@@ -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 ()
0 commit comments