]> code.delx.au - offlineimap/blobdiff - offlineimap/head/offlineimap/ui/Tk.py
/offlineimap/head: changeset 367
[offlineimap] / offlineimap / head / offlineimap / ui / Tk.py
index d28773f0bc1011e133eae6a76503d8303d969684..3e8201a8fc018c522cd69fa64b29c185eebbb20e 100644 (file)
@@ -29,6 +29,8 @@ from Queue import Queue
 from UIBase import UIBase
 from offlineimap.ui.Blinkenlights import BlinkenBase
 
+usabletest = None
+
 class PasswordDialog:
     def __init__(self, accountname, config, master=None, errmsg = None):
         self.top = Toplevel(master)
@@ -148,12 +150,17 @@ class ThreadFrame(Frame):
 
 class VerboseUI(UIBase):
     def isusable(s):
+        global usabletest
+        if usabletest != None:
+            return usabletest
+
         try:
             Tk().destroy()
-            return 1
+            usabletest = 1
         except TclError:
-            return 0
-
+            usabletest = 0
+        return usabletest
+    
     def _createTopWindow(self, doidlevac = 1):
         self.notdeleted = 1
         self.created = threading.Event()
@@ -275,6 +282,9 @@ class VerboseUI(UIBase):
 
 
     def init_banner(s):
+        s.threadframes = {}
+        s.availablethreadframes = []
+        s.tflock = Lock()
         s._createTopWindow()
         s._msg(version.productname + " " + version.versionstr + ", " +\
                version.copyright)
@@ -330,42 +340,39 @@ class LEDAccountFrame:
         self.fontfamily = fontfamily
         self.fontsize = fontsize
         self.frame = Frame(self.top, background = 'black')
-        self.frame.pack(side = BOTTOM, expand = 0, fill = X)
+        self.frame.pack(side = BOTTOM, expand = 1, fill = X)
         self._createcanvas(self.frame)
 
         self.label = Label(self.frame, text = accountname,
                            background = "black", foreground = "blue",
                            font = (self.fontfamily, self.fontsize))
-        self.label.pack(side = LEFT)
+        self.label.grid(sticky = E, row = 0, column = 1)
 
     def getnewthreadframe(s):
         return LEDThreadFrame(s.canvas)
 
     def _createcanvas(self, parent):
-        c = LEDCanvas(parent, background = 'black', height = 20, bd = 0,
-                      highlightthickness = 0)
-        c.setLEDCount(0)
-        c.createLEDLock()
+        c = LEDFrame(parent)
         self.canvas = c
-        c.pack(side = BOTTOM, expand = 0, fill = X)
+        c.grid(sticky = E, row = 0, column = 0)
+        parent.grid_columnconfigure(1, weight = 1)
+        #c.pack(side = LEFT, expand = 0, fill = X)
 
     def startsleep(s, sleepsecs):
-        print 351
         s.sleeping_abort = 0
         s.button = Button(s.frame, text = "Sync now", command = s.syncnow,
                           background = "black", activebackground = "black",
                           activeforeground = "white",
-                          foreground = "blue",
-                          font = (s.fontfamily, s.fontsize), bd = 0,
-                          relief = FLAT)
-        s.button.pack(side = LEFT)
+                          foreground = "blue", highlightthickness = 0,
+                          padx = 0, pady = 0,
+                          font = (s.fontfamily, s.fontsize), borderwidth = 0,
+                          relief = 'solid')
+        s.button.grid(sticky = E, row = 0, column = 2)
 
     def syncnow(s):
-        print 357
         s.sleeping_abort = 1
 
     def sleeping(s, sleepsecs, remainingsecs):
-        print 360
         if remainingsecs:
             s.button.config(text = 'Sync now (%d:%02d remain)' % \
                             (remainingsecs / 60, remainingsecs % 60))
@@ -375,34 +382,21 @@ class LEDAccountFrame:
             del s.button
         return s.sleeping_abort
 
-class LEDCanvas(Canvas):
+class LEDFrame(Frame):
     """This holds the different lights."""
