diff --git a/wxPython/CHANGES.txt b/wxPython/CHANGES.txt index 041bc8a3b0..391bf0986a 100644 --- a/wxPython/CHANGES.txt +++ b/wxPython/CHANGES.txt @@ -41,6 +41,11 @@ Added __nonzero__ method to wxTreeItemId, wxBitmap, wxImage, wxFont, and most other classes that have an Ok or IsOK method. This allows code like "if obj: ..." to be the same as "if obj.IsOk(): ..." +Toolbars on wxMac can now have controls on them. + +Added wxPython.lib.analogclock module based on samples that were +passed back and forth on wxPython-users a while back. + diff --git a/wxPython/MANIFEST.in b/wxPython/MANIFEST.in index 0dbd7d830c..d515a5580b 100644 --- a/wxPython/MANIFEST.in +++ b/wxPython/MANIFEST.in @@ -1,3 +1,5 @@ +# This is way out of date. (It's not activly used anymore...) + include *.txt include my_distutils.py ## include my_install_data.py diff --git a/wxPython/demo/AnalogClockWindow.py b/wxPython/demo/AnalogClockWindow.py new file mode 100644 index 0000000000..7d85145a33 --- /dev/null +++ b/wxPython/demo/AnalogClockWindow.py @@ -0,0 +1,79 @@ + + + +from wxPython.wx import * +from wxPython.lib.analogclock import AnalogClockWindow + +#---------------------------------------------------------------------- + +class TestPanel(wxPanel): + def __init__(self, parent, log): + self.log = log + wxPanel.__init__(self, parent, -1) + + c1 = AnalogClockWindow(self) + c1.SetBackgroundColour("RED") + c1.SetHandsColour("BLUE") + c1.SetTickMarkColours("WHITE") + + c2 = AnalogClockWindow(self) + c2.SetBackgroundColour("WHITE") + c2.SetHandsColour("RED") + c2.SetTickMarkColours("BLUE") + + c3 = AnalogClockWindow(self) + c3.SetBackgroundColour("BLUE") + c3.SetHandsColour("WHITE") + c3.SetTickMarkColours("RED") + + c4 = AnalogClockWindow(self, style=wxRAISED_BORDER) + c4.SetTickMarkStyle(AnalogClockWindow.TICKS_CIRCLE) + + c5 = AnalogClockWindow(self) + c5.SetTickMarkStyle(AnalogClockWindow.TICKS_NONE) + + c6 = AnalogClockWindow(self, style=wxSUNKEN_BORDER) + + + # layout the clocks in a grid + gs = wxGridSizer(2, 3, 4, 4) + gs.Add(c1, 0, wxEXPAND) + gs.Add(c2, 0, wxEXPAND) + gs.Add(c3, 0, wxEXPAND) + gs.Add(c4, 0, wxEXPAND) + gs.Add(c5, 0, wxEXPAND) + gs.Add(c6, 0, wxEXPAND) + + # put it in another sizer for a border + sizer = wxBoxSizer(wxVERTICAL) + sizer.Add(gs, 1, wxEXPAND|wxALL, 10) + + self.SetSizer(sizer) + + +#---------------------------------------------------------------------- + +def runTest(frame, nb, log): + win = TestPanel(nb, log) + return win + +#---------------------------------------------------------------------- + + + +overview = """ +

AnalogClockWindow

