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

Source Code for Module vwidget.views

  1   
  2  import gtk 
  3  import gtk.gdk as gdk 
  4  import vwidget.util as vw_util 
  5  from ConfigParser import ConfigParser 
  6   
7 -class VView(gtk.ScrolledWindow):
8 9 __display_name__ = "Stuff!" 10
11 - def __init__(self, closable=True):
12 gtk.ScrolledWindow.__init__(self) 13 self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) 14 self.vwactive = True 15 self.vwname = None 16 self.closable = closable 17 self.connect("destroy", self.vwDestroy)
18
19 - def vwDestroy(self, arg):
20 pass
21
22 - def vwSetSensitive(self, sensitive=True):
23 """ 24 Set this view object as "sensitive" to user input 25 """ 26 if self.vwactive != sensitive: 27 self.vwactive = sensitive 28 self.set_sensitive(sensitive)
29
30 - def vwGetDisplayName(self):
31 if self.vwname == None: 32 return self.__class__.__display_name__ 33 return self.vwname
34
35 - def vwSetDisplayName(self, name):
36 self.vwname = name
37
38 - def vwGetViewName(self):
39 return self.__class__.__name__
40
41 - def vwIsClosable(self):
42 return self.closable
43
44 - def vwSetClosable(self, closable):
45 self.closable = closable
46
47 -class GladeView(VView):
48 """ 49 Use a glade file to define "views" with the same name as the class 50 ( 51 """
52 - def __init__(self, gladefile):
53 VView.__init__(self) 54 self.vwglade = gtk.glade.XML(gladefile) 55 self.vwglade.signal_autoconnect(self) 56 win = self.vwglade.get_wiget(self.__class__.__name__) 57 frame = win.get_child() 58 p = view.get_parent() 59 if p != None: 60 p.remove(frame) 61 win.destroy() 62 self.add(frame)
63
64 - def vwGetWidget(self, name):
65 return self.vwglade.get_widget(name)
66
67 -class VTreeView(VView):
68 69 __model_class__ = gtk.ListStore 70 # Some example column definitions 71 __cols__ = ( 72 (None, 0, object), 73 ("Address",1, str), 74 ("Stuff",2, str) 75 ) 76 77 __editors__ = {} # 'Address': 'editAddrMethodName' 78
79 - def __init__(self):
80 VView.__init__(self) 81 self.treeview = gtk.TreeView() 82 self.treeview.connect("row_activated", self.vwActivated) 83 cols = self.vwGetColumns() 84 self.vwInitModel(cols, self.__model_class__) 85 self.add(self.treeview) 86 self.vwLoad()
87
88 - def vwGetColumns(self):
89 return self.__cols__
90
91 - def vwInitModel(self, cols, modelclass):
92 # Remove any old columns 93 for col in self.treeview.get_columns(): 94 self.treeview.remove_column(col) 95 96 ftypes = [] 97 for name,index,ctype in cols: 98 ftypes.append(ctype) 99 if name == None: 100 continue 101 102 onedit = None 103 emeth_name = self.__editors__.get(name) 104 if emeth_name != None: 105 onedit = getattr(self, emeth_name, None) 106 col = vw_util.makeColumn(name, index, onedit=onedit) 107 self.treeview.append_column(col) 108 109 self.model = modelclass(*ftypes) 110 self.treeview.set_model(self.model)
111
112 - def vwLoad(self):
113 # Over-ride this to cause a load from scratch 114 pass
115
116 - def vwClear(self):
117 # This clears the view 118 self.model.clear()
119
120 - def vwRemove(self, iter):
121 self.model.remove(iter)
122
123 - def vwActivated(self, tree, path, column):
124 # over-ride this for activation callbacks 125 pass
126
127 - def vwGetSelected(self, column):
128 """ 129 Get the selected row's column by index 130 """ 131 return vw_util.getTreeSelected(self.treeview, column)
132
133 -class VTextTag(gtk.TextTag):
134 - def __init__(self, tname):
135 gtk.TextTag.__init__(self, tname) 136 self.reversed = False
137
138 - def reverse(self):
139 pass
140
141 -class VRevTextTag(VTextTag):
142
143 - def reverse(self):
144 front = self.get_property("foreground-gdk") 145 back = self.get_property("background-gdk") 146 self.set_property("foreground-gdk", back) 147 self.set_property("background-gdk", front) 148 self.reversed = not self.reversed
149
150 -class VTextView(VView):
151
152 - def __init__(self, tagtable=None):
153 VView.__init__(self) 154 self.textview = gtk.TextView() 155 self.textview.connect("populate_popup", self.vwGetPopup) 156 self.add(self.textview) 157 158 if tagtable == None: 159 tagtable = gtk.TextTagTable() 160 161 self.vwSetTagTable(tagtable) 162 163 style = gtk.Style() 164 165 style.base[gtk.STATE_NORMAL] = gdk.Color(0,0,0) 166 style.text[gtk.STATE_NORMAL] = gdk.Color(0,0,0xff) 167 168 style.base[gtk.STATE_INSENSITIVE] = gdk.Color(0,0,0) 169 style.text[gtk.STATE_INSENSITIVE] = gdk.Color(20,20,20) 170 171 self.textview.set_style(style) 172 173 self.tagcfg = ConfigParser() 174 175 self.curtag = None # Is a current tag selected? 176 #self.deftag = 177 self.vwInitTag(VTextTag("default")) 178 179 start,end = self.textbuf.get_bounds() 180 self.textbuf.create_mark("insertend", end)
181
182 - def vwSetTagTable(self, tagtable):
183 self.tagtable = tagtable 184 self.textbuf = gtk.TextBuffer(self.tagtable) 185 self.textview.set_buffer(self.textbuf)
186
187 - def vwGetTagTable(self):
188 return self.tagtable
189
190 - def vwInitTag(self, tag, typename="default", handler=None, *handleargs):
191 """ 192 Initialize a tag for event processing and properties from 193 the tag config. 194 """ 195 if handler != None: 196 tag.connect("event", handler, *handleargs) 197 self.tagtable.add(tag) 198 self.vwSetTagColor(tag, typename=typename)
199
200 - def vwSetTagColor(self, tag, typename="default"):
201 if self.tagcfg.has_section(typename): 202 for name in self.tagcfg.options(typename): 203 tag.set_property(name, self.tagcfg.get(typename,name)) 204 else: 205 tag.set_property("font", "Monospace 10") 206 tag.set_property("foreground", "green") 207 tag.set_property("background", "black")
208
209 - def vwTagSelector(self, tag, textview, event, iter):
210 """ 211 Use this as the event handler for tag events on exclusivly 212 selectable tags. 213 """ 214 if event.type == gdk.BUTTON_PRESS: 215 if tag.get_property("name") != "default": 216 if self.curtag != None: 217 self.curtag.reverse() 218 tag.reverse() 219 self.curtag = tag 220 return True
221
222 - def vwLoadTags(self, tagfile):
223 self.tagcfg.read(tagfile) 224 for sec in self.tagcfg.sections(): 225 tag = self.vwGetTag(sec) 226 if tag == None: 227 tag = VTextTag(sec) 228 self.tagtable.add(tag) 229 230 tag.connect("event",self.vwTagEvent) 231 for name in self.tagcfg.options(sec): 232 val = self.tagcfg.get(sec,name) 233 if val.isdigit(): 234 val = int(val) 235 tag.set_property(name, val)
236
237 - def vwGetTag(self, name=None):
238 if name == None: 239 name = "default" 240 return self.tagtable.lookup(name)
241
242 - def vwTagEvent(self, tag, textview, event, iter):
243 #print "OVERRIDE ME FOR TAG EVENT PROCESSING!" 244 pass
245
246 - def vwGetPopup(self, textview, menu, vwfaddr=None):
247 """ 248 Over-ride this to add elements to the right click menu on click. 249 """ 250 #mn = gtk.MenuItem("Example!") 251 #mn.connect("activate", self.doexample) 252 #mn.show() 253 #menu.prepend(mn) 254 pass
255
256 - def vwInsertText(self, text, iter=None, tagname=None, tag=None):
257 if iter == None: 258 iter = self.textbuf.get_end_iter() 259 if tagname == None and tag == None: 260 self.textbuf.insert(iter, text) 261 else: 262 if tagname != None: 263 tag = self.tagtable.lookup(tagname) 264 self.textbuf.insert_with_tags(iter, text, tag) 265 self.textbuf.move_mark_by_name("insertend", iter)
266
267 - def vwScrollToBottom(self):
268 mark = self.textbuf.get_mark("insertend") 269 self.textview.scroll_to_mark(mark,0)
270
271 - def vwScrollToTop(self):
272 start,end = self.textbuf.get_bounds() 273 self.textview.scroll_to_iter(start, 0)
274
275 - def vwClearText(self):
276 start,end = self.textbuf.get_bounds() 277 self.textbuf.delete(start, end)
278
279 - def vwGetAppendIter(self):
280 return self.textbuf.get_end_iter()
281