Redo (again) how the stock objects are initialized in wxPython.
Factor out the wxPyTwoIntItem_helper template function so it can be used in other extension modules. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39008 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
52
wxPython/include/wx/wxPython/twoitem.h
Normal file
52
wxPython/include/wx/wxPython/twoitem.h
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: twoitem.h
|
||||||
|
// Purpose: A template function to help with converting a python object
|
||||||
|
// to some wx class that takes two integer value parameters.
|
||||||
|
// Factored out of wxPython_int.h
|
||||||
|
//
|
||||||
|
// Author: Robin Dunn
|
||||||
|
//
|
||||||
|
// Created: 25-April-2006
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) 2006 by Total Control Software
|
||||||
|
// Licence: wxWindows license
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef __twoitem_h__
|
||||||
|
#define __twoitem_h__
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
bool wxPyTwoIntItem_helper(PyObject* source, T** obj, const wxChar* name)
|
||||||
|
{
|
||||||
|
// If source is an object instance then it may already be the right type
|
||||||
|
if (wxPySwigInstance_Check(source)) {
|
||||||
|
T* ptr;
|
||||||
|
if (! wxPyConvertSwigPtr(source, (void **)&ptr, name))
|
||||||
|
goto error;
|
||||||
|
*obj = ptr;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// otherwise a 2-tuple of integers is expected
|
||||||
|
else if (PySequence_Check(source) && PyObject_Length(source) == 2) {
|
||||||
|
PyObject* o1 = PySequence_GetItem(source, 0);
|
||||||
|
PyObject* o2 = PySequence_GetItem(source, 1);
|
||||||
|
if (!PyNumber_Check(o1) || !PyNumber_Check(o2)) {
|
||||||
|
Py_DECREF(o1);
|
||||||
|
Py_DECREF(o2);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
**obj = T(PyInt_AsLong(o1), PyInt_AsLong(o2));
|
||||||
|
Py_DECREF(o1);
|
||||||
|
Py_DECREF(o2);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
error:
|
||||||
|
wxString msg;
|
||||||
|
msg.Printf(wxT("Expected a 2-tuple of integers or a %s object."), name);
|
||||||
|
PyErr_SetString(PyExc_TypeError, msg.mb_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@@ -227,41 +227,6 @@ bool wxColour_typecheck(PyObject* source);
|
|||||||
bool wxPyCheckForApp();
|
bool wxPyCheckForApp();
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
bool wxPyTwoIntItem_helper(PyObject* source, T** obj, const wxChar* name)
|
|
||||||
{
|
|
||||||
// If source is an object instance then it may already be the right type
|
|
||||||
if (wxPySwigInstance_Check(source)) {
|
|
||||||
T* ptr;
|
|
||||||
if (! wxPyConvertSwigPtr(source, (void **)&ptr, name))
|
|
||||||
goto error;
|
|
||||||
*obj = ptr;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
// otherwise a 2-tuple of integers is expected
|
|
||||||
else if (PySequence_Check(source) && PyObject_Length(source) == 2) {
|
|
||||||
PyObject* o1 = PySequence_GetItem(source, 0);
|
|
||||||
PyObject* o2 = PySequence_GetItem(source, 1);
|
|
||||||
if (!PyNumber_Check(o1) || !PyNumber_Check(o2)) {
|
|
||||||
Py_DECREF(o1);
|
|
||||||
Py_DECREF(o2);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
**obj = T(PyInt_AsLong(o1), PyInt_AsLong(o2));
|
|
||||||
Py_DECREF(o1);
|
|
||||||
Py_DECREF(o2);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
error:
|
|
||||||
wxString msg;
|
|
||||||
msg.Printf(wxT("Expected a 2-tuple of integers or a %s object."), name);
|
|
||||||
PyErr_SetString(PyExc_TypeError, msg.mb_str());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Other helpful stuff
|
// Other helpful stuff
|
||||||
bool wxPy2int_seq_helper(PyObject* source, int* i1, int* i2);
|
bool wxPy2int_seq_helper(PyObject* source, int* i1, int* i2);
|
||||||
bool wxPy4int_seq_helper(PyObject* source, int* i1, int* i2, int* i3, int* i4);
|
bool wxPy4int_seq_helper(PyObject* source, int* i1, int* i2, int* i3, int* i4);
|
||||||
|
@@ -173,6 +173,15 @@ your Mac."""
|
|||||||
self._BootstrapApp()
|
self._BootstrapApp()
|
||||||
|
|
||||||
|
|
||||||
|
def OnPreInit(self):
|
||||||
|
"""
|
||||||
|
Things that must be done after _BootstrapApp has done its
|
||||||
|
thing, but would be nice if they were already done by the time
|
||||||
|
that OnInit is called.
|
||||||
|
"""
|
||||||
|
wx.StockGDI._initStockObjects()
|
||||||
|
|
||||||
|
|
||||||
def __del__(self, destroy=wx.PyApp.__del__):
|
def __del__(self, destroy=wx.PyApp.__del__):
|
||||||
self.RestoreStdio() # Just in case the MainLoop was overridden
|
self.RestoreStdio() # Just in case the MainLoop was overridden
|
||||||
destroy(self)
|
destroy(self)
|
||||||
|
@@ -70,80 +70,52 @@ public:
|
|||||||
static const wxPen* GetPen(Item item);
|
static const wxPen* GetPen(Item item);
|
||||||
|
|
||||||
virtual const wxFont* GetFont(Item item);
|
virtual const wxFont* GetFont(Item item);
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
%pythoncode {
|
%pythoncode {
|
||||||
%# This function makes a class used to do delayed initialization of some
|
def _initStockObjects():
|
||||||
%# stock wx objects. When they are used the first time then an init function
|
import wx
|
||||||
%# is called to make the real instance, which is then used to replace the
|
wx.ITALIC_FONT = StockGDI.instance().GetFont(StockGDI.FONT_ITALIC)
|
||||||
%# original instance and class seen by the programmer.
|
wx.NORMAL_FONT = StockGDI.instance().GetFont(StockGDI.FONT_NORMAL)
|
||||||
def _wxPyMakeDelayedInitWrapper(initFunc):
|
wx.SMALL_FONT = StockGDI.instance().GetFont(StockGDI.FONT_SMALL)
|
||||||
class _wxPyStockObjectWrapper(object):
|
wx.SWISS_FONT = StockGDI.instance().GetFont(StockGDI.FONT_SWISS)
|
||||||
def __init__(self, *args):
|
|
||||||
self._args = args
|
|
||||||
def __getattr__(self, name):
|
|
||||||
obj = initFunc(*self._args)
|
|
||||||
self.__class__ = obj.__class__
|
|
||||||
self.__dict__ = obj.__dict__
|
|
||||||
return getattr(self, name)
|
|
||||||
def __str__(self):
|
|
||||||
return self.__getattr__("__str__")()
|
|
||||||
def __repr__(self):
|
|
||||||
return self.__getattr__("__repr__")()
|
|
||||||
return _wxPyStockObjectWrapper
|
|
||||||
|
|
||||||
def _wxPyFontInit(id):
|
wx.BLACK_DASHED_PEN = StockGDI.GetPen(StockGDI.PEN_BLACKDASHED)
|
||||||
return StockGDI.instance().GetFont(id)
|
wx.BLACK_PEN = StockGDI.GetPen(StockGDI.PEN_BLACK)
|
||||||
|
wx.CYAN_PEN = StockGDI.GetPen(StockGDI.PEN_CYAN)
|
||||||
|
wx.GREEN_PEN = StockGDI.GetPen(StockGDI.PEN_GREEN)
|
||||||
|
wx.GREY_PEN = StockGDI.GetPen(StockGDI.PEN_GREY)
|
||||||
|
wx.LIGHT_GREY_PEN = StockGDI.GetPen(StockGDI.PEN_LIGHTGREY)
|
||||||
|
wx.MEDIUM_GREY_PEN = StockGDI.GetPen(StockGDI.PEN_MEDIUMGREY)
|
||||||
|
wx.RED_PEN = StockGDI.GetPen(StockGDI.PEN_RED)
|
||||||
|
wx.TRANSPARENT_PEN = StockGDI.GetPen(StockGDI.PEN_TRANSPARENT)
|
||||||
|
wx.WHITE_PEN = StockGDI.GetPen(StockGDI.PEN_WHITE)
|
||||||
|
|
||||||
_wxPyStockPen = _wxPyMakeDelayedInitWrapper(StockGDI.GetPen)
|
wx.BLACK_BRUSH = StockGDI.GetBrush(StockGDI.BRUSH_BLACK)
|
||||||
_wxPyStockBrush = _wxPyMakeDelayedInitWrapper(StockGDI.GetBrush)
|
wx.BLUE_BRUSH = StockGDI.GetBrush(StockGDI.BRUSH_BLUE)
|
||||||
_wxPyStockCursor = _wxPyMakeDelayedInitWrapper(StockGDI.GetCursor)
|
wx.CYAN_BRUSH = StockGDI.GetBrush(StockGDI.BRUSH_CYAN)
|
||||||
_wxPyStockColour = _wxPyMakeDelayedInitWrapper(StockGDI.GetColour)
|
wx.GREEN_BRUSH = StockGDI.GetBrush(StockGDI.BRUSH_GREEN)
|
||||||
_wxPyStockFont = _wxPyMakeDelayedInitWrapper(_wxPyFontInit)
|
wx.GREY_BRUSH = StockGDI.GetBrush(StockGDI.BRUSH_GREY)
|
||||||
|
wx.LIGHT_GREY_BRUSH = StockGDI.GetBrush(StockGDI.BRUSH_LIGHTGREY)
|
||||||
|
wx.MEDIUM_GREY_BRUSH = StockGDI.GetBrush(StockGDI.BRUSH_MEDIUMGREY)
|
||||||
|
wx.RED_BRUSH = StockGDI.GetBrush(StockGDI.BRUSH_RED)
|
||||||
|
wx.TRANSPARENT_BRUSH = StockGDI.GetBrush(StockGDI.BRUSH_TRANSPARENT)
|
||||||
|
wx.WHITE_BRUSH = StockGDI.GetBrush(StockGDI.BRUSH_WHITE)
|
||||||
|
|
||||||
|
wx.BLACK = StockGDI.GetColour(StockGDI.COLOUR_BLACK)
|
||||||
|
wx.BLUE = StockGDI.GetColour(StockGDI.COLOUR_BLUE)
|
||||||
|
wx.CYAN = StockGDI.GetColour(StockGDI.COLOUR_CYAN)
|
||||||
|
wx.GREEN = StockGDI.GetColour(StockGDI.COLOUR_GREEN)
|
||||||
|
wx.LIGHT_GREY = StockGDI.GetColour(StockGDI.COLOUR_LIGHTGREY)
|
||||||
|
wx.RED = StockGDI.GetColour(StockGDI.COLOUR_RED)
|
||||||
|
wx.WHITE = StockGDI.GetColour(StockGDI.COLOUR_WHITE)
|
||||||
|
|
||||||
ITALIC_FONT = _wxPyStockCursor(StockGDI.FONT_ITALIC)
|
wx.CROSS_CURSOR = StockGDI.GetCursor(StockGDI.CURSOR_CROSS)
|
||||||
NORMAL_FONT = _wxPyStockCursor(StockGDI.FONT_NORMAL)
|
wx.HOURGLASS_CURSOR = StockGDI.GetCursor(StockGDI.CURSOR_HOURGLASS)
|
||||||
SMALL_FONT = _wxPyStockCursor(StockGDI.FONT_SMALL)
|
wx.STANDARD_CURSOR = StockGDI.GetCursor(StockGDI.CURSOR_STANDARD)
|
||||||
SWISS_FONT = _wxPyStockCursor(StockGDI.FONT_SWISS)
|
|
||||||
|
|
||||||
BLACK_DASHED_PEN = _wxPyStockPen(StockGDI.PEN_BLACKDASHED)
|
|
||||||
BLACK_PEN = _wxPyStockPen(StockGDI.PEN_BLACK)
|
|
||||||
CYAN_PEN = _wxPyStockPen(StockGDI.PEN_CYAN)
|
|
||||||
GREEN_PEN = _wxPyStockPen(StockGDI.PEN_GREEN)
|
|
||||||
GREY_PEN = _wxPyStockPen(StockGDI.PEN_GREY)
|
|
||||||
LIGHT_GREY_PEN = _wxPyStockPen(StockGDI.PEN_LIGHTGREY)
|
|
||||||
MEDIUM_GREY_PEN = _wxPyStockPen(StockGDI.PEN_MEDIUMGREY)
|
|
||||||
RED_PEN = _wxPyStockPen(StockGDI.PEN_RED)
|
|
||||||
TRANSPARENT_PEN = _wxPyStockPen(StockGDI.PEN_TRANSPARENT)
|
|
||||||
WHITE_PEN = _wxPyStockPen(StockGDI.PEN_WHITE)
|
|
||||||
|
|
||||||
BLACK_BRUSH = _wxPyStockBrush(StockGDI.BRUSH_BLACK)
|
|
||||||
BLUE_BRUSH = _wxPyStockBrush(StockGDI.BRUSH_BLUE)
|
|
||||||
CYAN_BRUSH = _wxPyStockBrush(StockGDI.BRUSH_CYAN)
|
|
||||||
GREEN_BRUSH = _wxPyStockBrush(StockGDI.BRUSH_GREEN)
|
|
||||||
GREY_BRUSH = _wxPyStockBrush(StockGDI.BRUSH_GREY)
|
|
||||||
LIGHT_GREY_BRUSH = _wxPyStockBrush(StockGDI.BRUSH_LIGHTGREY)
|
|
||||||
MEDIUM_GREY_BRUSH = _wxPyStockBrush(StockGDI.BRUSH_MEDIUMGREY)
|
|
||||||
RED_BRUSH = _wxPyStockBrush(StockGDI.BRUSH_RED)
|
|
||||||
TRANSPARENT_BRUSH = _wxPyStockBrush(StockGDI.BRUSH_TRANSPARENT)
|
|
||||||
WHITE_BRUSH = _wxPyStockBrush(StockGDI.BRUSH_WHITE)
|
|
||||||
|
|
||||||
BLACK = _wxPyStockColour(StockGDI.COLOUR_BLACK)
|
|
||||||
BLUE = _wxPyStockColour(StockGDI.COLOUR_BLUE)
|
|
||||||
CYAN = _wxPyStockColour(StockGDI.COLOUR_CYAN)
|
|
||||||
GREEN = _wxPyStockColour(StockGDI.COLOUR_GREEN)
|
|
||||||
LIGHT_GREY = _wxPyStockColour(StockGDI.COLOUR_LIGHTGREY)
|
|
||||||
RED = _wxPyStockColour(StockGDI.COLOUR_RED)
|
|
||||||
WHITE = _wxPyStockColour(StockGDI.COLOUR_WHITE)
|
|
||||||
|
|
||||||
CROSS_CURSOR = _wxPyStockCursor(StockGDI.CURSOR_CROSS)
|
|
||||||
HOURGLASS_CURSOR = _wxPyStockCursor(StockGDI.CURSOR_HOURGLASS)
|
|
||||||
STANDARD_CURSOR = _wxPyStockCursor(StockGDI.CURSOR_STANDARD)
|
|
||||||
|
|
||||||
|
_initStockObjects = staticmethod(_initStockObjects)
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -163,29 +135,6 @@ const wxColour wxNullColour;
|
|||||||
%mutable;
|
%mutable;
|
||||||
|
|
||||||
|
|
||||||
// %inline {
|
|
||||||
// const wxBitmap& _wxPyInitNullBitmap() { return wxNullBitmap; }
|
|
||||||
// const wxIcon& _wxPyInitNullIcon() { return wxNullIcon; }
|
|
||||||
// const wxCursor& _wxPyInitNullCursor() { return wxNullCursor; }
|
|
||||||
// const wxPen& _wxPyInitNullPen() { return wxNullPen; }
|
|
||||||
// const wxBrush& _wxPyInitNullBrush() { return wxNullBrush; }
|
|
||||||
// const wxPalette& _wxPyInitNullPalette() { return wxNullPalette; }
|
|
||||||
// const wxFont& _wxPyInitNullFont() { return wxNullFont; }
|
|
||||||
// const wxColour& _wxPyInitNullColour() { return wxNullColour; }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// %pythoncode {
|
|
||||||
// NullBitmap = _wxPyMakeDelayedInitWrapper(_wxPyInitNullBitmap)()
|
|
||||||
// NullIcon = _wxPyMakeDelayedInitWrapper(_wxPyInitNullIcon)()
|
|
||||||
// NullCursor = _wxPyMakeDelayedInitWrapper(_wxPyInitNullCursor)()
|
|
||||||
// NullPen = _wxPyMakeDelayedInitWrapper(_wxPyInitNullPen)()
|
|
||||||
// NullBrush = _wxPyMakeDelayedInitWrapper(_wxPyInitNullBrush)()
|
|
||||||
// NullPalette = _wxPyMakeDelayedInitWrapper(_wxPyInitNullPalette)()
|
|
||||||
// NullFont = _wxPyMakeDelayedInitWrapper(_wxPyInitNullFont)()
|
|
||||||
// NullColour = _wxPyMakeDelayedInitWrapper(_wxPyInitNullColour)()
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
@@ -280,6 +229,25 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
%pythoncode {
|
%pythoncode {
|
||||||
|
%# This function makes a class used to do delayed initialization of some
|
||||||
|
%# stock wx objects. When they are used the first time then an init function
|
||||||
|
%# is called to make the real instance, which is then used to replace the
|
||||||
|
%# original instance and class seen by the programmer.
|
||||||
|
def _wxPyMakeDelayedInitWrapper(initFunc):
|
||||||
|
class _wxPyStockObjectWrapper(object):
|
||||||
|
def __init__(self, *args):
|
||||||
|
self._args = args
|
||||||
|
def __getattr__(self, name):
|
||||||
|
obj = initFunc(*self._args)
|
||||||
|
self.__class__ = obj.__class__
|
||||||
|
self.__dict__ = obj.__dict__
|
||||||
|
return getattr(self, name)
|
||||||
|
def __str__(self):
|
||||||
|
return self.__getattr__("__str__")()
|
||||||
|
def __repr__(self):
|
||||||
|
return self.__getattr__("__repr__")()
|
||||||
|
return _wxPyStockObjectWrapper
|
||||||
|
|
||||||
wxTheFontList = _wxPyMakeDelayedInitWrapper(_wxPyInitTheFontList)()
|
wxTheFontList = _wxPyMakeDelayedInitWrapper(_wxPyInitTheFontList)()
|
||||||
wxThePenList = _wxPyMakeDelayedInitWrapper(_wxPyInitThePenList)()
|
wxThePenList = _wxPyMakeDelayedInitWrapper(_wxPyInitThePenList)()
|
||||||
wxTheBrushList = _wxPyMakeDelayedInitWrapper(_wxPyInitTheBrushList)()
|
wxTheBrushList = _wxPyMakeDelayedInitWrapper(_wxPyInitTheBrushList)()
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
%{
|
%{
|
||||||
#include "wx/wxPython/wxPython_int.h"
|
#include "wx/wxPython/wxPython_int.h"
|
||||||
#include "wx/wxPython/pyclasses.h"
|
#include "wx/wxPython/pyclasses.h"
|
||||||
|
#include "wx/wxPython/twoitem.h"
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
#include "wx/wxPython/wxPython_int.h"
|
#include "wx/wxPython/wxPython_int.h"
|
||||||
#include "wx/wxPython/pyistream.h"
|
#include "wx/wxPython/pyistream.h"
|
||||||
#include "wx/wxPython/swigver.h"
|
#include "wx/wxPython/swigver.h"
|
||||||
|
#include "wx/wxPython/twoitem.h"
|
||||||
|
|
||||||
#ifdef __WXMSW__
|
#ifdef __WXMSW__
|
||||||
#include <wx/msw/private.h>
|
#include <wx/msw/private.h>
|
||||||
@@ -469,8 +470,19 @@ void wxPyApp::_BootstrapApp()
|
|||||||
// It's now ok to generate exceptions for assertion errors.
|
// It's now ok to generate exceptions for assertion errors.
|
||||||
wxPythonApp->SetStartupComplete(true);
|
wxPythonApp->SetStartupComplete(true);
|
||||||
|
|
||||||
// Call the Python wxApp's OnInit function
|
|
||||||
|
// Call the Python wxApp's OnPreInit and OnInit functions
|
||||||
blocked = wxPyBeginBlockThreads();
|
blocked = wxPyBeginBlockThreads();
|
||||||
|
if (wxPyCBH_findCallback(m_myInst, "OnPreInit")) {
|
||||||
|
PyObject* method = m_myInst.GetLastFound();
|
||||||
|
PyObject* argTuple = PyTuple_New(0);
|
||||||
|
retval = PyEval_CallObject(method, argTuple);
|
||||||
|
m_myInst.clearRecursionGuard(method);
|
||||||
|
Py_DECREF(argTuple);
|
||||||
|
Py_DECREF(method);
|
||||||
|
if (retval == NULL)
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
if (wxPyCBH_findCallback(m_myInst, "OnInit")) {
|
if (wxPyCBH_findCallback(m_myInst, "OnInit")) {
|
||||||
|
|
||||||
PyObject* method = m_myInst.GetLastFound();
|
PyObject* method = m_myInst.GetLastFound();
|
||||||
|
Reference in New Issue
Block a user