173 lines
6.3 KiB
Python
173 lines
6.3 KiB
Python
#
|
|
# BitBake Graphical GTK User Interface
|
|
#
|
|
# Copyright (C) 2011-2012 Intel Corporation
|
|
#
|
|
# Authored by Joshua Lock <josh@linux.intel.com>
|
|
# Authored by Dongxiao Xu <dongxiao.xu@intel.com>
|
|
# Authored by Shane Wang <shane.wang@intel.com>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License version 2 as
|
|
# published by the Free Software Foundation.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along
|
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
import gtk
|
|
import gobject
|
|
import os
|
|
from bb.ui.crumbs.hobwidget import HobViewTable, HobInfoButton, HobButton, HobAltButton
|
|
from bb.ui.crumbs.hig.crumbsdialog import CrumbsDialog
|
|
from bb.ui.crumbs.hig.layerselectiondialog import LayerSelectionDialog
|
|
|
|
"""
|
|
The following are convenience classes for implementing GNOME HIG compliant
|
|
BitBake GUI's
|
|
In summary: spacing = 12px, border-width = 6px
|
|
"""
|
|
|
|
class ImageSelectionDialog (CrumbsDialog):
|
|
|
|
__columns__ = [{
|
|
'col_name' : 'Image name',
|
|
'col_id' : 0,
|
|
'col_style': 'text',
|
|
'col_min' : 400,
|
|
'col_max' : 400
|
|
}, {
|
|
'col_name' : 'Select',
|
|
'col_id' : 1,
|
|
'col_style': 'radio toggle',
|
|
'col_min' : 160,
|
|
'col_max' : 160
|
|
}]
|
|
|
|
|
|
def __init__(self, image_folder, image_types, title, parent, flags, buttons=None, image_extension = {}):
|
|
super(ImageSelectionDialog, self).__init__(title, parent, flags, buttons)
|
|
self.connect("response", self.response_cb)
|
|
|
|
self.image_folder = image_folder
|
|
self.image_types = image_types
|
|
self.image_list = []
|
|
self.image_names = []
|
|
self.image_extension = image_extension
|
|
|
|
# create visual elements on the dialog
|
|
self.create_visual_elements()
|
|
|
|
self.image_store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_BOOLEAN)
|
|
self.fill_image_store()
|
|
|
|
def create_visual_elements(self):
|
|
hbox = gtk.HBox(False, 6)
|
|
|
|
self.vbox.pack_start(hbox, expand=False, fill=False)
|
|
|
|
entry = gtk.Entry()
|
|
entry.set_text(self.image_folder)
|
|
table = gtk.Table(1, 10, True)
|
|
table.set_size_request(560, -1)
|
|
hbox.pack_start(table, expand=False, fill=False)
|
|
table.attach(entry, 0, 9, 0, 1)
|
|
image = gtk.Image()
|
|
image.set_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON)
|
|
open_button = gtk.Button()
|
|
open_button.set_image(image)
|
|
open_button.connect("clicked", self.select_path_cb, self, entry)
|
|
table.attach(open_button, 9, 10, 0, 1)
|
|
|
|
self.image_table = HobViewTable(self.__columns__)
|
|
self.image_table.set_size_request(-1, 300)
|
|
self.image_table.connect("toggled", self.toggled_cb)
|
|
self.image_table.connect_group_selection(self.table_selected_cb)
|
|
self.image_table.connect("row-activated", self.row_actived_cb)
|
|
self.vbox.pack_start(self.image_table, expand=True, fill=True)
|
|
|
|
self.show_all()
|
|
|
|
def change_image_cb(self, model, path, columnid):
|
|
if not model:
|
|
return
|
|
iter = model.get_iter_first()
|
|
while iter:
|
|
rowpath = model.get_path(iter)
|
|
model[rowpath][columnid] = False
|
|
iter = model.iter_next(iter)
|
|
|
|
model[path][columnid] = True
|
|
|
|
def toggled_cb(self, table, cell, path, columnid, tree):
|
|
model = tree.get_model()
|
|
self.change_image_cb(model, path, columnid)
|
|
|
|
def table_selected_cb(self, selection):
|
|
model, paths = selection.get_selected_rows()
|
|
if paths:
|
|
self.change_image_cb(model, paths[0], 1)
|
|
|
|
def row_actived_cb(self, tab, model, path):
|
|
self.change_image_cb(model, path, 1)
|
|
self.emit('response', gtk.RESPONSE_YES)
|
|
|
|
def select_path_cb(self, action, parent, entry):
|
|
dialog = gtk.FileChooserDialog("", parent,
|
|
gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
|
|
text = entry.get_text()
|
|
dialog.set_current_folder(text if len(text) > 0 else os.getcwd())
|
|
button = dialog.add_button("Cancel", gtk.RESPONSE_NO)
|
|
HobAltButton.style_button(button)
|
|
button = dialog.add_button("Open", gtk.RESPONSE_YES)
|
|
HobButton.style_button(button)
|
|
response = dialog.run()
|
|
if response == gtk.RESPONSE_YES:
|
|
path = dialog.get_filename()
|
|
entry.set_text(path)
|
|
self.image_folder = path
|
|
self.fill_image_store()
|
|
|
|
dialog.destroy()
|
|
|
|
def fill_image_store(self):
|
|
self.image_list = []
|
|
self.image_store.clear()
|
|
imageset = set()
|
|
for root, dirs, files in os.walk(self.image_folder):
|
|
# ignore the sub directories
|
|
dirs[:] = []
|
|
for f in files:
|
|
for image_type in self.image_types:
|
|
if image_type in self.image_extension:
|
|
real_types = self.image_extension[image_type]
|
|
else:
|
|
real_types = [image_type]
|
|
for real_image_type in real_types:
|
|
if f.endswith('.' + real_image_type):
|
|
imageset.add(f.rsplit('.' + real_image_type)[0].rsplit('.rootfs')[0])
|
|
self.image_list.append(f)
|
|
|
|
for image in imageset:
|
|
self.image_store.set(self.image_store.append(), 0, image, 1, False)
|
|
|
|
self.image_table.set_model(self.image_store)
|
|
|
|
def response_cb(self, dialog, response_id):
|
|
self.image_names = []
|
|
if response_id == gtk.RESPONSE_YES:
|
|
iter = self.image_store.get_iter_first()
|
|
while iter:
|
|
path = self.image_store.get_path(iter)
|
|
if self.image_store[path][1]:
|
|
for f in self.image_list:
|
|
if f.startswith(self.image_store[path][0] + '.'):
|
|
self.image_names.append(f)
|
|
break
|
|
iter = self.image_store.iter_next(iter)
|