]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/docs/MigrationGuide.html
added missing LFs to the header
[wxWidgets.git] / wxPython / docs / MigrationGuide.html
index 5d8c2f41582398bfa112b563b825b08085e08ef7..585fcda395aa0806cd8bf2fb140d4ebcc828d965 100644 (file)
@@ -358,7 +358,7 @@ class MyDialog(wx.Dialog):
 <div class="section" id="sizers">
 <h1><a name="sizers">Sizers</a></h1>
 <p>The hack allowing the old &quot;option&quot; keyword parameter has been removed.
-If you use keyword args with w.xSizer Add, Insert, or Prepend methods
+If you use keyword args with wx.Sizer Add, Insert, or Prepend methods
 then you will need to use the <tt class="literal"><span class="pre">proportion</span></tt> name instead of
 <tt class="literal"><span class="pre">option</span></tt>.  (The <tt class="literal"><span class="pre">proportion</span></tt> keyword was also allowed in 2.4.2.4.)</p>
 <p>When adding a spacer to a sizer you now need to use a wx.Size or a
@@ -376,32 +376,99 @@ be used from XRC.</p>
 <p>You should not use AddWindow, AddSizer, AddSpacer (and similar for
 Insert, Prepend, and etc.) methods any longer.  Just use Add and the
 wrappers will figure out what to do.  <strong>[Changed in 2.5.2.x]</strong>
-AddWindow, AddSize, AddSpacer and etc. will now issue a
+AddWindow, AddSizer, AddSpacer and etc. will now issue a
 DeprecationWarning.</p>
