Source code for leo.core.leoSessions

#@+leo-ver=5-thin
#@+node:ekr.20120420054855.14241: * @file leoSessions.py
'''Support for sessions in Leo.'''
#@+<< imports >>
#@+node:ekr.20120420054855.14344: ** <<imports>> (leoSessions.py)
import leo.core.leoGlobals as g
#import config
#import dnode
import json
# import os
# import sys
#@-<< imports >>
#@+<< exception classes>>
#@+node:ekr.20120420054855.14357: ** <<exception classes>>
# class LeoNodeNotFoundException(Exception):
    # pass

[docs]class LeoSessionException(Exception): pass
#@-<< exception classes>> #@+others #@+node:ekr.20120420054855.14349: ** class SessionManager # These were top-level nodes of leotools.py
[docs]class SessionManager(object): #@+others #@+node:ekr.20120420054855.14351: *3* ctor (LeoSessionController) def __init__(self): self.path = self.get_session_path() #@+node:ekr.20120420054855.14246: *3* clear_session
[docs] def clear_session(self, c): '''Close all tabs except the presently selected tab.''' for frame in g.app.windowList: if frame.c != c: frame.c.close()
#@+node:ekr.20120420054855.14417: *3* error # def error (self,s): # # Do not use g.trace or g.es here. # print(s) #@+node:ekr.20120420054855.14245: *3* get_session
[docs] def get_session(self): '''Return a list of UNLs for open tabs.''' result = [] mf = getattr(g.app.gui.frameFactory, 'masterFrame', None) if mf: outlines = [mf.widget(i).leo_c for i in range(mf.count())] else: outlines = [i.c for i in g.app.windowList] for c in outlines: result.append(c.p.get_UNL(with_file=True, with_proto=False, with_index=True)) return result
#@+node:ekr.20120420054855.14416: *3* get_session_path
[docs] def get_session_path(self): '''Return the path to the session file.''' for path in (g.app.homeLeoDir, g.app.homeDir): if g.os_path_exists(path): return g.os_path_finalize_join(path, 'leo.session') return None
#@+node:ekr.20120420054855.14247: *3* load_session
[docs] def load_session(self, c=None, unls=None): '''Open a tab for each item in UNLs & select the indicated node in each.''' if unls is None: unls = [] for unl in unls: if unl.strip(): i = unl.find("#") if i > -1: fn, unl = unl[: i], unl[i:] else: fn, unl = unl, '' fn = fn.strip() exists = fn and g.os_path_exists(fn) if exists: c2 = g.app.loadManager.loadLocalFile(fn, gui=g.app.gui, old_c=c) for p in c2.all_positions(): if p.get_UNL() == unl: c2.setCurrentPosition(p) c2.redraw() break
#@+node:ekr.20120420054855.14248: *3* load_snapshot
[docs] def load_snapshot(self): ''' Load a snapshot of a session from the leo.session file. Called when --restore-session is in effect. ''' fn = self.path if fn and g.os_path_exists(fn): with open(fn) as f: session = json.loads(f.read()) return session else: print('can not load session: no leo.session file') return None
#@+node:ekr.20120420054855.14249: *3* save_snapshot
[docs] def save_snapshot(self, c=None): ''' Save a snapshot of the present session to the leo.session file. Called automatically during shutdown when --session-save is in effect. ''' if self.path: session = self.get_session() # print('save_snaphot: %s' % (len(session))) with open(self.path, 'w') as f: json.dump(session, f) f.close() # Do not use g.trace or g.es here. print('wrote %s' % (self.path)) else: print('can not save session: no leo.session file')
#@-others #@+node:ekr.20120420054855.14375: ** Commands (leoSession.py) #@+node:ekr.20120420054855.14388: *3* session-clear
[docs]@g.command('session-clear') def session_clear_command(event): '''Close all tabs except the presently selected tab.''' c = event.get('c') m = g.app.sessionManager if c and m: m.clear_session(c)
#@+node:ekr.20120420054855.14385: *3* session-create
[docs]@g.command('session-create') def session_create_command(event): '''Create a new @session node.''' c = event.get('c') m = g.app.sessionManager if c and m: aList = m.get_session() p2 = c.p.insertAfter() p2.b = "\n".join(aList) p2.h = "@session" c.redraw()
#@+node:ekr.20120420054855.14387: *3* session-refresh
[docs]@g.command('session-refresh') def session_refresh_command(event): '''Refresh the current @session node.''' c = event.get('c') m = g.app.sessionManager if c and m: aList = m.get_session() c.p.b = "\n".join(aList) c.redraw()
#@+node:ekr.20120420054855.14386: *3* session-restore
[docs]@g.command('session-restore') def session_restore_command(event): '''Open a tab for each item in the @session node & select the indicated node in each.''' c = event.get('c') m = g.app.sessionManager if c and m: if c.p.h.startswith('@session'): aList = c.p.b.split("\n") m.load_session(c, aList) else: print('Please select an "@session" node')
#@+node:ekr.20120420054855.14390: *3* session-snapshot-load
[docs]@g.command('session-snapshot-load') def session_snapshot_load_command(event): '''Load a snapshot of a session from the leo.session file.''' c = event.get('c') m = g.app.sessionManager if c and m: aList = m.load_snapshot() m.load_session(c, aList)
#@+node:ekr.20120420054855.14389: *3* session-snapshot-save
[docs]@g.command('session-snapshot-save') def session_snapshot_save_command(event): '''Save a snapshot of the present session to the leo.session file.''' c = event.get('c') m = g.app.sessionManager if c and m: m.save_snapshot(c=c)
#@-others #@@language python #@@tabwidth -4 #@@pagewidth 70 #@-leo