lib/bb/ui/crumbs: replace HobXpmLabelButtonBox with HobImageButton

HobImageButton is an gtk.Button subclass, and therefore behaves like a
button with prelight and focus states, with an icon and two lines of text -
primary and secondary. The secondary text is displayed in a lighter colour
using a new module method, soften_color(), per the design.

(Bitbake rev: b91cc96c4ff4195ac26fdfd1fb0c2ff8db06aff8)

Signed-off-by: Joshua Lock <josh@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Joshua Lock 2012-03-22 15:54:37 -07:00 committed by Richard Purdie
parent ce914a6742
commit f76dcdb1ca
2 changed files with 80 additions and 73 deletions

View File

@ -53,8 +53,10 @@ class hic:
ICON_INFO_HOVER_FILE = os.path.join(HOB_ICON_BASE_DIR, ('info/info_hover.png'))
ICON_INDI_CONFIRM_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/confirmation.png'))
ICON_INDI_ERROR_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/error.png'))
ICON_INDI_REMOVE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/remove.png'))
ICON_INDI_ADD = os.path.join(HOB_ICON_BASE_DIR, ('indicators/add.png'))
ICON_INDI_REMOVE_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/remove.png'))
ICON_INDI_REMOVE_HOVER_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/remove-hover.png'))
ICON_INDI_ADD_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/add.png'))
ICON_INDI_ADD_HOVER_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/add-hover.png'))
class hcc:
@ -173,6 +175,27 @@ class HobViewTable (gtk.VBox):
if not view_column.get_title() in self.toggle_columns:
self.emit("row-activated", tree.get_model(), path)
"""
A method to calculate a softened value for the colour of widget when in the
provided state.
widget: the widget whose style to use
state: the state of the widget to use the style for
Returns a string value representing the softened colour
"""
def soften_color(widget, state=gtk.STATE_NORMAL):
# this colour munging routine is heavily inspired bu gdu_util_get_mix_color()
# from gnome-disk-utility:
# http://git.gnome.org/browse/gnome-disk-utility/tree/src/gdu-gtk/gdu-gtk.c?h=gnome-3-0
blend = 0.7
style = widget.get_style()
color = style.text[state]
color.red = color.red * blend + style.base[state].red * (1.0 - blend)
color.green = color.green * blend + style.base[state].green * (1.0 - blend)
color.blue = color.blue * blend + style.base[state].blue * (1.0 - blend)
return color.to_string()
class HobAltButton(gtk.Button):
"""
A gtk.Button subclass which has no relief, and so is more discrete
@ -181,64 +204,46 @@ class HobAltButton(gtk.Button):
gtk.Button.__init__(self, label)
self.set_relief(gtk.RELIEF_NONE)
class HobXpmLabelButtonBox(gtk.EventBox):
""" label: name of buttonbox
description: the simple description
class HobImageButton(gtk.Button):
"""
def __init__(self, display_file="", hover_file="", label="", description=""):
gtk.EventBox.__init__(self)
self._base_state_flags = gtk.STATE_NORMAL
self.set_events(gtk.gdk.MOTION_NOTIFY | gtk.gdk.BUTTON_PRESS | gtk.gdk.EXPOSE)
A gtk.Button with an icon and two rows of text, the second of which is
displayed in a blended colour.
self.connect("expose-event", self.cb)
self.connect("enter-notify-event", self.pointer_enter_cb)
self.connect("leave-notify-event", self.pointer_leave_cb)
primary_text: the main button label
secondary_text: optional second line of text
icon_path: path to the icon file to display on the button
"""
def __init__(self, primary_text, secondary_text="", icon_path="", hover_icon_path=""):
gtk.Button.__init__(self)
self.set_relief(gtk.RELIEF_NONE)
self.icon_hover = gtk.Image()
self.icon_hover.set_name("icon_image")
if type(hover_file) == str:
pixbuf = gtk.gdk.pixbuf_new_from_file(hover_file)
self.icon_hover.set_from_pixbuf(pixbuf)
self.icon_path = icon_path
self.hover_icon_path = hover_icon_path
self.icon_display = gtk.Image()
self.icon_display.set_name("icon_image")
if type(display_file) == str:
pixbuf = gtk.gdk.pixbuf_new_from_file(display_file)
self.icon_display.set_from_pixbuf(pixbuf)
hbox = gtk.HBox(False, 3)
hbox.show()
self.add(hbox)
self.icon = gtk.Image()
self.icon.set_from_file(self.icon_path)
self.icon.set_alignment(0.5, 0.0)
self.icon.show()
if self.hover_icon_path and len(self.hover_icon_path):
self.connect("enter-notify-event", self.set_hover_icon_cb)
self.connect("leave-notify-event", self.set_icon_cb)
hbox.pack_start(self.icon, False, False, 0)
label = gtk.Label()
label.set_alignment(0.0, 0.5)
colour = soften_color(label)
mark = "%s\n<span fgcolor='%s'><small>%s</small></span>" % (primary_text, colour, secondary_text)
label.set_markup(mark)
label.show()
hbox.pack_start(label, True, True, 0)
self.tb = gtk.Table(2, 10, True)
self.tb.set_row_spacing(1, False)
self.tb.set_col_spacing(1, False)
self.add(self.tb)
self.tb.attach(self.icon_display, 0, 2, 0, 2, 0, 0)
self.tb.attach(self.icon_hover, 0, 2, 0, 2, 0, 0)
def set_hover_icon_cb(self, widget, event):
self.icon.set_from_file(self.hover_icon_path)
lbl = gtk.Label()
lbl.set_alignment(0.0, 0.5)
lbl.set_markup("<span foreground=\'#1C1C1C\' font_desc=\'18px\'>%s</span>" % label)
self.tb.attach(lbl, 2, 10, 0, 1)
lbl = gtk.Label()
lbl.set_alignment(0.0, 0.5)
lbl.set_markup("<span foreground=\'#1C1C1C\' font_desc=\'14px\'>%s</span>" % description)
self.tb.attach(lbl, 2, 10, 1, 2)
def pointer_enter_cb(self, *args):
#if not self.is_focus():
self.set_state(gtk.STATE_PRELIGHT)
self._base_state_flags = gtk.STATE_PRELIGHT
self.icon_hover.show()
self.icon_display.hide()
def pointer_leave_cb(self, *args):
self.set_state(gtk.STATE_NORMAL)
self._base_state_flags = gtk.STATE_NORMAL
self.icon_display.show()
self.icon_hover.hide()
def cb(self, w,e):
""" Hide items - first time """
pass
def set_icon_cb(self, widget, event):
self.icon.set_from_file(self.icon_path)
class HobInfoButton(gtk.EventBox):
"""

View File

@ -24,7 +24,7 @@ import gtk
import glib
from bb.ui.crumbs.progressbar import HobProgressBar
from bb.ui.crumbs.hobcolor import HobColors
from bb.ui.crumbs.hobwidget import hic, HobXpmLabelButtonBox, HobInfoButton, HobAltButton
from bb.ui.crumbs.hobwidget import hic, HobImageButton, HobInfoButton, HobAltButton, HobButton
from bb.ui.crumbs.hoblistmodel import RecipeListModel
from bb.ui.crumbs.hobpages import HobPage
@ -139,9 +139,9 @@ class ImageConfigurationPage (HobPage):
icon_file = hic.ICON_LAYERS_DISPLAY_FILE
hover_file = hic.ICON_LAYERS_HOVER_FILE
self.layer_button = HobXpmLabelButtonBox(icon_file, hover_file,
"Layers", "Add support for machines, software, etc")
self.layer_button.connect("button-release-event", self.layer_button_clicked_cb)
self.layer_button = HobImageButton("Layers", "Add support for machines, software, etc.",
icon_file, hover_file)
self.layer_button.connect("clicked", self.layer_button_clicked_cb)
markup = "Layers are a powerful mechanism to extend the Yocto Project "
markup += "with your own functionality.\n"
@ -163,9 +163,9 @@ class ImageConfigurationPage (HobPage):
self.gtable.attach(self.machine_title, 0, 40, 0, 4)
self.gtable.attach(self.machine_title_desc, 0, 40, 4, 6)
self.gtable.attach(self.machine_combo, 0, 12, 6, 9)
self.gtable.attach(self.layer_button, 12, 36, 6, 10)
self.gtable.attach(self.layer_info_icon, 36, 40, 6, 9)
if show_progress_bar == True:
self.gtable.attach(self.layer_button, 12, 36, 6, 11)
self.gtable.attach(self.layer_info_icon, 36, 40, 6, 10)
if show_progress_bar:
self.gtable.attach(self.progress_box, 0, 40, 13, 17)
self.gtable.attach(self.machine_separator, 0, 40, 12, 13)
@ -186,22 +186,24 @@ class ImageConfigurationPage (HobPage):
self.image_combo_id = self.image_combo.connect("changed", self.image_combo_changed_cb)
self.image_desc = gtk.Label()
self.image_desc.set_alignment(0, 0)
self.image_desc.set_alignment(0, 0.5)
self.image_desc.set_line_wrap(True)
# button to view recipes
icon_file = hic.ICON_RCIPE_DISPLAY_FILE
hover_file = hic.ICON_RCIPE_HOVER_FILE
self.view_recipes_button = HobXpmLabelButtonBox(icon_file, hover_file,
"View Recipes", "Add/remove recipes and collections")
self.view_recipes_button.connect("button-release-event", self.view_recipes_button_clicked_cb)
self.view_recipes_button = HobImageButton("View Recipes",
"Add/remove recipes and collections",
icon_file, hover_file)
self.view_recipes_button.connect("clicked", self.view_recipes_button_clicked_cb)
# button to view packages
icon_file = hic.ICON_PACKAGES_DISPLAY_FILE
hover_file = hic.ICON_PACKAGES_HOVER_FILE
self.view_packages_button = HobXpmLabelButtonBox(icon_file, hover_file,
"View Packages", "Add/remove previously built packages to/from your image")
self.view_packages_button.connect("button-release-event", self.view_packages_button_clicked_cb)
self.view_packages_button = HobImageButton("View Packages",
"Add/remove previously built packages to/from your image",
icon_file, hover_file)
self.view_packages_button.connect("clicked", self.view_packages_button_clicked_cb)
self.image_separator = gtk.HSeparator()
@ -213,8 +215,8 @@ class ImageConfigurationPage (HobPage):
self.gtable.attach(self.image_separator, 0, 40, 35, 36)
def set_rcppkg_layout(self):
self.gtable.attach(self.view_recipes_button, 0, 18, 28, 32)
self.gtable.attach(self.view_packages_button, 18, 40, 28, 32)
self.gtable.attach(self.view_recipes_button, 0, 20, 27, 32)
self.gtable.attach(self.view_packages_button, 20, 40, 27, 32)
def create_config_build_button(self):
# Create the "Build packages" and "Just bake" buttons at the bottom
@ -343,14 +345,14 @@ class ImageConfigurationPage (HobPage):
self.image_combo.set_active(-1)
self.image_combo.set_active(active)
def layer_button_clicked_cb(self, event, data):
def layer_button_clicked_cb(self, button):
# Create a layer selection dialog
self.builder.show_layer_selection_dialog()
def view_recipes_button_clicked_cb(self, event, data):
def view_recipes_button_clicked_cb(self, button):
self.builder.show_recipes()
def view_packages_button_clicked_cb(self, event, data):
def view_packages_button_clicked_cb(self, button):
self.builder.show_packages()
def just_bake_button_clicked_cb(self, button):