mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-25 00:58:06 -05:00
264 lines
7.8 KiB
Python
264 lines
7.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
***************************************************************************
|
|
inOutSelector.py
|
|
---------------------
|
|
Date : April 2011
|
|
Copyright : (C) 2011 by Giuseppe Sucameli
|
|
Email : brush dot tyler at gmail dot com
|
|
***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************
|
|
"""
|
|
|
|
__author__ = 'Giuseppe Sucameli'
|
|
__date__ = 'April 2011'
|
|
__copyright__ = '(C) 2011, Giuseppe Sucameli'
|
|
# This will get replaced with a git SHA1 when you do a git archive
|
|
__revision__ = '$Format:%H$'
|
|
|
|
from PyQt4.QtCore import *
|
|
from PyQt4.QtGui import *
|
|
|
|
from qgis.core import QgsMapLayerRegistry, QgsMapLayer
|
|
|
|
from ui_inOutSelector import Ui_GdalToolsInOutSelector
|
|
import GdalTools_utils as Utils
|
|
|
|
class GdalToolsInOutSelector(QWidget, Ui_GdalToolsInOutSelector):
|
|
FILE = 0x1
|
|
LAYER = 0x2
|
|
MULTIFILE = 0x4 # NOT IMPLEMENTED YET
|
|
|
|
FILE_LAYER = 0x1|0x2
|
|
FILES = 0x1|0x4 # NOT IMPLEMENTED YET
|
|
FILES_LAYER = 0x3|0x4 # NOT IMPLEMENTED YET
|
|
|
|
__pyqtSignals__ = ("selectClicked()", "filenameChanged(), layerChanged()")
|
|
|
|
|
|
def __init__(self, parent = None, type=None):
|
|
QWidget.__init__(self, parent)
|
|
|
|
self.setupUi(self)
|
|
self.setFocusPolicy(Qt.StrongFocus)
|
|
self.combo.setInsertPolicy(QComboBox.NoInsert)
|
|
|
|
self.clear()
|
|
|
|
self.typ = None
|
|
if type == None:
|
|
self.resetType()
|
|
else:
|
|
self.setType(type)
|
|
|
|
self.connect(self.selectBtn, SIGNAL("clicked()"), self.selectButtonClicked)
|
|
self.connect(self.fileEdit, SIGNAL("textChanged(const QString &)"), self.textChanged)
|
|
self.connect(self.combo, SIGNAL("editTextChanged(const QString &)"), self.textChanged)
|
|
self.connect(self.combo, SIGNAL("currentIndexChanged(int)"), self.indexChanged)
|
|
|
|
def clear(self):
|
|
self.filenames = QStringList()
|
|
self.fileEdit.clear()
|
|
self.clearComboState()
|
|
self.combo.clear()
|
|
|
|
def textChanged(self):
|
|
if self.getType() & self.MULTIFILE:
|
|
self.filenames = QStringList() << self.fileEdit.text().split(",")
|
|
if self.getType() & self.LAYER:
|
|
index = self.combo.currentIndex()
|
|
if index >= 0:
|
|
text = self.combo.currentText()
|
|
if text != self.combo.itemText( index ):
|
|
return self.setFilename( text )
|
|
self.filenameChanged()
|
|
|
|
def indexChanged(self):
|
|
self.layerChanged()
|
|
self.filenameChanged()
|
|
|
|
def selectButtonClicked(self):
|
|
self.emit(SIGNAL("selectClicked()"))
|
|
|
|
def filenameChanged(self):
|
|
self.emit(SIGNAL("filenameChanged()"))
|
|
|
|
def layerChanged(self):
|
|
self.emit(SIGNAL("layerChanged()"))
|
|
|
|
def setType(self, type):
|
|
if type == self.typ:
|
|
return
|
|
|
|
if type & self.MULTIFILE: # MULTITYPE IS NOT IMPLEMENTED YET
|
|
type = type & ~self.MULTIFILE
|
|
|
|
self.typ = type
|
|
|
|
self.selectBtn.setVisible( self.getType() & self.FILE )
|
|
self.combo.setVisible( self.getType() & self.LAYER )
|
|
self.fileEdit.setVisible( not (self.getType() & self.LAYER) )
|
|
self.combo.setEditable( self.getType() & self.FILE )
|
|
|
|
if self.getType() & self.FILE:
|
|
self.setFocusProxy(self.selectBtn)
|
|
else:
|
|
self.setFocusProxy(self.combo)
|
|
|
|
# send signals to refresh connected widgets
|
|
self.filenameChanged()
|
|
self.layerChanged()
|
|
|
|
def getType(self):
|
|
return self.typ
|
|
|
|
def resetType(self):
|
|
self.setType( self.FILE_LAYER )
|
|
|
|
selectorType = pyqtProperty("int", getType, setType, resetType)
|
|
|
|
|
|
def setFilename(self, fn=None):
|
|
self.blockSignals( True )
|
|
prevFn, prevLayer = self.filename(), self.layer()
|
|
|
|
if isinstance(fn, QgsMapLayer):
|
|
fn = fn.source()
|
|
|
|
elif isinstance(fn, str) or isinstance(fn, unicode) or isinstance(fn, QString):
|
|
fn = QString( fn )
|
|
|
|
elif hasattr(fn, '__iter__') or isinstance(fn, QStringList):
|
|
if len( fn ) > 0:
|
|
fn = QStringList() << fn
|
|
if self.getType() & self.MULTIFILE:
|
|
self.filenames = fn
|
|
fn = fn.join( "," )
|
|
else:
|
|
fn = QString()
|
|
|
|
else:
|
|
fn = QString()
|
|
|
|
if not (self.getType() & self.LAYER):
|
|
self.fileEdit.setText( fn )
|
|
else:
|
|
self.combo.setCurrentIndex(-1)
|
|
self.combo.setEditText( fn )
|
|
|
|
self.blockSignals( False )
|
|
if self.filename() != prevFn:
|
|
self.filenameChanged()
|
|
if self.layer() != prevLayer:
|
|
self.layerChanged()
|
|
|
|
def setLayer(self, layer=None):
|
|
if not (self.getType() & self.LAYER):
|
|
return self.setFilename( layer )
|
|
|
|
self.blockSignals( True )
|
|
prevFn, prevLayer = self.filename(), self.layer()
|
|
|
|
if isinstance(layer, QgsMapLayer):
|
|
if self.combo.findData(layer.id()) >= 0:
|
|
index = self.combo.findData( layer.id() )
|
|
self.combo.setCurrentIndex( index )
|
|
else:
|
|
self.combo.setCurrentIndex( -1 )
|
|
self.combo.setEditText( layer.source() )
|
|
|
|
elif isinstance(layer, int) and layer >= 0 and layer < self.combo.count():
|
|
self.combo.setCurrentIndex( layer )
|
|
|
|
else:
|
|
self.combo.clearEditText()
|
|
self.combo.setCurrentIndex(-1)
|
|
|
|
self.blockSignals( False )
|
|
if self.filename() != prevFn:
|
|
self.filenameChanged()
|
|
if self.layer() != prevLayer:
|
|
self.layerChanged()
|
|
|
|
|
|
def setLayers(self, layers=None):
|
|
if layers == None or not hasattr(layers, '__iter__') or len(layers) <= 0:
|
|
self.combo.clear()
|
|
return
|
|
|
|
self.blockSignals( True )
|
|
prevFn, prevLayer = self.filename(), self.layer()
|
|
self.saveComboState()
|
|
|
|
self.combo.clear()
|
|
for l in layers:
|
|
self.combo.addItem( l.name(), l.id() )
|
|
|
|
self.restoreComboState()
|
|
self.blockSignals( False )
|
|
if self.filename() != prevFn:
|
|
self.filenameChanged()
|
|
if self.layer() != prevLayer:
|
|
self.layerChanged()
|
|
|
|
|
|
def clearComboState(self):
|
|
self.prevState = None
|
|
|
|
def saveComboState(self):
|
|
index = self.combo.currentIndex()
|
|
text = self.combo.currentText()
|
|
layerID = self.combo.itemData(index).toString() if index >= 0 else ""
|
|
self.prevState = ( index, text, layerID )
|
|
|
|
def restoreComboState(self):
|
|
if self.prevState == None:
|
|
return
|
|
index, text, layerID = self.prevState
|
|
|
|
if index < 0:
|
|
if text.isEmpty() and self.combo.count() > 0:
|
|
index = 0
|
|
|
|
elif self.combo.findData( layerID ) < 0:
|
|
index = -1
|
|
text = ""
|
|
|
|
else:
|
|
index = self.combo.findData( layerID )
|
|
|
|
self.combo.setCurrentIndex( index )
|
|
if index >= 0:
|
|
text = self.combo.itemText( index )
|
|
self.combo.setEditText( text )
|
|
|
|
def layer(self):
|
|
if self.getType() != self.FILE and self.combo.currentIndex() >= 0:
|
|
layerID = self.combo.itemData(self.combo.currentIndex()).toString()
|
|
return QgsMapLayerRegistry.instance().mapLayer( layerID )
|
|
return None
|
|
|
|
def filename(self):
|
|
if not (self.getType() & self.LAYER):
|
|
if self.getType() & self.MULTIFILE:
|
|
return self.filenames
|
|
return self.fileEdit.text()
|
|
|
|
if self.combo.currentIndex() < 0:
|
|
if self.getType() & self.MULTIFILE:
|
|
return self.filenames
|
|
return self.combo.currentText()
|
|
layer = self.layer()
|
|
if layer != None:
|
|
return layer.source()
|
|
|
|
return QString()
|
|
|