def dropMimeData(self, mimedata, action, row, column, parentIndex): """ Handles the dropping of an item onto the model. De-serializes the data and inserts it into the model. """ # decode data using qgis helpers uri_list = QgsMimeDataUtils.decodeUriList(mimedata) if not uri_list: return False # find parent item dropParent = self.itemFromIndex(parentIndex) if not dropParent: return False # each uri will become a new item for uri in uri_list: item = QStandardItem(uri.name) item.setData(uri) # avoid placing dragged layers on it item.setDropEnabled(False) if uri.providerKey in ICON_MAPPER: item.setIcon(QIcon(ICON_MAPPER[uri.providerKey])) dropParent.appendRow(item) dropParent.emitDataChanged() return True
def update_model(self, model, schema, profile): """ Update the model by retrieving the profile given in database """ menudict = {} with self.transaction(): cur = self.connection.cursor() select = """ select name, profile, model_index, datasource_uri from {}.{} where profile = '{}' """.format(schema, self.table, profile) cur.execute(select) rows = cur.fetchall() model.clear() for name, profile, model_index, datasource_uri in self.sortby_modelindex( rows): menu = model.invisibleRootItem() indexes = json.loads(model_index) parent = '' for idx, subname in indexes[:-1]: parent += '{}-{}/'.format(idx, subname) if parent in menudict: # already created entry menu = menudict[parent] continue # create menu item = QStandardItem(subname) uri_struct = QgsMimeDataUtils.Uri(datasource_uri) item.setData(uri_struct) item.setIcon( QIcon(':/plugins/MenuBuilder/resources/menu.svg')) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled | Qt.ItemIsDropEnabled | Qt.ItemIsEditable) item.setWhatsThis("menu") menu.appendRow(item) menudict[parent] = item # set current menu to the new created item menu = item # add leaf (layer item) item = QStandardItem(name) uri_struct = QgsMimeDataUtils.Uri(datasource_uri) # fix layer name instead of table name # usefull when the layer has been renamed in menu uri_struct.name = name if uri_struct.providerKey in ICON_MAPPER: item.setIcon(QIcon(ICON_MAPPER[uri_struct.providerKey])) item.setData(uri_struct) # avoid placing dragged layers on it item.setDropEnabled(False) if uri_struct.providerKey == 'postgres': # set tooltip to postgres comment comment = self.get_table_comment(uri_struct.uri) item.setToolTip(comment) menudict[parent].appendRow(item)
def addFieldDef(self,fieldDef, recover = None): self.defOrder = ['fieldName', 'fieldMap', 'fieldLabel', 'fieldType', 'fieldHint', 'fieldRequired', 'fieldDefault', 'fieldQtype', 'fieldWidget', 'fieldChoices','fieldAppearance','fieldReadOnly','fieldCalculation'] row = [] self.setIcon(QIcon(os.path.join(os.path.dirname(__file__),"field.png"))) if not 'fieldReadOnly' in fieldDef: fieldDef['fieldReadOnly'] = '' if not 'fieldCalculation' in fieldDef: fieldDef['fieldCalculation'] = '' if recover: #backup dict provided if recovering fields state for fdef in self.defOrder: if fdef == 'fieldName': sub_item = QStandardItem(None) elif fdef == 'fieldRequired': sub_item = QStandardItem(None) sub_item.setCheckable(True) if fieldDef['fieldRequired']: sub_item.setCheckState(Qt.Checked) else: sub_item.setCheckState(Qt.Unchecked) else: sub_item = QStandardItem(fieldDef[fdef]) row.append(sub_item) self.appendRow(row) self.setCheckable(True) if fieldDef['fieldEnabled']: self.setCheckState(Qt.Checked) else: self.setCheckState(Qt.Unchecked) else: fieldDef['fieldType'] = self.getODKType(fieldDef) if fieldDef['fieldType'] in appearanceDef.keys(): fieldDef['fieldAppearance'] = appearanceDef[fieldDef['fieldType']][0] else: fieldDef['fieldAppearance'] = 'default' for fdef in self.defOrder: if fdef == 'fieldName': sub_item = QStandardItem(None) elif fdef == 'fieldRequired': sub_item = QStandardItem(None) sub_item.setCheckable(True) if fieldDef['fieldRequired']: sub_item.setCheckState(Qt.Checked) else: sub_item.setCheckState(Qt.Unchecked) elif fdef == 'fieldChoices': sub_item = QStandardItem(json.dumps(fieldDef[fdef])) else: sub_item = QStandardItem(fieldDef[fdef] or '') sub_item.setDropEnabled(False) sub_item.setDragEnabled(False) row.append(sub_item) self.appendRow(row) self.setCheckable(True) if fieldDef['fieldEnabled']: self.setCheckState(Qt.Checked) else: self.setCheckState(Qt.Unchecked)
def update_model(self, model, schema, profile): """ Update the model by retrieving the profile given in database """ menudict = {} with self.transaction(): cur = self.connection.cursor() select = """ select name, profile, model_index, datasource_uri from {}.{} where profile = '{}' """.format(schema, self.table, profile) cur.execute(select) rows = cur.fetchall() model.clear() for name, profile, model_index, datasource_uri in self.sortby_modelindex(rows): menu = model.invisibleRootItem() indexes = json.loads(model_index) parent = '' for idx, subname in indexes[:-1]: parent += '{}-{}/'.format(idx, subname) if parent in menudict: # already created entry menu = menudict[parent] continue # create menu item = QStandardItem(subname) uri_struct = QgsMimeDataUtils.Uri(datasource_uri) item.setData(uri_struct) item.setIcon(QIcon(':/plugins/MenuBuilder/resources/menu.svg')) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled | Qt.ItemIsDropEnabled | Qt.ItemIsEditable) item.setWhatsThis("menu") menu.appendRow(item) menudict[parent] = item # set current menu to the new created item menu = item # add leaf (layer item) item = QStandardItem(name) uri_struct = QgsMimeDataUtils.Uri(datasource_uri) # fix layer name instead of table name # usefull when the layer has been renamed in menu uri_struct.name = name if uri_struct.providerKey in ICON_MAPPER: item.setIcon(QIcon(ICON_MAPPER[uri_struct.providerKey])) item.setData(uri_struct) # avoid placing dragged layers on it item.setDropEnabled(False) if uri_struct.providerKey == 'postgres': # set tooltip to postgres comment comment = self.get_table_comment(uri_struct.uri) item.setToolTip(comment) menudict[parent].appendRow(item)
def addGroup(self, name = None, metadata = None): model = self.model() group_item = QStandardItem(name or 'New Group') group_item.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEditable) group_item.setEnabled(True) if metadata: group_item.setText('Metadata') group_item.setDropEnabled(True) group_item.setDragEnabled(True) group_item.setCheckable(True) group_item.setCheckState(Qt.Checked) group_item.setIcon(QIcon(os.path.join(os.path.dirname(__file__),"group.png"))) model.appendRow([group_item]) if not name: self.setCurrentIndex(model.indexFromItem(group_item)) return group_item
def make_cell(val, editable=False): cell = QStandardItem() cell.setEditable(editable) cell.setData(val, Qt.EditRole) cell.setDropEnabled(False) return cell