class ConflictWindow(QMainWindow): mergeCompleted = pyqtSignal() def __init__(self, layer, type='conflict', parent=None): QMainWindow.__init__(self) self.iface = parent.iface self.layer = layer self.parent = parent self.layer_list = parent.layer_list settings = QSettings() self.tools = PgVersionTools(self) # Restore Window Settings settings = QSettings() try: self.restoreGeometry( pybytearray(settings.value("/pgVersion/geometry"))) self.restoreState( pybytearray(settings.value("/pgVersion/windowState"))) except: pass settings = QSettings() self.canvas = QgsMapCanvas() self.canvas.setCanvasColor(Qt.white) self.canvas.enableAntiAliasing( settings.value("/qgis/enable_anti_aliasing", True, type=bool)) self.canvas.useImageToRender( settings.value("/qgis/use_qimage_to_render", True, type=bool)) action = pyint(settings.value("/qgis/wheel_action", 0)) zoomFactor = pyint(settings.value("/qgis/zoom_factor", 2)) self.canvas.setWheelAction(QgsMapCanvas.WheelAction(action), zoomFactor) QgsMapLayerRegistry.instance().addMapLayer(layer) self.canvas.setExtent(layer.extent()) self.canvas.setLayerSet([QgsMapCanvasLayer(layer)]) self.canvas.zoomToFullExtent() self.setCentralWidget(self.canvas) actionZoomIn = QAction(QIcon(":/plugins/pgversion/icons/ZoomIn.png"), pystring("Zoom in"), self) actionZoomOut = QAction(QIcon(":/plugins/pgversion/icons/ZoomOut.png"), pystring("Zoom out"), self) actionZoomFull = QAction( QIcon(":/plugins/pgversion/icons/ZoomFullExtent.png"), pystring("Fullextent"), self) actionPan = QAction(QIcon(":/plugins/pgversion/icons/Pan.png"), pystring("Pan"), self) actionZoomIn.setCheckable(True) actionZoomOut.setCheckable(True) actionPan.setCheckable(True) actionZoomIn.triggered.connect(self.zoomIn) actionZoomOut.triggered.connect(self.zoomOut) actionZoomFull.triggered.connect(self.zoomFull) actionPan.triggered.connect(self.pan) self.toolbar = self.addToolBar("Canvas actions") self.toolbar.addAction(actionPan) self.toolbar.addAction(actionZoomIn) self.toolbar.addAction(actionZoomOut) self.toolbar.addAction(actionZoomFull) self.dockWidget = QDockWidget() self.dockWidget.setWidget(QTableWidget()) self.addDockWidget(Qt.BottomDockWidgetArea, self.dockWidget) self.tabView = self.dockWidget.widget() # create the map tools self.toolPan = QgsMapToolPan(self.canvas) self.toolPan.setAction(actionPan) self.toolZoomIn = QgsMapToolZoom(self.canvas, False) # false = in self.toolZoomIn.setAction(actionZoomIn) self.toolZoomOut = QgsMapToolZoom(self.canvas, True) # true = out self.toolZoomOut.setAction(actionZoomOut) self.pan() self.conflictLayerList = [] if type == 'conflict': self.cmbMerge = QComboBox() self.cmbMerge.addItems(self.tools.confRecords(self.layer)) self.btnMerge = QPushButton() self.cmbMerge.currentIndexChanged.connect(self.toggleBtnMerge) self.btnMerge.setText(self.tr('solve conflict')) self.toolbar.addWidget(self.cmbMerge) self.toolbar.addWidget(self.btnMerge) self.manageConflicts() self.btnMerge.clicked.connect(self.runMerge) self.tabView.itemSelectionChanged.connect(self.showConfObject) self.rBand = QgsRubberBand(self.canvas, False) def toggleBtnMerge(self): # if not self.btnMerge.isEnabled(): # self.btnMerge.setEnabled(False) # else: # self.btnMerge.setEnabled(True) return def toggleBtnCommit(self): # if not self.btnMerge.isEnabled(): # self.btnMerge.setEnabled(False) # else: # self.btnMerge.setEnabled(True) return def zoomIn(self): self.canvas.setMapTool(self.toolZoomIn) def zoomOut(self): self.canvas.setMapTool(self.toolZoomOut) def zoomFull(self): self.canvas.zoomToFullExtent() def pan(self): self.canvas.setMapTool(self.toolPan) def closeEvent(self, e): """ save window state """ # settings = QSettings() # settings.setValue("/pgVersion/windowState", pybytearray(self.saveState())) # settings.setValue("/pgVersion/geometry", pybytearray(self.saveGeometry())) QgsMapLayerRegistry.instance().removeMapLayer( self.tools.conflictLayer(self.layer).id()) self.close() def showDiffs(self): pass def showConfObject(self): myProject = self.tabView.item(self.tabView.currentRow(), 0).text() myId = self.tabView.item(self.tabView.currentRow(), 3).text() confLayer = self.tools.conflictLayer(self.layer) self.conflictLayerList.append(confLayer) self.rBand.reset() self.rBand.setColor(QColor(0, 0, 255)) self.rBand.setWidth(5) if confLayer.isValid(): iter = confLayer.getFeatures() for feature in iter: geom = feature.geometry() attrs = feature.attributes() if str(attrs[0]) == myId and attrs[len(attrs) - 5] == myProject: self.rBand.addGeometry(geom, None) return def manageConflicts(self): QApplication.setOverrideCursor(Qt.WaitCursor) vLayer = self.tools.conflictLayer(self.layer) if vLayer == None: return vLayerList = [vLayer, self.layer] QgsMapLayerRegistry.instance().addMapLayers(vLayerList, False) self.vLayerId = vLayer.id() self.canvas.setExtent(vLayer.extent()) self.canvas.refresh() vLayer.triggerRepaint() tabData = self.tools.tableRecords(self.layer) if tabData <> None: self.tools.createGridView(self.tabView, tabData[0], tabData[1], 100, 10) else: QApplication.restoreOverrideCursor() self.mergeCompleted.emit() QApplication.restoreOverrideCursor() def runMerge(self): QApplication.setOverrideCursor(Qt.WaitCursor) currentLayer = self.layer object = self.cmbMerge.currentText() if currentLayer == None: QMessageBox.information( None, self.tr('Notice'), self.tr('Please select a versioned layer for committing')) return else: myDb = self.tools.layerDB('Merge', currentLayer) mySchema = self.tools.layerSchema(currentLayer) myTable = self.tools.layerTable(currentLayer).replace( "_version", "") objectArray = object.split(" - ") if len(objectArray) == 1: return elif 'Commit all' in objectArray[0]: projectName = objectArray[1].strip() sql = "select objectkey from versions.pgvscheck('%s.%s') \ where myuser = '******' or conflict_user = '******' \ order by objectkey" % (mySchema, myTable, projectName, projectName) result = myDb.read(sql) for i in range(len(result['OBJECTKEY'])): sql = "select versions.pgvsmerge('%s.%s',%s,'%s')" % ( mySchema, myTable, result['OBJECTKEY'][i], projectName) myDb.run(sql) else: projectName = objectArray[1].strip() sql = "select versions.pgvsmerge('%s.%s',%s,'%s')" % ( mySchema, myTable, objectArray[0], projectName) myDb.run(sql) self.canvas.refresh() self.layer.triggerRepaint() self.cmbMerge.clear() QApplication.restoreOverrideCursor() if self.tools.confRecords(self.layer) == None: self.tabView.clear() self.tools.setModified(self.parent.layer_list) self.close() else: self.cmbMerge.addItems(self.tools.confRecords(self.layer)) tabData = self.tools.tableRecords(self.layer) self.tools.createGridView(self.tabView, tabData[0], tabData[1], 100, 10) self.manageConflicts() def loadLayer(self, layer): provider = layer.dataProvider() uri = provider.dataSourceUri() mySchema = self.tools.layerSchema(layer) myHost = self.tools.layerHost(layer) myDatabase = self.tools.layerDB(layer) myPassword = self.tools.layerPassword(layer) myPort = self.tools.layerPort(layer) myUsername = self.tools.layerUsername(layer) myGeometryColumn = self.tools.layerGeomCol(layer) myTable = myTable.replace("_version", "") myUri = QgsDataSourceURI() myUri.setConnection(myHost, myPort, myDatabase, myUsername, myPassword) myUri.setDataSource(mySchema, myTable, myGeometryColumn) myLayer = QgsVectorLayer(myUri.uri(), "", "postgres") QgsMapLayerRegistry.instance().addMapLayer(myLayer, False) # self.canvas.setExtent(myLayer.extent()) self.canvas.setLayerSet([QgsMapCanvasLayer(myLayer)]) self.canvas.refresh()
class ConflictWindow(QMainWindow): mergeCompleted = pyqtSignal() def __init__(self, iface, layer, type='conflict', parent=None): QMainWindow.__init__(self) self.iface = iface self.tools = PgVersionTools(iface) self.layer = layer self.parent = parent settings = QSettings() # Restore Window Settings settings = QSettings() try: self.restoreGeometry(pybytearray(settings.value("/pgVersion/geometry"))) self.restoreState(pybytearray(settings.value("/pgVersion/windowState"))) except: pass settings = QSettings() self.canvas = QgsMapCanvas() self.canvas.setCanvasColor(Qt.white) self.canvas.enableAntiAliasing( settings.value( "/qgis/enable_anti_aliasing",True, type=bool) ) self.canvas.useImageToRender( settings.value( "/qgis/use_qimage_to_render", True, type=bool) ) action = pyint(settings.value( "/qgis/wheel_action", 0 ) ) zoomFactor = pyint(settings.value( "/qgis/zoom_factor", 2) ) self.canvas.setWheelAction( QgsMapCanvas.WheelAction(action), zoomFactor ) QgsMapLayerRegistry.instance().addMapLayer(layer) self.canvas.setExtent(layer.extent()) self.canvas.setLayerSet( [ QgsMapCanvasLayer(layer) ] ) self.canvas.zoomToFullExtent() self.setCentralWidget(self.canvas) actionZoomIn = QAction(QIcon(":/plugins/pgversion/icons/ZoomIn.png"), pystring("Zoom in"), self) actionZoomOut = QAction(QIcon(":/plugins/pgversion/icons/ZoomOut.png"),pystring("Zoom out"), self) actionZoomFull = QAction(QIcon(":/plugins/pgversion/icons/ZoomFullExtent.png"),pystring("Fullextent"), self) actionPan = QAction(QIcon(":/plugins/pgversion/icons/Pan.png"),pystring("Pan"), self) actionZoomIn.setCheckable(True) actionZoomOut.setCheckable(True) actionPan.setCheckable(True) actionZoomIn.triggered.connect(self.zoomIn) actionZoomOut.triggered.connect(self.zoomOut) actionZoomFull.triggered.connect(self.zoomFull) actionPan.triggered.connect(self.pan) self.toolbar = self.addToolBar("Canvas actions") self.toolbar.addAction(actionPan) self.toolbar.addAction(actionZoomIn) self.toolbar.addAction(actionZoomOut) self.toolbar.addAction(actionZoomFull) self.dockWidget = QDockWidget() self.dockWidget.setWidget(QTableWidget()) self.addDockWidget(Qt.BottomDockWidgetArea, self.dockWidget) self.tabView = self.dockWidget.widget() # create the map tools self.toolPan = QgsMapToolPan(self.canvas) self.toolPan.setAction(actionPan) self.toolZoomIn = QgsMapToolZoom(self.canvas, False) # false = in self.toolZoomIn.setAction(actionZoomIn) self.toolZoomOut = QgsMapToolZoom(self.canvas, True) # true = out self.toolZoomOut.setAction(actionZoomOut) self.pan() self.conflictLayerList = [] if type=='conflict': self.cmbMerge = QComboBox() self.cmbMerge.addItems(self.tools.confRecords(self.layer)) self.btnMerge = QPushButton() self.cmbMerge.currentIndexChanged.connect(self.toggleBtnMerge) self.btnMerge.setText(QCoreApplication.translate('ManagerWindow','solve conflict')) self.toolbar.addWidget(self.cmbMerge) self.toolbar.addWidget(self.btnMerge) self.manageConflicts() self.btnMerge.clicked.connect(self.runMerge) self.tabView.itemSelectionChanged.connect(self.showConfObject) self.rBand = QgsRubberBand(self.canvas, False) def toggleBtnMerge(self): # if not self.btnMerge.isEnabled(): # self.btnMerge.setEnabled(False) # else: # self.btnMerge.setEnabled(True) return def toggleBtnCommit(self): # if not self.btnMerge.isEnabled(): # self.btnMerge.setEnabled(False) # else: # self.btnMerge.setEnabled(True) return def zoomIn(self): self.canvas.setMapTool(self.toolZoomIn) def zoomOut(self): self.canvas.setMapTool(self.toolZoomOut) def zoomFull(self): self.canvas.zoomToFullExtent() def pan(self): self.canvas.setMapTool(self.toolPan) def closeEvent(self, e): """ save window state """ # settings = QSettings() # settings.setValue("/pgVersion/windowState", pybytearray(self.saveState())) # settings.setValue("/pgVersion/geometry", pybytearray(self.saveGeometry())) QgsMapLayerRegistry.instance().removeMapLayer(self.tools.conflictLayer(self.layer).id()) self.close() def showDiffs(self): pass def showConfObject(self): myProject = self.tabView.item(self.tabView.currentRow(), 0).text() myId = self.tabView.item(self.tabView.currentRow(), 3).text() confLayer = self.tools.conflictLayer(self.layer) self.conflictLayerList.append(confLayer) self.rBand.reset() self.rBand.setColor(QColor(0, 0, 255)) self.rBand.setWidth(5) if confLayer.isValid(): iter = confLayer.getFeatures() for feature in iter: geom = feature.geometry() attrs = feature.attributes() if str(attrs[0]) == myId and attrs[len(attrs)-5] == myProject: self.rBand.addGeometry(geom, None) return def manageConflicts(self): QApplication.setOverrideCursor(Qt.WaitCursor) vLayer = self.tools.conflictLayer(self.layer) if vLayer == None: return vLayerList = [vLayer, self.layer] QgsMapLayerRegistry.instance().addMapLayers(vLayerList, False) self.vLayerId = vLayer.id() self.canvas.setExtent(vLayer.extent()) self.canvas.refresh() vLayer.triggerRepaint() tabData = self.tools.tableRecords(self.layer) if tabData <> None: self.tools.createGridView(self.tabView, tabData[0], tabData[1], 100, 10) else: self.mergeCompleted.emit() QApplication.restoreOverrideCursor() def runMerge(self): QApplication.setOverrideCursor(Qt.WaitCursor) currentLayer = self.layer object = self.cmbMerge.currentText() if currentLayer == None: QMessageBox.information(None, '', QCoreApplication.translate('ManagerWindow','Please select a versioned layer for committing')) return else: myDb = self.tools.layerDB('Merge', currentLayer) mySchema = self.tools.layerSchema(currentLayer) myTable = self.tools.layerTable(currentLayer).replace("_version", "") objectArray = object.split(" - ") if len(objectArray)==1: return elif 'Commit all' in objectArray[0]: projectName = objectArray[1].strip() sql = "select objectkey from versions.pgvscheck('%s.%s') \ where myuser = '******' or conflict_user = '******' \ order by objectkey" % (mySchema, myTable, projectName, projectName) result = myDb.read(sql) for i in range(len(result['OBJECTKEY'])): sql ="select versions.pgvsmerge('%s.%s',%s,'%s')" % (mySchema, myTable, result['OBJECTKEY'][i], projectName) myDb.run(sql) else: projectName = objectArray[1].strip() sql ="select versions.pgvsmerge('%s.%s',%s,'%s')" % (mySchema, myTable, objectArray[0], projectName) myDb.run(sql) self.canvas.refresh() self.layer.triggerRepaint() self.cmbMerge.clear() QApplication.restoreOverrideCursor() if self.tools.confRecords(self.layer) == None: self.tabView.clear() self.tools.setModified(self.layer) self.close() else: self.cmbMerge.addItems(self.tools.confRecords(self.layer)) tabData = self.tools.tableRecords(self.layer) self.tools.createGridView(self.tabView, tabData[0], tabData[1], 100, 10) self.manageConflicts() def loadLayer(self, layer): provider = layer.dataProvider() uri = provider.dataSourceUri() mySchema = self.tools.layerSchema(layer) myHost = self.tools.layerHost(layer) myDatabase = self.tools.layerDB(layer) myPassword = self.tools.layerPassword(layer) myPort = self.tools.layerPort(layer) myUsername = self.tools.layerUsername(layer) myGeometryColumn = self.tools.layerGeomCol(layer) myTable = myTable.replace("_version", "") myUri = QgsDataSourceURI() myUri.setConnection(myHost, myPort, myDatabase, myUsername, myPassword) myUri.setDataSource(mySchema, myTable, myGeometryColumn) myLayer = QgsVectorLayer(myUri.uri(), "", "postgres") QgsMapLayerRegistry.instance().addMapLayer(myLayer, False) # self.canvas.setExtent(myLayer.extent()) self.canvas.setLayerSet([QgsMapCanvasLayer(myLayer)]) self.canvas.refresh()