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()