diff options
Diffstat (limited to 'bitbake/lib/bb/ui/crumbs/hig/imageselectiondialog.py')
-rw-r--r-- | bitbake/lib/bb/ui/crumbs/hig/imageselectiondialog.py | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/bitbake/lib/bb/ui/crumbs/hig/imageselectiondialog.py b/bitbake/lib/bb/ui/crumbs/hig/imageselectiondialog.py new file mode 100644 index 0000000000..17f6bffe00 --- /dev/null +++ b/bitbake/lib/bb/ui/crumbs/hig/imageselectiondialog.py | |||
@@ -0,0 +1,172 @@ | |||
1 | # | ||
2 | # BitBake Graphical GTK User Interface | ||
3 | # | ||
4 | # Copyright (C) 2011-2012 Intel Corporation | ||
5 | # | ||
6 | # Authored by Joshua Lock <josh@linux.intel.com> | ||
7 | # Authored by Dongxiao Xu <dongxiao.xu@intel.com> | ||
8 | # Authored by Shane Wang <shane.wang@intel.com> | ||
9 | # | ||
10 | # This program is free software; you can redistribute it and/or modify | ||
11 | # it under the terms of the GNU General Public License version 2 as | ||
12 | # published by the Free Software Foundation. | ||
13 | # | ||
14 | # This program is distributed in the hope that it will be useful, | ||
15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | # GNU General Public License for more details. | ||
18 | # | ||
19 | # You should have received a copy of the GNU General Public License along | ||
20 | # with this program; if not, write to the Free Software Foundation, Inc., | ||
21 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
22 | |||
23 | import gtk | ||
24 | import gobject | ||
25 | import os | ||
26 | from bb.ui.crumbs.hobwidget import HobViewTable, HobInfoButton, HobButton, HobAltButton | ||
27 | from bb.ui.crumbs.hig.crumbsdialog import CrumbsDialog | ||
28 | from bb.ui.crumbs.hig.layerselectiondialog import LayerSelectionDialog | ||
29 | |||
30 | """ | ||
31 | The following are convenience classes for implementing GNOME HIG compliant | ||
32 | BitBake GUI's | ||
33 | In summary: spacing = 12px, border-width = 6px | ||
34 | """ | ||
35 | |||
36 | class ImageSelectionDialog (CrumbsDialog): | ||
37 | |||
38 | __columns__ = [{ | ||
39 | 'col_name' : 'Image name', | ||
40 | 'col_id' : 0, | ||
41 | 'col_style': 'text', | ||
42 | 'col_min' : 400, | ||
43 | 'col_max' : 400 | ||
44 | }, { | ||
45 | 'col_name' : 'Select', | ||
46 | 'col_id' : 1, | ||
47 | 'col_style': 'radio toggle', | ||
48 | 'col_min' : 160, | ||
49 | 'col_max' : 160 | ||
50 | }] | ||
51 | |||
52 | |||
53 | def __init__(self, image_folder, image_types, title, parent, flags, buttons=None, image_extension = {}): | ||
54 | super(ImageSelectionDialog, self).__init__(title, parent, flags, buttons) | ||
55 | self.connect("response", self.response_cb) | ||
56 | |||
57 | self.image_folder = image_folder | ||
58 | self.image_types = image_types | ||
59 | self.image_list = [] | ||
60 | self.image_names = [] | ||
61 | self.image_extension = image_extension | ||
62 | |||
63 | # create visual elements on the dialog | ||
64 | self.create_visual_elements() | ||
65 | |||
66 | self.image_store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_BOOLEAN) | ||
67 | self.fill_image_store() | ||
68 | |||
69 | def create_visual_elements(self): | ||
70 | hbox = gtk.HBox(False, 6) | ||
71 | |||
72 | self.vbox.pack_start(hbox, expand=False, fill=False) | ||
73 | |||
74 | entry = gtk.Entry() | ||
75 | entry.set_text(self.image_folder) | ||
76 | table = gtk.Table(1, 10, True) | ||
77 | table.set_size_request(560, -1) | ||
78 | hbox.pack_start(table, expand=False, fill=False) | ||
79 | table.attach(entry, 0, 9, 0, 1) | ||
80 | image = gtk.Image() | ||
81 | image.set_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON) | ||
82 | open_button = gtk.Button() | ||
83 | open_button.set_image(image) | ||
84 | open_button.connect("clicked", self.select_path_cb, self, entry) | ||
85 | table.attach(open_button, 9, 10, 0, 1) | ||
86 | |||
87 | self.image_table = HobViewTable(self.__columns__) | ||
88 | self.image_table.set_size_request(-1, 300) | ||
89 | self.image_table.connect("toggled", self.toggled_cb) | ||
90 | self.image_table.connect_group_selection(self.table_selected_cb) | ||
91 | self.image_table.connect("row-activated", self.row_actived_cb) | ||
92 | self.vbox.pack_start(self.image_table, expand=True, fill=True) | ||
93 | |||
94 | self.show_all() | ||
95 | |||
96 | def change_image_cb(self, model, path, columnid): | ||
97 | if not model: | ||
98 | return | ||
99 | iter = model.get_iter_first() | ||
100 | while iter: | ||
101 | rowpath = model.get_path(iter) | ||
102 | model[rowpath][columnid] = False | ||
103 | iter = model.iter_next(iter) | ||
104 | |||
105 | model[path][columnid] = True | ||
106 | |||
107 | def toggled_cb(self, table, cell, path, columnid, tree): | ||
108 | model = tree.get_model() | ||
109 | self.change_image_cb(model, path, columnid) | ||
110 | |||
111 | def table_selected_cb(self, selection): | ||
112 | model, paths = selection.get_selected_rows() | ||
113 | if paths: | ||
114 | self.change_image_cb(model, paths[0], 1) | ||
115 | |||
116 | def row_actived_cb(self, tab, model, path): | ||
117 | self.change_image_cb(model, path, 1) | ||
118 | self.emit('response', gtk.RESPONSE_YES) | ||
119 | |||
120 | def select_path_cb(self, action, parent, entry): | ||
121 | dialog = gtk.FileChooserDialog("", parent, | ||
122 | gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) | ||
123 | text = entry.get_text() | ||
124 | dialog.set_current_folder(text if len(text) > 0 else os.getcwd()) | ||
125 | button = dialog.add_button("Cancel", gtk.RESPONSE_NO) | ||
126 | HobAltButton.style_button(button) | ||
127 | button = dialog.add_button("Open", gtk.RESPONSE_YES) | ||
128 | HobButton.style_button(button) | ||
129 | response = dialog.run() | ||
130 | if response == gtk.RESPONSE_YES: | ||
131 | path = dialog.get_filename() | ||
132 | entry.set_text(path) | ||
133 | self.image_folder = path | ||
134 | self.fill_image_store() | ||
135 | |||
136 | dialog.destroy() | ||
137 | |||
138 | def fill_image_store(self): | ||
139 | self.image_list = [] | ||
140 | self.image_store.clear() | ||
141 | imageset = set() | ||
142 | for root, dirs, files in os.walk(self.image_folder): | ||
143 | # ignore the sub directories | ||
144 | dirs[:] = [] | ||
145 | for f in files: | ||
146 | for image_type in self.image_types: | ||
147 | if image_type in self.image_extension: | ||
148 | real_types = self.image_extension[image_type] | ||
149 | else: | ||
150 | real_types = [image_type] | ||
151 | for real_image_type in real_types: | ||
152 | if f.endswith('.' + real_image_type): | ||
153 | imageset.add(f.rsplit('.' + real_image_type)[0].rsplit('.rootfs')[0]) | ||
154 | self.image_list.append(f) | ||
155 | |||
156 | for image in imageset: | ||
157 | self.image_store.set(self.image_store.append(), 0, image, 1, False) | ||
158 | |||
159 | self.image_table.set_model(self.image_store) | ||
160 | |||
161 | def response_cb(self, dialog, response_id): | ||
162 | self.image_names = [] | ||
163 | if response_id == gtk.RESPONSE_YES: | ||
164 | iter = self.image_store.get_iter_first() | ||
165 | while iter: | ||
166 | path = self.image_store.get_path(iter) | ||
167 | if self.image_store[path][1]: | ||
168 | for f in self.image_list: | ||
169 | if f.startswith(self.image_store[path][0] + '.'): | ||
170 | self.image_names.append(f) | ||
171 | break | ||
172 | iter = self.image_store.iter_next(iter) | ||