Skip to contentSkip to conversation

Hob Notebook Implementation and Others

PATCH Applied Shane Wang 2 participants 14 messages Mar 20, 2012 Arm STM32

lore
Share & tools
lore

Shane Wang

author
#0 lore raw

v4 cover Hob Notebook Implementation and Others

This patchset is
- to implement Hob self-defined notebook, and use it in the build details page.
- to clean up the code per the comments from the community.
(In order to make it readable, we did them in separate patches)

Compared with V3 version, this version temporarily removed the patches for
- to improve the build log with the animation of the refresh icon.
- to add proxy support in the Settings dialog.

Because the updated patches are not ready so far per the comments from the community.

The following changes since commit fd3514f35adc938c2c405aae0e283a9df1395c9b:

blktrace: update to version 1.0.5 (2012-03-19 20:28:48 +0000)

are available in the git repository at:
git://git.pokylinux.org/poky-contrib shane/hob2-v0.70
http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=shane/hob2-v0.70

Liming An (6):
Hob: remove the invalid code in hobwidget.py
Hob: Fixed the hobwidget code and make it like a pythonista
Hob: add auto adjust background area function for long issue text
Hob: change HobNoteBook tab edge color from green to gray
Hob: fix static variable "self.search" to parameter "search" in
signal callback function
Hob: fixed the tabbar search entry retaining focus when user has
clicked off it issue

Shane Wang (5):
Hob: implement a self-defined notebook visual component for Hob
Hob: use HobNotebook to implement a notebook in build details page
Hob: show indicators on the tabs of the Hob notebook
Hob: change the code style to enumerate a list in a for-loop
Hob: fix '!= None' and '== None' in the code

 bitbake/lib/bb/ui/crumbs/builddetailspage.py     |   40 ++-
 bitbake/lib/bb/ui/crumbs/builder.py              |    5 +
 bitbake/lib/bb/ui/crumbs/hobcolor.py             |    3 +
 bitbake/lib/bb/ui/crumbs/hobeventhandler.py      |    4 +-
 bitbake/lib/bb/ui/crumbs/hoblistmodel.py         |    2 +-
 bitbake/lib/bb/ui/crumbs/hobpages.py             |    4 +-
 bitbake/lib/bb/ui/crumbs/hobwidget.py            |  528 ++++++++++++++++++----
 bitbake/lib/bb/ui/crumbs/imagedetailspage.py     |   12 +-
 bitbake/lib/bb/ui/crumbs/packageselectionpage.py |   27 +-
 bitbake/lib/bb/ui/crumbs/recipeselectionpage.py  |   29 +-
 bitbake/lib/bb/ui/crumbs/runningbuild.py         |   69 +++
 11 files changed, 571 insertions(+), 152 deletions(-)
Signature · 1 line
1.7.6
author
#1 lore raw

PATCH v4 1/11 Hob: implement a self-defined notebook visual component for Hob

In recipe selection page, package selection page, and build details page, etc, there is a notebook component which is not gtk.Notebook in the design video. We implement the visual component with a drawing area, and use it to replace the old notebook in recipe selection page and package selection page. The reasons why we do it are:

1) General speaking, gtk.Notebook doesn't look like the designer worked out. (see https://wiki.yoctoproject.org/wiki/File:Hob1.2-screencast2.mov)
2) And the designer version looks better, for example, there is an indicator to show how many recipes or packages are included, and how many issues happened when building? Very straightforward. But technically, gtk.Notebook can't implement that, as far as we know.
3) Moreover, there is an entry for "search recipes", and "search packages". How to make it horizontal to the tabs is a problem to us.

Regarding those, we give up gtk.Notebook and use our own.

---
 bitbake/lib/bb/ui/crumbs/hobcolor.py             |    1 +
 bitbake/lib/bb/ui/crumbs/hobwidget.py            |  468 ++++++++++++++++++----
 bitbake/lib/bb/ui/crumbs/packageselectionpage.py |   17 +-
 bitbake/lib/bb/ui/crumbs/recipeselectionpage.py  |   19 +-
 4 files changed, 394 insertions(+), 111 deletions(-)
bitbake/lib/bb/ui/crumbs/hobcolor.py +1 -0
index 9d67d5c..402f022 100644
@@ -28,6 +28,7 @@ class HobColors:
     DARK         = "#3c3b37"
     BLACK        = "#000000"
     LIGHT_ORANGE = "#f7a787"
+    YELLOW       = "#ffff00"
 
     OK = WHITE
     RUNNING = PALE_GREEN
bitbake/lib/bb/ui/crumbs/hobwidget.py +383 -85

487 lines not on this page · raw message

bitbake/lib/bb/ui/crumbs/packageselectionpage.py +5 -12
index 1c335ac..3cd1c5e 100755
@@ -23,7 +23,7 @@
 import gtk
 import glib
 from bb.ui.crumbs.hobcolor import HobColors
-from bb.ui.crumbs.hobwidget import HobViewBar, HobViewTable
+from bb.ui.crumbs.hobwidget import HobViewTable, HobNotebook
 from bb.ui.crumbs.hoblistmodel import PackageListModel
 from bb.ui.crumbs.hobpages import HobPage
 
@@ -102,11 +102,7 @@ class PackageSelectionPage (HobPage):
         self.pack_start(self.group_align, expand=True, fill=True)
 
         # set visiable members
-        self.grid = gtk.Table(10, 1, True)
-        self.grid.set_col_spacings(3)
-
-        self.ins = gtk.Notebook()
-        self.ins.set_show_tabs(False)
+        self.ins = HobNotebook()
         self.tables = [] # we need to modify table when the dialog is shown
         # append the tab
         for i in range(len(self.pages)):
@@ -122,16 +118,13 @@ class PackageSelectionPage (HobPage):
             self.ins.append_page(tab, label)
             self.tables.append(tab)
 
