diff options
author | Liming An <limingx.l.an@intel.com> | 2012-05-08 19:48:08 +0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2012-05-09 21:56:47 +0100 |
commit | 6841abd17268a1c1ca5e3634f0ae9e21426ca9c9 (patch) | |
tree | feca86dce10f797bb222fb8a86ac662f0ba73ee1 /bitbake/lib | |
parent | 71b277acb12353eac21fddc2531c8bac886b058b (diff) | |
download | poky-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')
-rwxr-xr-x | bitbake/lib/bb/ui/crumbs/builder.py | 52 | ||||
-rwxr-xr-x | bitbake/lib/bb/ui/crumbs/imagedetailspage.py | 139 |
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 | |||
32 | class ImageDetailsPage (HobPage): | 32 | class 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): |