Skip to content

Commit b70b68a

Browse files
committed
Implement profiles for plugin management.
1 parent 9bb9b86 commit b70b68a

8 files changed

Lines changed: 81 additions & 60 deletions

File tree

src/mapclient/application.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ def _user_specified_environment_main(base_dir, directories):
383383
if os.path.isdir(d) and d not in plugin_directories:
384384
plugin_directories.append(d)
385385

386-
pm.setDirectories(plugin_directories)
386+
pm.set_directories(plugin_directories)
387387
model.writeSettings()
388388

389389
logger.info(f"Set environment variable '{APPLICATION_ENVIRONMENT_CONFIG_DIR_VARIABLE}' to '{config_dir}' to use application with these settings.")

src/mapclient/core/managers/pluginmanager.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def getVirtualEnvCandidates():
3939

4040

4141
def _get_app_profile_key():
42-
return f'profile_name_{stable_hash(get_app_path())}'
42+
return f'current_profile_{stable_hash(get_app_path())}'
4343

4444

4545
class PluginManager:
@@ -76,6 +76,12 @@ def getVirtualEnvDirectory(self):
7676
def directories(self):
7777
return self._profile_directories.get(self._current_profile, [])
7878

79+
def current_profile(self):
80+
return self._current_profile
81+
82+
def set_current_profile(self, profile_name):
83+
self._current_profile = profile_name
84+
7985
def setReloadPlugins(self, state=True):
8086
self._reload_plugins = state
8187

@@ -105,13 +111,12 @@ def list(self):
105111
def setOptions(self, options):
106112
self._virtualenv_dir = options[VIRTUAL_ENV_PATH]
107113

108-
def setDirectories(self, directories):
114+
def set_directories(self, directories):
109115
"""
110116
Set the list of directories to be searched for
111117
plugins. Returns true if the directories listing
112118
was updated and false otherwise.
113119
"""
114-
115120
current_directories = self._profile_directories.get(self._current_profile, [])
116121
if current_directories != directories:
117122
self._profile_directories[self._current_profile] = directories
@@ -356,6 +361,7 @@ def readSettings(self, settings):
356361
self._profile_directories[profile_name] = directories
357362
settings.endArray()
358363
settings.endGroup()
364+
self._profile_directories[CONST_DEFAULT_PROFILE] = self._profile_directories.get(CONST_DEFAULT_PROFILE, [])
359365
settings.beginGroup('Ignored Plugins')
360366
plugin_count = settings.beginReadArray('plugins')
361367
for i in range(plugin_count):
@@ -399,6 +405,7 @@ def writeSettings(self, settings):
399405
settings.setArrayIndex(directory_index)
400406
settings.setValue('directory', directory)
401407
settings.endArray()
408+
profile_index += 1
402409
settings.endArray()
403410
settings.endGroup()
404411
settings.beginGroup('Ignored Plugins')
@@ -579,8 +586,8 @@ def checkForMissingPlugins(self, to_check):
579586
"""
580587
missing_plugins = {}
581588
for plugin in to_check:
582-
if not (plugin in self._database and \
583-
to_check[plugin]['author'] == self._database[plugin]['author'] and \
589+
if not (plugin in self._database and
590+
to_check[plugin]['author'] == self._database[plugin]['author'] and
584591
to_check[plugin]['version'] == self._database[plugin]['version']):
585592
missing_plugins[plugin] = to_check[plugin]
586593

src/mapclient/tools/pluginfinder/downloadtodirectorydialog.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def _download_clicked(self):
6262
'directory. Do you wish to add this directory to the MAP-Client plugin search path?')
6363
if add_dir == QMessageBox.StandardButton.Yes:
6464
self._plugin_directories.append(self._selected_directory)
65-
self._plugin_manager.setDirectories(self._plugin_directories)
65+
self._plugin_manager.set_directories(self._plugin_directories)
6666

6767
answer = QMessageBox.information(self, 'Download Successful', 'The selected plugin was successfully downloaded. '
6868
'You may need to restart the application to pick up newly downloaded plugins.')

src/mapclient/tools/pluginmanager/pluginmanagerdialog.py

Lines changed: 46 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@
1919
"""
2020
import json
2121
import os
22+
from copy import deepcopy
2223

