summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/ui/crumbs/hobwidget.py
diff options
context:
space:
mode:
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)