Patch #1362975: Rework CodeContext indentation algorithm to

avoid hard-coding pixel widths. Also make the text's scrollbar
a child of the text frame, not the top widget.
This commit is contained in:
Martin v. Löwis 2006-11-22 08:50:02 +00:00
parent 2607e6c021
commit 4ebbefe677
3 changed files with 64 additions and 18 deletions

View File

@ -54,25 +54,68 @@ class CodeContext:
def toggle_code_context_event(self, event=None):
if not self.label:
self.pad_frame = Tkinter.Frame(self.editwin.top,
bg=self.bgcolor, border=2,
relief="sunken")
self.label = Tkinter.Label(self.pad_frame,
text="\n" * (self.context_depth - 1),
anchor="w", justify="left",
font=self.textfont,
bg=self.bgcolor, fg=self.fgcolor,
border=0,
width=1, # Don't request more than we get
)
self.label.pack(side="top", fill="x", expand=True,
padx=4, pady=0)
self.pad_frame.pack(side="top", fill="x", expand=False,
padx=0, pady=0,
after=self.editwin.status_bar)
# The following code attempts to figure out the required border
# width and vertical padding required for the CodeContext widget
# to be perfectly aligned with the text in the main Text widget.
# This is done by retrieving the appropriate attributes from the
# editwin.text and editwin.text_frame widgets.
#
# All values are passed through int(str(<value>)), since some
# values may be pixel objects, which can't simply be added added
# to ints.
#
# This code is considered somewhat unstable since it relies on
# some of Tk's inner workings. However its effect is merely
# cosmetic; failure will only cause the CodeContext text to be
# somewhat misaligned with the text in the main Text widget.
#
# To avoid possible errors, all references to the inner workings
# of Tk are executed inside try/except blocks.
widgets_for_width_calc = self.editwin.text, self.editwin.text_frame
# calculate the required vertical padding
padx = 0
for widget in widgets_for_width_calc:
try:
# retrieve the "padx" attribte from widget's pack info
padx += int(str( widget.pack_info()['padx'] ))
except:
pass
try:
# retrieve the widget's "padx" attribte
padx += int(str( widget.cget('padx') ))
except:
pass
# calculate the required border width
border_width = 0
for widget in widgets_for_width_calc:
try:
# retrieve the widget's "border" attribte
border_width += int(str( widget.cget('border') ))
except:
pass
self.label = Tkinter.Label(self.editwin.top,
text="\n" * (self.context_depth - 1),
anchor="w", justify="left",
font=self.textfont,
bg=self.bgcolor, fg=self.fgcolor,
width=1, #don't request more than we get
padx=padx, #line up with text widget
border=border_width, #match border width
relief="sunken",
)
# CodeContext's label widget is packed before and above the
# text_frame widget, thus ensuring that it will appear directly
# above it.
self.label.pack(side="top", fill="x", expand=False,
before=self.editwin.text_frame)
else:
self.label.destroy()
self.pad_frame.destroy()
self.label = None
idleConf.SetOption("extensions", "CodeContext", "visible",
str(self.label is not None))

View File

@ -102,8 +102,8 @@ class EditorWindow(object):
self.top.instance_dict = {}
self.recent_files_path = os.path.join(idleConf.GetUserCfgDir(),
'recent-files.lst')
self.vbar = vbar = Scrollbar(top, name='vbar')
self.text_frame = text_frame = Frame(top)
self.vbar = vbar = Scrollbar(text_frame, name='vbar')
self.width = idleConf.GetOption('main','EditorWindow','width')
self.text = text = MultiCallCreator(Text)(
text_frame, name='text', padx=5, wrap='none',

View File

@ -101,6 +101,9 @@ Core and builtins
Library
-------
- Patch #1362975: Rework CodeContext indentation algorithm to
avoid hard-coding pixel widths.
- Patch #1070046: Marshal new-style objects like InstanceType
in xmlrpclib.