summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/ui/crumbs
diff options
context:
space:
mode:
authorLiming An <limingx.l.an@intel.com>2012-05-08 19:48:08 +0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2012-05-09 21:56:47 +0100
commit6841abd17268a1c1ca5e3634f0ae9e21426ca9c9 (patch)
treefeca86dce10f797bb222fb8a86ac662f0ba73ee1 /bitbake/lib/bb/ui/crumbs
parent71b277acb12353eac21fddc2531c8bac886b058b (diff)
downloadpoky-6841abd17268a1c1ca5e3634f0ae9e21426ca9c9.tar.gz
Hob: change the workflow about click 'Run Image' to run directly after builded a qemu image
[YOCTO #2155] (Bitbake rev: d8a1fc4613ce1d6c1d0e3dad53d7af15b2011fd5) Signed-off-by: Liming An <limingx.l.an@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/ui/crumbs')
-rwxr-xr-xbitbake/lib/bb/ui/crumbs/builder.py52
-rwxr-xr-xbitbake/lib/bb/ui/crumbs/imagedetailspage.py139
2 files changed, 109 insertions, 82 deletions
diff --git a/bitbake/lib/bb/ui/crumbs/builder.py b/bitbake/lib/bb/ui/crumbs/builder.py
index 4b274a75a1..42d0f2ca0e 100755
--- a/bitbake/lib/bb/ui/crumbs/builder.py
+++ b/bitbake/lib/bb/ui/crumbs/builder.py
@@ -1047,6 +1047,21 @@ class Builder(gtk.Window):
1047 response = dialog.run() 1047 response = dialog.run()
1048 dialog.destroy() 1048 dialog.destroy()
1049 1049
1050 def get_kernel_file_name(self, image_path):
1051 name_list = []
1052 kernel_name = ""
1053 if image_path:
1054 files = [f for f in os.listdir(image_path) if f[0] <> '.']
1055 for check_file in files:
1056 if check_file.endswith(".bin"):
1057 name_splits = check_file.split(".")[0]
1058 if self.configuration.curr_mach in name_splits.split("-"):
1059 kernel_name = check_file
1060 if not os.path.islink(os.path.join(image_path, check_file)):
1061 name_list.append(check_file)
1062
1063 return kernel_name, len(name_list)
1064
1050 def runqemu_image(self, image_name): 1065 def runqemu_image(self, image_name):
1051 if not image_name: 1066 if not image_name:
1052 lbl = "<b>Please select an image to launch in QEMU.</b>" 1067 lbl = "<b>Please select an image to launch in QEMU.</b>"
@@ -1057,24 +1072,31 @@ class Builder(gtk.Window):
1057 dialog.destroy() 1072 dialog.destroy()
1058 return 1073 return
1059 1074
1060 dialog = gtk.FileChooserDialog("Load Kernel Files", self, 1075 kernel_name, kernels_number = self.get_kernel_file_name(self.parameters.image_addr)
1061 gtk.FILE_CHOOSER_ACTION_SAVE) 1076 if not kernel_name or kernels_number > 1:
1062 button = dialog.add_button("Cancel", gtk.RESPONSE_NO) 1077 dialog = gtk.FileChooserDialog("Load Kernel Files", self,
1063 HobAltButton.style_button(button) 1078 gtk.FILE_CHOOSER_ACTION_SAVE)
1064 button = dialog.add_button("Open", gtk.RESPONSE_YES) 1079 button = dialog.add_button("Cancel", gtk.RESPONSE_NO)
1065 HobButton.style_button(button) 1080 HobAltButton.style_button(button)
1066 filter = gtk.FileFilter() 1081 button = dialog.add_button("Open", gtk.RESPONSE_YES)
1067 filter.set_name("Kernel Files") 1082 HobButton.style_button(button)
1068 filter.add_pattern("*.bin") 1083 filter = gtk.FileFilter()
1069 dialog.add_filter(filter) 1084 filter.set_name("Kernel Files")
1085 filter.add_pattern("*.bin")
1086 dialog.add_filter(filter)
1070 1087
1071 dialog.set_current_folder(self.parameters.image_addr) 1088 dialog.set_current_folder(self.parameters.image_addr)
1072 1089
1073 response = dialog.run() 1090 response = dialog.run()
1074 if response == gtk.RESPONSE_YES: 1091 if response == gtk.RESPONSE_YES:
1075 kernel_path = dialog.get_filename() 1092 kernel_path = dialog.get_filename()
1093 image_path = os.path.join(self.parameters.image_addr, image_name)
1094 dialog.destroy()
1095
1096 elif kernel_name:
1097 kernel_path = os.path.join(self.parameters.image_addr, kernel_name)
1076 image_path = os.path.join(self.parameters.image_addr, image_name) 1098 image_path = os.path.join(self.parameters.image_addr, image_name)
1077 dialog.destroy() 1099 response = gtk.RESPONSE_YES
1078 1100
1079 if response == gtk.RESPONSE_YES: 1101 if response == gtk.RESPONSE_YES:
1080 source_env_path = os.path.join(self.parameters.core_base, "oe-init-build-env") 1102 source_env_path = os.path.join(self.parameters.core_base, "oe-init-build-env")
diff --git a/bitbake/lib/bb/ui/crumbs/imagedetailspage.py b/bitbake/lib/bb/ui/crumbs/imagedetailspage.py
index ac631b6a20..1cfef80ac9 100755
--- a/bitbake/lib/bb/ui/crumbs/imagedetailspage.py
+++ b/bitbake/lib/bb/ui/crumbs/imagedetailspage.py
@@ -32,6 +32,12 @@ from bb.ui.crumbs.hobpages import HobPage
32class ImageDetailsPage (HobPage): 32class ImageDetailsPage (HobPage):
33 33
34 __columns__ = [{ 34 __columns__ = [{
35 'col_name' : 'Selected',
36 'col_id' : 2,
37 'col_style': 'radio toggle',
38 'col_min' : 100,
39 'col_max' : 100
40 },{
35 'col_name' : 'Image name', 41 'col_name' : 'Image name',
36 'col_id' : 0, 42 'col_id' : 0,
37 'col_style': 'text', 43 'col_style': 'text',
@@ -43,13 +49,7 @@ class ImageDetailsPage (HobPage):
43 'col_style': 'text', 49 'col_style': 'text',
44 'col_min' : 100, 50 'col_min' : 100,
45 'col_max' : 100 51 'col_max' : 100
46 }, { 52 }]
47 'col_name' : 'Select',
48 'col_id' : 2,
49 'col_style': 'radio toggle',
50 'col_min' : 100,
51 'col_max' : 100
52 }]
53 53
54 class DetailBox (gtk.EventBox): 54 class DetailBox (gtk.EventBox):
55 def __init__(self, widget = None, varlist = None, vallist = None, icon = None, button = None, color = HobColors.LIGHT_GRAY): 55 def __init__(self, widget = None, varlist = None, vallist = None, icon = None, button = None, color = HobColors.LIGHT_GRAY):
@@ -64,27 +64,31 @@ class ImageDetailsPage (HobPage):
64 self.hbox.set_border_width(15) 64 self.hbox.set_border_width(15)
65 self.add(self.hbox) 65 self.add(self.hbox)
66 66
67 total_rows = 0
67 if widget: 68 if widget:
68 row = 1 69 total_rows = 10
69 elif varlist and vallist: 70 if varlist and vallist:
70 # pack the icon and the text on the left 71 # pack the icon and the text on the left
71 row = len(varlist) 72 total_rows += len(varlist)
72 self.table = gtk.Table(row, 20, True) 73 self.table = gtk.Table(total_rows, 20, True)
74 self.table.set_row_spacings(6)
73 self.table.set_size_request(100, -1) 75 self.table.set_size_request(100, -1)
74 self.hbox.pack_start(self.table, expand=True, fill=True, padding=15) 76 self.hbox.pack_start(self.table, expand=True, fill=True, padding=15)
75 77
76 colid = 0 78 colid = 0
79 rowid = 0
77 self.line_widgets = {} 80 self.line_widgets = {}
78 if icon: 81 if icon:
79 self.table.attach(icon, colid, colid + 2, 0, 1) 82 self.table.attach(icon, colid, colid + 2, 0, 1)
80 colid = colid + 2 83 colid = colid + 2
81 if widget: 84 if widget:
82 self.table.attach(widget, colid, 20, 0, 1) 85 self.table.attach(widget, colid, 20, 0, 10)
83 elif varlist and vallist: 86 rowid = 10
84 for line in range(0, row): 87 if varlist and vallist:
85 self.line_widgets[varlist[line]] = self.text2label(varlist[line], vallist[line]) 88 for row in range(rowid, total_rows):
86 self.table.attach(self.line_widgets[varlist[line]], colid, 20, line, line + 1) 89 index = row - rowid
87 90 self.line_widgets[varlist[index]] = self.text2label(varlist[index], vallist[index])
91 self.table.attach(self.line_widgets[varlist[index]], colid, 20, row, row + 1)
88 # pack the button on the right 92 # pack the button on the right
89 if button: 93 if button:
90 self.hbox.pack_end(button, expand=False, fill=False) 94 self.hbox.pack_end(button, expand=False, fill=False)
@@ -172,6 +176,7 @@ class ImageDetailsPage (HobPage):
172 for button_id, button in self.button_ids.items(): 176 for button_id, button in self.button_ids.items():
173 button.disconnect(button_id) 177 button.disconnect(button_id)
174 self._remove_all_widget() 178 self._remove_all_widget()
179
175 # repack 180 # repack
176 self.pack_start(self.details_top_buttons, expand=False, fill=False) 181 self.pack_start(self.details_top_buttons, expand=False, fill=False)
177 self.pack_start(self.group_align, expand=True, fill=True) 182 self.pack_start(self.group_align, expand=True, fill=True)
@@ -196,6 +201,9 @@ class ImageDetailsPage (HobPage):
196 self.buttonlist = ["Build new image", "Run image", "Deploy image"] 201 self.buttonlist = ["Build new image", "Run image", "Deploy image"]
197 202
198 # Name 203 # Name
204 varlist = [""]
205 vallist = ["Listed generated image and package files."]
206 t = ''
199 self.image_store.clear() 207 self.image_store.clear()
200 default_toggled = False 208 default_toggled = False
201 default_image_size = 0 209 default_image_size = 0
@@ -211,16 +219,33 @@ class ImageDetailsPage (HobPage):
211 if default_toggled: 219 if default_toggled:
212 default_image_size = image_size 220 default_image_size = image_size
213 self.create_bottom_buttons(self.buttonlist, image_name) 221 self.create_bottom_buttons(self.buttonlist, image_name)
222 if 'qemu' in image_name:
223 t = ' (Selected QEMU items to be as runnable image)'
224 else:
225 t = ' (Selected Targeted item to be deploy)'
214 else: 226 else:
215 self.image_store.set(self.image_store.append(), 0, image_name, 1, image_size, 2, False) 227 self.image_store.set(self.image_store.append(), 0, image_name, 1, image_size, 2, False)
216 i = i + 1 228 i = i + 1
217 image_table = HobViewTable(self.__columns__) 229
218 image_table.set_model(self.image_store) 230 if build_succeeded:
219 image_table.connect("toggled", self.toggled_cb) 231 varlist = ["Name: ", "Directory: ", ". "]
232 vallist = []
233 vallist.append(image_name.split('.')[0])
234 vallist.append(image_addr)
235 vallist.append(t)
236 image_table = None
237 else:
238 image_table = HobViewTable(self.__columns__)
239 image_table.set_model(self.image_store)
240 image_table.connect("row-activated", self.row_activated_cb)
241 if default_image_size and ('qemu' in image_name):
242 t = '\n(Selected QEMU items to be as runnable image, so you need to select prompted kernel to run)'
243 vallist[0] += t
244
220 view_files_button = HobAltButton("View files") 245 view_files_button = HobAltButton("View files")
221 view_files_button.connect("clicked", self.view_files_clicked_cb, image_addr) 246 view_files_button.connect("clicked", self.view_files_clicked_cb, image_addr)
222 view_files_button.set_tooltip_text("Open the directory containing the image files") 247 view_files_button.set_tooltip_text("Open the directory containing the image files")
223 self.image_detail = self.DetailBox(widget=image_table, button=view_files_button) 248 self.image_detail = self.DetailBox(widget=image_table, varlist=varlist, vallist=vallist, button=view_files_button)
224 self.box_group_area.pack_start(self.image_detail, expand=True, fill=True) 249 self.box_group_area.pack_start(self.image_detail, expand=True, fill=True)
225 250
226 # Machine, Base image and Layers 251 # Machine, Base image and Layers
@@ -252,7 +277,7 @@ class ImageDetailsPage (HobPage):
252 edit_config_button.set_tooltip_text("Edit machine, base image and recipes") 277 edit_config_button.set_tooltip_text("Edit machine, base image and recipes")
253 edit_config_button.connect("clicked", self.edit_config_button_clicked_cb) 278 edit_config_button.connect("clicked", self.edit_config_button_clicked_cb)
254 self.setting_detail = self.DetailBox(varlist=varlist, vallist=vallist, button=edit_config_button) 279 self.setting_detail = self.DetailBox(varlist=varlist, vallist=vallist, button=edit_config_button)
255 self.box_group_area.pack_start(self.setting_detail, expand=False, fill=False) 280 self.box_group_area.pack_start(self.setting_detail, expand=True, fill=True)
256 281
257 # Packages included, and Total image size 282 # Packages included, and Total image size
258 varlist = ["Packages included: ", "Total image size: "] 283 varlist = ["Packages included: ", "Total image size: "]
@@ -303,37 +328,14 @@ class ImageDetailsPage (HobPage):
303 break 328 break
304 return deployable 329 return deployable
305 330
306 def toggled_cb(self, table, cell, path, columnid, tree): 331 def row_activated_cb(self, table, model, path):
307 model = tree.get_model()
308 if not model: 332 if not model:
309 return 333 return
310 iter = model.get_iter_first() 334 iter = model.get_iter(path)
311 while iter:
312 rowpath = model.get_path(iter)
313 model[rowpath][columnid] = False
314 iter = model.iter_next(iter)
315
316 model[path][columnid] = True
317 self.refresh_package_detail_box(model[path][1])
318
319 image_name = model[path][0] 335 image_name = model[path][0]
320 336 if iter and model[path][2] == 'runnable':
321 # remove 337 kernel_name, kernel_number = self.get_kernel_file_name(image_name)
322 for button_id, button in self.button_ids.items(): 338 self.builder.runqemu_image(image_name, kernel_name, kernel_number)
323 button.disconnect(button_id)
324 self._remove_all_widget()
325 # repack
326 self.pack_start(self.details_top_buttons, expand=False, fill=False)
327 self.pack_start(self.group_align, expand=True, fill=True)
328 if self.build_result:
329 self.box_group_area.pack_start(self.build_result, expand=False, fill=False)
330 self.box_group_area.pack_start(self.image_detail, expand=True, fill=True)
331 if self.setting_detail:
332 self.box_group_area.pack_start(self.setting_detail, expand=False, fill=False)
333 self.box_group_area.pack_start(self.package_detail, expand=False, fill=False)
334 self.create_bottom_buttons(self.buttonlist, image_name)
335 self.box_group_area.pack_end(self.details_bottom_buttons, expand=False, fill=False)
336 self.show_all()
337 339
338 def create_bottom_buttons(self, buttonlist, image_name): 340 def create_bottom_buttons(self, buttonlist, image_name):
339 # Create the buttons at the bottom 341 # Create the buttons at the bottom
@@ -348,7 +350,7 @@ class ImageDetailsPage (HobPage):
348 deploy_button.set_size_request(205, 49) 350 deploy_button.set_size_request(205, 49)
349 deploy_button.set_tooltip_text("Burn a live image to a USB drive or flash memory") 351 deploy_button.set_tooltip_text("Burn a live image to a USB drive or flash memory")
350 deploy_button.set_flags(gtk.CAN_DEFAULT) 352 deploy_button.set_flags(gtk.CAN_DEFAULT)
351 button_id = deploy_button.connect("clicked", self.deploy_button_clicked_cb) 353 button_id = deploy_button.connect("clicked", self.deploy_button_clicked_cb, image_name)
352 self.button_ids[button_id] = deploy_button 354 self.button_ids[button_id] = deploy_button
353 self.details_bottom_buttons.pack_end(deploy_button, expand=False, fill=False) 355 self.details_bottom_buttons.pack_end(deploy_button, expand=False, fill=False)
354 created = True 356 created = True
@@ -370,7 +372,7 @@ class ImageDetailsPage (HobPage):
370 run_button.set_flags(gtk.CAN_DEFAULT) 372 run_button.set_flags(gtk.CAN_DEFAULT)
371 packed = True 373 packed = True
372 run_button.set_tooltip_text("Start up an image with qemu emulator") 374 run_button.set_tooltip_text("Start up an image with qemu emulator")
373 button_id = run_button.connect("clicked", self.run_button_clicked_cb) 375 button_id = run_button.connect("clicked", self.run_button_clicked_cb, image_name)
374 self.button_ids[button_id] = run_button 376 self.button_ids[button_id] = run_button
375 self.details_bottom_buttons.pack_end(run_button, expand=False, fill=False) 377 self.details_bottom_buttons.pack_end(run_button, expand=False, fill=False)
376 created = True 378 created = True
@@ -408,27 +410,30 @@ class ImageDetailsPage (HobPage):
408 self.button_ids[button_id] = build_new_button 410 self.button_ids[button_id] = build_new_button
409 self.details_bottom_buttons.pack_start(build_new_button, expand=False, fill=False) 411 self.details_bottom_buttons.pack_start(build_new_button, expand=False, fill=False)
410 412
411 def _get_selected_image(self): 413 def get_kernel_file_name(self, image_name):
412 image_name = "" 414 name_list = []
413 iter = self.image_store.get_iter_first() 415 kernel_name = ""
414 while iter: 416 if image_name:
415 path = self.image_store.get_path(iter) 417 image_path = os.path.join(self.builder.parameters.image_addr)
416 if self.image_store[path][2]: 418 files = [f for f in os.listdir(image_path) if f[0] <> '.']
417 image_name = self.image_store[path][0] 419 for check_file in files:
418 break 420 if check_file.endswith(".bin"):
419 iter = self.image_store.iter_next(iter) 421 if self.test_mach_runnable(check_file):
420 422 selected_machine = self.builder.configuration.curr_mach
421 return image_name 423 if selected_machine in check_file:
424 kernel_name = check_file
425 if not os.path.islink(os.path.join(image_path, check_file)):
426 name_list.append(check_file)
427
428 return kernel_name, len(name_list)
422 429
423 def save_button_clicked_cb(self, button): 430 def save_button_clicked_cb(self, button):
424 self.builder.show_save_template_dialog() 431 self.builder.show_save_template_dialog()
425 432
426 def deploy_button_clicked_cb(self, button): 433 def deploy_button_clicked_cb(self, button, image_name):
427 image_name = self._get_selected_image()
428 self.builder.deploy_image(image_name) 434 self.builder.deploy_image(image_name)
429 435
430 def run_button_clicked_cb(self, button): 436 def run_button_clicked_cb(self, button, image_name):
431 image_name = self._get_selected_image()
432 self.builder.runqemu_image(image_name) 437 self.builder.runqemu_image(image_name)
433 438
434 def build_new_button_clicked_cb(self, button): 439 def build_new_button_clicked_cb(self, button):