-        self.grid.attach(self.ins, 0, 1, 1, 10, gtk.FILL | gtk.EXPAND, gtk.FILL | gtk.EXPAND, 1, 1)
-        # a black bar associated with the notebook
-        self.topbar = HobViewBar(self.ins) 
-        self.grid.attach(self.topbar, 0, 1, 0, 1, gtk.FILL | gtk.EXPAND, gtk.FILL | gtk.EXPAND, 1, 1)
+        self.ins.set_entry("Search packages:")
         # set the search entry for each table
         for tab in self.tables:
-            tab.set_search_entry(0, self.topbar.search)
+            tab.set_search_entry(0, self.ins.search)
 
         # add all into the dialog
-        self.box_group_area.add(self.grid)
+        self.box_group_area.pack_start(self.ins, expand=True, fill=True)
 
         button_box = gtk.HBox(False, 6)
         self.box_group_area.pack_start(button_box, expand=False, fill=False)
bitbake/lib/bb/ui/crumbs/recipeselectionpage.py +5 -14
index d615ef1..db873b6 100755
@@ -23,7 +23,7 @@
 import gtk
 import glib
 from bb.ui.crumbs.hobcolor import HobColors
-from bb.ui.crumbs.hobwidget import HobViewBar, HobViewTable
+from bb.ui.crumbs.hobwidget import HobViewTable, HobNotebook
 from bb.ui.crumbs.hoblistmodel import RecipeListModel
 from bb.ui.crumbs.hobpages import HobPage
 
@@ -124,13 +124,7 @@ class RecipeSelectionPage (HobPage):
         self.pack_start(self.group_align, expand=True, fill=True)
 
         # set visiable members
-        self.grid = gtk.Table(10, 1, True)
-        self.grid.set_col_spacings(3)
-
-        # draw the left part of the window
-        # a notebook
-        self.ins = gtk.Notebook()
-        self.ins.set_show_tabs(False)
+        self.ins = HobNotebook()
         self.tables = [] # we need modify table when the dialog is shown
         # append the tabs in order
         for i in range(len(self.pages)):
@@ -146,16 +140,13 @@ class RecipeSelectionPage (HobPage):
             self.ins.append_page(tab, label)
             self.tables.append(tab)
 
-        self.grid.attach(self.ins, 0, 1, 1, 10, gtk.FILL | gtk.EXPAND, gtk.FILL | gtk.EXPAND)
-        # a black bar associated with the notebook
-        self.topbar = HobViewBar(self.ins)
-        self.grid.attach(self.topbar, 0, 1, 0, 1, gtk.FILL | gtk.EXPAND, gtk.FILL | gtk.EXPAND)
+        self.ins.set_entry("Search recipes:")
         # set the search entry for each table
         for tab in self.tables:
-            tab.set_search_entry(0, self.topbar.search)
+            tab.set_search_entry(0, self.ins.search)
 
         # add all into the window
-        self.box_group_area.add(self.grid)
+        self.box_group_area.pack_start(self.ins, expand=True, fill=True)
 
         button_box = gtk.HBox(False, 6)
         self.box_group_area.pack_end(button_box, expand=False, fill=False)
Signature · 1 line
1.7.6
author
#3 lore raw

PATCH v4 3/11 Hob: show indicators on the tabs of the Hob notebook

This patch is to show the indicators (e.g., the number of the issues) in the build details page to highlight.

---
 bitbake/lib/bb/ui/crumbs/builddetailspage.py |   10 ++++++++++
 bitbake/lib/bb/ui/crumbs/builder.py          |    5 +++++
 bitbake/lib/bb/ui/crumbs/hobwidget.py        |   14 ++++++++++++++
 bitbake/lib/bb/ui/crumbs/runningbuild.py     |    4 ++++
 4 files changed, 33 insertions(+), 0 deletions(-)
bitbake/lib/bb/ui/crumbs/builddetailspage.py +10 -0
index 63d2c7b..7a5cfe6 100755
@@ -37,6 +37,8 @@ class BuildDetailsPage (HobPage):
     def __init__(self, builder):
         super(BuildDetailsPage, self).__init__(builder, "Building ...")
 
+        self.num_of_issues = 0
+
         # create visual elements
         self.create_visual_elements()
 
@@ -80,6 +82,14 @@ class BuildDetailsPage (HobPage):
         self.back_button.connect("clicked", self.back_button_clicked_cb)
         self.button_box.pack_start(self.back_button, expand=False, fill=False)
 
+    def show_issues(self):
+        self.num_of_issues += 1
+        self.notebook.show_indicator_icon("Issues", self.num_of_issues)
+
+    def reset_issues(self):
+        self.num_of_issues = 0
+        self.notebook.hide_indicator_icon("Issues")
+
     def _remove_all_widget(self):
         children = self.vbox.get_children() or []
         for child in children:
bitbake/lib/bb/ui/crumbs/builder.py +5 -0
index 1d255ac..318bcbf 100755
@@ -212,6 +212,7 @@ class Builder(gtk.Window):
         self.handler.build.connect("build-succeeded",    self.handler_build_succeeded_cb)
         self.handler.build.connect("build-failed",       self.handler_build_failed_cb)
         self.handler.build.connect("task-started",       self.handler_task_started_cb)
+        self.handler.build.connect("log-error",          self.handler_build_failure_cb)
         self.handler.connect("generating-data",          self.handler_generating_data_cb)
         self.handler.connect("data-generated",           self.handler_data_generated_cb)
         self.handler.connect("command-succeeded",        self.handler_command_succeeded_cb)
@@ -533,6 +534,7 @@ class Builder(gtk.Window):
         elif self.current_step == self.PACKAGE_GENERATING:
             fraction = 0
         self.build_details_page.update_progress_bar("Build Started: ", fraction)
+        self.build_details_page.reset_issues()
 
     def build_succeeded(self):
         if self.current_step == self.FAST_IMAGE_GENERATING:
