summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/ui/crumbs/hobwidget.py
diff options
context:
space:
mode:
authorLiming An <limingx.l.an@intel.com>2012-03-23 22:29:46 +0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2012-03-28 16:49:18 +0100
commit673a8f44c55c503a6f4e68c2586685641ca7d74e (patch)
tree1ac475f5c5ec9984471d387c347cbae30c08b623 /bitbake/lib/bb/ui/crumbs/hobwidget.py
parentceee95efb1590b63a397bc680f1391d4c494fdd9 (diff)
downloadpoky-673a8f44c55c503a6f4e68c2586685641ca7d74e.tar.gz
Hob: add refresh icon as ui request in building log
add a refresh icon to indicator the running task, for avoid add more heavy to bitbake building process, increased the timer interval counter, and decreased the refresh icon render size. (From Poky rev: cf76d2cef0905a442e61769560173b2e6a58fb62) (Bitbake rev: d5923a484f80bc1577f78035152c2d0728e4a1f3) Signed-off-by: Liming An <limingx.l.an@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/ui/crumbs/hobwidget.py')
-rw-r--r--bitbake/lib/bb/ui/crumbs/hobwidget.py169
1 files changed, 169 insertions, 0 deletions
diff --git a/bitbake/lib/bb/ui/crumbs/hobwidget.py b/bitbake/lib/bb/ui/crumbs/hobwidget.py
index 8936f0a42a..e2247622fa 100644
--- a/bitbake/lib/bb/ui/crumbs/hobwidget.py
+++ b/bitbake/lib/bb/ui/crumbs/hobwidget.py
@@ -57,6 +57,7 @@ class hic:
57 ICON_INDI_REMOVE_HOVER_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/remove-hover.png')) 57 ICON_INDI_REMOVE_HOVER_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/remove-hover.png'))
58 ICON_INDI_ADD_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/add.png')) 58 ICON_INDI_ADD_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/add.png'))
59 ICON_INDI_ADD_HOVER_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/add-hover.png')) 59 ICON_INDI_ADD_HOVER_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/add-hover.png'))
60 ICON_INDI_REFRESH_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/refresh.png'))
60 61
61class hcc: 62class hcc:
62 63
@@ -793,3 +794,171 @@ class HobWarpCellRendererText(gtk.CellRendererText):
793 return adjwidth 794 return adjwidth
794 795
795gobject.type_register(HobWarpCellRendererText) 796gobject.type_register(HobWarpCellRendererText)
797
798class RefreshRuningController(gobject.GObject):
799 def __init__(self, widget=None, iter=None):
800 gobject.GObject.__init__(self)
801 self.timeout_id = None
802 self.current_angle_pos = 0.0
803 self.step_angle = 0.0
804 self.tree_headers_height = 0
805 self.running_cell_areas = []
806
807 def is_active(self):
808 if self.timeout_id:
809 return True
810 else:
811 return False
812
813 def reset(self):
814 self.force_stop(True)
815 self.current_angle_pos = 0.0
816 self.timeout_id = None
817 self.step_angle = 0.0
818
819 ''' time_iterval: (1~1000)ms, which will be as the basic interval count for timer
820 init_usrdata: the current data which related the progress-bar will be at
821 min_usrdata: the range of min of user data
822 max_usrdata: the range of max of user data
823 step: each step which you want to progress
824 Note: the init_usrdata should in the range of from min to max, and max should > min
825 step should < (max - min)
826 '''
827 def start_run(self, time_iterval, init_usrdata, min_usrdata, max_usrdata, step, tree):
828 if (not time_iterval) or (not max_usrdata):
829 return
830 usr_range = (max_usrdata - min_usrdata) * 1.0
831 self.current_angle_pos = (init_usrdata * 1.0) / usr_range
832 self.step_angle = (step * 1) / usr_range
833 self.timeout_id = gobject.timeout_add(int(time_iterval),
834 self.make_image_on_progressing_cb, tree)
835 self.tree_headers_height = self.get_treeview_headers_height(tree)
836
837 def force_stop(self, after_hide_or_not=False):
838 if self.timeout_id:
839 gobject.source_remove(self.timeout_id)
840 self.timeout_id = None
841 if self.running_cell_areas:
842 self.running_cell_areas = []
843
844 def on_draw_cb(self, pixbuf, cr, x, y, img_width, img_height, do_refresh=True):
845 if pixbuf:
846 r = max(img_width/2, img_height/2)
847 cr.translate(x + r, y + r)
848 if do_refresh:
849 cr.rotate(2 * math.pi * self.current_angle_pos)
850
851 cr.set_source_pixbuf(pixbuf, -img_width/2, -img_height/2)
852 cr.paint()
853
854 def get_treeview_headers_height(self, tree):
855 if tree and (tree.get_property("headers-visible") == True):
856 height = tree.get_allocation().height - tree.get_bin_window().get_size()[1]
857 return height
858
859 return 0
860
861 def make_image_on_progressing_cb(self, tree):
862 self.current_angle_pos += self.step_angle
863 if (self.current_angle_pos >= 1):
864 self.current_angle_pos = self.step_angle
865
866 for rect in self.running_cell_areas:
867 tree.queue_draw_area(rect.x, rect.y + self.tree_headers_height, rect.width, rect.height)
868
869 return True
870
871 def append_running_cell_area(self, cell_area):
872 if cell_area and (cell_area not in self.running_cell_areas):
873 self.running_cell_areas.append(cell_area)
874
875 def remove_running_cell_area(self, cell_area):
876 if cell_area in self.running_cell_areas:
877 self.running_cell_areas.remove(cell_area)
878 if not self.running_cell_areas:
879 self.reset()
880
881gobject.type_register(RefreshRuningController)
882
883class HobCellRendererPixbuf(gtk.CellRendererPixbuf):
884 def __init__(self):
885 gtk.CellRendererPixbuf.__init__(self)
886 self.control = RefreshRuningController()
887 # create default refrensh stock icon
888 self.set_hob_icon_to_stock_icon(hic.ICON_INDI_REFRESH_FILE, "task-refresh")
889
890 def set_hob_icon_to_stock_icon(self, file_path, stock_id=""):
891 try:
892 pixbuf = gtk.gdk.pixbuf_new_from_file(file_path)
893 except Exception, e:
894 return None
895
896 if pixbuf and stock_id and (gtk.icon_factory_lookup_default(stock_id) == None):
897 icon_factory = gtk.IconFactory()
898 icon_factory.add_default()
899 icon_factory.add(stock_id, gtk.IconSet(pixbuf))
900 gtk.stock_add([(stock_id, '_label', 0, 0, '')])
901
902 return icon_factory.lookup(stock_id)
903
904 return None
905
906 def get_pixbuf_from_stock_icon(self, widget, stock_id="", size=gtk.ICON_SIZE_DIALOG):
907 if widget and stock_id and gtk.icon_factory_lookup_default(stock_id):
908 return widget.render_icon(stock_id, size)
909
910 return None
911
912 def set_icon_name_to_id(self, name):
913 if name and type(name) == str:
914 if name.startswith("gtk") or name == "task-refresh":
915 stock_id = name
916 else:
917 stock_id = 'gtk-' + name
918
919 return stock_id
920
921 ''' render cell exactly, "icon-name" is priority
922 if use the 'task-refresh' will make the pix animation
923 if 'pix' will change the pixbuf for it from the pixbuf or image.
924 '''
925 def do_render(self, window, tree, background_area,cell_area, expose_area, flags):
926 if (not self.control) or (not tree):
927 return
928
929 x, y, w, h = self.on_get_size(tree, cell_area)
930 x += cell_area.x
931 y += cell_area.y
932 w -= 2 * self.get_property("xpad")
933 h -= 2 * self.get_property("ypad")
934
935 stock_id = ""
936 if self.props.icon_name:
937 stock_id = self.set_icon_name_to_id(self.props.icon_name)
938 elif self.props.stock_id:
939 stock_id = self.props.stock_id
940 elif self.props.pixbuf:
941 pix = self.props.pixbuf
942 else:
943 return
944
945 if stock_id:
946 pix = self.get_pixbuf_from_stock_icon(tree, stock_id, self.props.stock_size)
947 if stock_id == 'task-refresh':
948 self.control.append_running_cell_area(cell_area)
949 if self.control.is_active():
950 self.control.on_draw_cb(pix, window.cairo_create(), x, y, w, h, True)
951 else:
952 self.control.start_run(200, 0, 0, 1000, 200, tree)
953 else:
954 self.control.remove_running_cell_area(cell_area)
955 self.control.on_draw_cb(pix, window.cairo_create(), x, y, w, h, False)
956
957 def on_get_size(self, widget, cell_area):
958 if self.props.icon_name or self.props.pixbuf or self.props.stock_id:
959 w, h = gtk.icon_size_lookup(self.props.stock_size)
960 return 0, 0, w, h
961
962 return 0, 0, 0, 0
963
964gobject.type_register(HobCellRendererPixbuf)