2324
from PySide6 import QtGui, QtWidgets
25+
26+
from mapclient.core.managers.pluginmanager import CONST_DEFAULT_PROFILE
2427
from mapclient.tools.pluginmanager.ui.ui_pluginmanagerdialog import Ui_PluginManagerDialog
2528

2629

@@ -34,8 +37,12 @@ def __init__(self, plugin_manager, parent=None):
3437
self._ui = Ui_PluginManagerDialog()
3538
self._ui.setupUi(self)
3639
self._ui.removeButton.setEnabled(False)
40+
self._ui.advancedButton.setVisible(False)
3741

3842
self._plugin_manager = plugin_manager
43+
self._profile_directories = deepcopy(plugin_manager.profile_directories())
44+
self._initialise_ui()
45+
self._update_ui()
3946

4047
self._make_connections()
4148

@@ -61,16 +68,28 @@ def _show_advanced_dialog(self):
6168
self._updaterSettings = dlg._updaterSettings
6269
self.reload_plugins()
6370

64-
def _profile_changed(self, previous_text, current_text):
65-
print("Update directory listing for profile:", self._ui.profileComboBox.currentText())
66-
print(previous_text, current_text)
67-
self._plugin_manager.set_profile_directories(previous_text, self.directories())
71+
def _initialise_ui(self):
72+
self._ui.profileComboBox.clear()
6873
self._ui.directoryListing.clear()
69-
profile_name = self._ui.profileComboBox.currentText()
70-
if profile_name:
71-
directories = self._plugin_manager.profile_directories(profile_name)
72-
if directories:
73-
self._set_directories(directories)
74+
75+
# Add profiles to the combo box.
76+
current_profile = self._plugin_manager.current_profile()
77+
for profile in self._profile_directories:
78+
self._ui.profileComboBox.addItem(profile)
79+
if profile == current_profile:
80+
self._ui.profileComboBox.setCurrentText(profile)
81+
82+
self._set_directories(self._profile_directories.get(current_profile, []))
83+
84+
def _update_ui(self):
85+
editable_profile = self._ui.profileComboBox.currentText() != CONST_DEFAULT_PROFILE
86+
self._ui.profileEditButton.setEnabled(editable_profile)
87+
self._ui.profileDeleteButton.setEnabled(editable_profile)
88+
89+
def _profile_changed(self, current_index):
90+
current_profile = self._ui.profileComboBox.currentText()
91+
self._set_directories(self._profile_directories.get(current_profile, []))
92+
self._update_ui()
7493

7594
def _directory_selection_changed(self):
7695
self._ui.removeButton.setEnabled(len(self._ui.directoryListing.selectedItems()) > 0)
@@ -85,7 +104,7 @@ def _create_new_profile(self):
85104
self._ui.profileComboBox.addItem(new_profile)
86105
self._ui.profileComboBox.setCurrentText(new_profile)
87106
self._ui.directoryListing.clear()
88-
self._plugin_manager.add_profile(new_profile)
107+
self._profile_directories[new_profile] = []
89108

90109
def _edit_current_profile(self):
91110
from mapclient.tools.pluginmanager.editprofiledialog import EditProfileDialog
@@ -94,22 +113,27 @@ def _edit_current_profile(self):
94113
if dlg.exec():
95114
current_profile = self._ui.profileComboBox.currentText()
96115
edited_profile = dlg.getProfileName()
97-
if edited_profile:
116+
if edited_profile and edited_profile != current_profile and edited_profile not in self._profile_directories.keys():
98117
current_index = self._ui.profileComboBox.currentIndex()
99118
self._ui.profileComboBox.setItemText(current_index, edited_profile)
100-
self._plugin_manager.rename_profile(current_profile, edited_profile)
119+
self._profile_directories[edited_profile] = self._profile_directories[current_profile]
120+
del self._profile_directories[current_profile]
101121