@@ -600,6 +602,9 @@ class Builder(gtk.Window):
                 fraction = 0.2 + 0.8 * fraction
         self.build_details_page.update_progress_bar(title + ": ", fraction)
 
+    def handler_build_failure_cb(self, running_build):
+        self.build_details_page.show_issues()
+
     def destroy_window_cb(self, widget, event):
         lbl = "<b>Do you really want to exit the Hob image creator?</b>"
         dialog = CrumbsMessageDialog(self, lbl, gtk.STOCK_DIALOG_INFO)
bitbake/lib/bb/ui/crumbs/hobwidget.py +14 -0
index 8fa663c..2c3d831 100644
@@ -619,6 +619,20 @@ class HobNotebook(gtk.VBox):
  
         self.tb.show()
 
+    def show_indicator_icon(self, title, number):
+        for i, child in enumerate(self.tabbar.children):
+            if child["toggled_page"] == -1:
+                continue
+            if child["title"] == title:
+                self.tabbar.show_indicator_icon(i, number)
+
+    def hide_indicator_icon(self, title):
+        for i, child in enumerate(self.tabbar.children):
+            if child["toggled_page"] == -1:
+                continue
+            if child["title"] == title:
+                self.tabbar.hide_indicator_icon(i)
+
     def tab_switched_cb(self, widget, page):
         self.notebook.set_current_page(page)
 
bitbake/lib/bb/ui/crumbs/runningbuild.py +4 -0
index eedd8d9..ddac232 100644
@@ -84,6 +84,9 @@ class RunningBuild (gobject.GObject):
           'task-started'   : (gobject.SIGNAL_RUN_LAST,
                               gobject.TYPE_NONE,
                               (gobject.TYPE_PYOBJECT,)),
+          'log-error'      : (gobject.SIGNAL_RUN_LAST,
+                              gobject.TYPE_NONE,
+                              ()),
           }
     pids_to_task = {}
     tasks_to_iter = {}
@@ -134,6 +137,7 @@ class RunningBuild (gobject.GObject):
             if event.levelno >= logging.ERROR:
                 icon = "dialog-error"
                 color = HobColors.ERROR
+                self.emit("log-error")
             elif event.levelno >= logging.WARNING:
                 icon = "dialog-warning"
                 color = HobColors.WARNING
Signature · 1 line
1.7.6
author
#4 lore raw

PATCH v4 4/11 Hob: change the code style to enumerate a list in a for-loop

In reply to Shane Wang

We use the more common style to enumerate a list in a for-loop
(http://docs.python.org/library/functions.html#enumerate), that is:

try to use
for item in mylist,

and try to use
for i, item in enumerate(list)
rather than
for i in range(len(mylist))

---
 bitbake/lib/bb/ui/crumbs/hobwidget.py            |   30 +++++++++++-----------
 bitbake/lib/bb/ui/crumbs/packageselectionpage.py |   10 +++---
 bitbake/lib/bb/ui/crumbs/recipeselectionpage.py  |   10 +++---
 3 files changed, 25 insertions(+), 25 deletions(-)
bitbake/lib/bb/ui/crumbs/hobwidget.py +15 -15
index 2c3d831..247bbd1 100644
@@ -109,38 +109,38 @@ class HobViewTable (gtk.VBox):
         self.toggle_columns = []
         self.table_tree.connect("row-activated", self.row_activated_cb)
 
-        for i in range(len(columns)):
-            col = gtk.TreeViewColumn(columns[i]['col_name'])
+        for i, column in enumerate(columns):
+            col = gtk.TreeViewColumn(column['col_name'])
             col.set_clickable(True)
             col.set_resizable(True)
-            col.set_sort_column_id(columns[i]['col_id'])
-            if 'col_min' in columns[i].keys():
-                col.set_min_width(columns[i]['col_min'])
-            if 'col_max' in columns[i].keys():
-                col.set_max_width(columns[i]['col_max'])
+            col.set_sort_column_id(column['col_id'])
+            if 'col_min' in column.keys():
+                col.set_min_width(column['col_min'])
+            if 'col_max' in column.keys():
+                col.set_max_width(column['col_max'])
             self.table_tree.append_column(col)
 
-            if (not 'col_style' in columns[i].keys()) or columns[i]['col_style'] == 'text':
+            if (not 'col_style' in column.keys()) or column['col_style'] == 'text':
                 cell = gtk.CellRendererText()
                 col.pack_start(cell, True)
-                col.set_attributes(cell, text=columns[i]['col_id'])
-            elif columns[i]['col_style'] == 'check toggle':
+                col.set_attributes(cell, text=column['col_id'])
+            elif column['col_style'] == 'check toggle':
                 cell = gtk.CellRendererToggle()
                 cell.set_property('activatable', True)
                 cell.connect("toggled", self.toggled_cb, i, self.table_tree)
                 self.toggle_id = i
                 col.pack_end(cell, True)
-                col.set_attributes(cell, active=columns[i]['col_id'])
-                self.toggle_columns.append(columns[i]['col_name'])
-            elif columns[i]['col_style'] == 'radio toggle':
+                col.set_attributes(cell, active=column['col_id'])
+                self.toggle_columns.append(column['col_name'])
+            elif column['col_style'] == 'radio toggle':
                 cell = gtk.CellRendererToggle()
                 cell.set_property('activatable', True)
                 cell.set_radio(True)
                 cell.connect("toggled", self.toggled_cb, i, self.table_tree)
                 self.toggle_id = i
                 col.pack_end(cell, True)
-                col.set_attributes(cell, active=columns[i]['col_id'])
-                self.toggle_columns.append(columns[i]['col_name'])
+                col.set_attributes(cell, active=column['col_id'])
+                self.toggle_columns.append(column['col_name'])
 
         scroll = gtk.ScrolledWindow()
         scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS)
bitbake/lib/bb/ui/crumbs/packageselectionpage.py +5 -5
index 3cd1c5e..23e460c 100755
@@ -105,16 +105,16 @@ class PackageSelectionPage (HobPage):
         self.ins = HobNotebook()
         self.tables = [] # we need to modify table when the dialog is shown
         # append the tab
