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 | |
| 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>
| -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): |
