r52821 - in python/trunk: Lib/idlelib/CodeContext.py Lib/idlelib/EditorWindow.py Misc/NEWS
Author: martin.v.loewis Date: Wed Nov 22 09:50:02 2006 New Revision: 52821 Modified: python/trunk/Lib/idlelib/CodeContext.py python/trunk/Lib/idlelib/EditorWindow.py python/trunk/Misc/NEWS Log: 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. Modified: python/trunk/Lib/idlelib/CodeContext.py ============================================================================== --- python/trunk/Lib/idlelib/CodeContext.py (original) +++ python/trunk/Lib/idlelib/CodeContext.py Wed Nov 22 09:50:02 2006 @@ -54,25 +54,68 @@ 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)) Modified: python/trunk/Lib/idlelib/EditorWindow.py ============================================================================== --- python/trunk/Lib/idlelib/EditorWindow.py (original) +++ python/trunk/Lib/idlelib/EditorWindow.py Wed Nov 22 09:50:02 2006 @@ -102,8 +102,8 @@ 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', Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Wed Nov 22 09:50:02 2006 @@ -101,6 +101,9 @@ Library ------- +- Patch #1362975: Rework CodeContext indentation algorithm to + avoid hard-coding pixel widths. + - Patch #1070046: Marshal new-style objects like InstanceType in xmlrpclib.
"martin.v.loewis" <python-checkins@python.org> writes:
Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Wed Nov 22 09:50:02 2006 @@ -101,6 +101,9 @@ Library -------
+- Patch #1362975: Rework CodeContext indentation algorithm to + avoid hard-coding pixel widths. + - Patch #1070046: Marshal new-style objects like InstanceType in xmlrpclib.
IDLE NEWS is being kept in idlelib/NEWS.txt. It displays via the IDLE About dialog. -- KBK
participants (3)
-
"Martin v. Löwis"
-
Kurt B. Kaiser
-
martin.v.loewis