-        for i in range(len(self.pages)):
-            columns = self.pages[i]['columns']
+        for page in self.pages:
+            columns = page['columns']
             tab = HobViewTable(columns)
-            filter = self.pages[i]['filter']
+            filter = page['filter']
             tab.set_model(self.package_model.tree_model(filter))
             tab.connect("toggled", self.table_toggled_cb)
-            if self.pages[i]['name'] == "Included":
+            if page['name'] == "Included":
                 tab.connect("row-activated", self.tree_row_activated_cb)
 
-            label = gtk.Label(self.pages[i]['name'])
+            label = gtk.Label(page['name'])
             self.ins.append_page(tab, label)
             self.tables.append(tab)
 
bitbake/lib/bb/ui/crumbs/recipeselectionpage.py +5 -5
index db873b6..6dd7c1e 100755
@@ -127,16 +127,16 @@ class RecipeSelectionPage (HobPage):
         self.ins = HobNotebook()
         self.tables = [] # we need modify table when the dialog is shown
         # append the tabs in order
-        for i in range(len(self.pages)):
-            columns = self.pages[i]['columns']
+        for page in self.pages:
+            columns = page['columns']
             tab = HobViewTable(columns)
-            filter = self.pages[i]['filter']
+            filter = page['filter']
             tab.set_model(self.recipe_model.tree_model(filter))
             tab.connect("toggled", self.table_toggled_cb)
-            if self.pages[i]['name'] == "Included":
+            if page['name'] == "Included":
                 tab.connect("row-activated", self.tree_row_activated_cb)
 
-            label = gtk.Label(self.pages[i]['name'])
+            label = gtk.Label(page['name'])
             self.ins.append_page(tab, label)
             self.tables.append(tab)
 
Signature · 1 line
1.7.6
author
#6 lore raw

PATCH v4 6/11 Hob: remove the invalid code in hobwidget.py

In reply to Shane Wang

From: Liming An <[email protected]>

To delete some code which is not used

---
 bitbake/lib/bb/ui/crumbs/hobwidget.py |    2 --
 1 files changed, 0 insertions(+), 2 deletions(-)
bitbake/lib/bb/ui/crumbs/hobwidget.py +0 -2
index f0d9cbc..71f0629 100644
@@ -516,7 +516,6 @@ class HobTabBar(gtk.DrawingArea):
         cr.fill()
 
     def draw_indicator(self, cr, i):
-        style = self.get_style()
         tab_x = self.children[i]["x"]
         tab_y = self.children[i]["y"]
         number = self.children[i]["indicator_number"]
@@ -528,7 +527,6 @@ class HobTabBar(gtk.DrawingArea):
         # x position is offset(tab_width*3/4 - icon_width/2) + start_pos(tab_x)
         x = tab_x + self.tab_width * 3/4 - dest_w/2
         y = tab_y + self.tab_height/2 - dest_h/2
-        cr.move_to(tab_x, tab_y)
         r = min(dest_w, dest_h)/2
         color = cr.set_source_color(gtk.gdk.color_parse(HobColors.ORANGE))
         cr.arc(x + r, y + r, r, 0, 2*math.pi)
Signature · 1 line
1.7.6
author
#5 lore raw

PATCH v4 5/11 Hob: fix '!= None' and '== None' in the code

In reply to Shane Wang

This patch is to fix the following:

if foo != None -----> if foo
if foo == None -----> if not foo

---
 bitbake/lib/bb/ui/crumbs/hobeventhandler.py  |    4 ++--
 bitbake/lib/bb/ui/crumbs/hoblistmodel.py     |    2 +-
 bitbake/lib/bb/ui/crumbs/hobpages.py         |    4 ++--
 bitbake/lib/bb/ui/crumbs/hobwidget.py        |    6 +++---
 bitbake/lib/bb/ui/crumbs/imagedetailspage.py |   12 ++++++------
 bitbake/lib/bb/ui/crumbs/runningbuild.py     |    4 ++--
 6 files changed, 16 insertions(+), 16 deletions(-)
bitbake/lib/bb/ui/crumbs/hobeventhandler.py +2 -2
index 790e2ef..1e1151e 100644
@@ -119,7 +119,7 @@ class HobHandler(gobject.GObject):
             self.generating = False
 
     def run_next_command(self, initcmd=None):
-        if initcmd != None:
+        if initcmd:
             self.initcmd = initcmd
 
         if self.commands_async:
@@ -127,7 +127,7 @@ class HobHandler(gobject.GObject):
             next_command = self.commands_async.pop(0)
         else:
             self.clear_busy()
-            if self.initcmd != None:
+            if self.initcmd:
                 self.emit("command-succeeded", self.initcmd)
             return
 
bitbake/lib/bb/ui/crumbs/hoblistmodel.py +1 -1
index caf31bc..69e13cf 100644
@@ -713,7 +713,7 @@ class RecipeListModel(gtk.ListStore):
         return None
 
     def set_selected_image(self, img):
