Continued refactoring of the project browser related code in order to extract some as plugins later on. eric7

Thu, 24 Nov 2022 11:51:40 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 24 Nov 2022 11:51:40 +0100
branch
eric7
changeset 9525
477545eef9f4
parent 9524
6a730f4d0080
child 9526
c2fe17f95b56

Continued refactoring of the project browser related code in order to extract some as plugins later on.

eric7.epj file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/eric7.Project.ProjectBrowserFlags.html file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/ProjectBrowserPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/ProjectBrowserPage.ui file | annotate | diff | comparison | revisions
src/eric7/Preferences/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Project/Project.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectBrowserFlags.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectBrowserRepositoryItem.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectFormsBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectInterfacesBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectOthersBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectProtocolsBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectResourcesBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectSourcesBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectTranslationsBrowser.py file | annotate | diff | comparison | revisions
--- a/eric7.epj	Wed Nov 23 16:07:16 2022 +0100
+++ b/eric7.epj	Thu Nov 24 11:51:40 2022 +0100
@@ -1904,7 +1904,6 @@
       "src/eric7/Project/Project.py",
       "src/eric7/Project/ProjectBaseBrowser.py",
       "src/eric7/Project/ProjectBrowser.py",
-      "src/eric7/Project/ProjectBrowserFlags.py",
       "src/eric7/Project/ProjectBrowserModel.py",
       "src/eric7/Project/ProjectBrowserRepositoryItem.py",
       "src/eric7/Project/ProjectBrowserSortFilterProxyModel.py",
--- a/src/eric7/Documentation/Source/eric7.Project.ProjectBrowserFlags.html	Wed Nov 23 16:07:16 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
-<title>eric7.Project.ProjectBrowserFlags</title>
-<meta charset="UTF-8">
-<link rel="stylesheet" href="styles.css">
-</head>
-<body>
-<a NAME="top" ID="top"></a>
-<h1>eric7.Project.ProjectBrowserFlags</h1>
-
-<p>
-Module defining the project browser flags.
-</p>
-<h3>Global Attributes</h3>
-
-<table>
-<tr><td>AllBrowsersFlag</td></tr><tr><td>FormsBrowserFlag</td></tr><tr><td>InterfacesBrowserFlag</td></tr><tr><td>OthersBrowserFlag</td></tr><tr><td>ProtocolsBrowserFlag</td></tr><tr><td>ResourcesBrowserFlag</td></tr><tr><td>SourcesBrowserFlag</td></tr><tr><td>TranslationsBrowserFlag</td></tr>
-</table>
-<h3>Classes</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Functions</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-<hr />
-</body></html>
\ No newline at end of file
--- a/src/eric7/Preferences/ConfigurationPages/ProjectBrowserPage.py	Wed Nov 23 16:07:16 2022 +0100
+++ b/src/eric7/Preferences/ConfigurationPages/ProjectBrowserPage.py	Thu Nov 24 11:51:40 2022 +0100
@@ -7,7 +7,10 @@
 Module implementing the Project Browser configuration page.
 """
 
-from PyQt6.QtCore import pyqtSlot
+import contextlib
+
+from PyQt6.QtCore import pyqtSlot, Qt
+from PyQt6.QtWidgets import QListWidgetItem
 
 from eric7 import Preferences
 from eric7.EricWidgets.EricApplication import ericApp
@@ -16,7 +19,6 @@
 from .Ui_ProjectBrowserPage import Ui_ProjectBrowserPage
 
 
-# TODO: change project browser configuration to use a QListWidget
 class ProjectBrowserPage(ConfigurationPageBase, Ui_ProjectBrowserPage):
     """
     Class implementing the Project Browser configuration page.
@@ -32,18 +34,22 @@
 
         self.__currentProjectTypeIndex = 0
 
+        # populate the project browser type list
+        self.__populateProjectBrowserList()
+
         # set initial values
         self.projectTypeCombo.addItem("", "")
-        self.__projectBrowserFlags = {"": 0}
+        self.__projectBrowsersLists = {"": []}
         try:
             projectTypes = ericApp().getObject("Project").getProjectTypes()
             for projectType in sorted(projectTypes.keys()):
                 self.projectTypeCombo.addItem(projectTypes[projectType], projectType)