-<p><strong>[Changed in 2.5.2.x]</strong> wx.ADJUST_MINSIZE is now the default
-behaviour for window items in sizers.  This means that the item's
-GetMinSize and/or GetBestSize will be called when calculating layout
-and the return value from that will be used for the minimum size used
-by the sizer.  The wx.FIXED_MINSIZE flag was added that will cause the
-sizer to use the old behaviour in that it will <em>not</em> call the window's
-methods to determine the new best size, instead the minsize that the
-window had when added to the sizer (or the size the window was created
-with) will always be used.</p>
-<p>Related to the above, when controls and some other window types are
-created either the size passed to the constructor, or their &quot;best
-size&quot; if an explicit size was not passed in, is set as the window's
-minimal size.  For non top-level windows that hasn't meant much in the
-past, but now the sizers are sensitive to the window's minimal size.
-The key point to understand here is that it is no longer the window's
-size it has when added to the sizer that matters, but its minimal
-size.  So you might have some issues to iron out if you create a
-control without a size and then set its size to something before
-adding it to the sizer.  Since it's minimal size is probably not the
-size you set then the sizer will appear to be misbehaving.  The fix is
-to either set the size when calling the window's constructor, or to
-reset the min size by calling SetSizeHints.  You can call SetSizeHints
-at anytime to change the minsize of a window, just call the sizer's
-Layout method to redistribute the controls as needed.</p>
+<p><strong>[Changed in 2.5.2.x]</strong> The Sizers have had some fundamental internal
+changes in the 2.5.2.x release intended to make them do more of the
+&quot;Right Thing&quot; but also be as backwards compatible as possible.
+First a bit about how things used to work:</p>
+<blockquote>
+<ul class="simple">
+<li>The size that a window had when Add()ed to the sizer was assumed
+to be its minimal size, and that size would always be used by
+default when calculating layout size and positions, and the
+sizer itself would keep track of that minimal size.</li>
+<li>If the window item was added with the <tt class="literal"><span class="pre">wx.ADJUST_MINSIZE</span></tt>
+flag then when layout was calculated the item's <tt class="literal"><span class="pre">GetBestSize</span></tt>
+would be used to reset the minimal size that the sizer used.</li>
+</ul>
+</blockquote>
+<p>The main thrust of the new Sizer changes was to make behavior like
+<tt class="literal"><span class="pre">wx.ADJUST_MINSIZE</span></tt> be the default, and also to push the tracking of
+the minimal size to the window itself (since it knows its own needs)
+instead of having the sizer take care of it.  Consequently these
+changes were made:</p>
+<blockquote>
+<ul class="simple">
+<li>The <tt class="literal"><span class="pre">wx.FIXED_MINSIZE</span></tt> flag was added to allow for the old
+behavior.  When this flag is used the size a window has when
+added to the sizer will be treated as its minimal size and it
+will not be readjusted on each layout.</li>
+<li>The min size stored in <tt class="literal"><span class="pre">wx.Window</span></tt> and settable with
+<tt class="literal"><span class="pre">SetSizeHints</span></tt> or <tt class="literal"><span class="pre">SetMinSize</span></tt> will by default be used by
+the sizer (if it was set) as the minimal size of the sizer item.
+If the min size was not set (or was only partially set) then the
+window's best size is fetched and it is used instead of (or
+blended with) the min size.  <tt class="literal"><span class="pre">wx.Window.GetBestFittingSize</span></tt>
+was added to facilitate getting the size to be used by the
+sizers.</li>
+<li>The best size of a window is cached so it doesn't need to
+recaculated on every layout.  <tt class="literal"><span class="pre">wx.Window.InvalidateBestSize</span></tt>
+was added and should be called (usually just internally in
+control methods) whenever something is done that would make the
+best size change.</li>
+<li>All wxControls were changed to set the minsize to what is passed
+to the constructor or Create method, and also to set the real
+size of the control to the blending of the min size and best
+size.  <tt class="literal"><span class="pre">wx.Window.SetBestFittingSize</span></tt> was added to help with
+this, although most controls don't need to call it directly
+because it is called indirectly via the <tt class="literal"><span class="pre">SetInitialSize</span></tt>
+called in the base classes.</li>
+</ul>
+</blockquote>
+<p>At this time, the only situation known not to work the same as before
+is the following:</p>
+<pre class="literal-block">
+win = SomeWidget(parent)
+win.SetSize(SomeNonDefaultSize)
+sizer.Add(win)
+</pre>
+<p>In this case the old code would have used the new size as the minimum,
+but now the sizer will use the default size as the minimum rather than
+the size set later.  It is an easy fix though, just move the
+specification of the size to the constructor (assuming that SomeWidget
+will set its minsize there like the rest of the controls do) or call
+<tt class="literal"><span class="pre">SetMinSize</span></tt> instead of <tt class="literal"><span class="pre">SetSize</span></tt>.</p>
+<p>In order to fit well with this new scheme of things, all wxControls or
+custom controls should do the following things.  (Depending on how
+they are used you may also want to do the same thing for non-control
+custom windows.)</p>
+<blockquote>
+<ul>
+<li><p class="first">Either override or inherit a meaningful <tt class="literal"><span class="pre">DoGetBestSize</span></tt> method
+that calculates whatever size is &quot;best&quot; for the control.  Once
+that size is calculated then there should normally be a call to
+<tt class="literal"><span class="pre">CacheBestSize</span></tt> to save it for later use, unless for some
+reason you want the best size to be recalculated on every
+layout.</p>
+<p>Note: In order to successfully override <tt class="literal"><span class="pre">DoGetBestSize</span></tt> in
+Python the class needs to be derived from <tt class="literal"><span class="pre">wx.PyWindow</span></tt>,
+<tt class="literal"><span class="pre">wx.PyControl</span></tt>, or etc.  If your class instead derives from
+one of the standard wx classes then just be sure that the min
+size gets explicitly set to what would have been the best size
+and things should work properly in almost all situations.</p>
+</li>
+<li><p class="first">Any method that changes the attributes of the control such that
+the best size will change should call <tt class="literal"><span class="pre">InvalidateBestSize</span></tt> so
+it will be recalculated the next time it is needed.</p>
+</li>
+<li><p class="first">The control's constructor and/or Create method should ensure
+that the minsize is set to the size passed in, and that the
+control is sized to a blending of the min size and best size.
+This can be done by calling <tt class="literal"><span class="pre">SetBestFittingSize</span></tt>.</p>
+</li>
+</ul>
+</blockquote>
 </div>
 <div class="section" id="platforminfo">
 <h1><a name="platforminfo">PlatformInfo</a></h1>
@@ -536,9 +603,7 @@ mask and the rest would be made fully opaque.</p>
 channel and will now only create a mask when all the pixels in the
 image are either fully transparent or fully opaque.  In addition, the
 wx.DC.DrawBitmap and wx.DC.Blit methods are able to correctly blend
-the pixels in the image with partially transparent alpha values.
-(Currently only on MSW and Mac, if anybody knows how to do it for GTK
-then please submit a patch!)</p>
+the pixels in the image with partially transparent alpha values.</p>
 <p>If you are using a PNG with an alpha channel but you need to have a
 wx.Mask like you automatically got in 2.4 then you can do one of the
 following:</p>