-        if img == None:
+        if not img:
             return
         path = self.find_path_for_item(img)
         self.include_item(item_path=path,
bitbake/lib/bb/ui/crumbs/hobpages.py +2 -2
index bd4b292..63ee3dd 100755
@@ -34,7 +34,7 @@ class HobPage (gtk.VBox):
         self.builder = builder
         self.builder_width, self.builder_height = self.builder.size_request()
 
-        if title == None:
+        if not title:
             self.title = "HOB -- Image Creator"
         else:
             self.title = title
@@ -62,7 +62,7 @@ class HobPage (gtk.VBox):
         label.set_markup("<span font_desc=\'14\'>%s</span>" % self.title)
         hbox.pack_start(label, expand=False, fill=False, padding=20)
 
-        if widget != None:
+        if widget:
             # add the widget in the event box
             hbox.pack_end(widget, expand=False, fill=False, padding=padding)
         eventbox.add(hbox)
bitbake/lib/bb/ui/crumbs/hobwidget.py +3 -3
index 247bbd1..f0d9cbc 100644
@@ -366,7 +366,7 @@ class HobTabBar(gtk.DrawingArea):
             child["x"] = self.tab_x + i * self.tab_width
             child["y"] = self.tab_y
 
-        if self.blank_rectangle != None:
+        if self.blank_rectangle:
             self.resize_blank_rectangle()
 
     def resize_blank_rectangle(self):
@@ -553,7 +553,7 @@ class HobTabBar(gtk.DrawingArea):
         self.queue_draw()
 
     def set_blank_size(self, x, y, w, h):
-        if self.blank_rectangle == None or self.blank_rectangle.x != x or self.blank_rectangle.width != w:
+        if not self.blank_rectangle or self.blank_rectangle.x != x or self.blank_rectangle.width != w:
             self.emit("blank-area-changed", x, y, w, h)
 
         return gtk.gdk.Rectangle(x, y, w, h)
@@ -640,7 +640,7 @@ class HobNotebook(gtk.VBox):
         if not notebook:
             return
         title = notebook.get_tab_label_text(notebook_child)
-        if title == None:
+        if not title:
             return
         for child in self.tabbar.children:
             if child["title"] == title:
bitbake/lib/bb/ui/crumbs/imagedetailspage.py +6 -6
index c063d74..30c25aa 100755
@@ -64,9 +64,9 @@ class ImageDetailsPage (HobPage):
             self.hbox.set_border_width(15)
             self.add(self.hbox)
 
-            if widget != None:
+            if widget:
                 row = 1
-            elif varlist != None and vallist != None:
+            elif varlist and vallist:
                 # pack the icon and the text on the left
                 row = len(varlist)
             self.table = gtk.Table(row, 20, True)
@@ -75,18 +75,18 @@ class ImageDetailsPage (HobPage):
 
             colid = 0
             self.line_widgets = {}
-            if icon != None:
+            if icon:
                 self.table.attach(icon, colid, colid + 2, 0, 1)
                 colid = colid + 2
-            if widget != None:
+            if widget:
                 self.table.attach(widget, colid, 20, 0, 1)
-            elif varlist != None and vallist != None:
+            elif varlist and vallist:
                 for line in range(0, row):
                     self.line_widgets[varlist[line]] = self.text2label(varlist[line], vallist[line])
                     self.table.attach(self.line_widgets[varlist[line]], colid, 20, line, line + 1)
 
             # pack the button on the right
-            if button != None:
+            if button:
                 self.hbox.pack_end(button, expand=False, fill=False)
 
         def update_line_widgets(self, variable, value):
bitbake/lib/bb/ui/crumbs/runningbuild.py +2 -2
index ddac232..d8af55c 100644
@@ -43,7 +43,7 @@ class RunningBuildModel (gtk.TreeStore):
 
     def config_model_filter(self, model, it):
         msg = model.get(it, self.COL_MESSAGE)[0]
-        if msg == None or type(msg) != str:
+        if not msg or type(msg) != str:
             return False
         if msg.startswith("\nOE Build Configuration:\n"):
             return True
@@ -51,7 +51,7 @@ class RunningBuildModel (gtk.TreeStore):
 
     def failure_model_filter(self, model, it):
         color = model.get(it, self.COL_COLOR)[0]
-        if color == None:
+        if not color:
             return False
         if color == HobColors.ERROR:
             return True
Signature · 1 line
1.7.6
author
#2 lore raw

PATCH v4 2/11 Hob: use HobNotebook to implement a notebook in build details page

In reply to Shane Wang

This patch is to use HobNotebook we defined to implement the notebook in the build details page.

---
 bitbake/lib/bb/ui/crumbs/builddetailspage.py |   30 ++++++++++--
 bitbake/lib/bb/ui/crumbs/runningbuild.py     |   65 ++++++++++++++++++++++++++
 2 files changed, 90 insertions(+), 5 deletions(-)
bitbake/lib/bb/ui/crumbs/builddetailspage.py +25 -5
index 8b75ca0..63d2c7b 100755
@@ -22,8 +22,10 @@
 
 import gtk
 from bb.ui.crumbs.progressbar import HobProgressBar
-from bb.ui.crumbs.hobwidget import hic
+from bb.ui.crumbs.hobwidget import hic, HobNotebook
 from bb.ui.crumbs.runningbuild import RunningBuildTreeView
+from bb.ui.crumbs.runningbuild import BuildConfigurationTreeView
+from bb.ui.crumbs.runningbuild import BuildFailureTreeView
 from bb.ui.crumbs.hobpages import HobPage
 
 #
@@ -49,11 +51,29 @@ class BuildDetailsPage (HobPage):
         self.stop_button.connect("clicked", self.stop_button_clicked_cb)
         self.progress_box.pack_end(self.stop_button, expand=False, fill=False)
 
+        self.notebook = HobNotebook()
+        self.config_tv = BuildConfigurationTreeView()
+        self.config_model = self.builder.handler.build.model.config_model()
+        self.config_tv.set_model(self.config_model)
+        self.scrolled_view_config = gtk.ScrolledWindow ()
+        self.scrolled_view_config.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        self.scrolled_view_config.add(self.config_tv)
+        self.notebook.append_page(self.scrolled_view_config, gtk.Label("Build Configuration"))
+
+        self.failure_tv = BuildFailureTreeView()
+        self.failure_model = self.builder.handler.build.model.failure_model()
+        self.failure_tv.set_model(self.failure_model)
+        self.scrolled_view_failure = gtk.ScrolledWindow ()
+        self.scrolled_view_failure.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        self.scrolled_view_failure.add(self.failure_tv)
+        self.notebook.append_page(self.scrolled_view_failure, gtk.Label("Issues"))
+
         self.build_tv = RunningBuildTreeView(readonly=True)
         self.build_tv.set_model(self.builder.handler.build.model)
-        self.scrolled_view = gtk.ScrolledWindow ()
-        self.scrolled_view.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-        self.scrolled_view.add(self.build_tv)
+        self.scrolled_view_build = gtk.ScrolledWindow ()
+        self.scrolled_view_build.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        self.scrolled_view_build.add(self.build_tv)
+        self.notebook.append_page(self.scrolled_view_build, gtk.Label("Log"))
 
         self.button_box = gtk.HBox(False, 6)
         self.back_button = gtk.LinkButton("Go back to Image Configuration screen", "<< Back to image configuration")
@@ -86,7 +106,7 @@ class BuildDetailsPage (HobPage):
         self.progress_bar.reset()
         self.vbox.pack_start(self.progress_box, expand=False, fill=False)
 
-        self.vbox.pack_start(self.scrolled_view, expand=True, fill=True)
+        self.vbox.pack_start(self.notebook, expand=True, fill=True)
 
         self.box_group_area.pack_end(self.button_box, expand=False, fill=False)
         self.show_all()
bitbake/lib/bb/ui/crumbs/runningbuild.py +65 -0

80 lines not on this page · raw message

Signature · 1 line
1.7.6
author
#7 lore raw

PATCH v4 7/11 Hob: Fixed the hobwidget code and make it like a pythonista

In reply to Shane Wang

From: Liming An <[email protected]>

fixed the 'for..in..' range dance code, and use the 'iterator' approach to replaced the index for quote the 'children' list

---
 bitbake/lib/bb/ui/crumbs/hobwidget.py |   63 ++++++++++++++++++---------------
 1 files changed, 34 insertions(+), 29 deletions(-)
bitbake/lib/bb/ui/crumbs/hobwidget.py +34 -29
index 71f0629..4c4b059 100644
@@ -309,7 +309,7 @@ class HobTabBar(gtk.DrawingArea):
         self.tab_h_ratio = 52 * 1.0/53
         self.set_size_request(self.width, self.height)
 
-        self.current_child = 0
+        self.current_child = None
         self.font = self.get_style().font_desc
         self.font.set_size(pango.SCALE * 13) 
         self.update_children_text_layout_and_bg_color()
@@ -339,10 +339,10 @@ class HobTabBar(gtk.DrawingArea):
         if self.is_focus() or event.type == gtk.gdk.BUTTON_PRESS:
             x, y = event.get_coords()
             # check which tab be clicked
-            for i, child in enumerate(self.children):
+            for child in self.children:
                if      (child["x"] < x) and (x < child["x"] + self.tab_width) \
                    and (child["y"] < y) and (y < child["y"] + self.tab_height):
-                   self.current_child = i
+                   self.current_child = child
                    result = True
                    break
 
@@ -353,7 +353,7 @@ class HobTabBar(gtk.DrawingArea):
                    self.grab_focus()
 
         if result == True:
-            page = self.children[self.current_child]["toggled_page"]
+            page = self.current_child["toggled_page"]
             self.emit("tab-switched", page)
             self.tab_pressed = True
             self.queue_draw()
@@ -383,16 +383,16 @@ class HobTabBar(gtk.DrawingArea):
             pangolayout = self.create_pango_layout(child["title"])
             pangolayout.set_font_description(self.font)
             child["title_layout"] = pangolayout
-            child[i]["r"] = color.red
-            child[i]["g"] = color.green
-            child[i]["b"] = color.blue
+            child["r"] = color.red
+            child["g"] = color.green
+            child["b"] = color.blue
 
     def append_tab_child(self, title, page):
         num = len(self.children) + 1
         self.tab_width = self.tab_width * len(self.children) / num
 
         i = 0
-        for child in self.children:
+        for i, child in enumerate(self.children):
             child["x"] = self.tab_x + i * self.tab_width
             i += 1
 
@@ -414,6 +414,9 @@ class HobTabBar(gtk.DrawingArea):
             "indicator_number" : 0,
         }
         self.children.append(new_one)
