From e237db27124346c2900e7b85327b24834c78eb9f Mon Sep 17 00:00:00 2001 From: portnov Date: Thu, 17 Jul 2008 18:02:09 +0600 Subject: [PATCH] Do not use GtkImageView, use own gtk.Button-based class. --- desktop.py | 252 ++++++++++++++++++++++++++++-------------------------------- gui.py | 194 ---------------------------------------------- gui.pyc | Bin 6854 -> 0 bytes 3 files changed, 117 insertions(+), 329 deletions(-) delete mode 100644 gui.py delete mode 100644 gui.pyc diff --git a/desktop.py b/desktop.py index f64d48e..d0f3ad2 100755 --- a/desktop.py +++ b/desktop.py @@ -7,150 +7,132 @@ import re import gobject import gtk import gtk.gdk -import gtkimageview as giv gettext.install("pydesktop") CONFIG = os.path.expanduser("~/.config/pydesktop.conf") def browse(title,filtername="",mimetypes=[],patterns=[]): - chooser = gtk.FileChooserDialog(title,None, gtk.FILE_CHOOSER_ACTION_OPEN, ( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) - if filtername: + chooser = gtk.FileChooserDialog(title,None, gtk.FILE_CHOOSER_ACTION_OPEN, ( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) + if filtername: + filter = gtk.FileFilter() + filter.set_name(filtername) + for t in mimetypes: + filter.add_mime_type(t) + for p in patterns: + filter.add_pattern(p) + chooser.add_filter(filter) filter = gtk.FileFilter() - filter.set_name(filtername) - for t in mimetypes: - filter.add_mime_type(t) - for p in patterns: - filter.add_pattern(p) + filter.set_name(_("All files")) + filter.add_pattern("*") chooser.add_filter(filter) - filter = gtk.FileFilter() - filter.set_name(_("All files")) - filter.add_pattern("*") - chooser.add_filter(filter) - r = chooser.run() - if r == gtk.RESPONSE_OK: - result = chooser.get_filename() - else: - result = None - chooser.destroy() - return result - -class Clicker(gobject.GObject, giv.IImageTool): - def __init__(self,menu): - gobject.GObject.__init__(self) - self.cache= giv.PixbufDrawCache() - self.crosshair = gtk.gdk.Cursor(gtk.gdk.LEFT_PTR) - self.menu = menu - - def do_button_press(self,ev): -# print "Button pressed:",ev.button,ev.x,ev.y - if ev.button == 3: - self.menu.popup(None,None,None,1,0) - - def do_button_release(self, ev_button): - pass - - def do_motion_notify(self, ev_motion): - pass - - def do_pixbuf_changed(self, reset_fit, rect): - pass - - def do_paint_image(self, draw_opts, drawable): - self.cache.draw(draw_opts, drawable) - - def do_cursor_at_point(self, x, y): - return self.crosshair - -gobject.type_register(Clicker) + r = chooser.run() + if r == gtk.RESPONSE_OK: + result = chooser.get_filename() + else: + result = None + chooser.destroy() + return result + +class ClickImage(gtk.Button): + def __init__(self): + gtk.Button.__init__(self) + self.img = gtk.Image() + self.img.show() + self.add(self.img) + + def load(self,path): + self.img.set_from_file(path) + class Desktop(object): - def __init__(self): - self.window = gtk.Window() - self.window.set_title("pyDesktop") - self.window.connect("destroy",self.on_close) - self.window.set_property("type-hint", gtk.gdk.WINDOW_TYPE_HINT_DESKTOP) - self.window.fullscreen() - screen_width = gtk.gdk.screen_width() - screen_height = gtk.gdk.screen_height() - self.window.set_decorated(False) - self.window.resize(screen_width, screen_height) - self.view = giv.ImageView() - try: - self.load_config() - except IOError: - print "Could not open config" - self.wall = giv.ImageScrollWin(self.view) - self.create_menu() - clk = Clicker(self.menu) - self.view.set_tool(clk) - self.window.add(self.wall) - self.window.show_all() - - def load_wallpaper(self,path): - pixbuf = gtk.gdk.pixbuf_new_from_file(path) - self.view.set_pixbuf(pixbuf,True) - - def load_config(self): - self.menu_items = [] - cfg = open(CONFIG) - cre = re.compile("^\s*(\S+)\s*=\s*(.*)$",re.L) - comm = re.compile("\s*#.*",re.L) - for line in cfg: - line = comm.sub("",line) - if line == "": - continue - - m = cre.match(line) - if m: - t = m.group(1) - e = m.group(2) - if t == "Wallpaper": - self.wallpaper_path = e - self.load_wallpaper(e) - else: - self.menu_items.append((t,e)) - cfg.close() - - def save_config(self): - cfg = open(CONFIG,'w') - cfg.write("Wallpaper = "+self.wallpaper_path+"\n") - for title,cmd in self.menu_items: - cfg.write("%s = %s\n" % (title,cmd)) - cfg.close() - - def create_menu(self): - self.menu = gtk.Menu() - for title,cmd in self.menu_items: - mi = gtk.MenuItem(label=title) - mi.connect("activate",self.exec_menu,cmd) - self.menu.add(mi) - wpi = gtk.Image() - wpi.set_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_MENU) - wp = gtk.ImageMenuItem() - wp.add(gtk.Label("Wallpaper...")) - wp.set_image(wpi) - wp.connect("activate",self.browse_wallpaper) - self.menu.add(wp) - exit = gtk.ImageMenuItem(gtk.STOCK_QUIT) - exit.connect("activate",self.on_close) - self.menu.add(exit) - self.menu.show_all() - - def exec_menu(self,widget,command): - os.system(command) - - def browse_wallpaper(self,widget): - wp = browse("Select wallpaper",filtername="Images",mimetypes=["image/jpeg","image/png","image/svg+xml"]) - if wp: - self.wallpaper_path = wp - self.load_wallpaper(self.wallpaper_path) - - def on_close(self,widget): - try: - self.save_config() - except IOError: - print "Could not save config" - gtk.main_quit() + def __init__(self): + self.window = gtk.Window() + self.window.set_title("pyDesktop") + self.window.connect("destroy",self.on_close) + self.window.set_property("type-hint", gtk.gdk.WINDOW_TYPE_HINT_DESKTOP) + self.window.fullscreen() + screen_width = gtk.gdk.screen_width() + screen_height = gtk.gdk.screen_height() + self.window.set_decorated(False) + self.window.resize(screen_width, screen_height) + self.wall = ClickImage() + self.wall.connect("button-press-event",self.on_click) + try: + self.load_config() + except IOError: + print "Could not open config" + self.create_menu() + self.window.add(self.wall) + self.window.show_all() + + def on_click(self,widget,event): + if event.button == 3: + self.menu.popup(None,None,None,event.button, event.get_time()) + + def load_wallpaper(self,path): + self.wall.load(path) + + def load_config(self): + self.menu_items = [] + cfg = open(CONFIG) + cre = re.compile("^\s*(\S+)\s*=\s*(.*)$",re.L) + comm = re.compile("\s*#.*",re.L) + for line in cfg: + line = comm.sub("",line) + if line == "": + continue + + m = cre.match(line) + if m: + t = m.group(1) + e = m.group(2) + if t == "Wallpaper": + self.wallpaper_path = e + self.load_wallpaper(e) + else: + self.menu_items.append((t,e)) + cfg.close() + + def save_config(self): + cfg = open(CONFIG,'w') + cfg.write("Wallpaper = "+self.wallpaper_path+"\n") + for title,cmd in self.menu_items: + cfg.write("%s = %s\n" % (title,cmd)) + cfg.close() + + def create_menu(self): + self.menu = gtk.Menu() + for title,cmd in self.menu_items: + mi = gtk.MenuItem(label=title) + mi.connect("activate",self.exec_menu,cmd) + self.menu.add(mi) + wpi = gtk.Image() + wpi.set_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_MENU) + wp = gtk.ImageMenuItem() + wp.add(gtk.Label("Wallpaper...")) + wp.set_image(wpi) + wp.connect("activate",self.browse_wallpaper) + self.menu.add(wp) + exit = gtk.ImageMenuItem(gtk.STOCK_QUIT) + exit.connect("activate",self.on_close) + self.menu.add(exit) + self.menu.show_all() + + def exec_menu(self,widget,command): + os.system(command) + + def browse_wallpaper(self,widget): + wp = browse("Select wallpaper",filtername="Images",mimetypes=["image/jpeg","image/png","image/svg+xml"]) + if wp: + self.wallpaper_path = wp + self.load_wallpaper(self.wallpaper_path) + + def on_close(self,widget): + try: + self.save_config() + except IOError: + print "Could not save config" + gtk.main_quit() d = Desktop() gtk.main() diff --git a/gui.py b/gui.py deleted file mode 100644 index 9e06859..0000000 --- a/gui.py +++ /dev/null @@ -1,194 +0,0 @@ -import pygtk -import gtk -import gobject - -def button(label,onclick,data=None): - """Create and return a gtk.Button with given label, - clicking it will call onclick()""" - b = gtk.Button(label) - b.connect("clicked", onclick,data) - b.show() - return b - -def toolbutton(stock_id,onclick,data=None): - b = gtk.ToolButton(stock_id) - b.connect("clicked",onclick,data) - b.show() - return b - -def stock_button(stock_id, onclick, data=None): - """Create and return a stock gtk.Button, - clicking it will call onclick()""" - b = gtk.Button(stock=stock_id) - b.connect("clicked", onclick, data) - b.show() - return b - -def icon_button(stock_id, onclick, data=None): - """Create and return a gtk.Button without label, - but with stock icon. Clicking it will call onclick()""" - b = gtk.Button() - i = gtk.Image() - i.set_from_stock(stock_id, gtk.ICON_SIZE_SMALL_TOOLBAR) - i.show() - b.set_image(i) - b.connect("clicked", onclick,data) - b.show() - return b - -def stock_text_button(stock_id,text, onclick, data=None): - b = gtk.Button() - i = gtk.Image() - i.set_from_stock(stock_id, gtk.ICON_SIZE_SMALL_TOOLBAR) - i.show() - l = label(text) - h = hbox([i,(l,True)]) - b.add(h) - b.connect("clicked", onclick,data) - b.show() - return b - -def image_button(image_path, label, onclick, data=None): - """Create and return a gtk.Button with icon and label. - Icon will been got from image_path.""" - b = gtk.Button() - h = gtk.HBox(spacing=10) - h.set_border_width(5) - i = gtk.Image() - i.set_from_file(image_path) - i.show() - h.pack_start(i,False) - l = gtk.Label() - l.set_use_markup(True) - l.set_markup(label) - l.show() - h.pack_start(l,False) - h.show() - b.add(h) - b.connect("clicked",onclick, data) - b.show() - return b - -def image_toggle_button(image_path, label, onclick, data=None): - """Create and return a gtk.ToggleButton with icon and label.""" - b = gtk.ToggleButton() - l = gtk.Label() - i = gtk.Image() - h = gtk.HBox() - i.set_from_file(image_path) - i.show() - l.set_use_markup(True) - l.set_markup(label) - l.show() - h.pack_start(i) - h.pack_start(l) - h.show() - b.add(h) - b.connect("toggled", onclick,data) - b.show() - return b - -def hbox(widget_list, spacing=5, gomogen=False, pack_end=False): - """Create and return a gtk.HBox(), containing given widgets. - Each element of widget_list may be a widget - or a pair (widget, expand_flag).""" - h = gtk. HBox(gomogen,spacing) - for wd in widget_list: - try: - w = wd[0] - f = wd[1] - except: - w = wd - f = False - if pack_end: - h.pack_end(w,f) - else: - h.pack_start(w,f) - h.show() - return h - -def vbox(widget_list, spacing=5, gomogen=False, pack_end=False): - """Create and return a gtk.VBox(), containing given widgets. - Each element of widget_list may be a widget - or a pair (widget, expand_flag).""" - h = gtk.VBox(gomogen,spacing) - for wd in widget_list: - try: - w = wd[0] - f = wd[1] - except: - w = wd - f = False - if pack_end: - h.pack_end(w,f) - else: - h.pack_start(w,f) - h.show() - return h - -def label(text,markup=False): - """Create and return a gtk.Label""" - if markup: - l = gtk.Label() - l.set_use_markup(True) - l.set_markup(text) - else: - l = gtk.Label(text) - l.show() - return l - -def entry(): - """Create and return a gtk.Entry.""" - e = gtk.Entry() - e.show() - return e - -def labeled_entry(text,markup=False): - l = label(text,markup) - e = entry() - h = hbox([l,e]) - return h,e - -def combobox(list): - w = gtk.combo_box_new_text() - for item in list: - w.append_text(item) - w.show() - return w - -def labeled_combobox(text,list,markup=False): - l = label(text,markup) - e = combobox(list) - h = hbox([l,e]) - return h,e - -def window_on_close(window,main=False): - """Hide given window, and if it's main, stop gtk main loop. - You can use this function as a callback for window's "destroy" signal.""" - window.hide() - if main: - gtk.main_quit() - -def close_gui(widget,data=None): - """Stop gtk main loop. Use this function as a callback for widgets - such as "Close" button.""" - gtk.main_quit() - -def window(title=None,widget=None,onclose=window_on_close,main=False): - """Create a gtk.Window with given title, - and pack a widget (if any) into that window. - Default onclose function will simply hide the window, - and stop gtk main loop it this window is main.""" - w = gtk.Window() - if title: - w.set_title(title) - w.set_border_width(10) - if widget: - w.add(widget) - w.connect("destroy",onclose,main) - w.show() - return w - -def show(): - """Start the gtk main loop.""" - gtk.main() diff --git a/gui.pyc b/gui.pyc deleted file mode 100644 index 693c40728d9cc808302392f6334ee9cea3150336..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6854 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