-    def createLEDLock(self):
-        self.ledlock = Lock()
-    def acquireLEDLock(self):
-        self.ledlock.acquire()
-    def releaseLEDLock(self):
-        self.ledlock.release()
-    def setLEDCount(self, arg):
-        self.ledcount = arg
-    def getLEDCount(self):
-        return self.ledcount
-    def incLEDCount(self):
-        self.ledcount += 1
+    def getnewobj(self):
+        retval = Canvas(self, background = 'black', height = 20, bd = 0,
+                        highlightthickness = 0, width = 10)
+        retval.pack(side = LEFT, padx = 0, pady = 0, ipadx = 0, ipady = 0)
+        return retval
 
 class LEDThreadFrame:
     """There is one of these for each little light."""
     def __init__(self, master):
-        self.canvas = master
+        self.canvas = master.getnewobj()
         self.color = ''
-        try:
-            self.canvas.acquireLEDLock()
-            startpos = 5 + self.canvas.getLEDCount() * 10
-            self.canvas.incLEDCount()
-        finally:
-            self.canvas.releaseLEDLock()
-        self.ovalid = self.canvas.create_oval(startpos, 5, startpos + 5,
-                                              10, fill = 'gray',
+        self.ovalid = self.canvas.create_oval(4, 4, 9,
+                                              9, fill = 'gray',
                                               outline = '#303030')
 
     def setcolor(self, newcolor):
@@ -430,20 +424,19 @@ class Blinkenlights(BlinkenBase, VerboseUI):
         if config.has_option('ui.Tk.Blinkenlights', 'fontsize'):
             s.fontsize = config.getint('ui.Tk.Blinkenlights', 'fontsize')
 
+    def isusable(s):
+        return VerboseUI.isusable(s)
+
     def _createTopWindow(self):
         VerboseUI._createTopWindow(self, 0)
         #self.top.resizable(width = 0, height = 0)
         self.top.configure(background = 'black', bd = 0)
 
         widthmetric = tkFont.Font(family = self.fontfamily, size = self.fontsize).measure("0")
-        self.loglines = 5
-        if self.config.has_option("ui.Tk.Blinkenlights", "loglines"):
-            self.loglines = self.config.getint("ui.Tk.Blinkenlights",
-                                               "loglines")
-        self.bufferlines = 500
-        if self.config.has_option("ui.Tk.Blinkenlights", "bufferlines"):
-            self.bufferlines = self.config.getint("ui.Tk.Blinkenlights",
-                                                  "bufferlines")
+        self.loglines = self.config.getdefaultint("ui.Tk.Blinkenlights",
+                                                  "loglines", 5)
+        self.bufferlines = self.config.getdefaultint("ui.Tk.Blinkenlights",
+                                                     "bufferlines", 500)
         self.text = ScrolledText(self.top, bg = 'black', #scrollbar = 'y',
                                  font = (self.fontfamily, self.fontsize),
                                  bd = 0, highlightthickness = 0, setgrid = 0,
@@ -472,13 +465,12 @@ class Blinkenlights(BlinkenBase, VerboseUI):
         menubar.add_command(label = "Exit", command = s.terminate)
         s.top.config(menu = menubar)
         s.menubar = menubar
-        s.gettf().setcolor('red')
-        s._msg(version.banner)
         s.text.see(END)
-        s.top.resizable(width = 0, height = 0)
-        if s.config.has_option("ui.Tk.Blinkenlights", "showlog") and \
-           s.config.getboolean("ui.Tk.Blinkenlights", "showlog"):
+        if s.config.getdefaultboolean("ui.Tk.Blinkenlights", "showlog", 1):
             s._togglelog()
+        s.gettf().setcolor('red')
+        s.top.resizable(width = 0, height = 0)
+        s._msg(version.banner)
 
     def _togglelog(s):
         if s.textenabled:
@@ -493,7 +485,7 @@ class Blinkenlights(BlinkenBase, VerboseUI):
             s.top.update()
         
         else: 
-            s.text.pack(side = BOTTOM, expand = 1, fill = BOTH)
+            s.text.pack(side = TOP, expand = 1, fill = BOTH)
             s.textenabled = 1
             s.top.update()
             s.top.geometry("")
@@ -507,7 +499,6 @@ class Blinkenlights(BlinkenBase, VerboseUI):
         BlinkenBase.sleep(s, sleepsecs)
 
     def sleeping(s, sleepsecs, remainingsecs):
-        print 503
         return BlinkenBase.sleeping(s, sleepsecs, remainingsecs)
 
     def _rescroll(s):