102122
def _delete_current_profile(self):
123+
current_profile = self._ui.profileComboBox.currentText()
103124
self._ui.profileComboBox.removeItem(self._ui.profileComboBox.currentIndex())
104-
self._plugin_manager.remove_profile(self._ui.profileComboBox.currentText())
125+
self._profile_directories.pop(current_profile)
126+
self._update_ui()
105127

106128
def _remove_button_clicked(self):
107129
for item in self._ui.directoryListing.selectedItems():
108-
self._ui.directoryListing.takeItem(self._ui.directoryListing.row(item))
130+
row = self._ui.directoryListing.row(item)
131+
current_profile = self._ui.profileComboBox.currentText()
132+
del self._profile_directories[current_profile][row]
133+
self._ui.directoryListing.takeItem(row)
109134

110135
def _add_directory_clicked(self):
111136
selected_items = self._ui.directoryListing.selectedItems()
112-
last = ''
113137
if selected_items:
114138
last_selected_item = selected_items[-1]
115139
last = last_selected_item
@@ -121,6 +145,8 @@ def _add_directory_clicked(self):
121145

122146
directory = QtWidgets.QFileDialog.getExistingDirectory(self, caption='Select External Plugin Directory', dir=last, options=QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontResolveSymlinks | QtWidgets.QFileDialog.ReadOnly)
123147
if len(directory) > 0:
148+
current_profile = self._ui.profileComboBox.currentText()
149+
self._profile_directories[current_profile].append(directory)
124150
self._ui.directoryListing.addItem(directory)
125151

126152
def _get_profile_directories(self, profile_name):
@@ -161,6 +187,7 @@ def profile(self):
161187
return self._ui.profileComboBox.currentText()
162188

163189
def _set_directories(self, directories):
190+
self._ui.directoryListing.clear()
164191
self._ui.directoryListing.addItems([directory for directory in directories if os.path.exists(directory)])
165192

166193
def directories(self):
@@ -170,6 +197,10 @@ def directories(self):
170197

171198
return directories
172199

200+
def save_profile_data(self):
201+
self._plugin_manager.set_current_profile(self._ui.profileComboBox.currentText())
202+
self._plugin_manager.set_profile_directories(self._profile_directories)
203+
173204
# import sys
174205
# import json
175206
# import os

src/mapclient/tools/pluginmanager/qt/pluginmanagerdialog.ui

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -38,27 +38,17 @@
3838
</widget>
3939
</item>
4040
<item>
41-
<spacer name="horizontalSpacer_2">
42-
<property name="orientation">
43-
<enum>Qt::Horizontal</enum>
44-
</property>
45-
<property name="sizeHint" stdset="0">
46-
<size>
47-
<width>40</width>
48-
<height>20</height>
49-
</size>
50-
</property>
51-
</spacer>
52-
</item>
53-
<item>
54-
<widget class="QPushButton" name="profileDeleteButton">
41+
<widget class="QPushButton" name="profileNewButton">
5542
<property name="text">
56-
<string>Delete</string>
43+
<string>New</string>
44+
</property>
45+
<property name="default">
46+
<bool>true</bool>
5747
</property>
5848
</widget>
5949
</item>
6050
<item>
61-
<spacer name="horizontalSpacer_3">
51+
<spacer name="horizontalSpacer_2">
6252
<property name="orientation">
6353
<enum>Qt::Horizontal</enum>
6454
</property>
@@ -78,12 +68,9 @@
7868
</widget>
7969
</item>
8070
<item>
81-
<widget class="QPushButton" name="profileNewButton">
71+
<widget class="QPushButton" name="profileDeleteButton">
8272
<property name="text">
83-
<string>New</string>
84-
</property>
85-
<property name="default">
86-
<bool>true</bool>
73+
<string>Delete</string>
8774
</property>
8875
</widget>
8976
</item>

src/mapclient/tools/pluginmanager/ui/ui_pluginmanagerdialog.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
################################################################################
44
## Form generated from reading UI file 'pluginmanagerdialog.ui'
55
##
6-
## Created by: Qt User Interface Compiler version 6.8.1
6+
## Created by: Qt User Interface Compiler version 6.9.1
77
##
88
## WARNING! All changes made in this file will be lost when recompiling UI file!
99
################################################################################
@@ -47,28 +47,24 @@ def setupUi(self, PluginManagerDialog):
4747

