def createTableRow(self, file_, schema, order): """ items is a list, and each item of the list can be a string or a list """ row = self._table_items column = 0 items = file_ for key in order: # items = self.collection.load_references(items) #TODO allow list elements value = None field = schema.get_field(key) item = None if field.class_ != 'ref' and not field.is_multivalue(): if key in items: value = items[key] field.set_value(value) value = field.get_value() if value is None: value = '' if field.class_ != 'image': item = FitxaTableItem(items['id']) if isinstance(value, (unicode, str)): item.setText(_fromUtf8(value)) elif isinstance(value, list): count = len(value) if count > 0: more = count - 1 more_text = '' if more > 0: more_text = ( " " + unicode(self.tr("( %d more)")) % more) item.setText(unicode(value[0]) + more_text) else: if value is None: value = '' item.setText(_fromUtf8(unicode(value))) self.tableWidget.setItem(row, column, item) else: item = FitxaTableImage(items['id']) if not value.startswith("http"): WorkerImageLoader.load(value, item) else: item.set_image(value, 64, 64) self.tableWidget.setCellWidget(row, column, item) column += 1 self.worker.start() self._table_items += 1
def __init__(self, parent, collection, filters=None, flags=None): """ Creates a new dashboard view""" if flags is None: flags = QtCore.Qt.WindowFlags(0) super(Ui_Collection, self).__init__(parent, flags) self.setupUi(self) self.collection = self.parent().collection.get_collection(collection) self.schema = self.collection.schema if filters is None: self.objects = self.collection.get_all() self.filters = None else: self.filters = filters self.objects = self.collection.filter(filters) self.worker = WorkerImageLoader(64, 64) self.worker.image_ready.connect( lambda image, obj: self.set_image(obj, image)) self.customize()
class Ui_Collection(QtGui.QWidget, Ui_Form): _table_headers = 0 _table_items = 0 def __init__(self, parent, collection, filters=None, flags=None): """ Creates a new dashboard view""" if flags is None: flags = QtCore.Qt.WindowFlags(0) super(Ui_Collection, self).__init__(parent, flags) self.setupUi(self) self.collection = self.parent().collection.get_collection(collection) self.schema = self.collection.schema if filters is None: self.objects = self.collection.get_all() self.filters = None else: self.filters = filters self.objects = self.collection.filter(filters) self.worker = WorkerImageLoader(64, 64) self.worker.image_ready.connect( lambda image, obj: self.set_image(obj, image)) self.customize() def set_image(self, obj, image=None): """Sets the image of the obj, where obj must be an isinstance of FitxaTableImage. If no image is provided, a default one (:box.png) is used. """ if image is None: # IMPORTANT box.png has an expected size of 64x64px image = ':box.png' obj.set_image(image, scale=False) def customize(self): """After setup the Ui customize some elements""" #Topbar icon = self.collection.schema.ico if icon is None: icon = ':ico/folder.png' title = self.collection.get_name().upper() if self.filters is not None: title += ' ' + self.tr('(filtered)') Topbar(widget=self.topbar, icon=icon, title=title) # Toolbar items = [ {'class':'link', 'name': self.tr('Dashboard'), 'path': 'view/dashboard', 'image': ':/dashboard.png'}, {'class': 'spacer'}, {'class': 'line'}, {'class':'link', 'name': self.tr('Filter'), 'path': 'view/filters/collection/' + self.collection.get_id(), 'image': ':/filter.png'}, {'class':'link', 'name': unicode(self.tr('New <b>%s</b>')) % self.collection.get_name(), 'path': 'view/add/collection/' + self.collection.get_id(), 'image': ':/add.png'}, ] if self.filters is not None: items.insert( 1, { 'class': 'link', 'name': self.tr('Unfilter'), 'path': 'action/unfilter', 'image': ':/unfilter.png' } ) CustomToolbar(self.toolbar, items, self.uritoaction) # +1 (id field) order = [i for i, k in self.schema.file.iteritems() if k.class_ != 'ref' and not k.is_multivalue()] order = sorted( order, cmp=lambda x, y: self.schema.order.index(x) > self.schema.order.index(y)) self.tableWidget.setColumnCount(len(order)) self.tableWidget.setRowCount(len(self.objects)) if 'image' in order: order.remove('image') order.insert(0, 'image') for item in order: field = self.schema.get_field(item) self.createHeaderItem(field.name) for item in self.objects: self.createTableRow(item, self.schema, order) self.tableWidget.resizeColumnsToContents() self.tableWidget.resizeRowsToContents() # Connections QtCore.QObject.connect( self.tableWidget, QtCore.SIGNAL("itemDoubleClicked(QTableWidgetItem*)"), self._itemSelected) def uritoaction(self, uri): """Extends the collector uri call adding extra options""" params = self.parent().collector_uri_call(uri) if params is not None: action = params.get('action', None) if action == 'unfilter': self.parent().display_view('collection', { 'collection': self.collection.get_id() }) def createHeaderItem(self, text): item = QtGui.QTableWidgetItem() item.setText(text) self.tableWidget.setHorizontalHeaderItem(self._table_headers, item) self._table_headers += 1 def createTableRow(self, file_, schema, order): """ items is a list, and each item of the list can be a string or a list """ row = self._table_items column = 0 items = file_ for key in order: # items = self.collection.load_references(items) #TODO allow list elements value = None field = schema.get_field(key) item = None if field.class_ != 'ref' and not field.is_multivalue(): if key in items: value = items[key] field.set_value(value) value = field.get_value() if value is None: value = '' if field.class_ != 'image': item = FitxaTableItem(items['id']) if isinstance(value, (unicode, str)): item.setText(_fromUtf8(value)) elif isinstance(value, list): count = len(value) if count > 0: more = count - 1 more_text = '' if more > 0: more_text = ( " " + unicode(self.tr("( %d more)")) % more) item.setText(unicode(value[0]) + more_text) else: if value is None: value = '' item.setText(_fromUtf8(unicode(value))) self.tableWidget.setItem(row, column, item) else: item = FitxaTableImage(items['id']) if not value.startswith("http"): WorkerImageLoader.load(value, item) else: item.set_image(value, 64, 64) self.tableWidget.setCellWidget(row, column, item) column += 1 self.worker.start() self._table_items += 1 def _itemSelected(self, tableItem): self.parent().display_view( 'fitxa', {'item': tableItem.getObjectId(), 'collection': self.collection.get_id()})