@@ -27,15 +27,24 @@ def __init__(self):
2727 self ._log = logging .getLogger (self .__class__ .__name__ )
2828 self ._log .setLevel (LOG_LEVEL )
2929 self ._pixbufs = {}
30+ self ._current_uri = None
3031 self .expanded_rows = {}
3132
3233 # preferences (should be set by plugin)
3334 self .show_line_numbers = True
3435 self .ctags_executable = 'ctags'
3536 self .expand_rows = True
36-
37+ self . sort_list = True
3738 self .create_ui ()
3839 self .show_all ()
40+
41+ def get_missing_pixbuf (self ):
42+ """ Used for symbols that do not have a known image. """
43+ if not 'missing' in self ._pixbufs :
44+ filename = os .path .join (ICON_DIR , "missing-image.png" )
45+ self ._pixbufs ['missing' ] = GdkPixbuf .Pixbuf .new_from_file (filename )
46+
47+ return self ._pixbufs ['missing' ]
3948
4049 def get_pixbuf (self , icon_name ):
4150 """
@@ -45,18 +54,23 @@ def get_pixbuf(self, icon_name):
4554 """
4655 if icon_name not in self ._pixbufs :
4756 filename = os .path .join (ICON_DIR , icon_name + ".png" )
48- try :
49- self ._pixbufs [icon_name ] = GdkPixbuf .Pixbuf .new_from_file (filename )
50- except Exception as e :
51- self ._log .warn ("Could not load pixbuf for icon '%s': %s" ,
52- icon_name ,
53- str (e ))
54- self ._pixbufs [icon_name ] = GdkPixbuf .Pixbuf .new_from_file (
55- os .path .join (ICON_DIR , "missing-image.png" ))
57+ if os .path .exists (filename ):
58+ try :
59+ self ._pixbufs [icon_name ] = GdkPixbuf .Pixbuf .new_from_file (filename )
60+ except Exception as e :
61+ self ._log .warn ("Could not load pixbuf for icon '%s': %s" ,
62+ icon_name ,
63+ str (e ))
64+ self ._pixbufs [icon_name ] = self .get_missing_pixbuf ()
65+ else :
66+ self ._pixbufs [icon_name ] = self .get_missing_pixbuf ()
67+
5668 return self ._pixbufs [icon_name ]
5769
5870 def clear (self ):
5971 """ Clear the tree view so that new data can be loaded. """
72+ if self .expand_rows :
73+ self ._save_expanded_rows ()
6074 self ._store .clear ()
6175
6276 def create_ui (self ):
@@ -76,12 +90,9 @@ def create_ui(self):
7690 cell = Gtk .CellRendererText ()
7791 column .pack_start (cell , True )
7892 column .add_attribute (cell , 'markup' , 5 )
79-
8093 self ._treeview .append_column (column )
81-
94+
8295 self ._treeview .connect ("row-activated" , self .on_row_activated )
83- self ._treeview .connect ("row-expanded" , self .on_row_expanded )
84- self ._treeview .connect ("row-collapsed" , self .on_row_collapsed )
8596
8697 sw = Gtk .ScrolledWindow ()
8798 sw .set_policy (Gtk .PolicyType .AUTOMATIC , Gtk .PolicyType .AUTOMATIC )
@@ -128,6 +139,7 @@ def load(self, kinds, tags, uri):
128139 Load the tags into the treeview and restore the expanded rows if
129140 applicable.
130141 """
142+ self ._current_uri = uri
131143 # load root-level tags first
132144 for i , tag in enumerate (tags ):
133145 if "class" not in tag .fields :
@@ -168,8 +180,9 @@ def load(self, kinds, tags, uri):
168180 # classes used in many python projects (eg. Models in Django)
169181 # Recursion would be even better.
170182
171- # sort
172- self ._store .set_sort_column_id (1 , Gtk .SortType .ASCENDING )
183+ # sort
184+ if self .sort_list :
185+ self ._store .set_sort_column_id (1 , Gtk .SortType .ASCENDING )
173186
174187 # expand
175188 if uri in self .expanded_rows :
@@ -198,40 +211,14 @@ def on_row_activated(self, treeview, path, column, data=None):
198211 line = model .get_value (iter , 4 )
199212 if uri and line :
200213 self .emit ("tag-activated" , (uri , line ))
201-
202- def on_row_collapsed (self , treeview , iter , path , data = None ):
203- """
204- Remove the Gtk.TreePath of the expanded row from dict, so that the
205- expanded rows will not be restored when switching between tabs.
206- """
207- uri = self ._store .get_value (iter , 3 )
208- path = str (path )
209- if uri is not None :
210- if uri in self .expanded_rows and path in self .expanded_rows [uri ]:
211- self .expanded_rows [uri ].remove (path )
212- #self._log.debug("Removing expanded row at %s", path)
213214
214- def on_row_expanded (self , treeview , iter , path , data = None ):
215- """
216- Save the Gtk.TreePath of the expanded row, as a string, so that the
217- expanded rows can be restored when switching between tabs.
218- """
219- uri = self ._store .get_value (iter , 3 )
220- path = str (path )
221- if uri is not None :
222- if uri not in self .expanded_rows :
223- self .expanded_rows [uri ] = []
224- if path not in self .expanded_rows [uri ]:
225- self .expanded_rows [uri ].append (path )
226- #self._log.debug("Adding expanded row at %s", path)
227-
228215 def parse_file (self , path , uri ):
229216 """
230217 Parse symbols out of a file using exhuberant ctags. The path is the local
231218 filename to pass to ctags, and the uri is the actual URI as known by
232219 Gedit. They would be different for remote files.
233220 """
234- command = "ctags -n --fields=fiKlmnsSzt -f - '%s'" % path
221+ command = "ctags -nu --fields=fiKlmnsSzt -f - '%s'" % path
235222 #self._log.debug(command)
236223 try :
237224 parser = ctags .Parser ()
@@ -241,7 +228,17 @@ def parse_file(self, path, uri):
241228 str (e ),
242229 self .ctags_executable )
243230 self .load (parser .kinds , parser .tags , uri )
244-
231+
232+
233+ def _save_expanded_rows (self ):
234+ self .expanded_rows [self ._current_uri ] = []
235+ self ._treeview .map_expanded_rows (self ._save_expanded_rows_mapping_func ,
236+ self ._current_uri )
237+
238+ def _save_expanded_rows_mapping_func (self , treeview , path , uri ):
239+ self .expanded_rows [uri ].append (str (path ))
240+
241+
245242class Config (object ):
246243 def __init__ (self ):
247244 self ._log = logging .getLogger (self .__class__ .__name__ )
@@ -272,6 +269,9 @@ def get_widget(self, has_schema):
272269 builder .get_object ("load_remote_files" ).set_active (
273270 self ._settings .get_boolean ('load-remote-files' )
274271 )
272+ builder .get_object ("sort_list" ).set_active (
273+ self ._settings .get_boolean ('sort-list' )
274+ )
275275 builder .get_object ("ctags_executable" ).set_text (
276276 self ._settings .get_string ('ctags-executable' )
277277 )
@@ -287,6 +287,9 @@ def on_expand_rows_toggled(self, button, data=None):
287287 def on_load_remote_files_toggled (self , button , data = None ):
288288 self ._settings .set_boolean ('load-remote-files' , button .get_active ())
289289
290+ def on_sort_list_toggled (self , button , data = None ):
291+ self ._settings .set_boolean ('sort-list' , button .get_active ())
292+
290293 def on_ctags_executable_changed (self , editable , data = None ):
291294 self ._settings .set_string ('ctags-executable' , editable .get_text ())
292295
@@ -324,6 +327,7 @@ def do_activate(self):
324327 self ._sourcetree .ctags_executable = self .ctags_executable
325328 self ._sourcetree .show_line_numbers = self .show_line_numbers
326329 self ._sourcetree .expand_rows = self .expand_rows
330+ self ._sourcetree .sort_list = self .sort_list
327331 panel = self .window .get_side_panel ()
328332 panel .add_item (self ._sourcetree , "SymbolBrowserPlugin" , "Source Code" , self .icon )
329333
@@ -355,10 +359,12 @@ def _init_settings(self):
355359 self .load_remote_files = settings .get_boolean ("load-remote-files" )
356360 self .show_line_numbers = settings .get_boolean ("show-line-numbers" )
357361 self .expand_rows = settings .get_boolean ("expand-rows" )
362+ self .sort_list = settings .get_boolean ("sort-list" )
358363 self .ctags_executable = settings .get_string ("ctags-executable" )
359364 settings .connect ("changed::load-remote-files" , self .on_setting_changed )
360365 settings .connect ("changed::show-line-numbers" , self .on_setting_changed )
361366 settings .connect ("changed::expand-rows" , self .on_setting_changed )
367+ settings .connect ("changed::sort-list" , self .on_setting_changed )
362368 settings .connect ("changed::ctags-executable" , self .on_setting_changed )
363369 self ._settings = settings
364370 else :
@@ -367,6 +373,7 @@ def _init_settings(self):
367373 self .load_remote_files = True
368374 self .show_line_numbers = False
369375 self .expand_rows = True
376+ self .sort_list = True
370377 self .ctags_executable = 'ctags'
371378
372379 def _load_active_document_symbols (self ):
@@ -400,7 +407,6 @@ def _load_active_document_symbols(self):
400407
401408
402409 def on_active_tab_changed (self , window , tab , data = None ):
403- self ._log .debug ("active-tab-changed" )
404410 self ._load_active_document_symbols ()
405411
406412 def on_setting_changed (self , settings , key , data = None ):
@@ -416,17 +422,20 @@ def on_setting_changed(self, settings, key, data=None):
416422 self .show_line_numbers = self ._settings .get_boolean (key )
417423 elif key == 'expand-rows' :
418424 self .expand_rows = self ._settings .get_boolean (key )
425+ elif key == 'sort-list' :
426+ self .sort_list = self ._settings .get_boolean (key )
419427 elif key == 'ctags-executable' :
420428 self .ctags_executable = self ._settings .get_string (key )
421429
422430 if self ._sourcetree is not None :
423431 self ._sourcetree .ctags_executable = self .ctags_executable
424432 self ._sourcetree .show_line_numbers = self .show_line_numbers
425433 self ._sourcetree .expand_rows = self .expand_rows
434+ self ._sourcetree .sort_list = self .sort_list
435+ self ._sourcetree .expanded_rows = {}
426436 self ._load_active_document_symbols ()
427437
428438 def on_tab_state_changed (self , window , data = None ):
429- self ._log .debug ("tab-state-changed" )
430439 self ._load_active_document_symbols ()
431440
432441 def on_tab_removed (self , window , tab , data = None ):
0 commit comments