Beispiel #1
0
    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)
Beispiel #3
0
    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
Beispiel #6
0
    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)
Beispiel #7
0
    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
Beispiel #11
0
    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)
Beispiel #13
0
    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)
Beispiel #16
0
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)
Beispiel #17
0
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>'
Beispiel #18
0
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 )