DirectorySelectorDialog.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. """
  2. ***************************************************************************
  3. DirectorySelectorDialog.py
  4. ---------------------
  5. Date : May 2016
  6. Copyright : (C) 2016 by Alexander Bruy
  7. Email : alexander dot bruy at gmail dot com
  8. ***************************************************************************
  9. * *
  10. * This program is free software; you can redistribute it and/or modify *
  11. * it under the terms of the GNU General Public License as published by *
  12. * the Free Software Foundation; either version 2 of the License, or *
  13. * (at your option) any later version. *
  14. * *
  15. ***************************************************************************
  16. """
  17. __author__ = 'Alexander Bruy'
  18. __date__ = 'May 2016'
  19. __copyright__ = '(C) 2016, Victor Olaya'
  20. import os
  21. import warnings
  22. from qgis.PyQt import uic
  23. from qgis.core import QgsSettings
  24. from qgis.PyQt.QtWidgets import QDialog, QAbstractItemView, QPushButton, QDialogButtonBox, QFileDialog
  25. from qgis.PyQt.QtGui import QStandardItemModel, QStandardItem
  26. pluginPath = os.path.split(os.path.dirname(__file__))[0]
  27. with warnings.catch_warnings():
  28. warnings.filterwarnings("ignore", category=DeprecationWarning)
  29. WIDGET, BASE = uic.loadUiType(
  30. os.path.join(pluginPath, 'ui', 'DlgMultipleSelection.ui'))
  31. class DirectorySelectorDialog(BASE, WIDGET):
  32. def __init__(self, parent, options):
  33. super().__init__(None)
  34. self.setupUi(self)
  35. self.lstLayers.setSelectionMode(QAbstractItemView.ExtendedSelection)
  36. self.options = options
  37. # Additional buttons
  38. self.btnAdd = QPushButton(self.tr('Add'))
  39. self.buttonBox.addButton(self.btnAdd,
  40. QDialogButtonBox.ActionRole)
  41. self.btnRemove = QPushButton(self.tr('Remove'))
  42. self.buttonBox.addButton(self.btnRemove,
  43. QDialogButtonBox.ActionRole)
  44. self.btnRemoveAll = QPushButton(self.tr('Remove all'))
  45. self.buttonBox.addButton(self.btnRemoveAll,
  46. QDialogButtonBox.ActionRole)
  47. self.btnAdd.clicked.connect(self.addDirectory)
  48. self.btnRemove.clicked.connect(lambda: self.removeRows())
  49. self.btnRemoveAll.clicked.connect(lambda: self.removeRows(True))
  50. self.populateList()
  51. def populateList(self):
  52. model = QStandardItemModel()
  53. for option in self.options:
  54. item = QStandardItem(option)
  55. model.appendRow(item)
  56. self.lstLayers.setModel(model)
  57. def accept(self):
  58. self.selectedoptions = []
  59. model = self.lstLayers.model()
  60. for i in range(model.rowCount()):
  61. item = model.item(i)
  62. self.selectedoptions.append(item.text())
  63. QDialog.accept(self)
  64. def reject(self):
  65. QDialog.reject(self)
  66. def addDirectory(self):
  67. settings = QgsSettings()
  68. if settings.contains('/Processing/lastDirectory'):
  69. path = settings.value('/Processing/lastDirectory')
  70. else:
  71. path = ''
  72. folder = QFileDialog.getExistingDirectory(self,
  73. self.tr('Select directory'),
  74. path,
  75. QFileDialog.ShowDirsOnly)
  76. if folder == '':
  77. return
  78. model = self.lstLayers.model()
  79. item = QStandardItem(folder)
  80. model.appendRow(item)
  81. settings.setValue('/Processing/lastDirectory',
  82. os.path.dirname(folder))
  83. def removeRows(self, removeAll=False):
  84. if removeAll:
  85. self.lstLayers.model().clear()
  86. else:
  87. self.lstLayers.setUpdatesEnabled(False)
  88. indexes = sorted(self.lstLayers.selectionModel().selectedIndexes())
  89. for i in reversed(indexes):
  90. self.lstLayers.model().removeRow(i.row())
  91. self.lstLayers.setUpdatesEnabled(True)
  92. def value(self):
  93. folders = []
  94. model = self.lstLayers.model()
  95. for i in range(model.rowCount()):
  96. folders.append(model.item(i).text())
  97. return ';'.join(folders)