diff options
| -rw-r--r-- | bitbake/lib/bb/ui/crumbs/hig.py | 122 |
1 files changed, 93 insertions, 29 deletions
diff --git a/bitbake/lib/bb/ui/crumbs/hig.py b/bitbake/lib/bb/ui/crumbs/hig.py index bc37d90a46..6b46a6212a 100644 --- a/bitbake/lib/bb/ui/crumbs/hig.py +++ b/bitbake/lib/bb/ui/crumbs/hig.py | |||
| @@ -696,6 +696,27 @@ class DeployImageDialog (CrumbsDialog): | |||
| 696 | os.close(f_from) | 696 | os.close(f_from) |
| 697 | os.close(f_to) | 697 | os.close(f_to) |
| 698 | self.progress_bar.hide() | 698 | self.progress_bar.hide() |
| 699 | |||
| 700 | class CellRendererPixbufActivatable(gtk.CellRendererPixbuf): | ||
| 701 | """ | ||
| 702 | A custom CellRenderer implementation which is activatable | ||
| 703 | so that we can handle user clicks | ||
| 704 | """ | ||
| 705 | __gsignals__ = { 'clicked' : (gobject.SIGNAL_RUN_LAST, | ||
| 706 | gobject.TYPE_NONE, | ||
| 707 | (gobject.TYPE_STRING,)), } | ||
| 708 | |||
| 709 | def __init__(self): | ||
| 710 | gtk.CellRendererPixbuf.__init__(self) | ||
| 711 | self.set_property('mode', gtk.CELL_RENDERER_MODE_ACTIVATABLE) | ||
| 712 | self.set_property('follow-state', True) | ||
| 713 | |||
| 714 | """ | ||
| 715 | Respond to a user click on a cell | ||
| 716 | """ | ||
| 717 | def do_activate(self, even, widget, path, background_area, cell_area, flags): | ||
| 718 | self.emit('clicked', path) | ||
| 719 | |||
| 699 | # | 720 | # |
| 700 | # LayerSelectionDialog | 721 | # LayerSelectionDialog |
| 701 | # | 722 | # |
| @@ -762,13 +783,13 @@ class LayerSelectionDialog (CrumbsDialog): | |||
| 762 | layer_tv.set_rules_hint(True) | 783 | layer_tv.set_rules_hint(True) |
| 763 | layer_tv.set_headers_visible(False) | 784 | layer_tv.set_headers_visible(False) |
| 764 | tree_selection = layer_tv.get_selection() | 785 | tree_selection = layer_tv.get_selection() |
| 765 | tree_selection.set_mode(gtk.SELECTION_SINGLE) | 786 | tree_selection.set_mode(gtk.SELECTION_NONE) |
| 766 | 787 | ||
| 767 | col0= gtk.TreeViewColumn('Path') | 788 | col0= gtk.TreeViewColumn('Path') |
| 768 | cell0 = gtk.CellRendererText() | 789 | cell0 = gtk.CellRendererText() |
| 769 | cell0.set_padding(5,2) | 790 | cell0.set_padding(5,2) |
| 770 | col0.pack_start(cell0, True) | 791 | col0.pack_start(cell0, True) |
| 771 | col0.set_attributes(cell0, text=0) | 792 | col0.set_cell_data_func(cell0, self.draw_layer_path_cb) |
| 772 | layer_tv.append_column(col0) | 793 | layer_tv.append_column(col0) |
| 773 | 794 | ||
| 774 | scroll = gtk.ScrolledWindow() | 795 | scroll = gtk.ScrolledWindow() |
| @@ -785,18 +806,33 @@ class LayerSelectionDialog (CrumbsDialog): | |||
| 785 | for layer in layers: | 806 | for layer in layers: |
| 786 | layer_store.set(layer_store.append(), 0, layer) | 807 | layer_store.set(layer_store.append(), 0, layer) |
| 787 | 808 | ||
| 788 | image = gtk.Image() | 809 | col1 = gtk.TreeViewColumn('Enabled') |
| 789 | image.set_from_stock(gtk.STOCK_ADD,gtk.ICON_SIZE_MENU) | 810 | layer_tv.append_column(col1) |
| 790 | add_button = gtk.Button() | 811 | |
| 791 | add_button.set_image(image) | 812 | cell1 = CellRendererPixbufActivatable() |
| 813 | cell1.set_fixed_size(-1,35) | ||
| 814 | cell1.connect("clicked", self.del_cell_clicked_cb, layer_store) | ||
| 815 | col1.pack_start(cell1, True) | ||
| 816 | col1.set_cell_data_func(cell1, self.draw_delete_button_cb, layer_tv) | ||
| 817 | |||
| 818 | add_button = HobAltButton() | ||
| 819 | box = gtk.HBox(False, 6) | ||
| 820 | box.show() | ||
| 821 | add_button.add(box) | ||
| 822 | im = gtk.Image() | ||
| 823 | im.set_from_file(hic.ICON_INDI_ADD) | ||
| 824 | im.show() | ||
| 825 | box.pack_start(im, expand=False, fill=False, padding=6) | ||
| 826 | lbl = gtk.Label("Add layer") | ||
| 827 | lbl.set_alignment(0.0, 0.5) | ||
| 828 | lbl.show() | ||
| 829 | box.pack_start(lbl, expand=True, fill=True, padding=6) | ||
| 792 | add_button.connect("clicked", self.layer_widget_add_clicked_cb, layer_store, window) | 830 | add_button.connect("clicked", self.layer_widget_add_clicked_cb, layer_store, window) |
| 793 | table_layer.attach(add_button, 0, 5, 1, 2, gtk.EXPAND | gtk.FILL, 0, 0, 6) | 831 | add_button.set_can_default(True) |
| 794 | image = gtk.Image() | 832 | add_button.grab_default() |
| 795 | image.set_from_stock(gtk.STOCK_REMOVE,gtk.ICON_SIZE_MENU) | 833 | add_button.set_can_focus(True) |
| 796 | del_button = gtk.Button() | 834 | add_button.grab_focus() |
| 797 | del_button.set_image(image) | 835 | table_layer.attach(add_button, 0, 10, 1, 2, gtk.EXPAND | gtk.FILL, 0, 0, 6) |
| 798 | del_button.connect("clicked", self.layer_widget_del_clicked_cb, tree_selection, layer_store) | ||
| 799 | table_layer.attach(del_button, 5, 10, 1, 2, gtk.EXPAND | gtk.FILL, 0, 0, 6) | ||
| 800 | layer_tv.set_model(layer_store) | 836 | layer_tv.set_model(layer_store) |
| 801 | 837 | ||
| 802 | hbox.show_all() | 838 | hbox.show_all() |
| @@ -811,6 +847,11 @@ class LayerSelectionDialog (CrumbsDialog): | |||
| 811 | self.all_layers = all_layers | 847 | self.all_layers = all_layers |
| 812 | self.layers_changed = False | 848 | self.layers_changed = False |
| 813 | 849 | ||
| 850 | # icon for remove button in TreeView | ||
| 851 | im = gtk.Image() | ||
| 852 | im.set_from_file(hic.ICON_INDI_REMOVE) | ||
| 853 | self.rem_icon = im.get_pixbuf() | ||
| 854 | |||
| 814 | # class members for internal use | 855 | # class members for internal use |
| 815 | self.layer_store = None | 856 | self.layer_store = None |
| 816 | 857 | ||
| @@ -819,24 +860,9 @@ class LayerSelectionDialog (CrumbsDialog): | |||
| 819 | self.connect("response", self.response_cb) | 860 | self.connect("response", self.response_cb) |
| 820 | 861 | ||
| 821 | def create_visual_elements(self): | 862 | def create_visual_elements(self): |
| 822 | hbox_top = gtk.HBox() | ||
| 823 | self.vbox.pack_start(hbox_top, expand=False, fill=False) | ||
| 824 | |||
| 825 | label = self.gen_label_widget("<b>Select Layers:</b>") | ||
| 826 | hbox_top.pack_start(label, expand=False, fill=False) | ||
| 827 | |||
| 828 | tooltip = "Layer is a collection of bb files and conf files" | ||
| 829 | info = HobInfoButton(tooltip, self) | ||
| 830 | hbox_top.pack_end(info, expand=False, fill=False) | ||
| 831 | |||
| 832 | layer_widget, self.layer_store = self.gen_layer_widget(self.layers, self.all_layers, self, None) | 863 | layer_widget, self.layer_store = self.gen_layer_widget(self.layers, self.all_layers, self, None) |
| 833 | layer_widget.set_size_request(-1, 180) | 864 | layer_widget.set_size_request(450, 250) |
| 834 | self.vbox.pack_start(layer_widget, expand=True, fill=True) | 865 | self.vbox.pack_start(layer_widget, expand=True, fill=True) |
| 835 | |||
| 836 | label = self.gen_label_widget("<b>Note:</b> '<i>meta</i>' is the Core layer for Yocto images please do not remove it.") | ||
| 837 | label.show() | ||
| 838 | self.vbox.pack_end(label, expand=False, fill=False) | ||
| 839 | |||
| 840 | self.show_all() | 866 | self.show_all() |
| 841 | 867 | ||
| 842 | def response_cb(self, dialog, response_id): | 868 | def response_cb(self, dialog, response_id): |
| @@ -850,6 +876,44 @@ class LayerSelectionDialog (CrumbsDialog): | |||
| 850 | self.layers_changed = (self.layers != layers) | 876 | self.layers_changed = (self.layers != layers) |
| 851 | self.layers = layers | 877 | self.layers = layers |
| 852 | 878 | ||
| 879 | """ | ||
| 880 | A custom cell_data_func to draw a delete 'button' in the TreeView for layers | ||
| 881 | other than the meta layer. The deletion of which is prevented so that the | ||
| 882 | user can't shoot themselves in the foot too badly. | ||
| 883 | """ | ||
| 884 | def draw_delete_button_cb(self, col, cell, model, it, tv): | ||
| 885 | path = model.get_value(it, 0) | ||
| 886 | # Trailing slashes are uncommon in bblayers.conf but confuse os.path.basename | ||
| 887 | path.rstrip('/') | ||
| 888 | name = os.path.basename(path) | ||
| 889 | if name == "meta": | ||
| 890 | cell.set_sensitive(False) | ||
| 891 | cell.set_property('pixbuf', None) | ||
| 892 | cell.set_property('mode', gtk.CELL_RENDERER_MODE_INERT) | ||
| 893 | else: | ||
| 894 | cell.set_property('pixbuf', self.rem_icon) | ||
| 895 | cell.set_sensitive(True) | ||
| 896 | cell.set_property('mode', gtk.CELL_RENDERER_MODE_ACTIVATABLE) | ||
| 897 | |||
| 898 | return True | ||
| 899 | |||
| 900 | """ | ||
| 901 | A custom cell_data_func to write an extra message into the layer path cell | ||
| 902 | for the meta layer. We should inform the user that they can't remove it for | ||
| 903 | their own safety. | ||
| 904 | """ | ||
| 905 | def draw_layer_path_cb(self, col, cell, model, it): | ||
| 906 | path = model.get_value(it, 0) | ||
| 907 | name = os.path.basename(path) | ||
| 908 | if name == "meta": | ||
| 909 | cell.set_property('markup', "<b>Core layer for images: it cannot be removed</b>\n%s" % path) | ||
| 910 | else: | ||
| 911 | cell.set_property('text', path) | ||
| 912 | |||
| 913 | def del_cell_clicked_cb(self, cell, path, model): | ||
| 914 | it = model.get_iter_from_string(path) | ||
| 915 | model.remove(it) | ||
| 916 | |||
| 853 | class ImageSelectionDialog (CrumbsDialog): | 917 | class ImageSelectionDialog (CrumbsDialog): |
| 854 | 918 | ||
| 855 | __columns__ = [{ | 919 | __columns__ = [{ |
