def __init__(self): self.builder = gtk.Builder() self.builder.add_from_file("picthing.glade") self.window = self.builder.get_object("window") self.builder.connect_signals(self) config = ConfigParser.ConfigParser() config.read(['picthing.ini', os.path.expanduser('~/.picthing.ini')]) self.libs = config.items('libraries') place = self.builder.get_object("place_librarypicker") libpick = gtk.combo_box_new_text() libpick.connect('changed',self.action_switchlibrary) place.add(libpick) libpick.show() if(len(self.libs)): for lib in self.libs: libpick.append_text(lib[0]) libpick.set_active(0) else: #FIXME use some dialog here sys.exit() # add image canvas self.image = ResizableImage() self.image.show() self.builder.get_object("picframe").add(self.image)
class PicThing: window = None builder = None iconview = None filemgr = None meta = None libs = None image = None def on_window_destroy(self, widget, data=None): gtk.main_quit() def __init__(self): self.builder = gtk.Builder() self.builder.add_from_file("picthing.glade") self.window = self.builder.get_object("window") self.builder.connect_signals(self) config = ConfigParser.ConfigParser() config.read(['picthing.ini', os.path.expanduser('~/.picthing.ini')]) self.libs = config.items('libraries') place = self.builder.get_object("place_librarypicker") libpick = gtk.combo_box_new_text() libpick.connect('changed',self.action_switchlibrary) place.add(libpick) libpick.show() if(len(self.libs)): for lib in self.libs: libpick.append_text(lib[0]) libpick.set_active(0) else: #FIXME use some dialog here sys.exit() # add image canvas self.image = ResizableImage() self.image.show() self.builder.get_object("picframe").add(self.image) def action_switchlibrary(self, widget): """ Load a new library """ library = self.libs[widget.get_active()] print "loading library '"+library[0]+"' in '"+library[1]+"'" self.meta = None self.builder.get_object('notebook').set_current_page(0) if(self.filemgr != None): self.filemgr.index.close(); self.filemgr = FileManager(library[1]) self.iconview = self.builder.get_object("iconview") self.iconview.set_model(self.filemgr.store) self.iconview.set_text_column(self.filemgr.COL_TITLE) self.iconview.set_pixbuf_column(self.filemgr.COL_PIXBUF) self.iconview.set_tooltip_column(self.filemgr.COL_PATH) self.new_query('') self.filemgr.index.tagcloud() def action_search(self,widget): querybox = self.builder.get_object("querybox") self.set_status("Searching...") query = querybox.get_text() query = query.strip() m = re.search('^folder:("([^"]*)")?$',query) try: if(m): query = m.group(2); self.filemgr.browse(query) elif(query == ''): self.filemgr.browse(query) else: self.filemgr.search(query) self.set_status("okay") except ParseException: self.set_status("Couldn't parse query") except KeyError: self.set_status("Wrong field name") except NoDirException: self.set_status("No such directory") self.builder.get_object('notebook').set_current_page(0) def action_iconclick(self,widget,item): model = widget.get_model() path = model[item][self.filemgr.COL_PATH] ftype = model[item][self.filemgr.COL_TYPE] if(ftype == 'dir'): if(path): self.new_query('folder:"'+path+'"') else: self.new_query('') else: self.builder.get_object('notebook').set_current_page(1) def action_pageswitch(self,notebook, page, page_num): """ Signal handler. Activates when the notebok tab is switched """ self.meta = None if(page_num == 1): self.load_image() elif(page_num == 2): self.builder.get_object('tagcloud').set_markup(self.filemgr.get_tagcloudstring()) def action_imgnext(self, button): """ Navigate to the next image in icon view """ pos = self.get_currentpos() pos = self.filemgr.get_nextimagepos(pos) if(pos != None): self.iconview.select_path(pos) self.load_image() def action_imgprev(self, button): """ Navigate to the previous image in icon view """ pos = self.get_currentpos() pos = self.filemgr.get_previmagepos(pos) if(pos != None): self.iconview.select_path(pos) self.load_image() def action_activate_link(self, widget, link): """ handle clicks in label links """ link = urllib.unquote(link) self.new_query(link) def get_currentpos(self): """ return the number (position) of the currently selected icon returns None if nothing is selected """ pos = self.iconview.get_selected_items() if(pos == None): return None; return pos[0][0] # array, tuple def load_image(self): """ Load the next image to show """ self.save_image() panel = self.builder.get_object('imagepanel') panel.hide() self.image.hide() pos = self.get_currentpos() if(pos == None): return img = self.filemgr.get_itemat(pos) if(img['ft'] == 'dir'): return self.meta = Metadata(img['fn']); obj = self.builder.get_object('imgtitle') obj.set_text(self.meta.get_title()) obj.set_sensitive(self.meta.writable) obj = self.builder.get_object('imgcontent') obj.set_text(self.meta.get_content()) obj = self.builder.get_object('imgcontentbox') obj.set_sensitive(self.meta.writable) obj = self.builder.get_object('imgtags') obj.set_text(self.meta.get_tags()) obj.set_sensitive(self.meta.writable) obj = self.builder.get_object('imgname') obj.set_text(os.path.basename(img['fn'])) panel.show() while gtk.events_pending(): gtk.main_iteration(False) self.image.set_from_file(img['fn']) self.image.show() def save_image(self): """ Save metadata of the currently loaded image (if any) """ if(self.meta == None): return cnt = self.builder.get_object('imgcontent'); self.meta.set_title( self.builder.get_object('imgtitle').get_text() ) self.meta.set_content( cnt.get_text(cnt.get_start_iter(),cnt.get_end_iter()) ) self.meta.set_tags( self.builder.get_object('imgtags').get_text() ) if self.meta.conditional_write(): # update index with new data self.filemgr.index.update_image(self.meta.filename) def new_query(self,query): """ Set a new search or browse query and execute it """ querybox = self.builder.get_object("querybox") querybox.set_text(query) self.action_search(None) def set_status(self,text,context=1): status = self.builder.get_object("statusbar") status.push(context,text) def action_scandialog(self,widget): query = self.builder.get_object("querybox").get_text() m = re.search('folder:("([^"]*)")?$',query) if(m): base = m.group(2) base = os.path.join(self.filemgr.root,base) else: base = self.filemgr.root self.builder.get_object("scandialog_folder").set_text(base); prg = self.builder.get_object("scandialog_progress") prg.hide() prg.set_pulse_step(0.01) btn = self.builder.get_object("scandialog_execute") btn.set_sensitive(True) dialog = self.builder.get_object("scandialog") dialog.run() def action_scandialog_response(self,dialog,response_id): print response_id if response_id < 0: dialog.hide() # abort any running scan: self.filemgr.index.scan_stop() return prg = self.builder.get_object("scandialog_progress") prg.set_text('') prg.show() btn = self.builder.get_object("scandialog_execute") btn.set_sensitive(False) base = self.builder.get_object("scandialog_folder").get_text(); self.filemgr.index.scan_start() scan = self.filemgr.index.scan_iterator(base, self.action_scan_loop, self.action_scan_exit) gobject.idle_add(scan.next) def action_scan_loop(self,fn,isimg): prg = self.builder.get_object("scandialog_progress") prg.show() prg.pulse() if isimg: prg.set_text(os.path.basename(fn)) def action_scan_exit(self,isabort): dialog = self.builder.get_object("scandialog") dialog.hide()