+ +This is a nice little clock class that was contributed to by several +members of the wxPython-users group. + + +""" + + + +if __name__ == '__main__': + import sys,os + import run + run.main(['', os.path.basename(sys.argv[0])]) + diff --git a/wxPython/demo/Main.py b/wxPython/demo/Main.py index ed2273726b..2c3d1e20eb 100644 --- a/wxPython/demo/Main.py +++ b/wxPython/demo/Main.py @@ -26,11 +26,11 @@ import images _treeList = [ # new stuff ('Recent Additions', [ - 'wxIntCtrl', - 'wxPyColourChooser', 'wxScrolledPanel', 'ShapedWindow', + 'NewNamespace', 'PopupMenu', + 'AnalogClockWindow', ]), # managed windows == things with a (optional) caption you can close @@ -104,7 +104,8 @@ _treeList = [ ('More Windows/Controls', [ #'wxFloatBar', deprecated #'wxMVCTree', deprecated - #'wxRightTextCtrl', deprecated as we have wxTE_RIGHT now. + #'wxRightTextCtrl', deprecated as we have wxTE_RIGHT now. + 'AnalogClockWindow', 'ColourSelect', 'ContextHelp', 'FancyText', @@ -326,7 +327,8 @@ class wxPythonDemo(wxFrame): aTable = wxAcceleratorTable([(wxACCEL_ALT, ord('X'), exitID), (wxACCEL_CTRL, ord('H'), helpID), (wxACCEL_CTRL, ord('F'), findID), - (wxACCEL_NORMAL, WXK_F3, findnextID)]) + (wxACCEL_NORMAL, WXK_F3, findnextID) + ]) self.SetAcceleratorTable(aTable) @@ -366,7 +368,7 @@ class wxPythonDemo(wxFrame): self.ovr = wxHtmlWindow(self.nb, -1, size=(400, 400)) self.nb.AddPage(self.ovr, self.overviewText) - else: # hopefully I can remove this hacky code soon, see bug #216861 + else: # hopefully I can remove this hacky code soon, see SF bug #216861 panel = wxPanel(self.nb, -1, style=wxCLIP_CHILDREN) self.ovr = wxHtmlWindow(panel, -1, size=(400, 400)) self.nb.AddPage(panel, self.overviewText) diff --git a/wxPython/demo/NewNamespace.py b/wxPython/demo/NewNamespace.py new file mode 100644 index 0000000000..5533bd03c0 --- /dev/null +++ b/wxPython/demo/NewNamespace.py @@ -0,0 +1,47 @@ + +import os +import wx +from wx import html + +#---------------------------------------------------------------------- + +class TestPanel(wx.Panel): + def __init__(self, parent, log): + self.log = log + wx.Panel.__init__(self, parent, -1) + + hwin = html.HtmlWindow(self, -1) + hwin.LoadFile(os.path.join(os.path.dirname(wx.__file__), 'wx.html')) + + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(hwin, 1, wx.EXPAND) + + self.SetSizer(sizer) + + +#---------------------------------------------------------------------- + +def runTest(frame, nb, log): + win = TestPanel(nb, log) + return win + +#---------------------------------------------------------------------- + + + +overview = """ +

Using the New Namespace

