Package vwidget :: Module layout
[hide private]
[frames] | no frames]

Source Code for Module vwidget.layout

  1  """ 
  2  A layout manager for gtk windows. 
  3  """ 
  4   
  5  import gtk 
  6  import cPickle as pickle 
  7   
8 -class LayoutWindow(gtk.Window):
9 10 lyt_restore = True 11
12 - def getWindowName(self):
13 return self.__class__.__name__
14
15 - def getWindowState(self):
16 return None
17
18 - def setWindowState(self, state):
19 return None
20
21 - def getGeometry(self):
22 """ 23 Returns a tuple of (x, y, xsize, ysize) for later use in setGeometry() 24 """ 25 x, y = self.get_position() 26 xsize, ysize = self.get_size() 27 return (x, y, xsize, ysize)
28
29 - def setGeometry(self, geom):
30 self.move(geom[0], geom[1]) 31 self.resize(geom[2], geom[3])
32
33 -class LayoutManager:
34
35 - def __init__(self):
36 self.windows = [] 37 self.winclasses = {} 38 self.defaultgeom = {}
39
40 - def addWindowClass(self, cls, args=(), defgeom=None, clsname=None):
41 if clsname == None: 42 clsname = cls.__name__ 43 self.winclasses[clsname] = (cls,args) 44 self.defaultgeom[clsname] = defgeom
45
46 - def getWindowClass(self, name):
47 return self.winclasses.get(name)[0]
48
49 - def createWindow(self, clsname):
50 clstup = self.winclasses.get(clsname) 51 if clstup == None: 52 raise Exception("Layout manager doesn't know how to make %s" % clsname) 53 cls, args = clstup 54 win = cls(*args) 55 self.manageWindow(win) 56 return win
57
58 - def getOrCreateWindow(self, name):
59 ''' 60 Get an existing instance of the given window type. If one does not 61 exist, make one instead. 62 ''' 63 for win in self.getManagedWindows(): 64 if win.getWindowName() == name: 65 return win 66 return self.createWindow(name)
67
68 - def loadLayoutFile(self, fd):
69 try: 70 for line in fd.readlines(): 71 72 clsname, geom, state = line.split(':', 2) 73 74 clstup = self.winclasses.get(clsname) 75 if clstup == None: 76 print "ERROR: unregistered class in layout: %s" % clsname 77 continue 78 79 cls, args = clstup 80 81 win = cls(*args) 82 win.setGeometry(eval(geom)) 83 try: 84 win.setWindowState(eval(state)) 85 except Exception, e: 86 print "ERROR: Failed to set window state: %s %s" % (clsname, e) 87 88 self.__trackWindow(win) 89 90 return True 91 92 except Exception, e: 93 print 'Layout Error: %s' % e 94 return False
95
96 - def saveLayoutFile(self, fd):
97 """ 98 You *must* call the save layout routine *before* the gtk teardown. 99 """ 100 wlist = [] 101 for win in self.windows: 102 if win.lyt_restore: 103 geom = win.getGeometry() 104 state = win.getWindowState() 105 wlist.append((win.getWindowName(), geom, state)) 106 fd.write('%s:%s:%s\n' % (win.getWindowName(), repr(geom), repr(state)))
107
108 - def __trackWindow(self, win):
109 self.windows.append(win) 110 win.connect("delete-event", self._windowDeleted) 111 win.show_all()
112
113 - def getManagedWindows(self):
114 return list(self.windows)
115
116 - def manageWindow(self, window):
117 self.__trackWindow(window) 118 geom = self.defaultgeom.get(window.__class__.__name__) 119 if geom != None: 120 window.setGeometry(geom)
121
122 - def _windowDeleted(self, window, event):
123 try: 124 self.windows.remove(window) 125 except ValueError, e: 126 pass
127
128 - def deleteAllWindows(self, omit=None):
129 for win in self.windows: 130 if win == omit: 131 continue 132 win.emit('delete_event', None) 133 win.destroy()
134