@@ -561,10 +626,11 @@ making it more easily maintainable and less prone to getting rusty as
 there seems to be less and less interest in maintaining the C++
 version.</p>
 <p>There are only a few known compatibility issues at this time.  First
-is the location of OGL.  The deprecated version is located in the
-wx.ogl module, and the new version is in the wx.lib.ogl package.  So
-this just means that to start using the new version you need to adjust
-your imports.  So if your code currently has something like this:</p>
+is that the ogl.DrawnShape has not been reimplemented yet.  Next is the
+location of OGL.  The deprecated version is located in the wx.ogl
+module, and the new version is in the wx.lib.ogl package.  So this
+just means that to start using the new version you need to adjust your
+imports.  So if your code currently has something like this:</p>
 <pre class="literal-block">
 import wx
 import wx.ogl as ogl
@@ -606,7 +672,7 @@ later into the main namespace via Python code.</p>
 the &quot;internal&quot; module names have changed, but you shouldn't have been
 using them anyway so it shouldn't bother you. ;-) In case you were
 erroneously using them in 2.4, here are the internal extension modules
-no longer exist:</p>
+that no longer exist:</p>
 <blockquote>
 <ul class="simple">
 <li>clip_dnd</li>
@@ -647,8 +713,93 @@ the objects in these modules only via the wx or wxPython.wx packages:</p>
 <p>The help module no longer exists and the classes therein are now part
 of the core module imported with wxPython.wx or the wx package.</p>
 </div>
-<div class="section" id="other-stuff">
-<h1><a name="other-stuff">Other Stuff</a></h1>
+<div class="section" id="wx-taskbaricon">
+<h1><a name="wx-taskbaricon">wx.TaskBarIcon</a></h1>
+<p><strong>[Changed in 2.5.3.x]</strong></p>
+<p>wx.TaskbarIcon now works on all three platforms, although for wxGTK it
+depends on support from the Window Manager.  On OS X the icon replaces
+the application's icon on the dock and when you right click on it the
+app's default popup menu is merged with the wx.TaskBarIcon's menu.
+Because of how it is implemented on the Mac using the Dock most of the
+TaskBarIcon events will _not_ be emitted on that platform, but since
+98% of the time you simply want to display an icon and have a popup
+menu it shouldn't be much of a problem.  You can still use the other
+events on the other platforms, you'll just want to be sure that you
+can do everything you want via the menu too.</p>
+<p>Since popping up a menu is the most common thing to do with a
+TaskBarIcon the class has some new built in functionality to
+facilitate that.  To use the TaskBarIcon in this new way, simply
+derive a new class from TaskBarIcon and implement a CreatePopupMenu
+method that creates and returns the menu.  That's all there is to it,
+besides binding event handlers for the menu items of course.  Take a
+look at the DemoTaskBarIcon class in the demo/Main.py module for an
+example.</p>
+<p><strong>NOTE</strong>:  Unfortunately due to being able to support virtualizing
+CreatePopupMenu the C++ TaskBarIcon instance now holds a reference to
+the Python instance, and so you will need to explicitly Destroy() your
+TaskBarIcon instance when you are done with it.  (Like you do with
+wx.Dialogs.)  If you don't destroy it then wxWidgets will assume that
+you want the app to keep running with just the icon in the task bar
+and the MainLoop will not exit.</p>
+</div>
+<div class="section" id="version-number-change">
+<h1><a name="version-number-change">Version Number Change</a></h1>
+<p><strong>[Changed in 2.5.3.x]</strong></p>
+<p>Starting with 2.5.3.0 the Unicode versions of wxPython will no longer
+have a 'u' appended to the fourth component of the version number.
+Please check for the presence of &quot;unicode&quot; in the <cite>wx.PlatformInfo</cite>
+tuple instead.  (This tuple of strings has been available since the
+first 2.5 version.) For example:</p>
+<pre class="literal-block">
+if &quot;unicode&quot; in wx.PlatformInfo:
+    # do whatever
+    ...
+</pre>
+</div>
+<div class="section" id="multi-version-installs">
+<h1><a name="multi-version-installs">Multi-Version Installs</a></h1>
+<p><strong>[Changed in 2.5.3.x]</strong></p>
+<p>Starting with 2.5.3.0 the wx and wxPython package directories will be
+installed in a subdirectory of the site-packages directory, instead of
+directly in site-packages.  This is done to help facilitate having
+multiple versions of wxPython installed side-by-side.  Why would you
+want to do this?  One possible scenario is you have an app that
+requires wxPython 2.4 but you want to use the newest 2.5 to do your
+own development with.  Or perhaps you want to be able to test your app
+with several different versions of wxPython to ensure compatibility.
+Before everyone panics, rest asured that if you only install one
+version of wxPython then you should notice no difference in how things
+work.</p>
+<p>In addition to installing wxPython into a &quot;versioned&quot; subdirectory of
+site-packages, a file named <cite>wx.pth</cite> is optionally installed that will
+contain the name of the versioned subdirectory.  This will cause that
+subdirectory to be automatically added to the sys.path and so doing an
+&quot;import wx&quot; will find the package in the subdirectory like it would
+have if it was still located directly in site-packages.  I say
+&quot;optionally&quot; above because that is how you can control which install
+of wxPython is the default one.  Which ever version installs the
+wx.pth file will be the one that is imported with a plain &quot;import wx&quot;
+statement.  Of course you can always manipulate that by editing the
+wx.pth file, or by setting PYTHONPATH in the environment, or by the
+method described in the next paragraph.</p>
+<p>Finally, a new module named wxversion.py is installed to the
+site-packages directory.  It can be used to manipulate the sys.path at
+runtime so your applications can select which version of wxPython they
+would like to to have imported.  You use it like this:</p>
+<pre class="literal-block">
+import wxversion
+wxversion.select(&quot;2.4&quot;)
+import wx
+</pre>
+<p>Then even though a 2.5 version of wxPython may be the default the
+application that does the above the first time that wx is imported
+will actually get a 2.4 version.  <strong>NOTE:</strong> There isn't actually a 2.4
+version of wxPython that supports this, but there will be.</p>
+<p>Please see this wiki page for more details, HowTo's and FAQ's:
+<a class="reference" href="http://wiki.wxpython.org/index.cgi/MultiVersionInstalls">http://wiki.wxpython.org/index.cgi/MultiVersionInstalls</a></p>
+</div>
+<div class="section" id="miscellaneous-stuff">
+<h1><a name="miscellaneous-stuff">Miscellaneous Stuff</a></h1>
 <p>wxPyDefaultPosition and wxPyDefaultSize are gone.  Use the
 wxDefaultPosition and wxDefaultSize objects instead.</p>
 <p>Similarly, the wxSystemSettings backwards compatibiility aliases for
