QGIS/python/plugins/GdalTools/tools/inOutSelector.py
2012-12-31 14:06:50 +01:00

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()