SettingVisibilityPresetsModel.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. # Copyright (c) 2018 Ultimaker B.V.
  2. # Cura is released under the terms of the LGPLv3 or higher.
  3. from typing import Optional, List
  4. import os
  5. import urllib.parse
  6. from configparser import ConfigParser
  7. from PyQt5.QtCore import pyqtProperty, Qt, pyqtSignal, pyqtSlot, QObject
  8. from UM.Application import Application
  9. from UM.Logger import Logger
  10. from UM.Qt.ListModel import ListModel
  11. from UM.Resources import Resources
  12. from UM.MimeTypeDatabase import MimeTypeDatabase, MimeTypeNotFoundError
  13. from UM.i18n import i18nCatalog
  14. from cura.Settings.SettingVisibilityPreset import SettingVisibilityPreset
  15. catalog = i18nCatalog("cura")
  16. class SettingVisibilityPresetsModel(QObject):
  17. onItemsChanged = pyqtSignal()
  18. activePresetChanged = pyqtSignal()
  19. def __init__(self, parent = None):
  20. super().__init__(parent)
  21. self._items = [] # type: List[SettingVisibilityPreset]
  22. self._populate()
  23. basic_item = self._getVisibilityPresetById("basic")
  24. basic_visibile_settings = ";".join(basic_item.settings)
  25. self._preferences = Application.getInstance().getPreferences()
  26. # Preference to store which preset is currently selected
  27. self._preferences.addPreference("cura/active_setting_visibility_preset", "basic")
  28. # Preference that stores the "custom" set so it can always be restored (even after a restart)
  29. self._preferences.addPreference("cura/custom_visible_settings", basic_visibile_settings)
  30. self._preferences.preferenceChanged.connect(self._onPreferencesChanged)
  31. self._active_preset_item = self._getVisibilityPresetById(self._preferences.getValue("cura/active_setting_visibility_preset"))
  32. # Initialize visible settings if it is not done yet
  33. visible_settings = self._preferences.getValue("general/visible_settings")
  34. if not visible_settings:
  35. self._preferences.setValue("general/visible_settings", ";".join(self._active_preset_item.settings))
  36. else:
  37. self._onPreferencesChanged("general/visible_settings")
  38. self.activePresetChanged.emit()
  39. def _getVisibilityPresetById(self, item_id: str) -> Optional[SettingVisibilityPreset]:
  40. result = None
  41. for item in self._items:
  42. if item.id == item_id:
  43. result = item
  44. break
  45. return result
  46. def _populate(self) -> None:
  47. from cura.CuraApplication import CuraApplication
  48. items = [] # type: List[SettingVisibilityPreset]
  49. custom_preset = SettingVisibilityPreset(id = "custom", name = "Custom selection", weight = -100)
  50. items.append(custom_preset)
  51. for file_path in Resources.getAllResourcesOfType(CuraApplication.ResourceTypes.SettingVisibilityPreset):
  52. setting_visibility_preset = SettingVisibilityPreset()
  53. try:
  54. setting_visibility_preset.loadFromFile(file_path)
  55. except Exception:
  56. Logger.logException("e", "Failed to load setting preset %s", file_path)
  57. items.append(setting_visibility_preset)
  58. # Sort them on weight (and if that fails, use ID)
  59. items.sort(key = lambda k: (int(k.weight), k.id))
  60. self.setItems(items)
  61. @pyqtProperty("QVariantList", notify = onItemsChanged)
  62. def items(self):
  63. return self._items
  64. def setItems(self, items: List[SettingVisibilityPreset]) -> None:
  65. if self._items != items:
  66. self._items = items
  67. self.onItemsChanged.emit()
  68. @pyqtSlot(str)
  69. def setActivePreset(self, preset_id: str) -> None:
  70. if preset_id == self._active_preset_item.id:
  71. Logger.log("d", "Same setting visibility preset [%s] selected, do nothing.", preset_id)
  72. return
  73. preset_item = self._getVisibilityPresetById(preset_id)
  74. if preset_item is None:
  75. Logger.log("w", "Tried to set active preset to unknown id [%s]", preset_id)
  76. return
  77. need_to_save_to_custom = self._active_preset_item.id == "custom" and preset_id != "custom"
  78. if need_to_save_to_custom:
  79. # Save the current visibility settings to custom
  80. current_visibility_string = self._preferences.getValue("general/visible_settings")
  81. if current_visibility_string:
  82. self._preferences.setValue("cura/custom_visible_settings", current_visibility_string)
  83. new_visibility_string = ";".join(preset_item.settings)
  84. if preset_id == "custom":
  85. # Get settings from the stored custom data
  86. new_visibility_string = self._preferences.getValue("cura/custom_visible_settings")
  87. if new_visibility_string is None:
  88. new_visibility_string = self._preferences.getValue("general/visible_settings")
  89. self._preferences.setValue("general/visible_settings", new_visibility_string)
  90. self._preferences.setValue("cura/active_setting_visibility_preset", preset_id)
  91. self._active_preset_item = preset_item
  92. self.activePresetChanged.emit()
  93. @pyqtProperty(str, notify = activePresetChanged)
  94. def activePreset(self) -> str:
  95. return self._active_preset_item.id
  96. def _onPreferencesChanged(self, name: str) -> None:
  97. if name != "general/visible_settings":
  98. return
  99. # Find the preset that matches with the current visible settings setup
  100. visibility_string = self._preferences.getValue("general/visible_settings")
  101. if not visibility_string:
  102. return
  103. visibility_set = set(visibility_string.split(";"))
  104. matching_preset_item = None
  105. for item in self._items:
  106. if item.id == "custom":
  107. continue
  108. if set(item.settings) == visibility_set:
  109. matching_preset_item = item
  110. break
  111. item_to_set = self._active_preset_item
  112. if matching_preset_item is None:
  113. # The new visibility setup is "custom" should be custom
  114. if self._active_preset_item.id == "custom":
  115. # We are already in custom, just save the settings
  116. self._preferences.setValue("cura/custom_visible_settings", visibility_string)
  117. else:
  118. # We need to move to custom preset.
  119. item_to_set = self._getVisibilityPresetById("custom")
  120. else:
  121. item_to_set = matching_preset_item
  122. if self._active_preset_item is None or self._active_preset_item.id != item_to_set.id:
  123. self._active_preset_item = item_to_set
  124. self._preferences.setValue("cura/active_setting_visibility_preset", self._active_preset_item.id)
  125. self.activePresetChanged.emit()