file_management_menu_provider.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. from PyQt5.QtWidgets import QMenu, QAction
  2. from PyQt5.QtCore import QEvent, QObject, QSettings
  3. from qgis.core import QgsVectorLayer, QgsRasterLayer, QgsMapLayer
  4. from .copy_path import copy_path
  5. from .uri import Uri
  6. from .file_manager import FileManager
  7. class FileManagementMenuObjectSettings:
  8. def __init__(self, layer_type, supported, context):
  9. if isinstance(layer_type, str):
  10. self.layer_type = [layer_type]
  11. else:
  12. self.layer_type = layer_type
  13. self.must_be_supported_type = supported
  14. self.context = context
  15. class FileManagementMenuProvider(QObject):
  16. def __init__(self, iface, settings):
  17. QObject.__init__(self)
  18. self._iface = iface
  19. self._view = iface.layerTreeView()
  20. self._actions = {}
  21. self._file_management_menu_base = QMenu('&File Management') # vector layer
  22. self._file_management_menu_db = QMenu('&File Management') # vector layer and database type
  23. self._file_management_menu_lyr = QMenu('&File Management') # vector layer and not database type
  24. self._settings = settings
  25. self._recent_path_actions = []
  26. self.create_recent_path_actions()
  27. self._clear_recent_paths_action = QAction('Clear History')
  28. self._clear_recent_paths_action.triggered.connect(self.clear_history)
  29. def clear_history(self):
  30. QSettings().remove('file_management/recent_rel_paths')
  31. self.create_recent_path_actions()
  32. self.create_menus()
  33. def addAction(self, action, settings):
  34. self._actions[action] = settings
  35. def create_recent_path_actions(self):
  36. self._recent_path_actions.clear()
  37. recent_paths = [str(x) for x in QSettings().value('file_management/recent_rel_paths', []) if x]
  38. for recent_path in recent_paths:
  39. func = eval(f'lambda: copy_path(self._view, \'relative path\', \'{recent_path}\', settings)',
  40. {'self': self, 'copy_path': copy_path, 'settings': self._settings})
  41. action_ = QAction(f'Copy Relative Path From: {recent_path}')
  42. action_.triggered.connect(func)
  43. self._recent_path_actions.append(action_)
  44. def register_layers(self, layers):
  45. for layer in layers:
  46. self.register_layer(layer)
  47. def register_layer(self, layer):
  48. uri = Uri(layer)
  49. fm = FileManager(uri)
  50. if fm.is_valid() and uri.is_database():
  51. self._iface.addCustomActionForLayer(self._file_management_menu_db.menuAction(), layer)
  52. elif fm.is_valid():
  53. self._iface.addCustomActionForLayer(self._file_management_menu_lyr.menuAction(), layer)
  54. else:
  55. self._iface.addCustomActionForLayer(self._file_management_menu_base.menuAction(), layer)
  56. def register_menus(self):
  57. self._iface.addCustomActionForLayerType(self._file_management_menu_base.menuAction(), '', QgsMapLayer.VectorLayer, False)
  58. self._iface.addCustomActionForLayerType(self._file_management_menu_db.menuAction(), '', QgsMapLayer.VectorLayer, False)
  59. self._iface.addCustomActionForLayerType(self._file_management_menu_lyr.menuAction(), '', QgsMapLayer.VectorLayer, False)
  60. def unregister_menus(self):
  61. self._iface.removeCustomActionForLayerType(self._file_management_menu_base.menuAction())
  62. self._iface.removeCustomActionForLayerType(self._file_management_menu_db.menuAction())
  63. self._iface.removeCustomActionForLayerType(self._file_management_menu_lyr.menuAction())
  64. def create_menus(self):
  65. self._file_management_menu_base.clear()
  66. self._file_management_menu_db.clear()
  67. self._file_management_menu_lyr.clear()
  68. for action, settings in self._actions.items():
  69. if isinstance(action, QAction):
  70. if 'database' in settings.context:
  71. self._file_management_menu_db.addAction(action)
  72. if 'file' in settings.context:
  73. self._file_management_menu_lyr.addAction(action)
  74. if not settings.must_be_supported_type:
  75. self._file_management_menu_base.addAction(action)
  76. elif isinstance(action, str) and action == 'separator':
  77. if 'database' in settings.context:
  78. self._file_management_menu_db.addSeparator()
  79. if 'file' in settings.context:
  80. self._file_management_menu_lyr.addSeparator()
  81. if not settings.must_be_supported_type:
  82. self._file_management_menu_base.addSeparator()
  83. if self._recent_path_actions:
  84. self._file_management_menu_db.addSeparator()
  85. self._file_management_menu_lyr.addSeparator()
  86. self._file_management_menu_base.addSeparator()
  87. for action in self._recent_path_actions:
  88. self._file_management_menu_db.addAction(action)
  89. self._file_management_menu_lyr.addAction(action)
  90. self._file_management_menu_base.addAction(action)
  91. self._file_management_menu_db.addAction(self._clear_recent_paths_action)
  92. self._file_management_menu_lyr.addAction(self._clear_recent_paths_action)
  93. self._file_management_menu_base.addAction(self._clear_recent_paths_action)
  94. # def createContextMenu(self) -> QMenu:
  95. # menu = self._original_menu()
  96. #
  97. # if not self._view.currentLayer():
  98. # return menu
  99. #
  100. # uri = Uri(self._view.currentLayer())
  101. # fm = FileManager(uri)
  102. #
  103. # action_before = None
  104. # for action in menu.actions():
  105. # if 'Set Layer Scale' in action.text():
  106. # action_before = action
  107. # break
  108. #
  109. # self._file_management_menu.clear()
  110. # for action, settings in self._actions.items():
  111. # if isinstance(action, QAction):
  112. # if settings.must_be_supported and fm.is_valid():
  113. # if settings.must_be_database and uri.is_database():
  114. # self._file_management_menu.addAction(action)
  115. # elif not settings.must_be_database:
  116. # self._file_management_menu.addAction(action)
  117. # elif not settings.must_be_supported:
  118. # if settings.must_be_database and uri.is_database():
  119. # self._file_management_menu.addAction(action)
  120. # elif not settings.must_be_database:
  121. # self._file_management_menu.addAction(action)
  122. # elif isinstance(action, str) and action == 'separator':
  123. # self._file_management_menu.addSeparator()
  124. # elif isinstance(action, str):
  125. # if QSettings().contains(action):
  126. # recent_paths = [str(x) for x in QSettings().value(action) if x]
  127. # if not isinstance(recent_paths, list):
  128. # continue
  129. # for i, recent_path in enumerate(recent_paths):
  130. # if i == 0:
  131. # self._file_management_menu.addSeparator()
  132. # func = eval(f'lambda: copy_path(self._view, \'relative path\', \'{recent_path}\', settings)',
  133. # {'self': self, 'copy_path': copy_path, 'settings': self._settings})
  134. # action_ = QAction(f'Copy Relative Path From: {recent_path}', self._file_management_menu)
  135. # action_.triggered.connect(func)
  136. # self._file_management_menu.addAction(action_)
  137. #
  138. # if i + 1 == len(recent_paths):
  139. # action_ = QAction('Clear History', self._file_management_menu)
  140. # action_.triggered.connect(lambda: QSettings().remove('file_management/recent_rel_paths'))
  141. # self._file_management_menu.addAction(action_)
  142. #
  143. # if not self._file_management_menu.isEmpty():
  144. # if action_before is not None:
  145. # menu.insertMenu(action_before, self._file_management_menu)
  146. # menu.insertSeparator(action_before)
  147. # else:
  148. # menu.addSeparator()
  149. # menu.addMenu(self._file_management_menu)
  150. #
  151. # return menu