+        # set the default current child
+        if not self.current_child:
+            self.current_child = new_one
 
     def on_draw(self, widget, event):
         cr = widget.window.cairo_create()
@@ -425,11 +428,12 @@ class HobTabBar(gtk.DrawingArea):
 
         self.draw_background(cr)
         self.draw_toggled_tab(cr)
-        self.draw_tab_text(cr)
 
-        for i, child in enumerate(self.children):
+        for child in self.children:
             if child["indicator_show"] == True:
-                self.draw_indicator(cr, i)
+                self.draw_indicator(cr, child)
+
+        self.draw_tab_text(cr)
 
     def draw_background(self, cr):
         style = self.get_style()
@@ -476,14 +480,15 @@ class HobTabBar(gtk.DrawingArea):
                 # center pos
                 off_x = (self.tab_width - fontw) / 2
                 off_y = (self.tab_height - fonth) / 2
-                x = child[i]["x"] + off_x
-                y = child[i]["y"] + off_y
+                x = child["x"] + off_x
+                y = child["y"] + off_y
                 self.window.draw_layout(self.style.fg_gc[gtk.STATE_NORMAL], int(x), int(y), pangolayout)
 
     def draw_toggled_tab(self, cr):
-        i = self.current_child
-        x = self.children[i]["x"]
-        y = self.children[i]["y"]
+        if not self.current_child:
+            return
+        x = self.current_child["x"]
+        y = self.current_child["y"]
         width = self.tab_width
         height = self.tab_height
         style = self.get_style()
@@ -515,10 +520,10 @@ class HobTabBar(gtk.DrawingArea):
         cr.arc(x + r, y + r, r, math.pi, 1.5*math.pi)
         cr.fill()
 
