Do not use GtkImageView, use own gtk.Button-based class.

portnov [2008-07-17 12:02:09]
Do not use GtkImageView, use own gtk.Button-based class.
Filename
desktop.py
gui.py
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 693c407..0000000
Binary files a/gui.pyc and /dev/null differ
ViewGit