@@ -674,15 +825,6 @@ wxPyTypeCast at all.</p>
 there are compatibility aliases for much of the above items.</p>
 <p>The wxWave class has been renamed to wxSound, and now has a slightly
 different API.</p>
-<p>wx.TaskbarIcon works on wxGTK-based platforms (for some window
-managers,) however you have to manage it a little bit more than you
-did before.  Basically, the app will treat it like a top-level frame
-in that if the wx.TaskBarIcon still exists when all the frames are
-closed then the app will still not exit.  You need to ensure that the
-wx.TaskBarIcon is destroyed when your last Frame is closed.  For
-wxPython apps it is usually enough if your main frame object holds the
-only reference to the wx.TaskBarIcon, then when the frame is closed
-Python reference counting takes care of the rest.</p>
 <p>Before Python 2.3 it was possible to pass a floating point object as a
 parameter to a function that expected an integer, and the
 PyArg_ParseTuple family of functions would automatically convert to
@@ -710,6 +852,22 @@ for changes in capabilities, usage, etc.</p>
 and will raise a DeprecationWarning if used.  The main wx.Mask
 constructor has been modified to be compatible with wx.MaskColour so
 you should use it instead.</p>
+<p><strong>[Changed in 2.5.2.x]</strong> In wx.TextCtrls that have the
+wx.TE_PROCESS_TAB style the TAB key will be treated like an ordinary
+character and will not cause any tab traversal navigation at all.  If
+you use this style but would still like to have the normal tab
+traversal take place then you should send your own
+wx.NavigationKeyEvent from the wx.EVT_KEY_DOWN handler.  There is a
+new Navigate method in the wx.Window class to help send the event and
+it is used something like this:</p>
+<pre class="literal-block">
+flags = wx.NavigationKeyEvent.IsForward
+if event.ShiftDown():
+    flags = wx.NavigationKeyEvent.IsBackward
+if event.ControlDown():
+    flags |= wx.NavigationKeyEvent.WinChange
+self.Navigate(flags)
+</pre>
 </div>
 </div>
 </body>