4848
self.horizontalLayout_3.addWidget(self.profileComboBox)
4949

50-
self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
51-
52-
self.horizontalLayout_3.addItem(self.horizontalSpacer_2)
53-
54-
self.profileDeleteButton = QPushButton(PluginManagerDialog)
55-
self.profileDeleteButton.setObjectName(u"profileDeleteButton")
50+
self.profileNewButton = QPushButton(PluginManagerDialog)
51+
self.profileNewButton.setObjectName(u"profileNewButton")
5652

57-
self.horizontalLayout_3.addWidget(self.profileDeleteButton)
53+
self.horizontalLayout_3.addWidget(self.profileNewButton)
5854

59-
self.horizontalSpacer_3 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
55+
self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
6056

61-
self.horizontalLayout_3.addItem(self.horizontalSpacer_3)
57+
self.horizontalLayout_3.addItem(self.horizontalSpacer_2)
6258

6359
self.profileEditButton = QPushButton(PluginManagerDialog)
6460
self.profileEditButton.setObjectName(u"profileEditButton")
6561

6662
self.horizontalLayout_3.addWidget(self.profileEditButton)
6763

68-
self.profileNewButton = QPushButton(PluginManagerDialog)
69-
self.profileNewButton.setObjectName(u"profileNewButton")
64+
self.profileDeleteButton = QPushButton(PluginManagerDialog)
65+
self.profileDeleteButton.setObjectName(u"profileDeleteButton")
7066

71-
self.horizontalLayout_3.addWidget(self.profileNewButton)
67+
self.horizontalLayout_3.addWidget(self.profileDeleteButton)
7268

7369

7470
self.verticalLayout.addLayout(self.horizontalLayout_3)
@@ -164,9 +160,9 @@ def setupUi(self, PluginManagerDialog):
164160
def retranslateUi(self, PluginManagerDialog):
165161
PluginManagerDialog.setWindowTitle(QCoreApplication.translate("PluginManagerDialog", u"Plugin Manager", None))
166162
self.profileLabel.setText(QCoreApplication.translate("PluginManagerDialog", u"Profile:", None))
167-
self.profileDeleteButton.setText(QCoreApplication.translate("PluginManagerDialog", u"Delete", None))
168-
self.profileEditButton.setText(QCoreApplication.translate("PluginManagerDialog", u"Edit", None))
169163
self.profileNewButton.setText(QCoreApplication.translate("PluginManagerDialog", u"New", None))
164+
self.profileEditButton.setText(QCoreApplication.translate("PluginManagerDialog", u"Edit", None))
165+
self.profileDeleteButton.setText(QCoreApplication.translate("PluginManagerDialog", u"Delete", None))
170166
self.groupBox.setTitle("")
171167
self.label.setText(QCoreApplication.translate("PluginManagerDialog", u"Plugin directories:", None))
172168
self.addButton.setText(QCoreApplication.translate("PluginManagerDialog", u"Add Directory", None))

src/mapclient/view/mainwindow.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ def _plugin_manager_load_plugins(self):
456456
# Are we currently using the plugin manager dialog?
457457
if self._plugin_manager_dlg is not None:
458458
pm.setReloadPlugins()
459-
pm.setDirectories(self._plugin_manager_dlg.directories())
459+
pm.set_directories(self._plugin_manager_dlg.directories())
460460

461461
if pm.reloadPlugins():
462462
pm.load()

src/mapclient/view/workflow/workflowwidget.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ def installMissingPlugins(self, plugins):
390390
pluginDirs = pm.directories()
391391
if directory not in pluginDirs:
392392
pluginDirs.append(directory)
393-
pm.setDirectories(pluginDirs)
393+
pm.set_directories(pluginDirs)
394394
dlg = PluginProgress(plugins, directory, self)
395395
dlg.show()
396396
dlg.run()

0 commit comments

Comments
 (0)