#
class ImageDetailsPage (HobPage):
- __columns__ = [{
- 'col_name' : 'Image name',
- 'col_id' : 0,
- 'col_style': 'text',
- 'col_min' : 500,
- 'col_max' : 500
- },{
- 'col_name' : 'Image size',
- 'col_id' : 1,
- 'col_style': 'text',
- 'col_min' : 100,
- 'col_max' : 100
- },{
- 'col_name' : 'Select',
- 'col_id' : 2,
- 'col_style': 'radio toggle',
- 'col_min' : 100,
- 'col_max' : 100
- }]
-
class DetailBox (gtk.EventBox):
def __init__(self, widget = None, varlist = None, vallist = None, icon = None, button = None, color = HobColors.LIGHT_GRAY):
gtk.EventBox.__init__(self)
self.set_style(style)
self.hbox = gtk.HBox()
- self.hbox.set_border_width(15)
+ self.hbox.set_border_width(10)
self.add(self.hbox)
total_rows = 0
def __init__(self, builder):
super(ImageDetailsPage, self).__init__(builder, "Image details")
- self.image_store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_BOOLEAN, gobject.TYPE_STRING)
+ self.image_store = []
self.button_ids = {}
self.details_bottom_buttons = gtk.HBox(False, 6)
self.create_visual_elements()
self.buttonlist = ["Build new image", "Run image", "Deploy image"]
# Name
- self.image_store.clear()
+ self.image_store = []
self.toggled_image = ""
default_image_size = 0
self.num_toggled = 0
for image_name in image_names:
image_size = HobPage._size_to_string(os.stat(os.path.join(image_addr, image_name)).st_size)
- image_attr = ("runnable" if (self.test_type_runnable(image_name) and self.test_mach_runnable(image_name)) else \
+ image_attr = ("run" if (self.test_type_runnable(image_name) and self.test_mach_runnable(image_name)) else \
("deploy" if self.test_deployable(image_name) else ""))
is_toggled = (image_attr != "")
if not self.toggled_image:
if i == (len(image_names) - 1):
is_toggled = True
- self.image_store.set(self.image_store.append(), 0, image_name, 1, image_size, 2, is_toggled, 3, image_attr)
if is_toggled:
default_image_size = image_size
self.toggled_image = image_name
+ split_stuff = image_name.split('.')
+ if "rootfs" in split_stuff:
+ image_type = image_name[(len(split_stuff[0]) + len(".rootfs") + 1):]
else:
- self.image_store.set(self.image_store.append(), 0, image_name, 1, image_size, 2, False, 3, image_attr)
+ image_type = image_name[(len(split_stuff[0]) + 1):]
+
+ self.image_store.append({'name': image_name,
+ 'type': image_type,
+ 'size': image_size,
+ 'is_toggled': is_toggled,
+ 'action_attr': image_attr,})
+
i = i + 1
self.num_toggled += is_toggled
is_runnable = self.create_bottom_buttons(self.buttonlist, self.toggled_image)
- if self.build_succeeded:
- varlist = ["Name: ", "Directory: "]
- vallist = []
- vallist.append(image_name.split('.')[0])
- vallist.append(image_addr)
- image_table = None
- else:
- varlist = None
- vallist = None
- image_table = HobViewTable(self.__columns__)
- image_table.set_model(self.image_store)
- image_table.connect("row-activated", self.row_activated_cb)
- image_table.connect_group_selection(self.table_selected_cb)
+ #if self.build_succeeded:
+ varlist = ["Name: ", "FileCreated: ", "Directory: "]
+ vallist = []
+
+ vallist.append(image_name.split('.')[0])
+ vallist.append(', '.join(fileitem['type'] for fileitem in self.image_store))
+ vallist.append(image_addr)
view_files_button = HobAltButton("View files")
view_files_button.connect("clicked", self.view_files_clicked_cb, image_addr)
view_files_button.set_tooltip_text("Open the directory containing the image files")
- self.image_detail = self.DetailBox(widget=image_table, varlist=varlist, vallist=vallist, button=view_files_button)
- self.box_group_area.pack_start(self.image_detail, expand=True, fill=True)
+ self.image_detail = self.DetailBox(varlist=varlist, vallist=vallist, button=view_files_button)
+ self.box_group_area.pack_start(self.image_detail, expand=False, fill=True)
# The default kernel box for the qemu images
self.sel_kernel = ""
self.box_group_area.pack_start(self.package_detail, expand=False, fill=False)
# pack the buttons at the bottom, at this time they are already created.
- self.box_group_area.pack_end(self.details_bottom_buttons, expand=False, fill=False)
+ if self.build_succeeded:
+ self.box_group_area.pack_end(self.details_bottom_buttons, expand=False, fill=False)
+ else: # for "My images" page
+ self.details_separator = gtk.HSeparator()
+ self.box_group_area.pack_start(self.details_separator, expand=False, fill=False)
+ self.box_group_area.pack_start(self.details_bottom_buttons, expand=False, fill=False)
self.show_all()
if not is_runnable:
return kernel_name
- def show_builded_images_dialog(self, widget):
- dialog = CrumbsDialog("Your builded images", self.builder,
+ def show_builded_images_dialog(self, widget, primary_action=""):
+ title = primary_action if primary_action else "Your builded images"
+ dialog = CrumbsDialog(title, self.builder,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT)
- dialog.set_size_request(-1, 350)
+ dialog.set_border_width(12)
label = gtk.Label()
label.set_use_markup(True)
label.set_alignment(0.0, 0.5)
- label.set_markup("<span font_desc='12'>Please select a image to run or deploy</span>")
+ label.set_markup("<span font_desc='12'>Select the image file you want to %s</span>" % primary_action)
dialog.vbox.pack_start(label, expand=False, fill=False)
- image_table = HobViewTable(self.__columns__)
- image_table.set_model(self.image_store)
- image_table.connect("row-activated", self.row_activated_cb)
- image_table.connect_group_selection(self.table_selected_cb)
- dialog.vbox.pack_start(image_table, expand=True, fill=True)
+ # filter created images as action attribution (deploy or run)
+ action_attr = ""
+ action_images = []
+ for fileitem in self.image_store:
+ action_attr = fileitem['action_attr']
+ if (action_attr == 'run' and primary_action == "Run image") \
+ or (action_attr == 'deploy' and primary_action == "Deploy image"):
+ action_images.append(fileitem)
+
+ # pack the corresponding 'runnable' or 'deploy' radio_buttons, if there has no more than one file.
+ # assume that there does not both have 'deploy' and 'runnable' files in the same building result
+ # in possible as design.
+ curr_row = 0
+ rows = (len(action_images)) if len(action_images) < 10 else 10
+ table = gtk.Table(rows, 10, True)
+ table.set_row_spacings(6)
+ table.set_col_spacing(0, 12)
+ table.set_col_spacing(5, 12)
+
+ sel_parent_btn = None
+ for fileitem in action_images:
+ sel_btn = gtk.RadioButton(sel_parent_btn, fileitem['type'])
+ sel_parent_btn = sel_btn if not sel_parent_btn else sel_parent_btn
+ sel_btn.set_active(fileitem['is_toggled'])
+ sel_btn.connect('toggled', self.table_selected_cb, fileitem)
+ if curr_row < 10:
+ table.attach(sel_btn, 2, 5, curr_row, curr_row + 1)
+ else:
+ table.attach(sel_btn, 7, 10, curr_row - 10, curr_row - 9)
+ curr_row += 1
+
+ dialog.vbox.pack_start(table, expand=False, fill=False, padding = 6)
- button = dialog.add_button(" OK ", gtk.RESPONSE_YES)
- HobButton.style_button(button)
+ button = dialog.add_button("Cancel", gtk.RESPONSE_CANCEL)
+ HobAltButton.style_button(button)
+
+ if primary_action:
+ button = dialog.add_button(primary_action, gtk.RESPONSE_YES)
+ HobButton.style_button(button)
dialog.show_all()
if response != gtk.RESPONSE_YES:
return
- it = self.image_store.get_iter_first()
- while it:
- image_attr = self.image_store.get_value(it, 3)
- is_select = self.image_store.get_value(it, 2)
- if is_select:
- image_name = self.image_store.get_value(it, 0)
- if image_attr == 'runnable':
- self.builder.runqemu_image(image_name, self.sel_kernel)
+ for fileitem in self.image_store:
+ if fileitem['is_toggled']:
+ if fileitem['action_attr'] == 'run':
+ self.builder.runqemu_image(fileitem['name'], self.sel_kernel)
elif image_attr == 'deploy':
- self.builder.deploy_image(image_name)
- it = self.image_store.iter_next(it)
-
- def repack_box_group(self, image_name=None):
- # remove
- for button_id, button in self.button_ids.items():
- button.disconnect(button_id)
- self._remove_all_widget()
- # repack
- self.pack_start(self.details_top_buttons, expand=False, fill=False)
- self.pack_start(self.group_align, expand=True, fill=True)
- if self.build_result:
- self.box_group_area.pack_start(self.build_result, expand=False, fill=False)
- self.box_group_area.pack_start(self.image_detail, expand=True, fill=True)
- if self.kernel_detail:
- self.box_group_area.pack_start(self.kernel_detail, expand=False, fill=False)
- if self.setting_detail:
- self.box_group_area.pack_start(self.setting_detail, expand=False, fill=False)
- self.box_group_area.pack_start(self.package_detail, expand=False, fill=False)
- is_runnable = self.create_bottom_buttons(self.buttonlist, image_name)
- self.box_group_area.pack_end(self.details_bottom_buttons, expand=False, fill=False)
- self.show_all()
- if not is_runnable:
- self.kernel_detail.hide()
+ self.builder.deploy_image(fileitem['name'])
- def table_selected_cb(self, selection):
- model, paths = selection.get_selected_rows()
- if (not model) or (not paths):
- return
-
- path = paths[0]
- columnid = 2
- iter = model.get_iter_first()
- while iter:
- rowpath = model.get_path(iter)
- model[rowpath][columnid] = False
- iter = model.iter_next(iter)
-
- model[path][columnid] = True
- self.refresh_package_detail_box(model[path][1])
-
- self.toggled_image = model[path][0]
- self.repack_box_group(self.toggled_image)
+ def table_selected_cb(self, tbutton, image):
+ image['is_toggled'] = tbutton.get_active()
+ if image['is_toggled']:
+ self.toggled_image = image['name']
def change_kernel_cb(self, widget):
kernel_path = self.builder.show_load_kernel_dialog()
# create button "Build new image"
if packed:
build_new_button = HobAltButton("Build new image")
- self.details_bottom_buttons.pack_start(build_new_button, expand=False, fill=False)
else:
build_new_button = HobButton("Build new image")
- build_new_button.set_size_request(205, 49)
build_new_button.set_flags(gtk.CAN_DEFAULT)
- self.details_bottom_buttons.pack_end(build_new_button, expand=False, fill=False)
+ build_new_button.set_size_request(205, 49)
+ self.details_bottom_buttons.pack_end(build_new_button, expand=False, fill=False)
build_new_button.set_tooltip_text("Create a new image from scratch")
button_id = build_new_button.connect("clicked", self.build_new_button_clicked_cb)
self.button_ids[button_id] = build_new_button
self.builder.show_save_template_dialog()
def deploy_button_clicked_cb(self, button):
- if self.build_succeeded and self.num_toggled > 1:
- self.show_builded_images_dialog()
- return
- self.builder.deploy_image(self.toggled_image)
+ if self.toggled_image:
+ if self.build_succeeded or self.num_toggled > 1:
+ self.set_sensitive(False)
+ self.show_builded_images_dialog(None, "Deploy image")
+ self.set_sensitive(True)
+ else:
+ self.builder.deploy_image(self.toggled_image)
def run_button_clicked_cb(self, button):
- if self.build_succeeded and self.num_toggled > 1:
- self.show_builded_images_dialog()
- return
- self.builder.runqemu_image(self.toggled_image, self.sel_kernel)
+ if self.toggled_image:
+ if self.num_toggled > 1:
+ self.set_sensitive(False)
+ self.show_builded_images_dialog(None, "Run image")
+ self.set_sensitive(True)
+ else:
+ self.builder.runqemu_image(self.toggled_image, self.sel_kernel)
def build_new_button_clicked_cb(self, button):
self.builder.initiate_new_build_async()