From 8080ccc7f0daacf196646a287aa7046428579a92 Mon Sep 17 00:00:00 2001 From: gryf Date: Thu, 24 Apr 2008 13:19:13 +0000 Subject: [PATCH] * Code clean up. * Decerased amount of class methods. * Added tags cloud support. --- src/ctrls/c_main.py | 367 +++++++++++++++++++++++++------------------- 1 file changed, 213 insertions(+), 154 deletions(-) diff --git a/src/ctrls/c_main.py b/src/ctrls/c_main.py index 6ba72fc..947b3a6 100644 --- a/src/ctrls/c_main.py +++ b/src/ctrls/c_main.py @@ -34,12 +34,8 @@ from os import popen from utils import deviceHelper from gtkmvc import Controller -from time import time, ctime - from c_config import ConfigController from views.v_config import ConfigView -from c_tags import TagsController -from views.v_tags import TagsView import views.v_dialogs as Dialogs @@ -66,6 +62,8 @@ class MainController(Controller): self.DND_TARGETS = [('files_tags', 0, 69)] Controller.__init__(self, model) self.tag_switched = True + self.hovering = False + self.first = True return def register_view(self, view): @@ -109,29 +107,23 @@ class MainController(Controller): self.context_id = context self.statusbar_id = self.view['mainStatus'].push(self.context_id, "Idle") - + # make tag_cloud_textview recive dnd signals self.view['tag_cloud_textview'].drag_dest_set(gtk.DEST_DEFAULT_ALL, self.DND_TARGETS, gtk.gdk.ACTION_COPY) - #ttv.connect('drag_motion', self.on_tag_cloud_textview_drag_motion) - #ttv.connect('drag_drop', self.on_tag_cloud_textview_drag_drop) - + # initialize treeviews self.__setup_disc_treeview() self.__setup_files_treeview() self.__setup_exif_treeview() - # in case passing catalog filename in command line, unlock gui - if self.model.filename != None: + if self.model.filename: self.__activate_ui(self.model.filename) # generate recent menu self.__generate_recent_menu() - - # initialoze tag cloud - self.__tag_cloud() # Show main window self.view['main'].show(); @@ -143,38 +135,37 @@ class MainController(Controller): def on_tag_cloud_textview_drag_drop(self, wid, context, x, y, time): context.finish(True, False, time) return True - + def on_tag_cloud_textview_drag_motion(self, filestv, context, x, y, time): context.drag_status(gtk.gdk.ACTION_COPY, time) iter = filestv.get_iter_at_location(x, y) try: tag = iter.get_tags()[0] - #print tag.get_property('name') self.tag_switched = False tag.set_property("weight", pango.WEIGHT_BOLD) except: if not self.tag_switched: self.__tag_cloud() pass - buff = filestv.get_buffer() - + #buff = filestv.get_buffer() + #self.__find_tag_in_textview() return True - + def on_files_drag_data_get(self, treeview, context, selection, targetType, eventTime): - # get selection, and send it to the client + # get selection, and send it to the client if targetType == self.DND_TARGETS[0][2]: # get selection treesrl = treeview.get_selection() model, list_of_paths = treesrl.get_selected_rows() ids = [] for path in list_of_paths: - id = model.get_value(model.get_iter(path),0) + id = model.get_value(model.get_iter(path), 0) ids.append(id) string = str(tuple(ids)).replace(",)", ")") selection.set(selection.target, 8, string) - + def on_tag_cloud_textview_drag_data_received(self, widget, context, x, y, selection, targetType, time): if targetType == self.DND_TARGETS[0][2]: @@ -187,16 +178,15 @@ class MainController(Controller): tn = self.model.get_tag_by_id(it) self.model.add_tags(int(id.strip()), tn) except: - if selection.data != '': + if selection.data: tags = Dialogs.TagsDialog().run() if not tags: return for id in ids: self.model.add_tags(int(id.strip()), tags) - + self.__tag_cloud() - print "end", selection.data - + def on_edit2_activate(self, menu_item): try: selection = self.view['files'].get_selection() @@ -205,7 +195,7 @@ class MainController(Controller): except TypeError: if __debug__: print "c_main.py: on_edit2_activate(): 0", - print "zaznaczonych wierszy" + print "zaznaczonych wierszy" return val = self.model.get_file_info(id) @@ -222,19 +212,19 @@ class MainController(Controller): image, only_thumbs = Dialogs.LoadImageFile().run() if not image: return - try: - selection = self.view['files'].get_selection() - model, list_of_paths = selection.get_selected_rows() - for path in list_of_paths: - id = model.get_value(model.get_iter(path),0) - self.model.add_thumbnail(image, id) - self.model.unsaved_project = True - self.__set_title(filepath=self.model.filename, modified=True) - except: - if __debug__: - print "c_main.py: on_add_thumb1_activate(): error on getting", - print "selected items or creating thumbnails" - return + #try: + selection = self.view['files'].get_selection() + model, list_of_paths = selection.get_selected_rows() + for path in list_of_paths: + id = model.get_value(model.get_iter(path), 0) + self.model.add_thumbnail(image, id) + self.model.unsaved_project = True + self.__set_title(filepath=self.model.filename, modified=True) + #except: + # if __debug__: + # print "c_main.py: on_add_thumb1_activate(): error on getting", + # print "selected items or creating thumbnails" + # return self.__get_item_info(id) return @@ -249,7 +239,7 @@ class MainController(Controller): selection = self.view['files'].get_selection() model, list_of_paths = selection.get_selected_rows() for path in list_of_paths: - id = model.get_value(model.get_iter(path),0) + id = model.get_value(model.get_iter(path), 0) self.model.del_thumbnail(id) except: if __debug__: @@ -273,7 +263,7 @@ class MainController(Controller): selection = self.view['files'].get_selection() model, list_of_paths = selection.get_selected_rows() for path in list_of_paths: - id = model.get_value(model.get_iter(path),0) + id = model.get_value(model.get_iter(path), 0) self.model.del_images(id) except: if __debug__: @@ -310,7 +300,7 @@ class MainController(Controller): if __debug__: print "c_main.py: on_rename1_activate(): label:", new_name - if new_name != None and new_name != name: + if new_name and new_name != name: self.model.rename(id, new_name) self.__set_title(filepath=self.model.filename, modified=True) self.model.unsaved_project = True @@ -326,14 +316,14 @@ class MainController(Controller): if len(list_of_paths) != 1: return - fid = model.get_value(model.get_iter(list_of_paths[0]),0) + fid = model.get_value(model.get_iter(list_of_paths[0]), 0) name = model.get_value(model.get_iter(list_of_paths[0]),1) new_name = Dialogs.InputNewName(name).run() if __debug__: print "c_main.py: on_rename1_activate(): label:", new_name - if new_name != None and new_name != name: + if new_name and new_name != name: self.model.rename(fid, new_name) self.__set_title(filepath=self.model.filename, modified=True) @@ -355,16 +345,86 @@ class MainController(Controller): w = self.view['tag_cloud_textview'].get_window(gtk.TEXT_WINDOW_TEXT) if w: w.set_cursor(None) - + + def on_clear_clicked(self, w): + self.view['tag_path_box'].hide() + self.model.selected_tags = [] + self.model.refresh_discs_tree() + self.on_discs_cursor_changed(w) + self.__tag_cloud() + + # NOTE: text view "links" functions + def on_tag_cloud_textview_visibility_notify_event(self, textview, event): + (wx, wy, mod) = textview.window.get_pointer() + (bx, by) = textview.window_to_buffer_coords(gtk.TEXT_WINDOW_WIDGET, + wx, wy) + self.check_hovering(bx, by) + return False + + def check_hovering(self, x, y): + """Check if the mouse is above a tagged link and if yes show + a hand cursor""" + _hovering = False + textview = self.view['tag_cloud_textview'] + # get the iter at the mouse position + iter = textview.get_iter_at_location(x, y) + + # set _hovering if the iter has the tag "url" + tags = iter.get_tags() + for tag in tags: + _hovering = True + break + + # change the global hovering state + if _hovering != self.hovering or self.first == True: + self.first = False + self.hovering = _hovering + # Set the appropriate cursur icon + if self.hovering: + textview.get_window(gtk.TEXT_WINDOW_TEXT).\ + set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2)) + else: + textview.get_window(gtk.TEXT_WINDOW_TEXT).\ + set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) + + + def on_tag_cloud_click(self, tag, textview, event, b_iter, data): + """react on click on connected tag items""" + tag_cloud = self.view['tag_cloud_textview'] + if event.type == gtk.gdk.BUTTON_RELEASE: + self.model.add_tag_to_path(tag.get_property('name')) + self.view['tag_path_box'].show() + + # fill the path of tag + self.view['tag_path'].set_text('') + temp = self.model.selected_tags.values() + self.model.refresh_discs_tree() + self.on_discs_cursor_changed(textview) + + temp.sort() + for tag1 in temp: + txt = self.view['tag_path'].get_text() + if txt == '': + self.view['tag_path'].set_text(tag1) + else: + self.view['tag_path'].set_text(txt + ", " +tag1) + self.__tag_cloud() + + #elif event.type == gtk.gdk.MOTION_NOTIFY: + # window = tag_cloud.get_window(gtk.TEXT_WINDOW_TEXT) + # if window: + # window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2)) + #else: + # window = tag_cloud.get_window(gtk.TEXT_WINDOW_TEXT) + # if window: + # window.set_cursor(None) + # NOTE: quit / close window def on_main_destroy_event(self, window, event): - self.on_quit1_activate(window) + self.on_quit_activate(window) return True - def on_tb_quit_clicked(self, widget): - self.on_quit1_activate(widget) - - def on_quit1_activate(self, widget): + def on_quit_activate(self, widget): """Quit and save window parameters to config file""" # check if any unsaved project is on go. if self.model.unsaved_project and \ @@ -378,9 +438,8 @@ class MainController(Controller): self.model.cleanup() gtk.main_quit() return False - - def on_new1_activate(self, widget): + def on_new_activate(self, widget): """Create new database file""" if self.model.unsaved_project: if not Dialogs.Qst('Unsaved data - pyGTKtalog', @@ -396,9 +455,6 @@ class MainController(Controller): self.view['description'].set_buffer(buf) self.__activate_ui() - def on_tb_new_clicked(self, widget): - self.on_new1_activate(widget) - def on_add_cd_activate(self, widget, label=None, current_id=None): """Add directory structure from cd/dvd disc""" mount = deviceHelper.volmount(self.model.config.confd['cd']) @@ -406,7 +462,7 @@ class MainController(Controller): guessed_label = deviceHelper.volname(self.model.config.confd['cd']) if not label: label = Dialogs.InputDiskLabel(guessed_label).run() - if label != None: + if label: self.scan_cd = True for widget in self.widgets_all: self.view[widget].set_sensitive(False) @@ -425,15 +481,12 @@ class MainController(Controller): "Last mount message:\n%s" % mount) return False - def on_tb_addcd_clicked(self, widget): - self.on_add_cd_activate(widget) - def on_add_directory1_activate(self, widget, path=None, label=None, current_id=None): """Show dialog for choose drectory to add from filesystem.""" if not label or not path: res = Dialogs.PointDirectoryToAdd().run() - if res !=(None,None): + if res != (None, None): path = res[1] label = res[0] else: @@ -476,18 +529,15 @@ class MainController(Controller): else: self.view['maintoolbar'].hide() - def on_save1_activate(self, widget): + def on_save_activate(self, widget): """Save catalog to file""" if self.model.filename: self.model.save() self.__set_title(filepath=self.model.filename) else: - self.on_save_as1_activate(widget) + self.on_save_as_activate(widget) - def on_tb_save_clicked(self, widget): - self.on_save1_activate(widget) - - def on_save_as1_activate(self, widget): + def on_save_as_activate(self, widget): """Save database to file under different filename.""" path = Dialogs.ChooseDBFilename().run() if path: @@ -514,11 +564,7 @@ class MainController(Controller): selected_id = self.model.discs_tree.get_value(selected_iter, 0) self.on_stat1_activate(menu_item, selected_id) - def on_tb_open_clicked(self, widget): - self.on_open1_activate(widget) - return - - def on_open1_activate(self, widget, path=None): + def on_open_activate(self, widget, path=None): """Open catalog file""" confirm = self.model.config.confd['confirmabandon'] if self.model.unsaved_project and confirm: @@ -538,6 +584,7 @@ class MainController(Controller): else: self.__generate_recent_menu() self.__activate_ui(path) + self.__tag_cloud() return def on_discs_cursor_changed(self, widget): @@ -545,11 +592,12 @@ class MainController(Controller): treeview.""" model = self.view['discs'].get_model() path, column = self.view['discs'].get_cursor() - iter = self.model.discs_tree.get_iter(path) - id = self.model.discs_tree.get_value(iter,0) - self.model.get_root_entries(id) - - self.__get_item_info(id) + if path: + iter = self.model.discs_tree.get_iter(path) + id = self.model.discs_tree.get_value(iter, 0) + self.model.get_root_entries(id) + self.__get_item_info(id) + return def on_discs_row_activated(self, treeview, path, treecolumn): @@ -557,7 +605,7 @@ class MainController(Controller): if treeview.row_expanded(path): treeview.collapse_row(path) else: - treeview.expand_row(path,False) + treeview.expand_row(path, False) return def on_images_button_press_event(self, iconview, event): @@ -678,19 +726,11 @@ class MainController(Controller): def on_files_cursor_changed(self, treeview): """Show details of selected file/directory""" - model, paths = treeview.get_selection().get_selected_rows() - try: - itera = model.get_iter(paths[0]) - iter = model.get_iter(treeview.get_cursor()[0]) - id = self.model.files_list.get_value(iter, 0) - self.__get_item_info(id) - except: - if __debug__: - print "c_main.py: on_files_cursor_changed() insufficient", - print "iterator" + file_id = self.__get_tv_id_under_cursor(treeview) + self.__get_item_info(file_id) return - def on_files_key_release_event(self, a, event): + def on_files_key_release_event(self, treeview, event): if gtk.gdk.keyval_name(event.keyval) == 'BackSpace': d_path, d_column = self.view['discs'].get_cursor() if d_path and d_column: @@ -702,7 +742,7 @@ class MainController(Controller): self.view['discs'].set_cursor(model.get_path(parent_iter)) else: # hard way - f_model = self.view['files'].get_model() + f_model = treeview.get_model() first_iter = f_model.get_iter_first() first_child_value = f_model.get_value(first_iter, 0) # get two steps up @@ -710,59 +750,58 @@ class MainController(Controller): parent_value = self.model.get_parent_discs_value(val) iter = self.model.discs_tree.get_iter_first() while iter: - current_value = self.model.discs_tree.get_value(iter,0) + current_value = self.model.discs_tree.get_value(iter, 0) if current_value == parent_value: path = self.model.discs_tree.get_path(iter) self.view['discs'].set_cursor(path) iter = None else: - iter = self.model.discs_tree.iter_next() - + iter = self.model.discs_tree.iter_next(iter) + if gtk.gdk.keyval_name(event.keyval) == 'Delete': + for file_id in self.__get_tv_selection_ids(treeview): + self.main.delete(file_id) + ids = self.__get_tv_selection_ids(self.view['files']) - def on_files_row_activated(self, files_obj, row, column): """On directory doubleclick in files listview dive into desired branch.""" f_iter = self.model.files_list.get_iter(row) - current_id = self.model.files_list.get_value(f_iter,0) + current_id = self.model.files_list.get_value(f_iter, 0) if self.model.files_list.get_value(f_iter,4) == 1: # ONLY directories. files are omitted. self.model.get_root_entries(current_id) d_path, d_column = self.view['discs'].get_cursor() - if d_path!=None: + if d_path: if not self.view['discs'].row_expanded(d_path): - self.view['discs'].expand_row(d_path,False) + self.view['discs'].expand_row(d_path, False) - iter = self.model.discs_tree.get_iter(d_path) - new_iter = self.model.discs_tree.iter_children(iter) - if new_iter: - while new_iter: - current_value = self.model.discs_tree.get_value(new_iter,0) - if current_value == current_id: - path = self.model.discs_tree.get_path(new_iter) - self.view['discs'].set_cursor(path) - new_iter = self.model.discs_tree.iter_next(new_iter) + iter = self.model.discs_tree.get_iter(d_path) + new_iter = self.model.discs_tree.iter_children(iter) + if new_iter: + while new_iter: + current_value = self.model.discs_tree.get_value(new_iter, 0) + if current_value == current_id: + path = self.model.discs_tree.get_path(new_iter) + self.view['discs'].set_cursor(path) + new_iter = self.model.discs_tree.iter_next(new_iter) return - def on_cancel1_activate(self, widget): - self.on_cancel_clicked(widget) - def on_cancel_clicked(self, widget): """When scanning thread is runing and user push the cancel button, models abort attribute trigger cancelation for scan operation""" self.model.abort = True return - def on_tb_find_clicked(self, widget): + def on_find_activate(self, widget): # TODO: implement searcher return # NOTE: recent signal def recent_item_response(self, path): - self.on_open1_activate(self, path) + self.on_open_activate(self, path) return # NOTE: add tags / images @@ -784,7 +823,7 @@ class MainController(Controller): self.model.unsaved_project = True self.__set_title(filepath=self.model.filename, modified=True) self.__get_item_info(id) - + return def on_add_image1_activate(self, menu_item): @@ -802,7 +841,7 @@ class MainController(Controller): try: selection = self.view['files'].get_selection() model, list_of_paths = selection.get_selected_rows() - id = model.get_value(model.get_iter(list_of_paths[0]),0) + id = model.get_value(model.get_iter(list_of_paths[0]), 0) except: try: path, column = self.view['files'].get_cursor() @@ -818,8 +857,7 @@ class MainController(Controller): self.__get_item_info(id) return - - + def on_update1_activate(self, menu_item): """Update disc under cursor position""" path, column = self.view['discs'].get_cursor() @@ -831,9 +869,9 @@ class MainController(Controller): fid = model.get_value(model.get_iter(path), 0) if self.model.get_source(path) == self.model.CD: - self.on_add_cd_activate(widget, label, fid) + self.on_add_cd_activate(menu_item, label, fid) elif self.model.get_source(path) == self.model.DR: - self.on_add_directory1_activate(widget, filepath, label, fid) + self.on_add_directory1_activate(menu_item, filepath, label, fid) return @@ -918,7 +956,7 @@ class MainController(Controller): if not list_of_paths: list_of_paths = [1] iter = model.get_iter(list_of_paths[0]) - self.model.get_root_entries(model.get_value(iter,0)) + self.model.get_root_entries(model.get_value(iter, 0)) except TypeError: return @@ -962,11 +1000,12 @@ class MainController(Controller): print "abort = %s" % self.model.abort print "self.model.config.recent = %s" % self.model.config.recent print "source: %s" % self.model.source + self.__tag_cloud() ##################### # observed properetis def property_statusmsg_value_change(self, model, old, new): - if self.statusbar_id != 0: + if self.statusbar_id: self.view['mainStatus'].remove(self.context_id, self.statusbar_id) self.statusbar_id = self.view['mainStatus'].push(self.context_id, "%s" % new) @@ -1005,15 +1044,15 @@ class MainController(Controller): ######################### # private class functions - def __get_tv_selection_ids(self, treev): + def __get_tv_selection_ids(self, treeview): """get selection from treeview and return coresponding ids' from connected model or None""" ids = [] try: - selection = treev.get_selection() + selection = treeview.get_selection() model, list_of_paths = selection.get_selected_rows() for path in list_of_paths: - ids.append(model.get_value(model.get_iter(path),0)) + ids.append(model.get_value(model.get_iter(path), 0)) return ids except: # DEBUG: treeview have no selection or smth is broken @@ -1022,6 +1061,17 @@ class MainController(Controller): print "getting selected items" return return None + + def __get_tv_id_under_cursor(self, treeview): + """get id of item form tree view under cursor""" + path, column = treeview.get_cursor() + if path and column: + model = treeview.get_model() + tm_iter = model.get_iter(path) + item_id = model.get_value(tm_iter, 0) + return item_id + return None + def __setup_disc_treeview(self): """Setup TreeView discs widget as tree.""" self.view['discs'].set_model(self.model.discs_tree) @@ -1067,16 +1117,17 @@ class MainController(Controller): c.set_resizable(True) self.view['files'].append_column(c) - c = gtk.TreeViewColumn('Size',gtk.CellRendererText(), text=2) + c = gtk.TreeViewColumn('Size', gtk.CellRendererText(), text=2) c.set_sort_column_id(2) c.set_resizable(True) self.view['files'].append_column(c) - c = gtk.TreeViewColumn('Date',gtk.CellRendererText(), text=3) + c = gtk.TreeViewColumn('Date', gtk.CellRendererText(), text=3) c.set_sort_column_id(3) c.set_resizable(True) self.view['files'].append_column(c) - + self.view['files'].set_search_column(1) + #v.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, # self.DND_TARGETS, # gtk.gdk.ACTION_DEFAULT) @@ -1087,12 +1138,12 @@ class MainController(Controller): def __setup_exif_treeview(self): self.view['exif_tree'].set_model(self.model.exif_list) - c = gtk.TreeViewColumn('EXIF key',gtk.CellRendererText(), text=0) + c = gtk.TreeViewColumn('EXIF key', gtk.CellRendererText(), text=0) c.set_sort_column_id(0) c.set_resizable(True) self.view['exif_tree'].append_column(c) - c = gtk.TreeViewColumn('EXIF value',gtk.CellRendererText(), text=1) + c = gtk.TreeViewColumn('EXIF value', gtk.CellRendererText(), text=1) c.set_sort_column_id(1) c.set_resizable(True) self.view['exif_tree'].append_column(c) @@ -1157,9 +1208,17 @@ class MainController(Controller): return def __get_item_info(self, item): - self.view['description'].show() - set = self.model.get_file_info(item) + buf = gtk.TextBuffer() + if not item: + buf.set_text('') + self.view['img_container'].hide() + self.view['exifinfo'].hide() + self.view['thumb_box'].hide() + self.view['description'].set_buffer(buf) + return + #self.view['description'].show() + set = self.model.get_file_info(item) if __debug__ and 'debug' in set: tag = buf.create_tag() @@ -1199,6 +1258,15 @@ class MainController(Controller): tag.set_property('weight', pango.WEIGHT_BOLD) buf.insert_with_tags(buf.get_end_iter(), "Note:\n", tag) buf.insert(buf.get_end_iter(), set['note']) + + tags = self.model.get_file_tags(item) + if tags: + buf.insert(buf.get_end_iter(), "\n") + tag = buf.create_tag() + tag.set_property('weight', pango.WEIGHT_BOLD) + buf.insert_with_tags(buf.get_end_iter(), "File tags:\n", tag) + for tag in tags: + buf.insert(buf.get_end_iter(), tags[tag] + ", ") self.view['description'].set_buffer(buf) @@ -1220,54 +1288,45 @@ class MainController(Controller): else: self.view['thumb_box'].hide() return - + def __tag_cloud(self): """generate tag cloud""" - # TODO: checkit! self.tag_switched = True - v = self.view['tag_cloud_textview'] - def tag_cloud_click(tag, textview, event, iter, e): - """react on click on connected tag items""" - if event.type == gtk.gdk.BUTTON_RELEASE: - print tag.get_property('name') - elif event.type == gtk.gdk.MOTION_NOTIFY: - w = v.get_window(gtk.TEXT_WINDOW_TEXT) - if w: - w.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2)) + tag_cloud = self.view['tag_cloud_textview'] + self.model.get_tags() + + def insert_blank(buff, b_iter): + if b_iter.is_end() and b_iter.is_start(): + return b_iter else: - w = v.get_window(gtk.TEXT_WINDOW_TEXT) - if w: - w.set_cursor(None) - - def insert_blank(b, iter): - if iter.is_end() and iter.is_start(): - return iter - else: - b.insert(iter, " ") - iter = b.get_end_iter() - return iter + buff.insert(b_iter, " ") + b_iter = buff.get_end_iter() + return b_iter if len(self.model.tag_cloud) > 0: - buff = v.get_buffer() + buff = tag_cloud.get_buffer() + #buff = gtk.TextBuffer() # NOTE: remove old tags tag_table = buff.get_tag_table() + def rem(texttag, data): tag_table.remove(texttag) tag_table.foreach(rem) - + tag_table.foreach(rem) buff.set_text('') + for cloud in self.model.tag_cloud: iter = insert_blank(buff, buff.get_end_iter()) tag = buff.create_tag(str(cloud['id'])) tag.set_property('size-points', cloud['size']) tag.set_property('foreground', cloud['color']) tag.set_property("weight", pango.WEIGHT_NORMAL) - tag.connect('event', tag_cloud_click, tag) + tag.connect('event', self.on_tag_cloud_click, tag) buff.insert_with_tags(iter, cloud['name'] + "(%d)" % cloud['count'], tag) - v.set_buffer(buff) + #tag_cloud.set_buffer(buff) def __find_tag_in_textview(self, widget, x, y): pass