X-Git-Url: http://git.maemo.org/git/?p=comic-widget;a=blobdiff_plain;f=src%2Fusr%2Flib%2Fhildon-desktop%2Fcomicwidget.py;h=950bd5fc43a28568f31b1e16cb194c7a5bdd686e;hp=033ad478c07206cf622ae18bc8dc905236d57763;hb=12d617c4788684d2cef1815caa95df5c809b6d52;hpb=bc4ba54afa80d996bad0c901c81996ae44da2af9 diff --git a/src/usr/lib/hildon-desktop/comicwidget.py b/src/usr/lib/hildon-desktop/comicwidget.py index 033ad47..950bd5f 100644 --- a/src/usr/lib/hildon-desktop/comicwidget.py +++ b/src/usr/lib/hildon-desktop/comicwidget.py @@ -11,12 +11,18 @@ import osso import cairo import datetime import shutil +import sys supports_alpha = False +# LOGGING! +# sys.stdout = open('/home/user/.comic-widget/output_log.txt', 'a') +# sys.stderr = open('/home/user/.comic-widget/error_log.txt', 'a') +# print "Start logging!" + # constants. dbfile is the location of the csv # comiccache is the location of the images -APP_VERSION = "0.3.0" +APP_VERSION = "0.3.4-1" basedbdir = "/opt/comic-widget/db/" imagedir = "/opt/comic-widget/images/" @@ -27,12 +33,17 @@ comics = {"xkcd":{"name":"xkcd","link":"http://xkcd.org/","start":666,"dbfile":d "sinfest":{"name":"Sinfest","link":"http://sinfest.com/","start":3400,"dbfile":dbdir + "comicdb.sinfest.csv"}, "phd":{"name":"PHD Comics","link":"http://www.phdcomics.com/","start":1240,"dbfile":dbdir + "comicdb.phd.csv"}, "dilbert":{"name":"Dilbert","link":"http://dilbert.com/","start":"2009-01-01","dbfile":dbdir + "comicdb.dilbert.csv"}, - "cyanide":{"name":"Cyanide&Happiness","link":"http://explosm.com/","start":"1920","dbfile":dbdir + "comicdb.cyanide.csv"}, - } + "cyanide":{"name":"Cyanide and Happiness","link":"http://explosm.com/","start":"1920","dbfile":dbdir + "comicdb.cyanide.csv"}, + "wulff":{"name":"Wulffmorgenthaler","link":"http://wulffmorgenthaler.com/","start":"edd3411b-96ca-4d93-bd5f-0cf1deb67c8a","dbfile":dbdir + "comicdb.wulff.csv"}, + } +defaults = {'width':480,'height':230} +#defaults = {'width':480,'height':240} +sizefile = "/home/user/.comic-widget/size.cfg" previous = False next = False + # handling of the comics class ComicDb(): def __init__(self, comic): @@ -92,10 +103,20 @@ class ComicDb(): def get_comic(self): print str(self.currentcomic) if self.currentcomic < 0: - self.refresh() self.currentcomic = 0 + if len(self.db) > 0: + fetchid = self.db[self.currentcomic]['id'] + else: + fetchid = comics[self.comic]['start'] + self.fetch_newer(self.comic, fetchid) + self.refresh() if len(self.db) < (self.currentcomic + 1): - self.currentcomic -= 1 + self.currentcomic = len(self.db) - 1 + if len(self.db) > 0: + fetchid = self.db[self.currentcomic]['id'] + else: + fetchid = comics[self.comic]['start'] + self.fetch_earlier(self.comic, fetchid) self.refresh() self.currentcomic = len(self.db) - 1 @@ -155,13 +176,13 @@ class ComicDb(): dbf.close() def refresh(self): - if len(self.db) < 1: - self.currentcomic = -1 - self.fetch_latest_std(self.comic, self.start) - elif self.currentcomic == 0 or self.currentcomic < 0: - self.fetch_latest_std(self.comic, self.db[0]['id']) - elif self.currentcomic == (len(self.db) - 1): - self.fetch_earlier(self.comic, self.db[self.currentcomic]['id']) + # if len(self.db) < 1: + # self.currentcomic = -1 + # self.fetch_latest_std(self.comic, self.start) + # elif self.currentcomic == 0 or self.currentcomic < 0: + # self.fetch_latest_std(self.comic, self.db[0]['id']) + # elif self.currentcomic == (len(self.db) - 1): + # self.fetch_earlier(self.comic, self.db[self.currentcomic]['id']) dbf = open(self.dbfile, 'r') dbr = csv.DictReader(dbf) self.db = [] @@ -169,8 +190,17 @@ class ComicDb(): self.db.insert(0,row) dbf.close() + +# fetch earlier def fetch_earlier(self, comic, earliest): - if len(earliest) == 10: + print "fetch before, " + comic + " earliest" + if comic == "cyanide" or comic == "wulff": + comicid = self.get_prev_id(comic,earliest) + if not comicid: + print "already at first comic" + return + print "got " + comicid + " as the one before current..." + elif len(earliest) == 10: # date id. dt = string.split(earliest, "-") d = datetime.date(int(dt[0]),int(dt[1]),int(dt[2])) @@ -180,14 +210,53 @@ class ComicDb(): comicid = int(earliest) - 1 irow = self.get_irow(comic, comicid) - if irow: + if irow and irow[0] == "skip": + print "problem with this one, fetching " + str(irow[2]) + " instead." + irow = self.get_irow(comic, irow[2]) + + if irow and len(irow) > 3: print "got irow: " print irow - print "\ninserting first...\n" - self.insert_row_first(irow) + print "\ninserting...\n" + self.insert_row_first([irow[0],irow[1],irow[2],irow[3],irow[4],irow[5]]) else: print "No comic found at " + comicid + + + + + def fetch_newer(self, comic, newest): + if comic == "cyanide" or comic == "wulff": + comicid = self.get_next_id(comic,newest) + if not comicid: + print "already at last comic" + return + elif len(newest) == 10: + # date id. + dt = string.split(newest, "-") + d = datetime.date(int(dt[0]),int(dt[1]),int(dt[2])) + newest = d + datetime.timedelta( 1 ) + comicid = newest.isoformat() + else: + comicid = int(newest) + 1 + + irow = self.get_irow(comic, comicid) + if irow and irow[0] == "skip": + print "problem with this one, fetching " + str(irow[1]) + " instead." + irow = self.get_irow(comic, irow[1]) + + if irow and len(irow) > 3: + print "got irow: " + print irow + print "\ninserting...\n" + self.insert_row([irow[0],irow[1],irow[2],irow[3],irow[4],irow[5]]) + else: + print "No comic found at " + str(comicid) + + + + def fetch_latest_std(self, comic, latest): print "fetching new after " + str(comic) + " " + str(latest) next = False @@ -259,7 +328,7 @@ class ComicDb(): if (hcode != 200): return False else: - print "Cyanide & Happiness is unreliable, so we need to track next and prev" + # print "Cyanide & Happiness is unreliable, so we need to track next and prev" s = f.read() f.close() # title: @@ -272,9 +341,94 @@ class ComicDb(): print "no 'next' found" return False else: - return splt[0] + print "got next: " + splt[0] + return splt[0] + if comic == 'wulff': + link = "http://wulffmorgenthaler.com/default.aspx?id=" + number + print "link: " + link + try: + f = urllib2.urlopen(link) + hcode = f.code + except: + hcode = 404 + print "got hcode = " + str(hcode) + "\n" + if (hcode != 200): + return False + else: + s = f.read() + f.close() + # title: + splt = string.split(s, ' | < Previous', 1) + if len(splt) < 2 or len(splt[0]) > 5: + print "no 'next' found" + return False + else: + print "got previous: " + splt[0] + return splt[0] + if comic == 'wulff': + link = "http://wulffmorgenthaler.com/default.aspx?id=" + number + print "link: " + link + try: + f = urllib2.urlopen(link) + hcode = f.code + except: + hcode = 404 + print "got hcode = " + str(hcode) + "\n" + if (hcode != 200): + return False + else: + s = f.read() + f.close() + # title: + splt = string.split(s, '< ', 1) prev = splt[0]; + print "got prev: " + prev splt = string.split(s, 'Previous | ', 1) if len(splt) < 2: @@ -392,20 +550,57 @@ class ComicDb(): return False splt = string.split(splt[1], ' by
', 1) + splt = string.split(splt[1], '">', 1) url = "http://www.explosm" + splt[0] splt2 = string.rsplit(url, "/", 1) filename = splt2[1] irow = [comic,number,link,url,filename,title,next,prev] return irow - + elif comic == 'wulff': + # wulf is type .gif + s = f.read() + f.close() +# +# +# +# + splt = string.split(s, ' 22: titl = titl[:19] + "..." - self.label.set_markup(' ' + self.comicname + ' ' + str(self.db.db[self.db.currentcomic]['id']) + '\n ' + titl + '') + self.label.set_markup(self.get_markup()) self.e_goweb = gtk.EventBox() @@ -543,6 +741,8 @@ class ComicHomePlugin(hildondesktop.HomePluginItem): self.vbox.show_all() self.add(self.vbox) + + # **************** Cairo draw functions *************** def realize(self, widget): @@ -629,7 +829,7 @@ class ComicHomePlugin(hildondesktop.HomePluginItem): titl = str(self.db.db[self.db.currentcomic]['title']) if len(titl) > 22: titl = titl[:19] + "..." - self.label.set_markup(' ' + self.comicname + ' ' + str(self.db.db[self.db.currentcomic]['id']) + '\n ' + titl + '') + self.label.set_markup(self.get_markup()) self.e_goweb.add(self.label) self.e_goweb.show_all() @@ -644,12 +844,17 @@ class ComicHomePlugin(hildondesktop.HomePluginItem): titl = str(self.db.db[self.db.currentcomic]['title']) if len(titl) > 22: titl = titl[:19] + "..." - self.label.set_markup(' ' + self.comicname + ' ' + str(self.db.db[self.db.currentcomic]['id']) + '\n ' + titl + '') + self.label.set_markup(self.get_markup()) self.e_goweb.add(self.label) self.e_goweb.show_all() elif func == 'switch': self.active_comics = self.get_active_comics() + print "closing log" + #sys.stdout.close() + #sys.stdout = sys.__stdout__ + #sys.stderr.close() + #sys.stderr = sys.__stderr__ print "active comics: " + str(self.active_comics) self.keypointer = (self.keypointer + 1) % len(self.active_comics) self.imgvpos = 0 @@ -663,7 +868,7 @@ class ComicHomePlugin(hildondesktop.HomePluginItem): titl = str(self.db.db[self.db.currentcomic]['title']) if len(titl) > 22: titl = titl[:19] + "..." - self.label.set_markup(' ' + self.comicname + ' ' + str(self.db.db[self.db.currentcomic]['id']) + '\n ' + titl + '') + self.label.set_markup(self.get_markup()) self.e_goweb.add(self.label) self.e_goweb.show_all() self.e_open.add(self.comic_image) @@ -698,32 +903,39 @@ class ComicHomePlugin(hildondesktop.HomePluginItem): def get_resized_pixmap(self, filename, vpos): print "vpos: " + str(vpos) - - maxheight = 182 + + width = int(self.sizes['width']) + height = int(self.sizes['height']) + picwidth = width - 2 + maxheight = height - 48 pixbuf = gtk.gdk.pixbuf_new_from_file(filename) - parent_buf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, pixbuf.get_has_alpha(), 8, 480, maxheight) + parent_buf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, pixbuf.get_has_alpha(), 8, width, maxheight) parent_buf.fill(0xffffffff) retimg = gtk.Image() # get correct width/height new_height = 1 - new_width = 478 - new_height = int((478.0 / pixbuf.get_width()) * pixbuf.get_height()) + new_width = picwidth + new_height = int((float(picwidth) / pixbuf.get_width()) * pixbuf.get_height()) scaled_buf = pixbuf.scale_simple(new_width,new_height,gtk.gdk.INTERP_BILINEAR) print "scaled height: " + str(scaled_buf.get_height()) if scaled_buf.get_height() > maxheight: if scaled_buf.get_height() - (vpos + maxheight) < 0: vpos = scaled_buf.get_height() - maxheight - scaled_buf.copy_area(0,vpos,478,maxheight,parent_buf,1,0) + scaled_buf.copy_area(0,vpos,picwidth,maxheight,parent_buf,1,0) + # parent_buf.composite(scaled_buf, 0, 0, 478, maxheight, 0, 0, 478, maxheight, gtk.gdk.INTERP_BILINEAR, 0) self.imgvpos = vpos else: tmpy = maxheight - scaled_buf.get_height() if tmpy > 0: tmpy = tmpy / 2 - scaled_buf.copy_area(0,0,478,scaled_buf.get_height(),parent_buf,1,tmpy) + scaled_buf.copy_area(0,0,picwidth,scaled_buf.get_height(),parent_buf,1,tmpy) self.imgvpos = 0 +# test = parent_buf.render_pixmap_and_mask(0) +# parent_buf.add_alpha(True,chr(255),chr(255),chr(255)) retimg.set_from_pixbuf(parent_buf) + print retimg.get_pixel_size() print "vpos after fixing image: " + str(self.imgvpos) return retimg @@ -785,7 +997,12 @@ class ComicHomePlugin(hildondesktop.HomePluginItem): return ret - + def get_markup(self): + if len(self.comicname + " " + str(self.db.db[self.db.currentcomic]['id'])) < 20: + return ' ' + self.comicname + ' ' + str(self.db.db[self.db.currentcomic]['id']) + '\n ' + str(self.db.db[self.db.currentcomic]['title']) + '' + else: + return ' ' + self.comicname + '' + '\n ' + str(self.db.db[self.db.currentcomic]['title']) + '' + #check if settings file exists @@ -794,6 +1011,7 @@ class ComicHomePlugin(hildondesktop.HomePluginItem): # ************************* OPTION DIALOGS ******************************** def show_options(self, widget): + print "loading options dialog" dialog = gtk.Dialog("Comic Widget", None, gtk.DIALOG_DESTROY_WITH_PARENT) about_button = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL) @@ -806,14 +1024,23 @@ class ComicHomePlugin(hildondesktop.HomePluginItem): comics_button.set_alignment(0,0,0,0) comics_button.connect("clicked", self.show_comics) - dialog.vbox.pack_start(about_button, True, True, 0) - dialog.vbox.pack_start(comics_button, True, True, 0) + # size_button = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL) + # size_button.set_text("Change size", "Change the size of the widget") + # size_button.set_alignment(0,0,0,0) + # size_button.connect("clicked", self.show_size) + print "adding buttons to dialog, starting with comics" + dialog.vbox.pack_start(comics_button, True, True, 0) + print "adding about button" + dialog.vbox.pack_start(about_button, True, True, 0) + # dialog.vbox.pack_start(size_button, True, True, 0) + print "show!" dialog.show_all() dialog.run() dialog.destroy() def show_about(self, widget): + print "in about dialog" dialog = gtk.AboutDialog() dialog.set_title("About") dialog.set_name("Comic widget") @@ -828,38 +1055,64 @@ class ComicHomePlugin(hildondesktop.HomePluginItem): dialog.run() dialog.destroy() - def show_comics(self, widget): - dialog = gtk.Dialog("Configure Search Engines", None, gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_NO_SEPARATOR) + def show_comics(self, widget, data = None): + print "in comics dialog! yay!" + dialog = gtk.Dialog("Choose comics", None, gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_NO_SEPARATOR) comiclist = comics.keys() comiclist.sort() buttonlist = {} + self.connlist = {} + self.liststore = gtk.ListStore(str,str,bool) for comicid in comiclist: - buttonlist[comicid] = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL) - print buttonlist[comicid].get_name() - - print buttonlist[comicid].set_alignment(0, 0.5, 0, 0.5) active = False for acomic in self.active_comics: if acomic == comicid: active = True break if active: - buttonlist[comicid].set_text(comics[comicid]['name'] + " *", comicid + ": click to remove") - buttonlist[comicid].connect("clicked", self.remove_comic) + self.liststore.append(["* " + comics[comicid]['name'],comicid, active]) else: - buttonlist[comicid].set_text(comics[comicid]['name'], comicid + ": click to add") - buttonlist[comicid].connect("clicked", self.add_comic) - dialog.vbox.pack_start(buttonlist[comicid], True, True, 0) + self.liststore.append([" " + comics[comicid]['name'],comicid, active]) + self.treeview = hildon.GtkTreeView(gtk.HILDON_UI_MODE_EDIT) + self.treeview.set_model(self.liststore) + self.treeview.set_reorderable(True) + tvcolumn = gtk.TreeViewColumn('Column 0') + self.treeview.append_column(tvcolumn) + cell = gtk.CellRendererText() + tvcolumn.pack_start(cell, True) + tvcolumn.add_attribute(cell, 'text', 0) + + ts = hildon.PannableArea() + + ts.set_size_request(-1, 280) + ts.add(self.treeview) + selection = self.treeview.get_selection() - + dialog.vbox.pack_start(ts,True,True,0) dialog.show_all() + selection.connect("changed", self.pick_comic, comiclist) dialog.run() dialog.destroy() + + def pick_comic(self, widget, data): + selected = widget.get_selected() + if selected == None: + return False + + print selected[0].get_value(selected[1],0) + ", " + selected[0].get_value(selected[1],1) + ", " + str(selected[0].get_value(selected[1],2)) + if selected[0].get_value(selected[1],2): + self.remove_comic(selected[0].get_value(selected[1],1)) + splt = selected[0].get_value(selected[1],0)[1:] + selected[0].set_value(selected[1],0," " + splt) + selected[0].set_value(selected[1],2,False) + else: + self.add_comic(selected[0].get_value(selected[1],1)) + splt = selected[0].get_value(selected[1],0)[1:] + selected[0].set_value(selected[1],0,"*" + splt) + selected[0].set_value(selected[1],2,True) + - def add_comic(self, widget): - print "add " + widget.get_title() - splt = string.split(widget.get_value(), ':', 1) - comicid = splt[0] + def add_comic(self, comicid): if os.path.isfile(activecomics) == True: print "added " + comicid + " to " + str(self.active_comics) try: @@ -870,22 +1123,54 @@ class ComicHomePlugin(hildondesktop.HomePluginItem): dbw = csv.writer(dbf) dbw.writerow(self.active_comics) dbf.close() - widget.set_text(comics[comicid]['name'] + " *", comicid + ": click to remove") - - def remove_comic(self, widget): - print "remove " + widget.get_title() - if len(self.active_comics) == 1: - return - splt = string.split(widget.get_value(), ':', 1) - comicid = splt[0] + + def remove_comic(self, comicid): if os.path.isfile(activecomics) == True: print "removing " + comicid + " from " + str(self.active_comics) - del self.active_comics[self.active_comics.index(comicid)] + try: + del self.active_comics[self.active_comics.index(comicid)] + except: + pass dbf = open(activecomics, 'w') dbw = csv.writer(dbf) dbw.writerow(self.active_comics) dbf.close() - widget.set_text(comics[comicid]['name'], comicid + ": click to add") + + + def get_size_settings(self): + # defaults = {'width':480,'height':230} + # options: w 798 700 600 500 480 400 + # options: h 420 360 310 270 240 200 + print "checking to see if config file is available" + if os.path.isfile(sizefile) == True: + print "found " + sizefile + dbf = open(sizefile, 'r') + dbr = csv.reader(dbf) + try: + cfg = dbr.next() + except: + dbf.close() + print "empty config file" + return defaults + dbf.close() + + sizes = {'width':int(cfg[0]),'height':int(cfg[1])} + if sizes['width'] > 798: + sizes['width'] = 798 + if sizes['width'] < 400: + sizes['width'] = 400 + if sizes['height'] > 420: + sizes['height'] = 420 + if sizes['height'] < 200: + sizes['height'] = 200 + + return sizes + + + # if not, copy it. + else: + print "no config file" + return defaults hd_plugin_type = ComicHomePlugin