[Python-checkins] r52821 - in python/trunk: Lib/idlelib/CodeContext.py Lib/idlelib/EditorWindow.py Misc/NEWS

martin.v.loewis python-checkins at python.org
Wed Nov 22 09:50:04 CET 2006


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.
 


More information about the Python-checkins mailing list