diff -r 6c2b4b5c2cf4 Lib/idlelib/CodeContext.py --- a/Lib/idlelib/CodeContext.py Mon Apr 29 01:17:54 2013 +0530 +++ b/Lib/idlelib/CodeContext.py Mon Apr 29 02:10:50 2013 +0530 @@ -50,7 +50,7 @@ self.editwin.setvar('<>', True) # Start two update cycles, one for context lines, one for font changes. self.text.after(UPDATEINTERVAL, self.timer_event) - self.text.after(FONTUPDATEINTERVAL, self.font_timer_event) + self.font_timer_event() def toggle_code_context_event(self, event=None): if not self.label: @@ -173,4 +173,4 @@ if self.label and newtextfont != self.textfont: self.textfont = newtextfont self.label["font"] = self.textfont - self.text.after(FONTUPDATEINTERVAL, self.font_timer_event) + diff -r 6c2b4b5c2cf4 Lib/idlelib/ZoomFont.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/idlelib/ZoomFont.py Mon Apr 29 02:10:50 2013 +0530 @@ -0,0 +1,134 @@ +# Python 2/3 compatibility +import sys +if sys.version < '3': + import Tkinter as tk + import tkFont +else: + import tkinter as tk + import tkinter.font as tkFont + + +# get the IDLE configuration handler +from idlelib.configHandler import idleConf + +from pprint import pprint + +def printit(func): + def f(*args, **kw): + return func(*args, **kw) + return f + + + +jn = lambda x,y: '%i.%i' % (x,y) # join integers to text coordinates +sp = lambda x: list(map(int, x.split('.'))) # convert tkinter Text coordinate to a line and column tuple + +class ZoomFont: # must be the same name as the file for EditorWindow.py + # to load it. + + menudefs = [ + ('options', [ + None, + ('Increase Font Size', '<>'), + ('Default Font Size', '<>'), + ('Decrease Font Size', '<>'), + ]),] + + def __init__(self, editwin): + self.editwin = editwin # reference to the editor window + self.text = text = self.editwin.text + self.text.bind('', self.zoomfont_increase_event) + self.text.bind('', self.zoomfont_decrease_event) + self.text.bind('', self.control_release, '+') + self.text.bind('', self.zoomfont_default_event) + self._ratio = 0 + self._zero_pause = False + self._pause_id = None + + def set_font(self, fontSize=0): + if fontSize: + idleConf.userCfg['main'].SetOption('EditorWindow','font-size', + str(fontSize)) + else: + #set to default + idleConf.userCfg['main'].RemoveOption('EditorWindow','font-size') + + winInstances = self.editwin.top.instance_dict.keys() + for instance in winInstances: + instance.ResetFont() + # This is a hack to work with LineNumbers and CodeContext + C = instance.extensions.get('CodeContext', None) + if C: + C.font_timer_event() + L = self.editwin.extensions.get('LineNumbers', None) + if L: + L.adjust_font() + return + + def store_cursor(self, event): + x, y = event.x, event.y + text = self.text + line, col = sp(text.index('@%d,%d' % (x,y))) + top, bot = self.editwin.getwindowlines() + self._store = (line, top, bot) + + def restore_cursor(self): + line, top, bot = self._store + new_top, new_bot = self.editwin.getwindowlines() + new_h = max([new_bot - new_top - 1, 1]) + + h = max([bot - top, 1]) + + ratio = (line - top) / (1.0 * h) + top2 = int(line - new_h * ratio) + top2 = max([top2, 0]) + + self.text.yview(jn(top2, 0)) + + def cursor(func): + # Decorator function for handling yview + def f(self, event): + if self._zero_pause: + self.pause_at_default() + return "break" + self.store_cursor(event) + ret = func(self, event) + self.restore_cursor() + return ret + return f + + @cursor + def zoomfont_increase_event(self, event=None): + fontSize=int(idleConf.GetOption('main', 'EditorWindow', 'font-size', + type='int', default='10')) + if fontSize<22: + self.set_font(fontSize+1) + return "break" + + @cursor + def zoomfont_decrease_event(self, event=None): + fontSize=int(idleConf.GetOption('main', 'EditorWindow', 'font-size', + type='int', default='10')) + if fontSize>7: + self.set_font(fontSize-1) + return "break" + + @cursor + def zoomfont_default_event(self, event=None): + if idleConf.defaultCfg['main'].has_option('EditorWindow','font-size'): + self.set_font(0) + return "break" + + def control_release(self, event=None): + self._zero_pause = False + + def pause_at_default(self, event=None): + self._zero_pause = True + if self._pause_id: + self.text.after_cancel(self._pause_id) + + def unpause(): + self._zero_pause = False + + self._pause_id = self.text.after(250, unpause) + diff -r 6c2b4b5c2cf4 Lib/idlelib/config-extensions.def --- a/Lib/idlelib/config-extensions.def Mon Apr 29 01:17:54 2013 +0530 +++ b/Lib/idlelib/config-extensions.def Mon Apr 29 02:10:50 2013 +0530 @@ -94,3 +94,13 @@ enable_shell=0 enable_editor=1 +[ZoomFont] +enable=1 +enable_editor=1 +enable_shell=1 + +[ZoomFont_cfgBindings] +zoomfont-default= +zoomfont-increase= +zoomfont-decrease= + diff -r 6c2b4b5c2cf4 Lib/idlelib/configDialog.py --- a/Lib/idlelib/configDialog.py Mon Apr 29 01:17:54 2013 +0530 +++ b/Lib/idlelib/configDialog.py Mon Apr 29 02:10:50 2013 +0530 @@ -1122,6 +1122,12 @@ instance.set_notabs_indentwidth() instance.ApplyKeybindings() instance.reset_help_menu_entries() + C = instance.extensions.get('CodeContext', None) + if C: + C.font_timer_event() + L = instance.extensions.get('LineNumbers', None) + if L: + L.adjust_font() def Cancel(self): self.destroy()