From 07b3fcc88b1d972663c2fa8062e42393fc998b38 Mon Sep 17 00:00:00 2001 From: Herman Snevajs Date: Thu, 11 Jun 2026 09:40:09 +0200 Subject: [PATCH 1/2] Indicate currently opened project in Browser (#919) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In the Mergin Maps Browser tree the currently-open project is now pinned to the top of its workspace, shown with a brand-green folder icon and a " • open" suffix, and the indicator follows the active QGIS project as the user switches or downloads-and-opens projects. --- Mergin/data_item.py | 30 +++++++++++++++++++++++++++++- Mergin/images/folder-open.svg | 4 ++++ Mergin/plugin.py | 4 ++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 Mergin/images/folder-open.svg diff --git a/Mergin/data_item.py b/Mergin/data_item.py index 21a06c26..13403d8f 100644 --- a/Mergin/data_item.py +++ b/Mergin/data_item.py @@ -141,8 +141,19 @@ def __init__(self, parent, project, project_manager, plugin): self.project_name = posixpath.join(project["namespace"], project["name"]) # posix path for server API calls self.path = mergin_project_local_path(self.project_name) display_name = project["name"] + open_project_path = mergin_project_local_path() + self.is_open = ( + self.path is not None and open_project_path is not None and same_dir(self.path, open_project_path) + ) + if self.is_open: + display_name = f"{project['name']} • open" QgsDirectoryItem.__init__(self, parent, display_name, self.path, "/Mergin/" + self.project_name) - self.setSortKey(f"0 {self.name()}") + # put the opened project at the beginning of local entries. + self.setSortKey(f" 0 {project['name']}" if self.is_open else f"0 {self.name()}") + # QgsDirectoryItem.icon() ignores setIcon(), so cache the override and serve it from icon() instead. + self._open_icon = ( + QIcon(os.path.join(os.path.dirname(__file__), "images", "folder-open.svg")) if self.is_open else None + ) self.project = project self.project_manager = project_manager if self.project_manager is not None: @@ -150,6 +161,18 @@ def __init__(self, parent, project, project_manager, plugin): else: self.mc = None + def icon(self): + """Provide the custom icon for the currently-open project; fall back to the default folder otherwise.""" + if self.is_open and self._open_icon is not None: + return self._open_icon + return super().icon() + + def equal(self, other): + """Called when the browser tree refreshes; also compare is_open so the diff detects open/close transitions.""" + if not super().equal(other): + return False + return getattr(other, "is_open", False) == self.is_open + def open_project(self): self.project_manager.open_project(self.path) @@ -507,6 +530,11 @@ def fetch_more(self): self.fetch_projects(page=page_to_get) self.refresh() + def reload_local(self): + """Re-read local projects from settings and refresh the tree.""" + self.local_projects = [] + self.refresh() + def reload(self): if not self.plugin.current_workspace: self.plugin.choose_active_workspace() diff --git a/Mergin/images/folder-open.svg b/Mergin/images/folder-open.svg new file mode 100644 index 00000000..151bac00 --- /dev/null +++ b/Mergin/images/folder-open.svg @@ -0,0 +1,4 @@ + + + diff --git a/Mergin/plugin.py b/Mergin/plugin.py index 88614910..0ea28d28 100644 --- a/Mergin/plugin.py +++ b/Mergin/plugin.py @@ -540,6 +540,10 @@ def on_qgis_project_changed(self): if self.mergin_proj_dir is not None: self.enable_toolbar_actions() set_qgis_project_mergin_variables(self.mergin_proj_dir) + # re-render Browser items so the opened-project indicator follows the active QGIS project. + # reload_local() invalidates the local-projects cache + if self.has_browser_item(): + self.data_item_provider.root_item.reload_local() def add_context_menu_actions(self, layers): provider_names = "vectortile" From 143a702e3cade28daa342a0b0cf12e313dde5cbb Mon Sep 17 00:00:00 2001 From: Herman Snevajs Date: Mon, 15 Jun 2026 16:28:53 +0200 Subject: [PATCH 2/2] adjust size --- Mergin/images/folder-open.svg | 5 ++--- Mergin/plugin.py | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Mergin/images/folder-open.svg b/Mergin/images/folder-open.svg index 151bac00..2a8d04b0 100644 --- a/Mergin/images/folder-open.svg +++ b/Mergin/images/folder-open.svg @@ -1,4 +1,3 @@ - - + + diff --git a/Mergin/plugin.py b/Mergin/plugin.py index 0ea28d28..3b473f84 100644 --- a/Mergin/plugin.py +++ b/Mergin/plugin.py @@ -541,7 +541,6 @@ def on_qgis_project_changed(self): self.enable_toolbar_actions() set_qgis_project_mergin_variables(self.mergin_proj_dir) # re-render Browser items so the opened-project indicator follows the active QGIS project. - # reload_local() invalidates the local-projects cache if self.has_browser_item(): self.data_item_provider.root_item.reload_local()