# # BitBake Graphical GTK User Interface # # Copyright (C) 2011-2013 Intel Corporation # # Authored by Andrei Dinu # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import string import gtk import gobject import os import tempfile import glib from bb.ui.crumbs.hig.crumbsdialog import CrumbsDialog from bb.ui.crumbs.hig.settingsuihelper import SettingsUIHelper from bb.ui.crumbs.hig.crumbsmessagedialog import CrumbsMessageDialog from bb.ui.crumbs.hig.layerselectiondialog import LayerSelectionDialog """ The following are convenience classes for implementing GNOME HIG compliant BitBake GUI's In summary: spacing = 12px, border-width = 6px """ class PropertyDialog(CrumbsDialog): def __init__(self, title, parent, information, flags, buttons=None): super(PropertyDialog, self).__init__(title, parent, flags, buttons) self.properties = information if len(self.properties) == 10: self.create_recipe_visual_elements() elif len(self.properties) == 5: self.create_package_visual_elements() else: self.create_information_visual_elements() def create_information_visual_elements(self): HOB_ICON_BASE_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), ("icons/")) ICON_PACKAGES_DISPLAY_FILE = os.path.join(HOB_ICON_BASE_DIR, ('info/info_display.png')) self.set_resizable(False) self.table = gtk.Table(1,1,False) self.table.set_row_spacings(0) self.table.set_col_spacings(0) self.image = gtk.Image() self.image.set_from_file(ICON_PACKAGES_DISPLAY_FILE) self.image.set_property("xalign",0) #self.vbox.add(self.image) image_info = self.properties.split("*")[0] info = self.properties.split("*")[1] vbox = gtk.VBox(True, spacing=30) self.label_short = gtk.Label() self.label_short.set_line_wrap(False) self.label_short.set_markup(image_info) self.label_short.set_property("xalign", 0) self.info_label = gtk.Label() self.info_label.set_line_wrap(True) self.info_label.set_markup(info) self.info_label.set_property("yalign", 0.5) self.table.attach(self.image, 0,1,0,1, xoptions=gtk.FILL|gtk.EXPAND, yoptions=gtk.FILL,xpadding=5,ypadding=5) self.table.attach(self.label_short, 0,1,0,1, xoptions=gtk.FILL|gtk.EXPAND, yoptions=gtk.FILL,xpadding=40,ypadding=5) self.table.attach(self.info_label, 0,1,1,2, xoptions=gtk.FILL|gtk.EXPAND, yoptions=gtk.FILL,xpadding=40,ypadding=10) self.vbox.add(self.table) self.connect('delete-event', lambda w, e: self.destroy() or True) def treeViewTooltip( self, widget, e, tooltips, cell, emptyText="" ): try: (path,col,x,y) = widget.get_path_at_pos( int(e.x), int(e.y) ) it = widget.get_model().get_iter(path) value = widget.get_model().get_value(it,cell) if value in self.tooltip_items: tooltips.set_tip(widget, self.tooltip_items[value]) tooltips.enable() else: tooltips.set_tip(widget, emptyText) except: tooltips.set_tip(widget, emptyText) def create_package_visual_elements(self): import json name = self.properties['name'] binb = self.properties['binb'] size = self.properties['size'] recipe = self.properties['recipe'] file_list = json.loads(self.properties['files_list']) files_temp = '' paths_temp = '' files_binb = [] paths_binb = [] self.tooltip_items = {} self.set_resizable(False) #cleaning out the recipe variable recipe = recipe.split("+")[0] vbox = gtk.VBox(True,spacing = 0) ###################################### NAME ROW + COL ################################# self.label_short = gtk.Label() self.label_short.set_size_request(300,-1) self.label_short.set_selectable(True) self.label_short.set_line_wrap(True) self.label_short.set_markup("Name: " + name) self.label_short.set_property("xalign", 0) self.vbox.add(self.label_short) ###################################### SIZE ROW + COL ###################################### self.label_short = gtk.Label() self.label_short.set_size_request(300,-1) self.label_short.set_selectable(True) self.label_short.set_line_wrap(True) self.label_short.set_markup("Size: " + size) self.label_short.set_property("xalign", 0) self.vbox.add(self.label_short) ##################################### RECIPE ROW + COL ######################################### self.label_short = gtk.Label() self.label_short.set_size_request(300,-1) self.label_short.set_selectable(True) self.label_short.set_line_wrap(True) self.label_short.set_markup("Recipe: " + recipe) self.label_short.set_property("xalign", 0) self.vbox.add(self.label_short) ##################################### BINB ROW + COL ####################################### if binb != '': self.label_short = gtk.Label() self.label_short.set_selectable(True) self.label_short.set_line_wrap(True) self.label_short.set_markup("Brought in by: ") self.label_short.set_property("xalign", 0) self.label_info = gtk.Label() self.label_info.set_size_request(300,-1) self.label_info.set_selectable(True) self.label_info.set_line_wrap(True) self.label_info.set_markup(binb) self.label_info.set_property("xalign", 0) self.vbox.add(self.label_short) self.vbox.add(self.label_info) #################################### FILES BROUGHT BY PACKAGES ################################### if file_list: self.textWindow = gtk.ScrolledWindow() self.textWindow.set_shadow_type(gtk.SHADOW_IN) self.textWindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.textWindow.set_size_request(100, 170) packagefiles_store = gtk.ListStore(str) self.packagefiles_tv = gtk.TreeView() self.packagefiles_tv.set_rules_hint(True) self.packagefiles_tv.set_headers_visible(True) self.textWindow.add(self.packagefiles_tv) self.cell1 = gtk.CellRendererText() col1 = gtk.TreeViewColumn('Package files', self.cell1) col1.set_cell_data_func(self.cell1, self.regex_field) self.packagefiles_tv.append_column(col1) items = file_list.keys() items.sort() for item in items: fullpath = item while len(item) > 35: item = item[:len(item)/2] + "" + item[len(item)/2+1:] if len(item) == 35: item = item[:len(item)/2] + "..." + item[len(item)/2+3:] self.tooltip_items[item] = fullpath packagefiles_store.append([str(item)]) self.packagefiles_tv.set_model(packagefiles_store) tips = gtk.Tooltips() tips.set_tip(self.packagefiles_tv, "") self.packagefiles_tv.connect("motion-notify-event", self.treeViewTooltip, tips, 0) self.packagefiles_tv.set_events(gtk.gdk.POINTER_MOTION_MASK) self.vbox.add(self.textWindow) self.vbox.show_all() def regex_field(self, column, cell, model, iter): cell.set_property('text', model.get_value(iter, 0)) return def create_recipe_visual_elements(self): summary = self.properties['summary'] name = self.properties['name'] version = self.properties['version'] revision = self.properties['revision'] binb = self.properties['binb'] group = self.properties['group'] license = self.properties['license'] homepage = self.properties['homepage'] bugtracker = self.properties['bugtracker'] description = self.properties['description'] self.set_resizable(False) #cleaning out the version variable and also the summary version = version.split(":")[1] if len(version) > 30: version = version.split("+")[0] else: version = version.split("-")[0] license = license.replace("&" , "and") if (homepage == ''): homepage = 'unknown' if (bugtracker == ''): bugtracker = 'unknown' summary = summary.split("+")[0] #calculating the rows needed for the table binb_items_count = len(binb.split(',')) binb_items = binb.split(',') vbox = gtk.VBox(False,spacing = 0) ######################################## SUMMARY LABEL ######################################### if summary != '': self.label_short = gtk.Label() self.label_short.set_width_chars(37) self.label_short.set_selectable(True) self.label_short.set_line_wrap(True) self.label_short.set_markup("" + summary + "") self.label_short.set_property("xalign", 0) self.vbox.add(self.label_short) ########################################## NAME ROW + COL ####################################### self.label_short = gtk.Label() self.label_short.set_selectable(True) self.label_short.set_line_wrap(True) self.label_short.set_markup("Name: " + name) self.label_short.set_property("xalign", 0) self.vbox.add(self.label_short) ####################################### VERSION ROW + COL #################################### self.label_short = gtk.Label() self.label_short.set_selectable(True) self.label_short.set_line_wrap(True) self.label_short.set_markup("Version: " + version) self.label_short.set_property("xalign", 0) self.vbox.add(self.label_short) ##################################### REVISION ROW + COL ##################################### self.label_short = gtk.Label() self.label_short.set_line_wrap(True) self.label_short.set_selectable(True) self.label_short.set_markup("Revision: " + revision) self.label_short.set_property("xalign", 0) self.vbox.add(self.label_short) ################################## GROUP ROW + COL ############################################ self.label_short = gtk.Label() self.label_short.set_selectable(True) self.label_short.set_line_wrap(True) self.label_short.set_markup("Group: " + group) self.label_short.set_property("xalign", 0) self.vbox.add(self.label_short) ################################# HOMEPAGE ROW + COL ############################################ if homepage != 'unknown': self.label_info = gtk.Label() self.label_info.set_selectable(True) self.label_info.set_line_wrap(True) if len(homepage) > 35: self.label_info.set_markup("" + homepage[0:35] + "..." + "") else: self.label_info.set_markup("" + homepage[0:60] + "") self.label_info.set_property("xalign", 0) self.label_short = gtk.Label() self.label_short.set_selectable(True) self.label_short.set_line_wrap(True) self.label_short.set_markup("Homepage: ") self.label_short.set_property("xalign", 0) self.vbox.add(self.label_short) self.vbox.add(self.label_info) ################################# BUGTRACKER ROW + COL ########################################### if bugtracker != 'unknown': self.label_info = gtk.Label() self.label_info.set_selectable(True) self.label_info.set_line_wrap(True) if len(bugtracker) > 35: self.label_info.set_markup("" + bugtracker[0:35] + "..." + "") else: self.label_info.set_markup("" + bugtracker[0:60] + "") self.label_info.set_property("xalign", 0) self.label_short = gtk.Label() self.label_short.set_selectable(True) self.label_short.set_line_wrap(True) self.label_short.set_markup("Bugtracker: ") self.label_short.set_property("xalign", 0) self.vbox.add(self.label_short) self.vbox.add(self.label_info) ################################# LICENSE ROW + COL ############################################ self.label_info = gtk.Label() self.label_info.set_selectable(True) self.label_info.set_line_wrap(True) self.label_info.set_markup(license) self.label_info.set_property("xalign", 0) self.label_short = gtk.Label() self.label_short.set_selectable(True) self.label_short.set_line_wrap(True) self.label_short.set_markup("License: ") self.label_short.set_property("xalign", 0) self.vbox.add(self.label_short) self.vbox.add(self.label_info) ################################### BINB ROW+COL ############################################# if binb != '': self.label_short = gtk.Label() self.label_short.set_selectable(True) self.label_short.set_line_wrap(True) self.label_short.set_markup("Brought in by: ") self.label_short.set_property("xalign", 0) self.vbox.add(self.label_short) self.label_info = gtk.Label() self.label_info.set_selectable(True) self.label_info.set_width_chars(36) if len(binb) > 200: scrolled_window = gtk.ScrolledWindow() scrolled_window.set_policy(gtk.POLICY_NEVER,gtk.POLICY_ALWAYS) scrolled_window.set_size_request(100,100) self.label_info.set_markup(binb) self.label_info.set_padding(6,6) self.label_info.set_alignment(0,0) self.label_info.set_line_wrap(True) scrolled_window.add_with_viewport(self.label_info) self.vbox.add(scrolled_window) else: self.label_info.set_markup(binb) self.label_info.set_property("xalign", 0) self.label_info.set_line_wrap(True) self.vbox.add(self.label_info) ################################ DESCRIPTION TAG ROW ################################################# self.label_short = gtk.Label() self.label_short.set_line_wrap(True) self.label_short.set_markup("Description ") self.label_short.set_property("xalign", 0) self.vbox.add(self.label_short) ################################ DESCRIPTION INFORMATION ROW ########################################## hbox = gtk.HBox(True,spacing = 0) self.label_short = gtk.Label() self.label_short.set_selectable(True) self.label_short.set_width_chars(36) if len(description) > 200: scrolled_window = gtk.ScrolledWindow() scrolled_window.set_policy(gtk.POLICY_NEVER,gtk.POLICY_ALWAYS) scrolled_window.set_size_request(100,100) self.label_short.set_markup(description) self.label_short.set_padding(6,6) self.label_short.set_alignment(0,0) self.label_short.set_line_wrap(True) scrolled_window.add_with_viewport(self.label_short) self.vbox.add(scrolled_window) else: self.label_short.set_markup(description) self.label_short.set_property("xalign", 0) self.label_short.set_line_wrap(True) self.vbox.add(self.label_short) self.vbox.show_all()