/offlineimap/head: changeset 317
Basic Tk.Blinkenlights structure completed. Need to fine-tune the display. Sleeping API added to Blinkenlights base class.
This commit is contained in:
		| @@ -119,4 +119,16 @@ class BlinkenBase: | ||||
|         finally: | ||||
|             s.tflock.release() | ||||
|              | ||||
|     def sleep(s, sleepsecs): | ||||
|         s.gettf().setcolor('red') | ||||
|         s.getaccountframe().startsleep(sleepsecs) | ||||
|         UIBase.sleep(s, sleepsecs) | ||||
|  | ||||
|     def sleeping(s, sleepsecs, remainingsecs): | ||||
|         if remainingsecs and s.gettf().getcolor() == 'black': | ||||
|             s.gettf().setcolor('red') | ||||
|         else: | ||||
|             s.gettf().setcolor('black') | ||||
|         return s.getaccountframe().sleeping(sleepsecs, remainingsecs) | ||||
|  | ||||
|      | ||||
|   | ||||
| @@ -155,12 +155,12 @@ class VerboseUI(UIBase): | ||||
|             return 0 | ||||
|  | ||||
|     def _createTopWindow(self, doidlevac = 1): | ||||
|         self.threadframes = {} | ||||
|         self.availablethreadframes = [] | ||||
|         self.tflock = Lock() | ||||
|         self.notdeleted = 1 | ||||
|         self.created = threading.Event() | ||||
|  | ||||
|         self.af = {} | ||||
|         self.aflock = Lock() | ||||
|  | ||||
|         t = threadutil.ExitNotifyThread(target = self._runmainloop, | ||||
|                                         name = "Tk Mainloop") | ||||
|         t.setDaemon(1) | ||||
| @@ -181,6 +181,19 @@ class VerboseUI(UIBase): | ||||
|         s.top.after_idle(s.created.set) | ||||
|         s.top.mainloop() | ||||
|         s.notdeleted = 0 | ||||
|  | ||||
|     def getaccountframe(s): | ||||
|         accountname = s.getthreadaccount() | ||||
|         s.aflock.acquire() | ||||
|         try: | ||||
|             if accountname in s.af: | ||||
|                 return s.af[accountname] | ||||
|  | ||||
|             s.af[accountname] = LEDAccountFrame(s.top, accountname, | ||||
|                                                 s.fontfamily, s.fontsize) | ||||
|         finally: | ||||
|             s.aflock.release() | ||||
|         return s.af[accountname] | ||||
|      | ||||
|     def getpass(s, accountname, config, errmsg = None): | ||||
|         pd = PasswordDialog(accountname, config, errmsg = errmsg) | ||||
| @@ -310,7 +323,53 @@ TkUI = VerboseUI | ||||
|  | ||||
| ################################################## Blinkenlights | ||||
|  | ||||
| class LEDAccountFrame: | ||||
|     def __init__(self, top, accountname, fontfamily, fontsize): | ||||
|         self.top = top | ||||
|         self.accountname = accountname | ||||
|         self.fontfamily = fontfamily | ||||
|         self.fontsize = fontsize | ||||
|         self.frame = Frame(self.top) | ||||
|         self.frame.pack(side = BOTTOM, expand = 0, fill = X) | ||||
|         self._createcanvas(self.frame) | ||||
|  | ||||
|         self.label = Label(self.frame, text = accountname) | ||||
|         self.label.pack() | ||||
|  | ||||
|     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() | ||||
|         self.canvas = c | ||||
|         c.pack(side = BOTTOM, 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) | ||||
|         s.button.pack() | ||||
|  | ||||
|     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)) | ||||
|             time.sleep(sleepsecs) | ||||
|         else: | ||||
|             s.button.destroy() | ||||
|             del s.button | ||||
|         return s.sleeping_abort | ||||
|  | ||||
| class LEDCanvas(Canvas): | ||||
|     """This holds the different lights.""" | ||||
|     def createLEDLock(self): | ||||
|         self.ledlock = Lock() | ||||
|     def acquireLEDLock(self): | ||||
| @@ -325,6 +384,7 @@ class LEDCanvas(Canvas): | ||||
|         self.ledcount += 1 | ||||
|  | ||||
| class LEDThreadFrame: | ||||
|     """There is one of these for each little light.""" | ||||
|     def __init__(self, master): | ||||
|         self.canvas = master | ||||
|         self.color = '' | ||||
| @@ -352,23 +412,6 @@ class LEDThreadFrame: | ||||
|         else: | ||||
|             self.setcolor('black') | ||||
|  | ||||
|     def destroythreadextraframe(self): | ||||
|         pass | ||||
|  | ||||
|     def getthreadextraframe(self): | ||||
|         raise NotImplementedError | ||||
|  | ||||
|     def setaccount(self, account): | ||||
|         pass | ||||
|     def setmailbox(self, mailbox): | ||||
|         pass | ||||
|     def updateloclabel(self): | ||||
|         pass | ||||
|     def appendmessage(self, newtext): | ||||
|         pass | ||||
|     def setmessage(self, newtext): | ||||
|         pass | ||||
|           | ||||
|  | ||||
| class Blinkenlights(BlinkenBase, VerboseUI): | ||||
|     def __init__(s, config, verbose = 0): | ||||
| @@ -384,12 +427,7 @@ class Blinkenlights(BlinkenBase, VerboseUI): | ||||
|         VerboseUI._createTopWindow(self, 0) | ||||
|         #self.top.resizable(width = 0, height = 0) | ||||
|         self.top.configure(background = 'black', bd = 0) | ||||
|         c = LEDCanvas(self.top, background = 'black', height = 20, bd = 0, | ||||
|                       highlightthickness = 0) | ||||
|         c.setLEDCount(0) | ||||
|         c.createLEDLock() | ||||
|         self.canvas = c | ||||
|         c.pack(side = BOTTOM, expand = 0, fill = X) | ||||
|  | ||||
|         widthmetric = tkFont.Font(family = self.fontfamily, size = self.fontsize).measure("0") | ||||
|         self.loglines = 5 | ||||
|         if self.config.has_option("ui.Tk.Blinkenlights", "loglines"): | ||||
| @@ -414,10 +452,8 @@ class Blinkenlights(BlinkenBase, VerboseUI): | ||||
|         self.tags = [] | ||||
|         self.textlock = Lock() | ||||
|  | ||||
|     def gettf(s, newtype=LEDThreadFrame): | ||||
|         return VerboseUI.gettf(s, newtype, s.canvas) | ||||
|  | ||||
|     def init_banner(s): | ||||
|         BlinkenBase.init_banner(s) | ||||
|         s._createTopWindow() | ||||
|         menubar = Menu(s.top, activebackground = "black", | ||||
|                        activeforeground = "white", | ||||
| @@ -436,14 +472,6 @@ class Blinkenlights(BlinkenBase, VerboseUI): | ||||
|         if s.config.has_option("ui.Tk.Blinkenlights", "showlog") and \ | ||||
|            s.config.getboolean("ui.Tk.Blinkenlights", "showlog"): | ||||
|             s._togglelog() | ||||
|         #s.tflock.acquire() | ||||
|         #try: | ||||
|         #    for i in range(s.top.winfo_reqwidth() / 10 - 1): | ||||
|         #        newframe = LEDThreadFrame(s.canvas) | ||||
|         #        newframe.setthread(None) | ||||
|         #        s.availablethreadframes.append(newframe) | ||||
|         #finally: | ||||
|         #    s.tflock.release() | ||||
|  | ||||
|     def _togglelog(s): | ||||
|         if s.textenabled: | ||||
| @@ -466,25 +494,14 @@ class Blinkenlights(BlinkenBase, VerboseUI): | ||||
|             s._rescroll() | ||||
|             s.top.resizable(width = 1, height = 1) | ||||
|  | ||||
|  | ||||
|     def threadExited(s, thread): | ||||
|         threadid = thread.threadid | ||||
|         s.tflock.acquire() | ||||
|         try: | ||||
|             if threadid in s.threadframes: | ||||
|                 tf = s.threadframes[threadid] | ||||
|                 del s.threadframes[threadid] | ||||
|                 s.availablethreadframes.append(tf) | ||||
|                 tf.setthread(None) | ||||
|         finally: | ||||
|             s.tflock.release() | ||||
|  | ||||
|     def sleep(s, sleepsecs): | ||||
|         s.sleeping_abort = 0 | ||||
|         s.menubar.add_command(label = "Sync now", command = s._sleep_cancel) | ||||
|         s.gettf().setcolor('red') | ||||
|         s._msg("Next sync in %d:%02d" % (sleepsecs / 60, sleepsecs % 60)) | ||||
|         UIBase.sleep(s, sleepsecs) | ||||
|         BlinkenBase.sleep(s, sleepsecs) | ||||
|  | ||||
|     def sleeping(s, sleepsecs, remainingsecs): | ||||
|         print 503 | ||||
|         return BlinkenBase.sleeping(s, sleepsecs, remainingsecs) | ||||
|  | ||||
|     def _rescroll(s): | ||||
|         s.text.see(END) | ||||
| @@ -496,7 +513,7 @@ class Blinkenlights(BlinkenBase, VerboseUI): | ||||
|             for thisline in msg.split("\n"): | ||||
|                 s._msg(thisline) | ||||
|             return | ||||
|         VerboseUI._msg(s, msg) | ||||
|         #VerboseUI._msg(s, msg) | ||||
|         color = s.gettf().getcolor() | ||||
|         rescroll = 1 | ||||
|         s.textlock.acquire() | ||||
| @@ -520,17 +537,4 @@ class Blinkenlights(BlinkenBase, VerboseUI): | ||||
|             s.text.config(state = DISABLED) | ||||
|             s.textlock.release() | ||||
|  | ||||
|     def sleeping(s, sleepsecs, remainingsecs): | ||||
|         if remainingsecs: | ||||
|             s.menubar.entryconfig('end', label = "Sync now (%d:%02d remain)" % \ | ||||
|                           (remainingsecs / 60, remainingsecs % 60)) | ||||
|             if s.gettf().getcolor() == 'red': | ||||
|                 s.gettf().setcolor('black') | ||||
|             else: | ||||
|                 s.gettf().setcolor('red') | ||||
|             time.sleep(sleepsecs) | ||||
|         else: | ||||
|             s.menubar.delete('end') | ||||
|             s.gettf().setcolor('black') | ||||
|         return s.sleeping_abort | ||||
|      | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 jgoerzen
					jgoerzen