-                self.__projectBrowserFlags[
+                self.__projectBrowsersLists[
                     projectType
-                ] = Preferences.getProjectBrowserFlags(projectType)
+                ] = Preferences.getProjectBrowsers(projectType)
         except KeyError:
             self.pbGroup.setEnabled(False)
+            self.pbGroup.setVisible(False)
 
         self.initColour(
             "Highlighted", self.pbHighlightedButton, Preferences.getProjectBrowserColour
@@ -84,82 +90,66 @@
         )
 
         if self.pbGroup.isEnabled():
-            self.__storeProjectBrowserFlags(
+            self.__storeProjectBrowsersList(
                 self.projectTypeCombo.itemData(self.__currentProjectTypeIndex)
             )
-            for projectType, flags in list(self.__projectBrowserFlags.items()):
-                if projectType != "":
-                    Preferences.setProjectBrowserFlags(projectType, flags)
-
-    def __storeProjectBrowserFlags(self, projectType):
-        """
-        Private method to store the flags for the selected project type.
-
-        @param projectType type of the selected project (string)
-        """
-        from eric7.Project.ProjectBrowserFlags import (
-            FormsBrowserFlag,
-            InterfacesBrowserFlag,
-            OthersBrowserFlag,
-            ProtocolsBrowserFlag,
-            ResourcesBrowserFlag,
-            SourcesBrowserFlag,
-            TranslationsBrowserFlag,
-        )
+            for projectType, browsersList in self.__projectBrowsersLists.items():
+                if bool(projectType):
+                    Preferences.setProjectBrowsers(projectType, browsersList)
 
-        flags = 0
-        if self.sourcesBrowserCheckBox.isChecked():
-            flags |= SourcesBrowserFlag
-        if self.formsBrowserCheckBox.isChecked():
-            flags |= FormsBrowserFlag
-        if self.resourcesBrowserCheckBox.isChecked() and projectType not in (
-            "PyQt6",
-            "PyQt6C",
-        ):
-            flags |= ResourcesBrowserFlag
-        if self.translationsBrowserCheckBox.isChecked():
-            flags |= TranslationsBrowserFlag
-        if self.interfacesBrowserCheckBox.isChecked():
-            flags |= InterfacesBrowserFlag
-        if self.othersBrowserCheckBox.isChecked():
-            flags |= OthersBrowserFlag
-        if self.protocolsBrowserCheckBox.isChecked():
-            flags |= ProtocolsBrowserFlag
+    def __populateProjectBrowserList(self):
+        """
+        Private method to populate the project browsers list.
+        """
+        with contextlib.suppress(KeyError):
+            projectBrowser = ericApp().getObject("ProjectBrowser")
+            for (
+                browserType,
+                userString,
+            ) in projectBrowser.getProjectBrowserUserStrings().items():
+                itm = QListWidgetItem(userString, self.projectBrowserListWidget)
+                itm.setData(Qt.ItemDataRole.UserRole, browserType)
+                itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
+                itm.setCheckState(Qt.CheckState.Unchecked)
 
-        self.__projectBrowserFlags[projectType] = flags
-
-    def __setProjectBrowsersCheckBoxes(self, projectType):
+    def __storeProjectBrowsersList(self, projectType):
         """
-        Private method to set the checkboxes according to the selected project
+        Private method to store the list of enabled browsers for the selected project
         type.
 
-        @param projectType type of the selected project (string)
+        @param projectType type of the selected project
+        @type str
         """
-        from eric7.Project.ProjectBrowserFlags import (
-            FormsBrowserFlag,
-            InterfacesBrowserFlag,
-            OthersBrowserFlag,
-            ProtocolsBrowserFlag,
-            ResourcesBrowserFlag,
-            SourcesBrowserFlag,
-            TranslationsBrowserFlag,
-        )
+        browsersList = []
+        for row in range(self.projectBrowserListWidget.count()):
+            itm = self.projectBrowserListWidget.item(row)
+            if itm.checkState() == Qt.CheckState.Checked:
+                browsersList.append(itm.data(Qt.ItemDataRole.UserRole))
+        self.__projectBrowsersLists[projectType] = browsersList
 
-        flags = self.__projectBrowserFlags[projectType]
+    def __setProjectBrowsersList(self, projectType):
+        """
+        Private method to check the project browser entries according to the selected
+        project type.
 
-        self.sourcesBrowserCheckBox.setChecked(flags & SourcesBrowserFlag)
-        self.formsBrowserCheckBox.setChecked(flags & FormsBrowserFlag)
-        self.resourcesBrowserCheckBox.setEnabled(
-            projectType not in ("PyQt6", "PyQt6C", "E7Plugin")
-        )
-        if projectType in ("PyQt6", "PyQt6C", "E7Plugin"):
-            self.resourcesBrowserCheckBox.setChecked(False)
-        else:
-            self.resourcesBrowserCheckBox.setChecked(flags & ResourcesBrowserFlag)
-        self.translationsBrowserCheckBox.setChecked(flags & TranslationsBrowserFlag)
-        self.interfacesBrowserCheckBox.setChecked(flags & InterfacesBrowserFlag)
-        self.othersBrowserCheckBox.setChecked(flags & OthersBrowserFlag)
-        self.protocolsBrowserCheckBox.setChecked(flags & ProtocolsBrowserFlag)
+        @param projectType selected project type
+        @type str
+        """
+        browsersList = self.__projectBrowsersLists[projectType]
+        for row in range(self.projectBrowserListWidget.count()):
+            itm = self.projectBrowserListWidget.item(row)
+            if (
+                projectType in ("PyQt6", "PyQt6C", "E7Plugin")
+                and itm.data(Qt.ItemDataRole.UserRole) == "resources"
+            ):
+                itm.setFlags(itm.flags() & ~Qt.ItemFlag.ItemIsEnabled)
+            else:
+                itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsEnabled)
+            itm.setCheckState(
+                Qt.CheckState.Checked
+                if itm.data(Qt.ItemDataRole.UserRole) in browsersList
+                else Qt.CheckState.Unchecked
+            )
 
     @pyqtSlot(int)
     def on_projectTypeCombo_activated(self, index):