-    def draw_indicator(self, cr, i):
-        tab_x = self.children[i]["x"]
-        tab_y = self.children[i]["y"]
-        number = self.children[i]["indicator_number"]
+    def draw_indicator(self, cr, child):
+        tab_x = child["x"]
+        tab_y = child["y"]
+        number = child["indicator_number"]
         dest_w = int(32 * self.tab_w_ratio)
         dest_h = int(32 * self.tab_h_ratio)
         if dest_h < self.tab_height:
@@ -541,13 +546,13 @@ class HobTabBar(gtk.DrawingArea):
         cr.move_to(x, y)
         self.window.draw_layout(self.style.fg_gc[gtk.STATE_NORMAL], int(x), int(y), layout)
 
-    def show_indicator_icon(self, i, number):
-        self.children[i]["indicator_show"] = True
-        self.children[i]["indicator_number"] = number
+    def show_indicator_icon(self, child, number):
+        child["indicator_show"] = True
+        child["indicator_number"] = number
         self.queue_draw()
 
-    def hide_indicator_icon(self, i):
-        self.children[i]["indicator_show"] = False
+    def hide_indicator_icon(self, child):
+        child["indicator_show"] = False
         self.queue_draw()
 
     def set_blank_size(self, x, y, w, h):
@@ -618,18 +623,18 @@ class HobNotebook(gtk.VBox):
         self.tb.show()
 
     def show_indicator_icon(self, title, number):
-        for i, child in enumerate(self.tabbar.children):
+        for child in self.tabbar.children:
             if child["toggled_page"] == -1:
                 continue
             if child["title"] == title:
-                self.tabbar.show_indicator_icon(i, number)
+                self.tabbar.show_indicator_icon(child, number)
 
     def hide_indicator_icon(self, title):
-        for i, child in enumerate(self.tabbar.children):
+        for child in self.tabbar.children:
             if child["toggled_page"] == -1:
                 continue
             if child["title"] == title:
-                self.tabbar.hide_indicator_icon(i)
+                self.tabbar.hide_indicator_icon(child)
 
     def tab_switched_cb(self, widget, page):
         self.notebook.set_current_page(page)
Signature · 1 line
1.7.6
author
#8 lore raw

PATCH v4 8/11 Hob: add auto adjust background area function for long issue text

In reply to Shane Wang

From: Liming An <[email protected]>

To add auto expand the background area function for long issue text input.

---
 bitbake/lib/bb/ui/crumbs/hobwidget.py |   30 +++++++++++++++++++++---------
 1 files changed, 21 insertions(+), 9 deletions(-)
bitbake/lib/bb/ui/crumbs/hobwidget.py +21 -9
index 4c4b059..bc27cd1 100644
@@ -521,26 +521,38 @@ class HobTabBar(gtk.DrawingArea):
         cr.fill()
 
     def draw_indicator(self, cr, child):
+        text = ("%d" % child["indicator_number"])
+        layout = self.create_pango_layout(text)
+        layout.set_font_description(self.font)
+        textw, texth = layout.get_pixel_size()
+        # draw the back round area
         tab_x = child["x"]
         tab_y = child["y"]
-        number = child["indicator_number"]
         dest_w = int(32 * self.tab_w_ratio)
         dest_h = int(32 * self.tab_h_ratio)
         if dest_h < self.tab_height:
             dest_w = dest_h
-
         # x position is offset(tab_width*3/4 - icon_width/2) + start_pos(tab_x)
         x = tab_x + self.tab_width * 3/4 - dest_w/2
         y = tab_y + self.tab_height/2 - dest_h/2
+
         r = min(dest_w, dest_h)/2
         color = cr.set_source_color(gtk.gdk.color_parse(HobColors.ORANGE))
-        cr.arc(x + r, y + r, r, 0, 2*math.pi)
-        cr.fill()
-
-        text = ("%d" % number)
-        layout = self.create_pango_layout(text)
-        layout.set_font_description(self.font)
-        textw, texth = layout.get_pixel_size()
+        # check round back area can contain the text or not
+        back_round_can_contain_width = float(2 * r * 0.707)
+        if float(textw) > back_round_can_contain_width:
+            xoff = (textw - int(back_round_can_contain_width)) / 2
+            cr.move_to(x + r - xoff, y + r + r)
+            cr.arc((x + r - xoff), (y + r), r, 0.5*math.pi, 1.5*math.pi)
+            cr.fill() # left half round
+            cr.rectangle((x + r - xoff), y, 2 * xoff, 2 * r)
+            cr.fill() # center rectangle
+            cr.arc((x + r + xoff), (y + r), r, 1.5*math.pi, 0.5*math.pi)
+            cr.fill() # right half round
+        else:
+            cr.arc((x + r), (y + r), r, 0, 2*math.pi)
+            cr.fill()
+        # draw the number text
         x = x + (dest_w/2)-(textw/2)
         y = y + (dest_h/2) - (texth/2)
         cr.move_to(x, y)
Signature · 1 line
1.7.6
author
#9 lore raw

PATCH v4 9/11 Hob: change HobNoteBook tab edge color from green to gray

In reply to Shane Wang

From: Liming An <[email protected]>

To change the notebook tab pressed edge color from green to gray.

---
 bitbake/lib/bb/ui/crumbs/hobcolor.py  |    2 ++
 bitbake/lib/bb/ui/crumbs/hobwidget.py |   13 ++++++++-----
 2 files changed, 10 insertions(+), 5 deletions(-)
bitbake/lib/bb/ui/crumbs/hobcolor.py +2 -0
index 402f022..f767d22 100644
@@ -25,6 +25,8 @@ class HobColors:
     PALE_RED     = "#ffaaaa"
     GRAY         = "#aaaaaa"
     LIGHT_GRAY   = "#dddddd"
+    DEEP_GRAY    = "#7c7c77"
+    SLIGHT_DARK  = "#5f5f5f"
     DARK         = "#3c3b37"
     BLACK        = "#000000"
     LIGHT_ORANGE = "#f7a787"
