def _loadCardGroup(self, groupName, records, parent=None): if (not groupName): groupName = 'None' cards = self.cardWidget() factory = self.factory() # create the group item group_item = QTreeWidgetItem(parent, [groupName]) font = group_item.font(0) font.setBold(True) font.setPointSize(font.pointSize() + 2) group_item.setFont(0, font) group_item.setFlags(Qt.ItemIsEnabled) # load sub-groups if (type(records) == dict): for subgroup, records in sorted(records.items()): self._loadCardGroup(subgroup, records, group_item) else: for record in records: widget = factory.createCard(cards, record) if (not widget): continue widget.adjustSize() # create the card item item = QTreeWidgetItem(group_item) item.setSizeHint(0, QSize(0, widget.height())) cards.setItemWidget(item, 0, widget) group_item.setExpanded(True)
def _loadCardGroup( self, groupName, records, parent = None ): if ( not groupName ): groupName = 'None' cards = self.cardWidget() factory = self.factory() # create the group item group_item = QTreeWidgetItem(parent, [groupName]) font = group_item.font(0) font.setBold(True) font.setPointSize(font.pointSize() + 2) group_item.setFont(0, font) group_item.setFlags(Qt.ItemIsEnabled) # load sub-groups if ( type(records) == dict ): for subgroup, records in sorted(records.items()): self._loadCardGroup(subgroup, records, group_item) else: for record in records: widget = factory.createCard(cards, record) if ( not widget ): continue widget.adjustSize() # create the card item item = QTreeWidgetItem(group_item) item.setSizeHint(0, QSize(0, widget.height())) cards.setItemWidget(item, 0, widget) group_item.setExpanded(True)
def init_main_panel(self): from PyQt4.QtGui import QTreeWidgetItem as Twi this = self.mw coco = self.coco tree = this.friends_list_tree self.root = [] friends = coco.friends from copy import deepcopy # 有些好友并不在任何返回的群组中(可能是陌生人或者黑名单吧,没有测试过) friends_copy = deepcopy(friends) for cat in coco.categories: group_item = Twi(tree, [cat['name']]) group_item.setSizeHint(0, QSize(0, 30)) self.root.append(group_item) index = cat['index'] friends_of_this_group = friends_copy.pop(index) for friend in friends_of_this_group: uin = friend['uin'] # 有备注就取备注否则取昵称 nick = coco.friend_cache[uin]['nick'] t = Twi(group_item, [nick]) # 将uin存储在item上 t.uin = uin coco.friend_cache[uin]['nick'] = nick if friends_copy: logging.debug('thers are friends that not belong to any category.') tree.insertTopLevelItems(0, self.root)
def createActionItem(self, key): """ Creates a new action item for the inputed key. :param key | <str> :return <QTreeWidgetItem> """ action = self._actions.get(key) if (not action): text = 'Missing Action: %s' % key item = QTreeWidgetItem([text]) ico = projexui.resources.find('img/log/warning.png') item.setIcon(0, QIcon(ico)) else: item = QTreeWidgetItem([str(action.text()).replace('&', '')]) item.setIcon(0, action.icon()) item.setSizeHint(0, QSize(120, 20)) item.setData(0, Qt.UserRole, qt.wrapVariant(key)) flags = item.flags() flags ^= Qt.ItemIsDropEnabled item.setFlags(flags) return item
def createActionItem( self, key ): """ Creates a new action item for the inputed key. :param key | <str> :return <QTreeWidgetItem> """ action = self._actions.get(key) if ( not action ): text = 'Missing Action: %s' % key item = QTreeWidgetItem([text]) ico = projexui.resources.find('img/log/warning.png') item.setIcon(0, QIcon(ico)) else: item = QTreeWidgetItem([str(action.text()).replace('&', '')]) item.setIcon(0, action.icon()) item.setSizeHint(0, QSize(120, 20)) item.setData(0, Qt.UserRole, qt.wrapVariant(key)) flags = item.flags() flags ^= Qt.ItemIsDropEnabled item.setFlags(flags) return item
def init_main_panel(self): from PyQt4.QtGui import QTreeWidgetItem as Twi this = self.mw coco = self.coco tree = this.friends_list_tree self.root = [] friends = coco.friends from copy import deepcopy # 有些好友并不在任何返回的群组中(可能是陌生人或者黑名单吧,没有测试过) friends_copy = deepcopy(friends) for cat in coco.categories: group_item = Twi(tree, [cat["name"]]) group_item.setSizeHint(0, QSize(0, 30)) self.root.append(group_item) index = cat["index"] friends_of_this_group = friends_copy.pop(index) for friend in friends_of_this_group: uin = friend["uin"] # 有备注就取备注否则取昵称 nick = coco.friend_cache[uin]["nick"] t = Twi(group_item, [nick]) # 将uin存储在item上 t.uin = uin coco.friend_cache[uin]["nick"] = nick if friends_copy: logging.debug("thers are friends that not belong to any category.") tree.insertTopLevelItems(0, self.root)
def addApplet(self, app): assert isinstance( app, Applet), "Applets must inherit from Applet base class." assert app.base_initialized, "Applets must call Applet.__init__ upon construction." assert issubclass( type(app.gui), AppletGuiInterface ), "Applet GUIs must conform to the Applet GUI interface." self._applets.append(app) applet_index = len(self._applets) - 1 self.appletStack.addWidget(app.gui.centralWidget()) # Viewer controls are optional. If the applet didn't provide one, create an empty widget for him. if app.gui.viewerControlWidget() is None: self.viewerControlStack.addWidget(QWidget(parent=self)) else: self.viewerControlStack.addWidget(app.gui.viewerControlWidget()) # Add rows to the applet bar model rootItem = self.appletBar.invisibleRootItem() # Add all of the applet bar's items to the toolbox widget for controlName, controlGuiItem in app.gui.appletDrawers(): appletNameItem = QTreeWidgetItem(self.appletBar, QtCore.QStringList(controlName)) appletNameItem.setFont(0, QFont("Ubuntu", 14)) drawerItem = QTreeWidgetItem(appletNameItem) drawerItem.setSizeHint(0, controlGuiItem.frameSize()) # drawerItem.setBackground( 0, QBrush( QColor(224, 224, 224) ) ) # drawerItem.setForeground( 0, QBrush( QColor(0,0,0) ) ) self.appletBar.setItemWidget(drawerItem, 0, controlGuiItem) # Since each applet can contribute more than one applet bar item, # we need to keep track of which applet this item is associated with self.appletBarMapping[rootItem.childCount() - 1] = applet_index # Set up handling of GUI commands from this applet app.guiControlSignal.connect( bind(self.handleAppletGuiControlSignal, applet_index)) self._disableCounts.append(0) self._controlCmds.append([]) # Set up handling of progress updates from this applet self.progressDisplayManager.addApplet(applet_index, app) # Set up handling of shell requests from this applet app.shellRequestSignal.connect( partial(self.handleShellRequest, applet_index)) self.projectManager.addApplet(app) return applet_index
def createMenuItem( self, title ): """ Creates a new menu item with the given title. :param title | <str> :return <QTreeWidgetItem> """ item = QTreeWidgetItem([title]) ico = projexui.resources.find('img/folder.png') item.setIcon(0, QIcon(ico)) item.setSizeHint(0, QSize(120, 20)) item.setData(0, Qt.UserRole, qt.wrapVariant('menu')) return item
def createMenuItem(self, title): """ Creates a new menu item with the given title. :param title | <str> :return <QTreeWidgetItem> """ item = QTreeWidgetItem([title]) ico = projexui.resources.find('img/folder.png') item.setIcon(0, QIcon(ico)) item.setSizeHint(0, QSize(120, 20)) item.setData(0, Qt.UserRole, qt.wrapVariant('menu')) return item
def addApplet( self, app ): assert isinstance( app, Applet ), "Applets must inherit from Applet base class." assert app.base_initialized, "Applets must call Applet.__init__ upon construction." assert issubclass( type(app.gui), AppletGuiInterface ), "Applet GUIs must conform to the Applet GUI interface." self._applets.append(app) applet_index = len(self._applets) - 1 self.appletStack.addWidget( app.gui.centralWidget() ) # Viewer controls are optional. If the applet didn't provide one, create an empty widget for him. if app.gui.viewerControlWidget() is None: self.viewerControlStack.addWidget( QWidget(parent=self) ) else: self.viewerControlStack.addWidget( app.gui.viewerControlWidget() ) # Add rows to the applet bar model rootItem = self.appletBar.invisibleRootItem() # Add all of the applet bar's items to the toolbox widget for controlName, controlGuiItem in app.gui.appletDrawers(): appletNameItem = QTreeWidgetItem( self.appletBar, QtCore.QStringList( controlName ) ) appletNameItem.setFont( 0, QFont("Ubuntu", 14) ) drawerItem = QTreeWidgetItem(appletNameItem) drawerItem.setSizeHint( 0, controlGuiItem.frameSize() ) # drawerItem.setBackground( 0, QBrush( QColor(224, 224, 224) ) ) # drawerItem.setForeground( 0, QBrush( QColor(0,0,0) ) ) self.appletBar.setItemWidget( drawerItem, 0, controlGuiItem ) # Since each applet can contribute more than one applet bar item, # we need to keep track of which applet this item is associated with self.appletBarMapping[rootItem.childCount()-1] = applet_index # Set up handling of GUI commands from this applet app.guiControlSignal.connect( bind(self.handleAppletGuiControlSignal, applet_index) ) self._disableCounts.append(0) self._controlCmds.append( [] ) # Set up handling of progress updates from this applet self.progressDisplayManager.addApplet(applet_index, app) # Set up handling of shell requests from this applet app.shellRequestSignal.connect( partial(self.handleShellRequest, applet_index) ) self.projectManager.addApplet(app) return applet_index
def refresh(self): tree = self.uiFilterTREE tree.blockSignals(True) tree.setUpdatesEnabled(False) tree.clear() # create the code color codeClr = tree.palette().color(tree.palette().Base).darker(140) # sort the data hash filters = self._filterOptions.items() filters.sort(lambda x, y: cmp(x[1].get('order', 100000), y[1].get( 'order', 100000))) for key, option in filters: # create the data for this item data = {'code': key} data.update(option) # create the data item item = QTreeWidgetItem( [data.get('name', ''), data.get('code', '')]) item.setIcon(0, resources.icon(data.get('icon', '') % data)) item.setSizeHint(0, QSize(0, 18)) # check the item if its enabled if (self.isCheckable()): enabled = data.get('enabled', False) item.setCheckState(0, Qt.Checked if enabled else Qt.Unchecked) # set some ui data for the code name to hide it a bit item.setTextAlignment(1, Qt.AlignRight | Qt.AlignCenter) item.setForeground(1, codeClr) # add to the tree tree.addTopLevelItem(item) tree.setUpdatesEnabled(True) tree.blockSignals(False)
def refresh( self ): tree = self.uiFilterTREE tree.blockSignals(True) tree.setUpdatesEnabled(False) tree.clear() # create the code color codeClr = tree.palette().color(tree.palette().Base).darker(140) # sort the data hash filters = self._filterOptions.items() filters.sort( lambda x,y: cmp(x[1].get('order',100000),y[1].get('order',100000)) ) for key, option in filters: # create the data for this item data = { 'code': key } data.update(option) # create the data item item = QTreeWidgetItem( [data.get('name',''),data.get('code','')] ) item.setIcon( 0, resources.icon( data.get('icon','') % data ) ) item.setSizeHint( 0, QSize( 0, 18 ) ) # check the item if its enabled if ( self.isCheckable() ): enabled = data.get('enabled',False) item.setCheckState( 0, Qt.Checked if enabled else Qt.Unchecked ) # set some ui data for the code name to hide it a bit item.setTextAlignment( 1, Qt.AlignRight | Qt.AlignCenter ) item.setForeground( 1, codeClr ) # add to the tree tree.addTopLevelItem(item) tree.setUpdatesEnabled(True) tree.blockSignals(False)
def refreshCards(self): """ Refreshes the results for the cards view of the browser. """ cards = self.cardWidget() factory = self.factory() self.setUpdatesEnabled(False) self.blockSignals(True) cards.setUpdatesEnabled(False) cards.blockSignals(True) cards.clear() QApplication.instance().processEvents() if (self.isGroupingActive()): grouping = self.records().grouped() for groupName, records in sorted(grouping.items()): self._loadCardGroup(groupName, records, cards) else: for record in self.records(): widget = factory.createCard(cards, record) if (not widget): continue widget.adjustSize() # create the card item item = QTreeWidgetItem(cards) item.setSizeHint(0, QSize(0, widget.height())) cards.setItemWidget(item, 0, widget) cards.setUpdatesEnabled(True) cards.blockSignals(False) self.setUpdatesEnabled(True) self.blockSignals(False)
def refreshCards( self ): """ Refreshes the results for the cards view of the browser. """ cards = self.cardWidget() factory = self.factory() self.setUpdatesEnabled(False) self.blockSignals(True) cards.setUpdatesEnabled(False) cards.blockSignals(True) cards.clear() QApplication.instance().processEvents() if ( self.isGroupingActive() ): grouping = self.records().grouped() for groupName, records in sorted(grouping.items()): self._loadCardGroup(groupName, records, cards) else: for record in self.records(): widget = factory.createCard(cards, record) if ( not widget ): continue widget.adjustSize() # create the card item item = QTreeWidgetItem(cards) item.setSizeHint(0, QSize(0, widget.height())) cards.setItemWidget(item, 0, widget) cards.setUpdatesEnabled(True) cards.blockSignals(False) self.setUpdatesEnabled(True) self.blockSignals(False)
def setPlugins( self, plugins ): """ Loads the plugins for the inputed dialog. :param plugins | [<XWizardPlugin>, ..] """ langs = {} icons = {} for plugin in plugins: wlang = plugin.wizardType() wgrp = plugin.wizardGroup() langs.setdefault(wlang, {}) langs[wlang].setdefault(wgrp, []) langs[wlang][wgrp].append( plugin ) icons.setdefault(wgrp, plugin.groupIcon(wgrp)) self._plugins = langs self.uiPluginTREE.clear() for wlang in sorted(langs.keys()): langitem = QTreeWidgetItem([wlang]) langitem.setSizeHint(0, QSize(0, 26)) for wgrp in sorted(langs[wlang].keys()): grpitem = QTreeWidgetItem([wgrp]) grpitem.setIcon(0, QIcon(icons[wgrp])) grpitem.setSizeHint(0, QSize(0, 26)) langitem.addChild(grpitem) folder = QIcon(projexui.resources.find('img/folder_32.png')) langitem.setIcon(0, folder) self.uiPluginTREE.addTopLevelItem(langitem) langitem.setExpanded(True)
class LegendItem(QTreeWidgetItem): """ Provide a widget to show and manage the properties of one single layer """ def __init__(self, parent, canvasLayer): QTreeWidgetItem.__init__(self) self.legend = parent self.canvasLayer = canvasLayer self.canvasLayer.layer().setLayerName( self.legend.normalizeLayerName( unicode( self.canvasLayer.layer().name() ) ) ) self.setText(0, self.canvasLayer.layer().name()) self.isVect = (self.canvasLayer.layer().type() == 0) # 0: Vector, 1: Raster self.layerId = self.canvasLayer.layer().id() self.setSizeHint(0, QSize(24, 24)) self.setCheckState(0, Qt.Checked) pm = QPixmap(22, 22) icon = QIcon() if self.isVect: renderer = self.canvasLayer.layer().rendererV2() sym = renderer.symbols()[0] img = QImage(sym.asImage(QSize(22, 22))) pix = pm.fromImage(img) icon.addPixmap(pix, QIcon.Normal, QIcon.On) self.vectorLayerSymbology(self.canvasLayer.layer()) else: pm = self.canvasLayer.layer().previewAsPixmap(QSize(22, 22)) icon.addPixmap(pm) self.rasterLayerSymbology(self.canvasLayer.layer()) self.setIcon(0, icon) self.setToolTip(0, self.canvasLayer.layer().attribution()) layerFont = QFont() layerFont.setBold(True) self.setFont(0, layerFont) def nextSibling( self ): """ Return the next layer item """ return self.legend.nextSibling( self ) def storeAppearanceSettings( self ): """ Store the appearance of the layer item """ self.__itemIsExpanded = self.isExpanded() def restoreAppearanceSettings( self ): """ Restore the appearance of the layer item """ self.setExpanded( self.__itemIsExpanded ) def changeSymbologySettings(self, theMapLayer, itemList): if not theMapLayer: return # Remove previous symbology items self.takeChildren() # Add the new symbology items for i in range(len(itemList)): self.child = QTreeWidgetItem(self) self.child.setSizeHint(0, QSize(18, 18)) self.child.setText(0, unicode(itemList[i][0])) iconChild = QIcon() iconChild.addPixmap(itemList[i][1]) self.child.setIcon(0, iconChild) def vectorLayerSymbology(self, layer): renderer = layer.rendererV2() # Do nothing if only single symbol if renderer.type() == "singleSymbol": return # Add the new items itemList = [] # Simbology List label = '' sym = renderer.symbols() for idx, it in enumerate(sym): values = '' if renderer.type() == "graduatedSymbol": rng = renderer.ranges()[idx] label = rng.label() if not label.isEmpty(): values += label elif renderer.type() == "categorizedSymbol": cat = renderer.categories()[idx] label = cat.label() if not label.isEmpty(): values += label img = QImage() img = it.asImage(QSize(16, 16)) pix = QPixmap(16, 16) pix = QPixmap().fromImage(img) itemList.append([values, pix]) self.changeSymbologySettings(layer, itemList) def rasterLayerSymbology(self, layer): # Add the new items itemList = [] label = '' color = QColor() renderer = layer.renderer() rtype = renderer.type() #if rtype == "paletted": # rtype == "singlebandgray" if rtype == "singlebandpseudocolor": shader = renderer.shader().rasterShaderFunction() if isinstance(shader, QgsColorRampShader): colorRampItems = shader.colorRampItemList() for it in colorRampItems: # Get Qpair label = it.label color = it.color pix = QPixmap(16, 16) pix.fill(color) itemList.append([label, pix]) self.changeSymbologySettings(layer, itemList)
class LegendItem( QTreeWidgetItem ): """ Provide a widget to show and manage the properties of one single layer """ def __init__( self, parent, canvasLayer ): QTreeWidgetItem.__init__( self ) self.legend = parent self.canvasLayer = canvasLayer self.canvasLayer.layer().setLayerName( self.legend.normalizeLayerName( unicode( self.canvasLayer.layer().name() ) ) ) self.setText( 0, self.canvasLayer.layer().name() ) self.isVect = ( self.canvasLayer.layer().type() == QgsMapLayer.VectorLayer ) # 0: Vector, 1: Raster #self.layerId = self.canvasLayer.layer().getLayerID() self.layerId = self.canvasLayer.layer().id() if self.isVect: geom = self.canvasLayer.layer().dataProvider().geometryType() self.setCheckState( 0, Qt.Checked ) pm = QPixmap( 20, 20 ) icon = QIcon() if self.isVect: if geom == QGis.WKBPoint or geom == QGis.WKBMultiPoint or geom == QGis.WKBPoint25D or geom == QGis.WKBMultiPoint25D: # Point icon.addPixmap( QPixmap( ":/icons/mIconPointLayer.png" ), QIcon.Normal, QIcon.On) elif geom == QGis.WKBLineString or geom == QGis.WKBMultiLineString or geom == QGis.WKBLineString25D or geom == QGis.WKBMultiLineString25D: # Polyline icon.addPixmap( QPixmap( ":/icons/mIconLineLayer.png"), QIcon.Normal, QIcon.On) elif geom == QGis.WKBPolygon or geom == QGis.WKBMultiPolygon or geom == QGis.WKBPolygon25D or geom == QGis.WKBMultiPolygon25D: # Polygon icon.addPixmap( QPixmap( ":/icons/mIconPolygonLayer.png"), QIcon.Normal, QIcon.On) else: # Not a valid WKT Geometry geom = self.canvasLayer.layer().geometryType() # QGis Geometry if geom == QGis.Point: # Point icon.addPixmap( QPixmap( ":/icons/mIconPointLayer.png" ), QIcon.Normal, QIcon.On) elif geom == QGis.Line: # Line icon.addPixmap( QPixmap( ":/icons/mIconLineLayer.png"), QIcon.Normal, QIcon.On) elif geom == QGis.Polygon: # Polygon icon.addPixmap( QPixmap( ":/icons/mIconPolygonLayer.png"), QIcon.Normal, QIcon.On) else: raise RuntimeError, 'Unknown geometry: ' + str( geom ) else: pm = self.canvasLayer.layer().previewAsPixmap( pm.size() ) icon.addPixmap( pm ) self.setIcon( 0, icon ) self.setToolTip( 0, self.canvasLayer.layer().publicSource() ) layerFont = QFont() layerFont.setBold( True ) self.setFont( 0, layerFont ) # Display layer properties self.properties = self.getLayerProperties( self.canvasLayer.layer() ) self.child = QTreeWidgetItem( self ) self.child.setFlags( Qt.NoItemFlags ) # Avoid the item to be selected self.displayLayerProperties() def getLayerProperties( self, l ): """ Create a layer-properties string (l:layer)""" print 'I: Generating layer properties...' layerSRID = l.crs().description() + ' (' + str( l.crs().postgisSrid() ) + ')' extent = l.extent() viewCrs = self.legend.canvas.mapRenderer().destinationCrs() viewExtent = self.legend.canvas.mapRenderer().layerToMapCoordinates( l, extent ) strViewExtent = self.legend.viewParamsView.stringExtent( viewExtent ) if l.type() == QgsMapLayer.VectorLayer : # Vector wkbType = ["WKBUnknown","WKBPoint","WKBLineString","WKBPolygon", "WKBMultiPoint","WKBMultiLineString","WKBMultiPolygon", "WKBNoGeometry","WKBPoint25D","WKBLineString25D","WKBPolygon25D", "WKBMultiPoint25D","WKBMultiLineString25D","WKBMultiPolygon25D"] tableSource = QgsDataSourceURI(l.source()).table() properties = "Source: %s<br>" \ "%s <br>" \ "Geometry type: %s<br>" \ "Number of features: %s<br>" \ "Number of fields: %s<br>" \ "SRS (EPSG): %s<br>" \ "Extent: %s <br>" \ "View extent: %s " \ % ( l.source(), self.extractSqlQuery( tableSource ), wkbType[l.wkbType()], l.featureCount(), l.dataProvider().fields().count(), layerSRID, extent.toString(), strViewExtent ) elif l.type() == QgsMapLayer.RasterLayer : # Raster rType = [ "GrayOrUndefined (single band)", "Palette (single band)", "Multiband" ] properties = "Source: %s<br>" \ "Raster type: %s<br>" \ "Width-Height (pixels): %sx%s<br>" \ "Bands: %s<br>" \ "SRS (EPSG): %s<br>" \ "Extent: %s <br>" \ "View extent: %s " \ % ( l.source(), rType[l.rasterType()], l.width(), l.height(), l.bandCount(), layerSRID, extent.toString(), strViewExtent ) print 'I: Test projections: %i ? %i' % (l.crs().postgisSrid(), viewCrs.postgisSrid()) if l.crs().postgisSrid() != viewCrs.postgisSrid(): properties = properties + "<br> <b><font color='red'>Warning! reprojection raster to EPSG:" + str( viewCrs.postgisSrid() ) + " may be slow!</font></b>" return properties def displayLayerProperties( self ): """ It is required to build the QLabel widget every time it is set """ propertiesFont = QFont() propertiesFont.setItalic( True ) propertiesFont.setPointSize( 8 ) propertiesFont.setStyleStrategy( QFont.PreferAntialias ) label = QLabel( self.properties ) label.setTextFormat( Qt.RichText ) label.setTextInteractionFlags( Qt.TextSelectableByMouse | Qt.TextSelectableByKeyboard ) label.setFont( propertiesFont ) self.legend.setItemWidget( self.child, 0, label ) def updateProperties( self ): """ Update view """ self.properties = self.getLayerProperties( self.canvasLayer.layer() ) label = self.treeWidget().itemWidget(self.child, 0) label.setText( self.properties ) self.child.setSizeHint(0, label.sizeHint()) self.legend.updateGeometries() def nextSibling( self ): """ Return the next layer item """ return self.legend.nextSibling( self ) def storeAppearanceSettings( self ): """ Store the appearance of the layer item """ self.__itemIsExpanded = self.isExpanded() def restoreAppearanceSettings( self ): """ Restore the appearance of the layer item """ self.setExpanded( self.__itemIsExpanded ) self.displayLayerProperties() # Generate the QLabel widget again def extractSqlQuery( self , source): rx = QRegExp('\\(select row_number\\(\\) over\\(order by 1\\) id, q.\\w+ from \\((.*)\\) as q\\)') if rx.indexIn(source) == -1: return 'Table: <b>' + source + '</b>' return 'SqlQuery: <b>' + rx.cap(1) + '</b>'
class LegendItem( QTreeWidgetItem ): """ Provide a widget to show and manage the properties of one single layer """ def __init__( self, parent, canvasLayer ): QTreeWidgetItem.__init__( self ) self.legend = parent self.canvasLayer = canvasLayer self.canvasLayer.layer().setLayerName( self.legend.normalizeLayerName( unicode( self.canvasLayer.layer().name() ) ) ) self.setText( 0, self.canvasLayer.layer().name() ) self.isVect = ( self.canvasLayer.layer().type() == 0 ) # 0: Vector, 1: Raster self.layerId = self.canvasLayer.layer().getLayerID() if self.isVect: geom = self.canvasLayer.layer().dataProvider().geometryType() self.setCheckState( 0, Qt.Checked ) pm = QPixmap( 20, 20 ) icon = QIcon() if self.isVect: if geom == 1 or geom == 4 or geom == 8 or geom == 11: # Point icon.addPixmap( QPixmap( resources_prefix + "mIconPointLayer.png" ), QIcon.Normal, QIcon.On) elif geom == 2 or geom == 5 or geom == 9 or geom == 12: # Polyline icon.addPixmap( QPixmap( resources_prefix + "mIconLineLayer.png"), QIcon.Normal, QIcon.On) elif geom == 3 or geom == 6 or geom == 10 or geom == 13: # Polygon icon.addPixmap( QPixmap( resources_prefix + "mIconPolygonLayer.png"), QIcon.Normal, QIcon.On) else: # Not a valid WKT Geometry geom = self.canvasLayer.layer().geometryType() # QGis Geometry if geom == 0: # Point icon.addPixmap( QPixmap( resources_prefix + "mIconPointLayer.png" ), QIcon.Normal, QIcon.On) elif geom == 1: # Line icon.addPixmap( QPixmap( resources_prefix + "mIconLineLayer.png"), QIcon.Normal, QIcon.On) elif geom == 2: # Polygon icon.addPixmap( QPixmap( resources_prefix + "mIconPolygonLayer.png"), QIcon.Normal, QIcon.On) else: raise RuntimeError, 'Unknown geometry: ' + str( geom ) self.vectorLayerSymbology( self.canvasLayer.layer() ) else: self.canvasLayer.layer().thumbnailAsPixmap( pm ) icon.addPixmap( pm ) self.child = QTreeWidgetItem( self ) iconChild = QIcon() iconChild.addPixmap( self.canvasLayer.layer().legendAsPixmap().scaled( 15, 15, Qt.KeepAspectRatio ) ) self.child.setSizeHint ( 0, QSize( 15, 15 ) ) self.child.setIcon( 0, iconChild ) self.setIcon( 0, icon ) self.setToolTip( 0, self.canvasLayer.layer().publicSource() ) layerFont = QFont() layerFont.setBold( True ) self.setFont( 0, layerFont ) def nextSibling( self ): """ Return the next layer item """ return self.legend.nextSibling( self ) def storeAppearanceSettings( self ): """ Store the appearance of the layer item """ self.__itemIsExpanded = self.isExpanded() def restoreAppearanceSettings( self ): """ Restore the appearance of the layer item """ self.setExpanded( self.__itemIsExpanded ) def vectorLayerSymbology( self, layer ): itemList = [] # Simbology List # Add the new items lw = '' uv = '' label = '' renderer = layer.renderer() sym = renderer.symbols() for it in sym: img = QImage() if it.type() == QGis.Point: img = it.getPointSymbolAsImage( 4 ) # 4: A convenience scale elif it.type() == QGis.Line: img = it.getLineSymbolAsImage() else: #polygon img = it.getPolygonSymbolAsImage() values = '' lw = it.lowerValue() if not lw.isEmpty(): values += lw uv = it.upperValue() if not uv.isEmpty(): values += " - " values += uv label = it.label() if not label.isEmpty(): values += " " values += label pix = QPixmap( 20, 20 ) pix = QPixmap().fromImage( img ) itemList.append( [ values, pix ] ) self.changeSymbologySettings( layer, itemList ) def changeSymbologySettings( self, theMapLayer, itemList ): if not theMapLayer: return # Remove previous symbology items self.takeChildren() # Add the name of classification field as the first symbology item renderer = theMapLayer.renderer() if renderer.name() == "Graduated Symbol" or \ renderer.name() == "Unique Value": fields = theMapLayer.pendingFields() self.child = QTreeWidgetItem( self ) self.child.setText( 0, fields[ renderer.classificationAttributes()[ 0 ] ].name() ) childFont = QFont() childFont.setItalic( True ) self.child.setFont( 0, childFont ) # Add the new symbology items for i in range( len( itemList ) ): self.child = QTreeWidgetItem( self ) self.child.setText( 0, unicode( itemList[ i ][ 0 ] ) ) iconChild = QIcon() iconChild.addPixmap( itemList[ i ][ 1 ] ) self.child.setIcon( 0, iconChild ) childFont = QFont() childFont.setPointSize( 9 ) self.child.setFont( 0, childFont )