@@ -172,10 +162,10 @@
         if self.__currentProjectTypeIndex == index:
             return
 
-        self.__storeProjectBrowserFlags(
+        self.__storeProjectBrowsersList(
             self.projectTypeCombo.itemData(self.__currentProjectTypeIndex)
         )
-        self.__setProjectBrowsersCheckBoxes(self.projectTypeCombo.itemData(index))
+        self.__setProjectBrowsersList(self.projectTypeCombo.itemData(index))
         self.__currentProjectTypeIndex = index
 
     @pyqtSlot(bool)
--- a/src/eric7/Preferences/ConfigurationPages/ProjectBrowserPage.ui	Wed Nov 23 16:07:16 2022 +0100
+++ b/src/eric7/Preferences/ConfigurationPages/ProjectBrowserPage.ui	Thu Nov 24 11:51:40 2022 +0100
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>617</width>
-    <height>429</height>
+    <height>709</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout_2">
@@ -107,6 +107,19 @@
        </layout>
       </item>
       <item>
+       <widget class="QListWidget" name="projectBrowserListWidget">
+        <property name="alternatingRowColors">
+         <bool>true</bool>
+        </property>
+        <property name="selectionMode">
+         <enum>QAbstractItemView::NoSelection</enum>
+        </property>
+        <property name="sortingEnabled">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
        <layout class="QGridLayout" name="gridLayout">
         <item row="0" column="0">
          <widget class="QCheckBox" name="sourcesBrowserCheckBox">
--- a/src/eric7/Preferences/__init__.py	Wed Nov 23 16:07:16 2022 +0100
+++ b/src/eric7/Preferences/__init__.py	Thu Nov 24 11:51:40 2022 +0100
@@ -52,17 +52,6 @@
 from eric7.EricWidgets.EricApplication import ericApp
 from eric7.EricWidgets.EricIconBar import EricIconBar
 
-# TODO: eliminate ProjectBrowserFlags
-from eric7.Project.ProjectBrowserFlags import (
-    AllBrowsersFlag,
-    FormsBrowserFlag,
-    InterfacesBrowserFlag,
-    OthersBrowserFlag,
-    ProtocolsBrowserFlag,
-    ResourcesBrowserFlag,
-    SourcesBrowserFlag,
-    TranslationsBrowserFlag,
-)
 from eric7.QScintilla.Shell import ShellHistoryStyle
 from eric7.Utilities.crypto import pwConvert
 from eric7.Utilities.crypto.py3PBKDF2 import hashPassword
@@ -775,95 +764,55 @@
         "Workspace": "",
     }
 