bitbake/lib/bb/ui/crumbs/hobwidget.py +8 -5
index bc27cd1..a5c52f7 100644
@@ -496,16 +496,19 @@ class HobTabBar(gtk.DrawingArea):
 
         r = height / 10
         if self.tab_pressed == True:
-            for xoff, yoff in [(1, 0), (2, 0)]:
-                cr.set_source_color(gtk.gdk.color_parse(HobColors.PALE_GREEN))
+            for xoff, yoff, c1, c2 in [(1, 0, HobColors.SLIGHT_DARK, HobColors.DARK), (2, 0, HobColors.GRAY, HobColors.LIGHT_GRAY)]:
+                cr.set_source_color(gtk.gdk.color_parse(c1))
+                cr.move_to(x + xoff, y + height + yoff)
+                cr.line_to(x + xoff, r + yoff)
+                cr.arc(x + r + xoff, y + r + yoff, r, math.pi, 1.5*math.pi)
                 cr.move_to(x + r + xoff, y + yoff)
                 cr.line_to(x + width - r + xoff, y + yoff)
-                cr.arc(x + width - r+ xoff, y + r + yoff, r, 1.5*math.pi, 2*math.pi)
+                cr.arc(x + width - r + xoff, y + r + yoff, r, 1.5*math.pi, 2*math.pi)
+                cr.stroke()
+                cr.set_source_color(gtk.gdk.color_parse(c2))
                 cr.move_to(x + width + xoff, r + yoff)
                 cr.line_to(x + width + xoff, y + height + yoff)
                 cr.line_to(x + xoff, y + height + yoff)
-                cr.line_to(x + xoff, r + yoff)
-                cr.arc(x + r + xoff, y + r + yoff, r, math.pi, 1.5*math.pi)
                 cr.stroke()
             x = x + 2
             y = y + 2
Signature · 1 line
1.7.6
author
#10 lore raw

PATCH v4 10/11 Hob: fix static variable "self.search" to parameter "search" in signal callback function

In reply to Shane Wang

From: Liming An <[email protected]>

To fix the signal callback function code, and make the temp parameter to replaced the static global variable, as required.

---
 bitbake/lib/bb/ui/crumbs/hobwidget.py |   31 ++++++++++++++-----------------
 1 files changed, 14 insertions(+), 17 deletions(-)
bitbake/lib/bb/ui/crumbs/hobwidget.py +14 -17
index a5c52f7..0bb83d7 100644
@@ -673,20 +673,17 @@ class HobNotebook(gtk.VBox):
 
     def blank_area_resize_cb(self, widget, request_x, request_y, request_width, request_height):
         self.search.set_size_request(request_width, request_height)
-        widget.modify_bg(gtk.STATE_SELECTED, gtk.gdk.color_parse(HobColors.YELLOW))
-
-    def set_search_entry_editable_cb(self, widget, event):
-        if self.search:
-            self.search.set_editable(True)
-            self.search.set_text("")
-            style = self.search.get_style()
-            style.text[gtk.STATE_NORMAL] = self.get_colormap().alloc_color(HobColors.BLACK, False, False)
-            self.search.set_style(style)
-
-    def set_search_entry_reset_cb(self, widget, event):
-        if self.search:
-            style = self.search.get_style()
-            style.text[gtk.STATE_NORMAL] = self.get_colormap().alloc_color(HobColors.GRAY, False, False)
-            self.search.set_style(style)
-            self.search.set_text(self.search_name)
-            self.search.set_editable(False)
+
+    def set_search_entry_editable_cb(self, search, event):
+        search.set_editable(True)
+        search.set_text("")
+        style = self.search.get_style()
+        style.text[gtk.STATE_NORMAL] = self.get_colormap().alloc_color(HobColors.BLACK, False, False)
+        search.set_style(style)
+
+    def set_search_entry_reset_cb(self, search, event):
+        style = search.get_style()
+        style.text[gtk.STATE_NORMAL] = self.get_colormap().alloc_color(HobColors.GRAY, False, False)
+        search.set_style(style)
+        search.set_text(self.search_name)
+        search.set_editable(False)
Signature · 1 line
1.7.6
author
#11 lore raw

PATCH v4 11/11 Hob: fixed the tabbar search entry retaining focus when user has clicked off it issue

In reply to Shane Wang

From: Liming An <[email protected]>

Add reset focus code to fixed the search entry retaining focus issue

---
 bitbake/lib/bb/ui/crumbs/hobwidget.py |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
bitbake/lib/bb/ui/crumbs/hobwidget.py +1 -0
index 0bb83d7..4b0a0cf 100644
@@ -344,6 +344,7 @@ class HobTabBar(gtk.DrawingArea):
                    and (child["y"] < y) and (y < child["y"] + self.tab_height):
                    self.current_child = child
                    result = True
+                   self.grab_focus()
                    break
 
             # check the blank area is focus in or not
Signature · 1 line
1.7.6
#12 lore raw
In reply to Shane Wang
Quoted 10 lines · Shane Wang

This patchset is
- to implement Hob self-defined notebook, and use it in the build details page.
- to clean up the code per the comments from the community.
(In order to make it readable, we did them in separate patches)

Compared with V3 version, this version temporarily removed the patches for
- to improve the build log with the animation of the refresh icon.
- to add proxy support in the Settings dialog.

Because the updated patches are not ready so far per the comments from the community.

Merged to master, thanks!

Richard

#13 lore raw

See them. Thanks.

--
Shane

Richard Purdie wrote on 2012-03-20:

Quoted 16 lines · Shane Wang
Quoted 6 lines

This patchset is
- to implement Hob self-defined notebook, and use it in the build details page. - to clean up the code per the comments from the community.
(In order to make it readable, we did them in separate patches)
Compared with V3 version, this version temporarily removed the patches

for

Quoted 3 lines

- to improve the build log with the animation of the refresh icon.
- to add proxy support in the Settings dialog.
Because the updated patches are not ready so far per the comments from

the community.

Merged to master, thanks!

Richard