Draw descriptions on buttons.

portnov [2008-08-24 11:59:12]
Draw descriptions on buttons.
Filename
qwerty.py
diff --git a/qwerty.py b/qwerty.py
index 5da46fc..687ced0 100755
--- a/qwerty.py
+++ b/qwerty.py
@@ -18,6 +18,7 @@ SECTION = 1
 KEY = 2

 PADDING = 4
+LINEHEIGHT = 1.2

 KEYS = [ "QWERTYUIOP",
          "ASDFGHJKL",
@@ -44,11 +45,12 @@ def find_icon(name):
             return p

 class SuperButton(gtk.DrawingArea):
-    def __init__(self,key, label=None, icon=None):
+    def __init__(self,key, label=None, desc=None, icon=None):
         gtk.DrawingArea.__init__(self)

         self.key = key
         self.label = label
+        self.desc = desc
         self.active = False
         self.running = False
         self.cls = None
@@ -67,6 +69,33 @@ class SuperButton(gtk.DrawingArea):

         self.fg = BUTTON_BORDER

+    def show_text_wrap(self,cr,x,y,fontsize,text):
+        def size(text):
+            xs,ys, w,h = cr.text_extents(text)[:4]
+            return w
+
+        cr.set_font_size(fontsize)
+        words = text.split()
+        s = u''
+        old = s
+        lines = []
+        for i,word in enumerate(words[:]):
+            if i:
+                s = s + ' ' + word
+            else:
+                s = word
+            o,n = size(old), size(s)
+            if o < self.width and n >= self.width:
+                lines.append(old)
+                s = word
+            else:
+                del words[0]
+            old = s
+        lines.append(old)
+        for i,line in enumerate(lines):
+            cr.move_to(x,y + fontsize*i*LINEHEIGHT)
+            cr.show_text(line)
+
     def draw_icon(self,cr):
         pb = gdk.pixbuf_new_from_file(self.icon)

@@ -103,6 +132,9 @@ class SuperButton(gtk.DrawingArea):
             cr.set_font_size(16)
             cr.show_text(self.label)

+    def draw_desc(self,cr):
+        self.show_text_wrap(cr,20,130, 14, self.desc)
+
     def on_expose(self,widget,event):
         x,y,self.width,self.height,b = widget.window.get_geometry()
         cr = widget.window.cairo_create()
@@ -118,6 +150,8 @@ class SuperButton(gtk.DrawingArea):
         cr.show_text(self.key)

         self.draw_label(cr)
+        if self.desc:
+            self.draw_desc(cr)

         if self.icon:
             self.draw_icon(cr)
@@ -135,6 +169,10 @@ class SuperButton(gtk.DrawingArea):
         self.label = label
         self.queue_draw()

+    def set_desc(self,desc):
+        self.desc = desc
+        self.queue_draw()
+
     def set_icon(self,icon):
         self.active = True
         self.icon = find_icon(icon)
@@ -232,9 +270,7 @@ def parse_config():

         v = parse_line('Description',line)
         if v:
-            if context == SECTION:
-                S.desc = v
-            elif context == KEY:
+            if context == KEY:
                 K.desc = v
             else:
                 raise SyntaxError, "Unexpected 'Description' key in config file"
@@ -296,6 +332,8 @@ def save_config():
             write('Key', K.key)
             write('Icon', K.icon)
             write('Title', K.title)
+            if hasattr(K, 'desc'):
+                write('Description', K.desc)
             if hasattr(K, 'cls'):
                 write('Class', K.cls)
             write('Command', K.command)
@@ -552,6 +590,8 @@ class GUI(object):
             K = self.S.keys[k]
             btn = self.buttons[k]
             btn.set_label(K.title)
+            if hasattr(K, 'desc'):
+                btn.set_desc(K.desc)
             btn.set_icon(K.icon)
             if hasattr(K,'cls'):
               if K.cls in self.by_class:
ViewGit