-    # defaults for the project browser flags settings
-    # TODO: change this to 'projectBrowserTypesDefaults
-    #       all without 'interfaces' and 'protocols'
-    projectBrowserFlagsDefaults = {
+    # defaults for the project browser lists settings
+    projectBrowsersDefaults = {
+        "allBrowsers": (
+            "sources", "forms", "resources", "translations", "others",
+            "interfaces", "protocols",
+        ),
         "PyQt5": (
-            SourcesBrowserFlag
-            | FormsBrowserFlag
-            | ResourcesBrowserFlag
-            | TranslationsBrowserFlag
-            | InterfacesBrowserFlag
-            | OthersBrowserFlag
-            | ProtocolsBrowserFlag
+            "sources", "forms", "resources", "translations", "others",
+            "interfaces", "protocols",
         ),
         "PyQt5C": (
-            SourcesBrowserFlag
-            | ResourcesBrowserFlag
-            | TranslationsBrowserFlag
-            | InterfacesBrowserFlag
-            | OthersBrowserFlag
-            | ProtocolsBrowserFlag
+            "sources", "resources", "translations", "others",
+            "interfaces", "protocols",
         ),
         "PyQt6": (
-            SourcesBrowserFlag
-            | FormsBrowserFlag
-            | TranslationsBrowserFlag
-            | InterfacesBrowserFlag
-            | OthersBrowserFlag
-            | ProtocolsBrowserFlag
+            "sources", "forms", "translations", "others",
+            "interfaces", "protocols",
         ),
         "PyQt6C": (
-            SourcesBrowserFlag
-            | TranslationsBrowserFlag
-            | InterfacesBrowserFlag
-            | OthersBrowserFlag
-            | ProtocolsBrowserFlag
+            "sources", "translations", "others",
+            "interfaces", "protocols",
         ),
         "E7Plugin": (
-            SourcesBrowserFlag
-            | FormsBrowserFlag
-            | TranslationsBrowserFlag
-            | InterfacesBrowserFlag
-            | OthersBrowserFlag
-            | ProtocolsBrowserFlag
+            "sources", "forms", "translations", "others",
+            "interfaces", "protocols",
         ),
         "Console": (
-            SourcesBrowserFlag
-            | InterfacesBrowserFlag
-            | OthersBrowserFlag
-            | ProtocolsBrowserFlag
+            "sources", "others",
+            "interfaces", "protocols",
         ),
         "Other": (
-            SourcesBrowserFlag
-            | InterfacesBrowserFlag
-            | OthersBrowserFlag
-            | ProtocolsBrowserFlag
+            "sources", "others",
+            "interfaces", "protocols",
         ),
         "PySide2": (
-            SourcesBrowserFlag
-            | FormsBrowserFlag
-            | ResourcesBrowserFlag
-            | TranslationsBrowserFlag
-            | InterfacesBrowserFlag
-            | OthersBrowserFlag
-            | ProtocolsBrowserFlag
+            "sources", "forms", "resources", "translations", "others",
+            "interfaces", "protocols",
         ),
         "PySide2C": (
-            SourcesBrowserFlag
-            | ResourcesBrowserFlag
-            | TranslationsBrowserFlag
-            | InterfacesBrowserFlag
-            | OthersBrowserFlag
-            | ProtocolsBrowserFlag
+            "sources", "resources", "translations", "others",
+            "interfaces", "protocols",
         ),
         "PySide6": (
-            SourcesBrowserFlag
-            | FormsBrowserFlag
-            | ResourcesBrowserFlag
-            | TranslationsBrowserFlag
-            | InterfacesBrowserFlag
-            | OthersBrowserFlag
-            | ProtocolsBrowserFlag
+            "sources", "forms", "resources", "translations", "others",
+            "interfaces", "protocols",
         ),
         "PySide6C": (
-            SourcesBrowserFlag
-            | ResourcesBrowserFlag
-            | TranslationsBrowserFlag
-            | InterfacesBrowserFlag
-            | OthersBrowserFlag
-            | ProtocolsBrowserFlag
+            "sources", "resources", "translations", "others",
+            "interfaces", "protocols",
         ),
     }
 
@@ -2660,30 +2609,33 @@
         Prefs.settings.setValue("Project/" + key, value)
 
 
-# TODO: change this to use the type names
-def getProjectBrowserFlags(key):
+def getProjectBrowsers(key):
     """
-    Module function to retrieve the various project browser flags settings.
-
-    @param key the key of the value to get
-    @return the requested project setting
+    Function to retrieve the enabled project browsers per project type.
+
+    @param key project type
+    @type str
+    @return list of enabled project browsers
+    @rtype list of str
     """
     try:
-        default = Prefs.projectBrowserFlagsDefaults[key]
+        default = list(Prefs.projectBrowsersDefaults[key][:])
     except KeyError:
-        default = AllBrowsersFlag
-
-    return int(Prefs.settings.value("Project/BrowserFlags/" + key, default))
-
-
-def setProjectBrowserFlags(key, value):
+        default = list(Prefs.projectBrowsersDefaults["allBrowsers"][:])
+
+    return toList(Prefs.settings.value("Project/BrowsersEnabled/" + key, default))
+
+
+def setProjectBrowsers(key, value):
     """
-    Module function to store the various project browser flags settings.
-
-    @param key the key of the setting to be set
-    @param value the value to be set
+    Function to store the enabled project browsers per project type.
+
+    @param key project type
+    @type str
+    @param value list of enabled project browsers
+    @type list of str
     """
-    Prefs.settings.setValue("Project/BrowserFlags/" + key, value)
+    Prefs.settings.setValue("Project/BrowsersEnabled/" + key, value)
 
 
 def getProjectBrowserColour(key):
--- a/src/eric7/Project/Project.py	Wed Nov 23 16:07:16 2022 +0100
+++ b/src/eric7/Project/Project.py	Thu Nov 24 11:51:40 2022 +0100
@@ -2324,7 +2324,7 @@
         for fileCategory in self.getFileCategories():
             if fn in self.__pdata[fileCategory]:
                 self.__pdata[fileCategory].remove(fn)
-                self.projectFileRemoved(fn, fileCategory)
+                self.projectFileRemoved.emit(fn, fileCategory)
                 self.setDirty(True)
                 if updateModel:
                     self.__model.removeItem(fn)
--- a/src/eric7/Project/ProjectBrowser.py	Wed Nov 23 16:07:16 2022 +0100
+++ b/src/eric7/Project/ProjectBrowser.py	Thu Nov 24 11:51:40 2022 +0100
@@ -10,8 +10,7 @@
 import contextlib
 
 from PyQt6.QtCore import Qt, pyqtSignal
-from PyQt6.QtGui import QColor
-from PyQt6.QtWidgets import QApplication
+from PyQt6.QtGui import QColor, QIcon
 
 from eric7 import Preferences
 from eric7.EricGui import EricPixmapCache
@@ -19,16 +18,6 @@
 from eric7.EricWidgets.EricLed import EricClickableLed
 from eric7.EricWidgets.EricTabWidget import EricTabWidget
 
-from .ProjectBrowserFlags import (
-    AllBrowsersFlag,
-    FormsBrowserFlag,
-    InterfacesBrowserFlag,
-    OthersBrowserFlag,
-    ProtocolsBrowserFlag,
-    ResourcesBrowserFlag,
-    SourcesBrowserFlag,
-    TranslationsBrowserFlag,
-)
 from .ProjectBrowserRepositoryItem import ProjectBrowserRepositoryItem
 from .ProjectFormsBrowser import ProjectFormsBrowser
 from .ProjectInterfacesBrowser import ProjectInterfacesBrowser
@@ -162,7 +151,7 @@
         self.currentChanged.connect(self.__currentChanged)
         self.project.getModel().vcsStateChanged.connect(self.__vcsStateChanged)
 
-        self.__currentBrowsersFlags = 0
+        self.__currentBrowsersList = []
         self.__projectPropertiesChanged()
         self.setCurrentIndex(0)
 
@@ -217,7 +206,7 @@
         @return list of references to project browsers
         @rtype list of ProjectBaseBrowser
         """
-        return [itm.projectBrowser for itm in self.__browserRepository.items()]
+        return [itm.projectBrowser for itm in self.__browserRepository.values()]
 
     def getProjectBrowser(self, browserType):
         """
@@ -242,97 +231,51 @@
         """
         return list(self.__browserRepository.keys())
 
-    def __setBrowsersAvailable(self, browserFlags):
+    def getProjectBrowserUserStrings(self):
+        """
+        Public method to get a dictionary of defined project browser user strings.
+        
+        @return dictionary of defined project browser user strings
+        @rtype dict
+        """
+        return {
+            key: item.projectBrowserUserString
+            for key, item in self.__browserRepository.items()
+        }
+
+    def getProjectBrowserIcon(self, browserType):
+        try:
+            return self.__browserRepository[browserType].getIcon()
+        except KeyError:
+            return QIcon()
+
+    def __setBrowsersAvailable(self, browsersList):
         """
         Private method to add selected browsers to the project browser.
 
-        @param browserFlags flags indicating the browsers to add (integer)
+        @param browsersList list of project browsers to be shown
+        @type list of str
         """
         # step 1: remove all tabs
         while self.count() > 0:
             self.removeTab(0)
 
         # step 2: add browsers
-        # TODO: change the logic after browser flags have been eliminated
-        if browserFlags & SourcesBrowserFlag:
-            index = self.addTab(
-                self.__browserRepository["sources"].projectBrowser,
-                self.__browserRepository["sources"].getIcon(),
-                "",
-            )
-            self.setTabToolTip(
-                index,
-                self.__browserRepository["sources"].projectBrowser.windowTitle(),
-            )
-
-        if browserFlags & FormsBrowserFlag:
+        for browser in sorted(
+            browsersList,
+            key=lambda x: self.__browserRepository[x].priority,
+            reverse=True,
+        ):
             index = self.addTab(
-                self.__browserRepository["forms"].projectBrowser,
-                self.__browserRepository["forms"].getIcon(),
-                "",
-            )
-            self.setTabToolTip(
-                index,
-                self.__browserRepository["forms"].projectBrowser.windowTitle(),
-            )
-
-        if browserFlags & ResourcesBrowserFlag:
-            index = self.addTab(
-                self.__browserRepository["resources"].projectBrowser,
-                self.__browserRepository["resources"].getIcon(),
+                self.__browserRepository[browser].projectBrowser,
+                self.__browserRepository[browser].getIcon(),
                 "",
             )
             self.setTabToolTip(
                 index,
-                self.__browserRepository["resources"].projectBrowser.windowTitle(),
-            )
-
-        if browserFlags & TranslationsBrowserFlag:
-            index = self.addTab(
-                self.__browserRepository["translations"].projectBrowser,
-                self.__browserRepository["translations"].getIcon(),
-                "",
-            )
-            self.setTabToolTip(
-                index,
-                self.__browserRepository["translations"].projectBrowser.windowTitle(),
-            )
-
-        if browserFlags & InterfacesBrowserFlag:
-            index = self.addTab(
-                self.__browserRepository["interfaces"].projectBrowser,
-                self.__browserRepository["interfaces"].getIcon(),
-                "",
-            )
-            self.setTabToolTip(
-                index,
-                self.__browserRepository["interfaces"].projectBrowser.windowTitle(),
+                self.__browserRepository[browser].projectBrowser.windowTitle(),
             )
 
-        if browserFlags & ProtocolsBrowserFlag:
-            index = self.addTab(
-                self.__browserRepository["protocols"].projectBrowser,
-                self.__browserRepository["protocols"].getIcon(),
-                "",
-            )
-            self.setTabToolTip(
-                index,
-                self.__browserRepository["protocols"].projectBrowser.windowTitle(),
-            )
-
-        if browserFlags & OthersBrowserFlag:
-            index = self.addTab(
-                self.__browserRepository["others"].projectBrowser,
-                self.__browserRepository["others"].getIcon(),
-                "",
-            )
-            self.setTabToolTip(
-                index,
-                self.__browserRepository["others"].projectBrowser.windowTitle(),
-            )
-
-        QApplication.processEvents()
-
     def __currentChanged(self, index):
         """
         Private slot to handle the currentChanged(int) signal.
@@ -372,15 +315,15 @@
         """
         Private slot to handle the projectPropertiesChanged signal.
         """
-        flags = (
-            Preferences.getProjectBrowserFlags(self.project.getProjectType())
+        browsersList = (
+            Preferences.getProjectBrowsers(self.project.getProjectType())
             if self.project.isOpen()
-            else AllBrowsersFlag
+            else list(self.__browserRepository.keys())
         )
 
-        if flags != self.__currentBrowsersFlags:
-            self.__currentBrowsersFlags = flags
-            self.__setBrowsersAvailable(flags)
+        if browsersList != self.__currentBrowsersList:
+            self.__currentBrowsersList = browsersList[:]
+            self.__setBrowsersAvailable(browsersList)
 
         endIndex = self.count()
         for index in range(endIndex):
@@ -388,31 +331,14 @@
 
         self.__setSourcesIcon()
 
-    # TODO: move the logic to determine the icon to the sources browser.
     def __setSourcesIcon(self):
         """
         Private method to set the right icon for the sources browser tab.
         """
-        if not self.project.isOpen():
-            icon = EricPixmapCache.getIcon("projectSources")
-        else:
-            if self.project.getProjectLanguage() == "Python3":
-                if self.project.isMixedLanguageProject():
-                    icon = EricPixmapCache.getIcon("projectSourcesPyMixed")
-                else:
-                    icon = EricPixmapCache.getIcon("projectSourcesPy")
-            elif self.project.getProjectLanguage() == "MicroPython":
-                icon = EricPixmapCache.getIcon("micropython")
-            elif self.project.getProjectLanguage() == "Ruby":
-                if self.project.isMixedLanguageProject():
-                    icon = EricPixmapCache.getIcon("projectSourcesRbMixed")
-                else:
-                    icon = EricPixmapCache.getIcon("projectSourcesRb")
-            elif self.project.getProjectLanguage() == "JavaScript":
-                icon = EricPixmapCache.getIcon("projectSourcesJavaScript")
-            else:
-                icon = EricPixmapCache.getIcon("projectSources")
-        self.setTabIcon(self.indexOf(self.getProjectBrowser("sources")), icon)
+        self.setTabIcon(
+            self.indexOf(self.getProjectBrowser("sources")),
+            self.getProjectBrowserIcon("sources"),
+        )
 
     def handleEditorChanged(self, fn):
         """
--- a/src/eric7/Project/ProjectBrowserFlags.py	Wed Nov 23 16:07:16 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2008 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module defining the project browser flags.
-"""
-
-# TODO: replace these by well defined strings
-SourcesBrowserFlag = 1
-FormsBrowserFlag = 2
-ResourcesBrowserFlag = 4
-TranslationsBrowserFlag = 8
-InterfacesBrowserFlag = 16
-OthersBrowserFlag = 32
-ProtocolsBrowserFlag = 64
-
-AllBrowsersFlag = (
-    SourcesBrowserFlag
-    | FormsBrowserFlag
-    | ResourcesBrowserFlag
-    | TranslationsBrowserFlag
-    | InterfacesBrowserFlag
-    | OthersBrowserFlag
-    | ProtocolsBrowserFlag
-)
--- a/src/eric7/Project/ProjectBrowserRepositoryItem.py	Wed Nov 23 16:07:16 2022 +0100
+++ b/src/eric7/Project/ProjectBrowserRepositoryItem.py	Thu Nov 24 11:51:40 2022 +0100
@@ -21,6 +21,7 @@
     """
     projectBrowser: ProjectBaseBrowser
     projectBrowserUserString: str
+    priority: int  # should be 0..100
     fileCategory: str
     getIcon: Callable
 
--- a/src/eric7/Project/ProjectFormsBrowser.py	Wed Nov 23 16:07:16 2022 +0100
+++ b/src/eric7/Project/ProjectFormsBrowser.py	Thu Nov 24 11:51:40 2022 +0100
@@ -151,6 +151,7 @@
             ProjectBrowserRepositoryItem(
                 projectBrowser=self,
                 projectBrowserUserString=self.tr("Forms Browser"),
+                priority=75,
                 fileCategory="FORMS",
                 getIcon=self.getIcon,
             ),
--- a/src/eric7/Project/ProjectInterfacesBrowser.py	Wed Nov 23 16:07:16 2022 +0100
+++ b/src/eric7/Project/ProjectInterfacesBrowser.py	Thu Nov 24 11:51:40 2022 +0100
@@ -108,6 +108,7 @@
             ProjectBrowserRepositoryItem(
                 projectBrowser=self,
                 projectBrowserUserString=self.tr("Interfaces (IDL) Browser"),
+                priority=50,
                 fileCategory="INTERFACES",
                 getIcon=self.getIcon,
             ),
--- a/src/eric7/Project/ProjectOthersBrowser.py	Wed Nov 23 16:07:16 2022 +0100
+++ b/src/eric7/Project/ProjectOthersBrowser.py	Thu Nov 24 11:51:40 2022 +0100
@@ -88,6 +88,7 @@
             ProjectBrowserRepositoryItem(
                 projectBrowser=self,
                 projectBrowserUserString=self.tr("Others Browser"),
+                priority=0,
                 fileCategory="OTHERS",
                 getIcon=self.getIcon,
             ),
--- a/src/eric7/Project/ProjectProtocolsBrowser.py	Wed Nov 23 16:07:16 2022 +0100
+++ b/src/eric7/Project/ProjectProtocolsBrowser.py	Thu Nov 24 11:51:40 2022 +0100
@@ -102,6 +102,7 @@
             ProjectBrowserRepositoryItem(
                 projectBrowser=self,
                 projectBrowserUserString=self.tr("Protocols (protobuf) Browser"),
+                priority=50,
                 fileCategory="PROTOCOLS",
                 getIcon=self.getIcon,
             ),
--- a/src/eric7/Project/ProjectResourcesBrowser.py	Wed Nov 23 16:07:16 2022 +0100
+++ b/src/eric7/Project/ProjectResourcesBrowser.py	Thu Nov 24 11:51:40 2022 +0100
@@ -97,6 +97,7 @@
             ProjectBrowserRepositoryItem(
                 projectBrowser=self,
                 projectBrowserUserString=self.tr("Resources Browser"),
+                priority=75,
                 fileCategory="RESOURCES",
                 getIcon=self.getIcon,
             ),
--- a/src/eric7/Project/ProjectSourcesBrowser.py	Wed Nov 23 16:07:16 2022 +0100
+++ b/src/eric7/Project/ProjectSourcesBrowser.py	Thu Nov 24 11:51:40 2022 +0100
@@ -98,6 +98,7 @@
             ProjectBrowserRepositoryItem(
                 projectBrowser=self,
                 projectBrowserUserString=self.tr("Sources Browser"),
+                priority=100,
                 fileCategory="SOURCES",
                 getIcon=self.getIcon,
             ),
@@ -139,7 +140,27 @@
         @return icon for the browser
         @rtype QIcon
         """
-        return EricPixmapCache.getIcon("projectSources")
+        if not self.project.isOpen():
+            icon = EricPixmapCache.getIcon("projectSources")
+        else:
+            if self.project.getProjectLanguage() == "Python3":
+                if self.project.isMixedLanguageProject():
+                    icon = EricPixmapCache.getIcon("projectSourcesPyMixed")
+                else:
+                    icon = EricPixmapCache.getIcon("projectSourcesPy")
+            elif self.project.getProjectLanguage() == "MicroPython":
+                icon = EricPixmapCache.getIcon("micropython")
+            elif self.project.getProjectLanguage() == "Ruby":
+                if self.project.isMixedLanguageProject():
+                    icon = EricPixmapCache.getIcon("projectSourcesRbMixed")
+                else:
+                    icon = EricPixmapCache.getIcon("projectSourcesRb")
+            elif self.project.getProjectLanguage() == "JavaScript":
+                icon = EricPixmapCache.getIcon("projectSourcesJavaScript")
+            else:
+                icon = EricPixmapCache.getIcon("projectSources")
+
+        return icon
 
     def __closeAllWindows(self):
         """
--- a/src/eric7/Project/ProjectTranslationsBrowser.py	Wed Nov 23 16:07:16 2022 +0100
+++ b/src/eric7/Project/ProjectTranslationsBrowser.py	Thu Nov 24 11:51:40 2022 +0100
@@ -108,6 +108,7 @@
             ProjectBrowserRepositoryItem(
                 projectBrowser=self,
                 projectBrowserUserString=self.tr("Translations Browser"),
+                priority=75,
                 fileCategory="TRANSLATIONS",
                 getIcon=self.getIcon,
             ),

eric ide

mercurial