Skip to content

Commit fd09a0e

Browse files
authored
Merge pull request #922 from MerginMaps/fix/issue-919-indicate-open-project
Indicate currently opened project in Browser (#919)
2 parents 30d8cf2 + 143a702 commit fd09a0e

3 files changed

Lines changed: 35 additions & 1 deletion

File tree

Mergin/data_item.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,15 +141,38 @@ def __init__(self, parent, project, project_manager, plugin):
141141
self.project_name = posixpath.join(project["namespace"], project["name"]) # posix path for server API calls
142142
self.path = mergin_project_local_path(self.project_name)
143143
display_name = project["name"]
144+
open_project_path = mergin_project_local_path()
145+
self.is_open = (
146+
self.path is not None and open_project_path is not None and same_dir(self.path, open_project_path)
147+
)
148+
if self.is_open:
149+
display_name = f"{project['name']} • open"
144150
QgsDirectoryItem.__init__(self, parent, display_name, self.path, "/Mergin/" + self.project_name)
145-
self.setSortKey(f"0 {self.name()}")
151+
# put the opened project at the beginning of local entries.
152+
self.setSortKey(f" 0 {project['name']}" if self.is_open else f"0 {self.name()}")
153+
# QgsDirectoryItem.icon() ignores setIcon(), so cache the override and serve it from icon() instead.
154+
self._open_icon = (
155+
QIcon(os.path.join(os.path.dirname(__file__), "images", "folder-open.svg")) if self.is_open else None
156+
)
146157
self.project = project
147158
self.project_manager = project_manager
148159
if self.project_manager is not None:
149160
self.mc = self.project_manager.mc
150161
else:
151162
self.mc = None
152163

164+
def icon(self):
165+
"""Provide the custom icon for the currently-open project; fall back to the default folder otherwise."""
166+
if self.is_open and self._open_icon is not None:
167+
return self._open_icon
168+
return super().icon()
169+
170+
def equal(self, other):
171+
"""Called when the browser tree refreshes; also compare is_open so the diff detects open/close transitions."""
172+
if not super().equal(other):
173+
return False
174+
return getattr(other, "is_open", False) == self.is_open
175+
153176
def open_project(self):
154177
self.project_manager.open_project(self.path)
155178

@@ -507,6 +530,11 @@ def fetch_more(self):
507530
self.fetch_projects(page=page_to_get)
508531
self.refresh()
509532

533+
def reload_local(self):
534+
"""Re-read local projects from settings and refresh the tree."""
535+
self.local_projects = []
536+
self.refresh()
537+
510538
def reload(self):
511539
if not self.plugin.current_workspace:
512540
self.plugin.choose_active_workspace()

Mergin/images/folder-open.svg

Lines changed: 3 additions & 0 deletions
Loading

Mergin/plugin.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,9 @@ def on_qgis_project_changed(self):
540540
if self.mergin_proj_dir is not None:
541541
self.enable_toolbar_actions()
542542
set_qgis_project_mergin_variables(self.mergin_proj_dir)
543+
# re-render Browser items so the opened-project indicator follows the active QGIS project.
544+
if self.has_browser_item():
545+
self.data_item_provider.root_item.reload_local()
543546

544547
def add_context_menu_actions(self, layers):
545548
provider_names = "vectortile"

0 commit comments

Comments
 (0)