+ +This sample isn't really a demo, but rather a place to display the +introductory doc for using the new namespace. + + +""" + + + +if __name__ == '__main__': + import sys,os + import run + run.main(['', os.path.basename(sys.argv[0])]) + diff --git a/wxPython/demo/wxListCtrl.py b/wxPython/demo/wxListCtrl.py index 9a652d882b..501b148a3c 100644 --- a/wxPython/demo/wxListCtrl.py +++ b/wxPython/demo/wxListCtrl.py @@ -281,37 +281,22 @@ class TestListCtrlPanel(wxPanel, wxColumnSorterMixin): self.popupID4 = wxNewId() self.popupID5 = wxNewId() self.popupID6 = wxNewId() - self.popupID7 = wxNewId() - self.popupID8 = wxNewId() - self.popupID9 = wxNewId() EVT_MENU(self, self.popupID1, self.OnPopupOne) EVT_MENU(self, self.popupID2, self.OnPopupTwo) EVT_MENU(self, self.popupID3, self.OnPopupThree) EVT_MENU(self, self.popupID4, self.OnPopupFour) EVT_MENU(self, self.popupID5, self.OnPopupFive) EVT_MENU(self, self.popupID6, self.OnPopupSix) - EVT_MENU(self, self.popupID7, self.OnPopupSeven) - EVT_MENU(self, self.popupID8, self.OnPopupEIght) - EVT_MENU(self, self.popupID9, self.OnPopupNine) # make a menu menu = wxMenu() - # Show how to put an icon in the menu - item = wxMenuItem(menu, self.popupID1,"One") - item.SetBitmap(images.getSmilesBitmap()) - menu.AppendItem(item) - # add some other items - menu.Append(self.popupID2, "Two") + # add some items + menu.Append(self.popupID1, "FindItem tests") +# menu.Append(self.popupID2, "Two") menu.Append(self.popupID3, "ClearAll and repopulate") menu.Append(self.popupID4, "DeleteAllItems") menu.Append(self.popupID5, "GetItem") menu.Append(self.popupID6, "Edit") - # make a submenu - sm = wxMenu() - sm.Append(self.popupID8, "sub item 1") - sm.Append(self.popupID9, "sub item 1") - menu.AppendMenu(self.popupID7, "Test Submenu", sm) - # Popup the menu. If an item is selected then its handler # will be called before PopupMenu returns. @@ -331,8 +316,6 @@ class TestListCtrlPanel(wxPanel, wxColumnSorterMixin): self.log.WriteText("Popup three\n") self.list.ClearAll() wxCallAfter(self.PopulateList) - #wxYield() - #self.PopulateList() def OnPopupFour(self, event): self.list.DeleteAllItems() @@ -345,15 +328,6 @@ class TestListCtrlPanel(wxPanel, wxColumnSorterMixin): self.list.EditLabel(self.currentItem) - def OnPopupSeven(self, event): - self.log.WriteText("Popup seven\n") - - def OnPopupEIght(self, event): - self.log.WriteText("Popup eight\n") - - def OnPopupNine(self, event): - self.log.WriteText("Popup nine\n") - def OnSize(self, event): w,h = self.GetClientSizeTuple() self.list.SetDimensions(0, 0, w, h) diff --git a/wxPython/demo/wxSplitterWindow.py b/wxPython/demo/wxSplitterWindow.py index 206244f6c0..33359b3ba1 100644 --- a/wxPython/demo/wxSplitterWindow.py +++ b/wxPython/demo/wxSplitterWindow.py @@ -37,11 +37,6 @@ def runTest(frame, nb, log): splitter.SetMinimumPaneSize(20) splitter.SplitVertically(p1, p2, 100) -## splitter.SetSize((300,300)) -## print splitter.GetSashPosition() -## splitter.SetSashPosition(100) -## print splitter.GetSashPosition() - return splitter @@ -50,41 +45,16 @@ def runTest(frame, nb, log): - - - - - - - - - - - overview = """\ -This class manages up to two subwindows. The current view can be split into two programmatically (perhaps from a menu command), and unsplit either programmatically or via the wxSplitterWindow user interface. - -wxSplitterWindow() ------------------------------------ - -Default constructor. - -wxSplitterWindow(wxWindow* parent, wxWindowID id, int x, const wxPoint& point = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style=wxSP_3D, const wxString& name = "splitterWindow") - -Constructor for creating the window. - -Parameters -------------------- - -parent = The parent of the splitter window. - -id = The window identifier. - -pos = The window position. - -size = The window size. - -style = The window style. See wxSplitterWindow. - -name = The window name. +This class manages up to two subwindows. The current view can be split +into two programmatically (perhaps from a menu command), and unsplit +either programmatically or via the wxSplitterWindow user interface. """ + + + +if __name__ == '__main__': + import sys,os + import run + run.main(['', os.path.basename(sys.argv[0])]) + diff --git a/wxPython/wx/lib/analogclock.py b/wxPython/wx/lib/analogclock.py new file mode 100644 index 0000000000..645522be39 --- /dev/null +++ b/wxPython/wx/lib/analogclock.py @@ -0,0 +1,15 @@ +"""Provides a way to drop the wx prefix from wxPython objects.""" + +__author__ = "Patrick K. O'Brien " +__cvsid__ = "$Id$" +__revision__ = "$Revision$"[11:-2] + +import wx +from wx import prefix + +from wxPython.lib import analogclock +prefix.rename(d_new=globals(), d_old=analogclock.__dict__) +del analogclock + +del prefix +del wx diff --git a/wxPython/wxPython/lib/analogclock.py b/wxPython/wxPython/lib/analogclock.py new file mode 100644 index 0000000000..dd83981d5f --- /dev/null +++ b/wxPython/wxPython/lib/analogclock.py @@ -0,0 +1,201 @@ +#---------------------------------------------------------------------- +# Name: wxPython.lib.analogclock +# Purpose: A simple analog clock window +# +# Author: several folks on wxPython-users +# +# Created: 16-April-2003 +# RCS-ID: $Id$ +# Copyright: (c) 2003 by Total Control Software +# Licence: wxWindows license +#---------------------------------------------------------------------- + +import math, sys, string, time +from wxPython.wx import * + + + +class AnalogClockWindow(wxWindow): + """A simple analog clock window""" + + TICKS_NONE = 0 + TICKS_SQUARE = 1 + TICKS_CIRCLE = 2 + + def __init__(self, parent, ID=-1, pos=wxDefaultPosition, size=wxDefaultSize, + style=0, name="clock"): + # Initialize the wxWindow... + wxWindow.__init__(self, parent, ID, pos, size, style, name) + + # Initialize the default clock settings... + self.minuteMarks = 60 + self.hourMarks = 12 + self.tickMarksBrushC = self.GetForegroundColour() + self.tickMarksPenC = self.GetForegroundColour() + self.tickMarkStyle = self.TICKS_SQUARE + + # Make an initial bitmap for the face, it will be updated and + # painted at the first EVT_SIZE event. + W, H = size + self.faceBitmap = wxEmptyBitmap(max(W,1), max(H,1)) + + # Initialize the timer that drives the update of the clock + # face. Update every half second to ensure that there is at + # least one true update during each realtime second. + self.timer = wxTimer(self) + self.timer.Start(500) + + # Set event handlers... + EVT_PAINT(self, self.OnPaint) + EVT_ERASE_BACKGROUND(self, lambda x: None) + EVT_SIZE(self, self.OnSize) + EVT_TIMER(self, -1, self.OnTimerExpire) + EVT_WINDOW_DESTROY(self, self.OnQuit) + + + def SetTickMarkStyle(self, style): + """ + Set the style of the marks around the edge of the clock. + Options are TICKS_NONE, TICKS_SQUARE, and TICKS_CIRCLE + """ + self.tickMarkStyle = style + + + def SetTickMarkColours(self, brushC, penC="BLACK"): + """ + Set the brush colour and optionally the pen colour of + the marks around the edge of the clock. + """ + self.tickMarksBrushC = brushC + self.tickMarksPenC = penC + + SetTickMarkColour = SetTickMarkColours + + + def SetHandsColour(self, c): + """An alias for SetForegroundColour""" + self.SetForegroundColour(c) # the hands just use the foreground colour + + + + # Using the current settings, render the points and line endings for the + # circle inside the specified device context. In this case, the DC is + # a memory based device context that will be blitted to the actual + # display DC inside the OnPaint() event handler. + def OnSize(self, event): + # The faceBitmap init is done here, to make sure the buffer is always + # the same size as the Window + size = self.GetClientSize() + self.faceBitmap = wxEmptyBitmap(size.width, size.height) + self.DrawFace() + + + def OnPaint(self, event): + self.DrawHands(wxPaintDC(self)) + + + def OnQuit(self, event): + self.timer.Stop() + del self.timer + + + def OnTimerExpire(self, event): + self.DrawHands(wxClientDC(self)) + + + def DrawHands(self, drawDC): + # Start by drawing the face bitmap + drawDC.DrawBitmap(self.faceBitmap,0,0) + + currentTime = time.localtime(time.time()) + hour, minutes, seconds = currentTime[3:6] + + W,H = self.faceBitmap.GetWidth(), self.faceBitmap.GetHeight() + centerX = W / 2 + centerY = H / 2 + + radius = min(centerX, centerY) + hour += minutes / 60.0 # added so the hour hand moves continuously + x, y = self.point(hour, 12, (radius * .65)) + hourX, hourY = (x + centerX), (centerY - y) + x, y = self.point(minutes, 60, (radius * .85)) + minutesX, minutesY = (x + centerX), (centerY - y) + x, y = self.point(seconds, 60, (radius * .85)) + secondsX, secondsY = (x + centerX), (centerY - y) + + # Draw the hour hand... + drawDC.SetPen(wxPen(self.GetForegroundColour(), 5, wxSOLID)) + drawDC.DrawLine(centerX, centerY, hourX, hourY) + + # Draw the minutes hand... + drawDC.SetPen(wxPen(self.GetForegroundColour(), 3, wxSOLID)) + drawDC.DrawLine(centerX, centerY, minutesX, minutesY) + + # Draw the seconds hand... + drawDC.SetPen(wxPen(self.GetForegroundColour(), 1, wxSOLID)) + drawDC.DrawLine(centerX, centerY, secondsX, secondsY) + + + # Draw the specified set of line marks inside the clock face for the + # hours or minutes... + def DrawFace(self): + backgroundBrush = wxBrush(self.GetBackgroundColour(), wxSOLID) + drawDC = wxMemoryDC() + drawDC.SelectObject(self.faceBitmap) + drawDC.SetBackground(backgroundBrush) + drawDC.Clear() + + W,H = self.faceBitmap.GetWidth(), self.faceBitmap.GetHeight() + centerX = W / 2 + centerY = H / 2 + + # Draw the marks for hours and minutes... + self.DrawTimeMarks(drawDC, self.minuteMarks, centerX, centerY, 4) + self.DrawTimeMarks(drawDC, self.hourMarks, centerX, centerY, 9) + + + def DrawTimeMarks(self, drawDC, markCount, centerX, centerY, markSize): + for i in range(markCount): + x, y = self.point(i + 1, markCount, min(centerX,centerY) - 16) + scaledX = x + centerX - markSize/2 + scaledY = centerY - y - markSize/2 + + drawDC.SetBrush(wxBrush(self.tickMarksBrushC, wxSOLID)) + drawDC.SetPen(wxPen(self.tickMarksPenC, 1, wxSOLID)) + if self.tickMarkStyle != self.TICKS_NONE: + if self.tickMarkStyle == self.TICKS_CIRCLE: + drawDC.DrawEllipse(scaledX - 2, scaledY, markSize, markSize) + else: + drawDC.DrawRectangle(scaledX - 3, scaledY, markSize, markSize) + + + def point(self, tick, range, radius): + angle = tick * (360.0 / range) + radiansPerDegree = math.pi / 180 + pointX = int(round(radius * math.sin(angle * radiansPerDegree))) + pointY = int(round(radius * math.cos(angle * radiansPerDegree))) + return wxPoint(pointX, pointY) + + + + +if __name__ == "__main__": + class App(wxApp): + def OnInit(self): + frame = wxFrame(None, -1, "AnalogClockWindow Test", size=(375,375)) + + clock = AnalogClockWindow(frame) + clock.SetTickMarkColours("RED") + clock.SetHandsColour("WHITE") + clock.SetBackgroundColour("BLUE") + + frame.Centre(wxBOTH) + frame.Show(True) + self.SetTopWindow(frame) + return true + + theApp = App(0) + theApp.MainLoop() + + +