mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-28 17:32:29 +01:00
Remove python support from WINGs
As the README used to say, it was a unfinished work. If someone wants to finish it after all these years it can be recovered from the logs. But meanwhile let's not carry dead code around.
This commit is contained in:
@@ -21,8 +21,7 @@ lib_LTLIBRARIES = libWINGs.la libWUtil.la
|
|||||||
LDADD= libWUtil.la libWINGs.la $(top_builddir)/wrlib/libwraster.la @INTLIBS@
|
LDADD= libWUtil.la libWINGs.la $(top_builddir)/wrlib/libwraster.la @INTLIBS@
|
||||||
|
|
||||||
|
|
||||||
EXTRA_DIST = BUGS make-rgb python/Makefile python/README python/WINGs.i \
|
EXTRA_DIST = BUGS make-rgb
|
||||||
python/WINGs.py python/setup.py python/test.py
|
|
||||||
|
|
||||||
|
|
||||||
# wbutton.c
|
# wbutton.c
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
|
|
||||||
all: WINGs.c
|
|
||||||
python setup.py build
|
|
||||||
ln -sf `find build/ -name wings.so` .
|
|
||||||
|
|
||||||
install: WINGs.c
|
|
||||||
python setup.py install
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf build dist WINGs.c *.o *~ *.so MANIFEST wings.py *.pyc *.pyo core
|
|
||||||
|
|
||||||
dist:
|
|
||||||
python setup.py sdist
|
|
||||||
|
|
||||||
WINGs.c: WINGs.i
|
|
||||||
swig -python -noproxy `get-wings-flags --cflags` -I.. -o WINGs.c WINGs.i
|
|
||||||
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
|
|
||||||
This is a python wrapper for the WINGs library, that can be used to write python
|
|
||||||
based programs with WINGs-based graphic interfaces.
|
|
||||||
|
|
||||||
This module in not built by default. To build it you need python2.1 or later
|
|
||||||
and swig-1.3.14 or later.
|
|
||||||
|
|
||||||
To build it, first compile and install WINGs. after that run 'make' in this
|
|
||||||
directory. 'make install' will install the python module into the python tree.
|
|
||||||
|
|
||||||
run test.py or WINGs.py for an example.
|
|
||||||
|
|
||||||
the code is not finished yet and may fail to work as expected in some cases.
|
|
||||||
|
|
||||||
Note: currently the module expects WINGs installed to build. it won't take
|
|
||||||
the WINGs libraries and header files from the source tree. You need to
|
|
||||||
install WINGs first. Even if an old version of WINGs is already installed,
|
|
||||||
you still need to install the newly built WINGs, else the python module will
|
|
||||||
be built against the old version.
|
|
||||||
|
|
||||||
@@ -1,699 +0,0 @@
|
|||||||
%module wings
|
|
||||||
%{
|
|
||||||
#include "WINGs/WINGsP.h"
|
|
||||||
%}
|
|
||||||
|
|
||||||
%include typemaps.i
|
|
||||||
|
|
||||||
// This tells SWIG to treat char ** as a special case
|
|
||||||
%typemap(python, in) char ** {
|
|
||||||
/* Check if is a list */
|
|
||||||
if (PyList_Check($input)) {
|
|
||||||
int size = PyList_Size($input);
|
|
||||||
int i = 0;
|
|
||||||
$1 = (char **) wmalloc((size+1)*sizeof(char *));
|
|
||||||
for (i = 0; i < size; i++) {
|
|
||||||
PyObject *o = PyList_GetItem($input, i);
|
|
||||||
if (PyString_Check(o))
|
|
||||||
$1[i] = PyString_AsString(PyList_GetItem($input, i));
|
|
||||||
else {
|
|
||||||
PyErr_SetString(PyExc_TypeError, "list must contain strings");
|
|
||||||
wfree($1);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$1[i] = 0;
|
|
||||||
} else {
|
|
||||||
PyErr_SetString(PyExc_TypeError, "not a list");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// This cleans up the char ** array we malloc-ed before the function call
|
|
||||||
%typemap(python, freearg) char ** {
|
|
||||||
wfree($1);
|
|
||||||
}
|
|
||||||
// This allows a C function to return a char ** as a Python list
|
|
||||||
%typemap(python, out) char ** {
|
|
||||||
int len,i;
|
|
||||||
len = 0;
|
|
||||||
while ($1[len]) len++;
|
|
||||||
$result = PyList_New(len);
|
|
||||||
for (i = 0; i < len; i++) {
|
|
||||||
PyList_SetItem($result, i, PyString_FromString($1[i]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now for some callbacks
|
|
||||||
%typemap(python, in) PyObject *pyacArgs {
|
|
||||||
if (PyTuple_Check($input)) {
|
|
||||||
if (PyTuple_Size($input) != 3) {
|
|
||||||
PyErr_SetString(PyExc_ValueError,
|
|
||||||
"wrong number of parameters in tuple. should be 3.");
|
|
||||||
return NULL;
|
|
||||||
} else {
|
|
||||||
PyObject *func = PyTuple_GetItem($input, 1);
|
|
||||||
if (func!=Py_None && !PyCallable_Check(func)) {
|
|
||||||
PyErr_SetString(PyExc_TypeError,
|
|
||||||
"'action' needs to be a callable object!");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
PyErr_SetString(PyExc_TypeError, "2nd argument not a tuple!");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
$1 = $input;
|
|
||||||
}
|
|
||||||
|
|
||||||
%typemap(python, in) PyObject *pycArgs {
|
|
||||||
if (PyTuple_Check($input)) {
|
|
||||||
if (PyTuple_Size($input) != 2) {
|
|
||||||
PyErr_SetString(PyExc_ValueError,
|
|
||||||
"wrong number of parameters in tuple. should be 2.");
|
|
||||||
return NULL;
|
|
||||||
} else {
|
|
||||||
PyObject *func = PyTuple_GetItem($input, 0);
|
|
||||||
if (func!=Py_None && !PyCallable_Check(func)) {
|
|
||||||
PyErr_SetString(PyExc_TypeError,
|
|
||||||
"'action' needs to be a callable object!");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
PyErr_SetString(PyExc_TypeError, "2nd argument not a tuple!");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
$1 = $input;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Type mapping for grabbing a FILE * from Python
|
|
||||||
%typemap(python, in) FILE * {
|
|
||||||
if (!PyFile_Check($input)) {
|
|
||||||
PyErr_SetString(PyExc_TypeError, "Need a file!");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
$1 = PyFile_AsFile($input);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* These are for free-ing the return of functions that need to be freed
|
|
||||||
* before returning control to python. */
|
|
||||||
%typemap(python, ret) char* WMGetTextFieldText { wfree($1); };
|
|
||||||
|
|
||||||
|
|
||||||
%include exception.i
|
|
||||||
|
|
||||||
%exception pyWMScreenMainLoop {
|
|
||||||
$function
|
|
||||||
if (PyErr_Occurred())
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
%exception pyWMRunModalLoop {
|
|
||||||
$function
|
|
||||||
if (PyErr_Occurred())
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
%{
|
|
||||||
static int mainLoopDone = 0;
|
|
||||||
%}
|
|
||||||
|
|
||||||
|
|
||||||
%inline %{
|
|
||||||
WMScreen *pyWMOpenScreen(const char *display, int simpleapp)
|
|
||||||
{
|
|
||||||
Display *dpy = XOpenDisplay(display);
|
|
||||||
|
|
||||||
if (!dpy) {
|
|
||||||
wwarning("WINGs: could not open display %s", XDisplayName(display));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (simpleapp) {
|
|
||||||
return WMCreateSimpleApplicationScreen(dpy);
|
|
||||||
} else {
|
|
||||||
return WMCreateScreen(dpy, DefaultScreen(dpy));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMScreenMainLoop(WMScreen *scr)
|
|
||||||
{
|
|
||||||
XEvent event;
|
|
||||||
|
|
||||||
while (!PyErr_Occurred() && !mainLoopDone) {
|
|
||||||
WMNextEvent(((W_Screen*)scr)->display, &event);
|
|
||||||
WMHandleEvent(&event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMBreakScreenMainLoop(WMScreen *scr)
|
|
||||||
{
|
|
||||||
mainLoopDone = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMRunModalLoop(WMScreen *scr, WMView *view)
|
|
||||||
{
|
|
||||||
int oldModalLoop = scr->modalLoop;
|
|
||||||
WMView *oldModalView = scr->modalView;
|
|
||||||
|
|
||||||
scr->modalView = view;
|
|
||||||
|
|
||||||
scr->modalLoop = 1;
|
|
||||||
while (!PyErr_Occurred() && scr->modalLoop) {
|
|
||||||
XEvent event;
|
|
||||||
|
|
||||||
WMNextEvent(scr->display, &event);
|
|
||||||
WMHandleEvent(&event);
|
|
||||||
}
|
|
||||||
|
|
||||||
scr->modalView = oldModalView;
|
|
||||||
scr->modalLoop = oldModalLoop;
|
|
||||||
}
|
|
||||||
%}
|
|
||||||
|
|
||||||
|
|
||||||
//%rename WMScreenMainLoop _WMScreenMainLoop;
|
|
||||||
//%rename(_WMScreenMainLoop) WMScreenMainLoop;
|
|
||||||
//%rename WMRunModalLoop _WMRunModalLoop;
|
|
||||||
|
|
||||||
|
|
||||||
%{
|
|
||||||
/* These functions match the prototypes of the normal C callback
|
|
||||||
* functions. However, we use the clientdata pointer for holding a
|
|
||||||
* reference to a Python tuple containing (object, funct, clientData).
|
|
||||||
*/
|
|
||||||
static void PythonWMActionCallback(WMWidget *widget, void *cdata)
|
|
||||||
{
|
|
||||||
PyObject *pyobj, *func, *pydata, *arglist, *tuple, *result;
|
|
||||||
|
|
||||||
tuple = (PyObject*) cdata;
|
|
||||||
pyobj = PyTuple_GetItem(tuple, 0);
|
|
||||||
func = PyTuple_GetItem(tuple, 1);
|
|
||||||
if (func && func!=Py_None) {
|
|
||||||
pydata = PyTuple_GetItem(tuple, 2);
|
|
||||||
arglist = Py_BuildValue("(OO)", pyobj, pydata);
|
|
||||||
result = PyEval_CallObject(func, arglist);
|
|
||||||
Py_DECREF(arglist);
|
|
||||||
Py_XDECREF(result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void PythonWMCallback(void *data)
|
|
||||||
{
|
|
||||||
PyObject *func, *pydata, *arglist, *tuple, *result;
|
|
||||||
|
|
||||||
tuple = (PyObject*) data;
|
|
||||||
func = PyTuple_GetItem(tuple, 0);
|
|
||||||
if (func && func!=Py_None) {
|
|
||||||
pydata = PyTuple_GetItem(tuple, 1);
|
|
||||||
arglist = Py_BuildValue("(O)", pydata);
|
|
||||||
result = PyEval_CallObject(func, arglist);
|
|
||||||
Py_DECREF(arglist);
|
|
||||||
Py_XDECREF(result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
pyTextFieldDidBeginEditing(WMTextFieldDelegate *self, WMNotification *notif)
|
|
||||||
{
|
|
||||||
PyObject *pyobj, *delegate, *func, *pydata, *arglist, *tuple, *result;
|
|
||||||
int action;
|
|
||||||
|
|
||||||
tuple = (PyObject*) self->data;
|
|
||||||
pyobj = PyTuple_GetItem(tuple, 0);
|
|
||||||
delegate = PyTuple_GetItem(tuple, 1);
|
|
||||||
if (delegate != Py_None) {
|
|
||||||
// should we call PyObject_HasAttrString()?? rather not and let
|
|
||||||
// python raise an exception because the object doesn't has the
|
|
||||||
// attribute
|
|
||||||
func = PyObject_GetAttrString(delegate, "didBeginEditing");
|
|
||||||
if (func!=NULL && func!=Py_None) {
|
|
||||||
pydata = PyObject_GetAttrString(delegate, "data");
|
|
||||||
if (!pydata) {
|
|
||||||
Py_INCREF(Py_None);
|
|
||||||
pydata = Py_None;
|
|
||||||
}
|
|
||||||
action = (int)WMGetNotificationClientData(notif);
|
|
||||||
arglist = Py_BuildValue("(OOi)", pyobj, pydata, action);
|
|
||||||
result = PyEval_CallObject(func, arglist);
|
|
||||||
Py_DECREF(pydata);
|
|
||||||
Py_DECREF(arglist);
|
|
||||||
Py_XDECREF(result);
|
|
||||||
}
|
|
||||||
Py_XDECREF(func);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
pyTextFieldDidChange(WMTextFieldDelegate *self, WMNotification *notif)
|
|
||||||
{
|
|
||||||
PyObject *pyobj, *delegate, *func, *pydata, *arglist, *tuple, *result;
|
|
||||||
int action;
|
|
||||||
|
|
||||||
tuple = (PyObject*) self->data;
|
|
||||||
pyobj = PyTuple_GetItem(tuple, 0);
|
|
||||||
delegate = PyTuple_GetItem(tuple, 1);
|
|
||||||
if (delegate != Py_None) {
|
|
||||||
func = PyObject_GetAttrString(delegate, "didChange");
|
|
||||||
if (func!=NULL && func!=Py_None) {
|
|
||||||
pydata = PyObject_GetAttrString(delegate, "data");
|
|
||||||
if (!pydata) {
|
|
||||||
Py_INCREF(Py_None);
|
|
||||||
pydata = Py_None;
|
|
||||||
}
|
|
||||||
action = (int)WMGetNotificationClientData(notif);
|
|
||||||
arglist = Py_BuildValue("(OOi)", pyobj, pydata, action);
|
|
||||||
result = PyEval_CallObject(func, arglist);
|
|
||||||
Py_DECREF(pydata);
|
|
||||||
Py_DECREF(arglist);
|
|
||||||
Py_XDECREF(result);
|
|
||||||
}
|
|
||||||
Py_XDECREF(func);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
pyTextFieldDidEndEditing(WMTextFieldDelegate *self, WMNotification *notif)
|
|
||||||
{
|
|
||||||
PyObject *pyobj, *delegate, *func, *pydata, *arglist, *tuple, *result;
|
|
||||||
int action;
|
|
||||||
|
|
||||||
tuple = (PyObject*) self->data;
|
|
||||||
pyobj = PyTuple_GetItem(tuple, 0);
|
|
||||||
delegate = PyTuple_GetItem(tuple, 1);
|
|
||||||
if (delegate != Py_None) {
|
|
||||||
func = PyObject_GetAttrString(delegate, "didEndEditing");
|
|
||||||
if (func!=NULL && func!=Py_None) {
|
|
||||||
pydata = PyObject_GetAttrString(delegate, "data");
|
|
||||||
if (!pydata) {
|
|
||||||
Py_INCREF(Py_None);
|
|
||||||
pydata = Py_None;
|
|
||||||
}
|
|
||||||
action = (int)WMGetNotificationClientData(notif);
|
|
||||||
arglist = Py_BuildValue("(OOi)", pyobj, pydata, action);
|
|
||||||
result = PyEval_CallObject(func, arglist);
|
|
||||||
Py_DECREF(pydata);
|
|
||||||
Py_DECREF(arglist);
|
|
||||||
Py_XDECREF(result);
|
|
||||||
}
|
|
||||||
Py_XDECREF(func);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static Bool
|
|
||||||
pyTextFieldShouldBeginEditing(WMTextFieldDelegate *self, WMTextField *tPtr)
|
|
||||||
{
|
|
||||||
PyObject *pyobj, *delegate, *func, *pydata, *arglist, *tuple, *result;
|
|
||||||
Bool retval = False;
|
|
||||||
|
|
||||||
tuple = (PyObject*) self->data;
|
|
||||||
pyobj = PyTuple_GetItem(tuple, 0);
|
|
||||||
delegate = PyTuple_GetItem(tuple, 1);
|
|
||||||
if (delegate != Py_None) {
|
|
||||||
func = PyObject_GetAttrString(delegate, "shouldBeginEditing");
|
|
||||||
if (func!=NULL && func!=Py_None) {
|
|
||||||
pydata = PyObject_GetAttrString(delegate, "data");
|
|
||||||
if (!pydata) {
|
|
||||||
Py_INCREF(Py_None);
|
|
||||||
pydata = Py_None;
|
|
||||||
}
|
|
||||||
arglist = Py_BuildValue("(OO)", pyobj, pydata);
|
|
||||||
result = PyEval_CallObject(func, arglist);
|
|
||||||
if (result!=Py_None && PyInt_AsLong(result)!=0) {
|
|
||||||
retval = True;
|
|
||||||
}
|
|
||||||
Py_DECREF(pydata);
|
|
||||||
Py_DECREF(arglist);
|
|
||||||
Py_XDECREF(result);
|
|
||||||
}
|
|
||||||
Py_XDECREF(func);
|
|
||||||
}
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Bool
|
|
||||||
pyTextFieldShouldEndEditing(WMTextFieldDelegate *self, WMTextField *tPtr)
|
|
||||||
{
|
|
||||||
PyObject *pyobj, *delegate, *func, *pydata, *arglist, *tuple, *result;
|
|
||||||
Bool retval = False;
|
|
||||||
|
|
||||||
tuple = (PyObject*) self->data;
|
|
||||||
pyobj = PyTuple_GetItem(tuple, 0);
|
|
||||||
delegate = PyTuple_GetItem(tuple, 1);
|
|
||||||
if (delegate != Py_None) {
|
|
||||||
func = PyObject_GetAttrString(delegate, "shouldEndEditing");
|
|
||||||
if (func!=NULL && func!=Py_None) {
|
|
||||||
pydata = PyObject_GetAttrString(delegate, "data");
|
|
||||||
if (!pydata) {
|
|
||||||
Py_INCREF(Py_None);
|
|
||||||
pydata = Py_None;
|
|
||||||
}
|
|
||||||
arglist = Py_BuildValue("(OO)", pyobj, pydata);
|
|
||||||
result = PyEval_CallObject(func, arglist);
|
|
||||||
if (result!=Py_None && PyInt_AsLong(result)!=0) {
|
|
||||||
retval = True;
|
|
||||||
}
|
|
||||||
Py_DECREF(pydata);
|
|
||||||
Py_DECREF(arglist);
|
|
||||||
Py_XDECREF(result);
|
|
||||||
}
|
|
||||||
Py_XDECREF(func);
|
|
||||||
}
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
%}
|
|
||||||
|
|
||||||
%inline %{
|
|
||||||
void pyWMSetWindowCloseAction(WMWindow *win, PyObject *pyacArgs) {
|
|
||||||
WMSetWindowCloseAction(win, PythonWMActionCallback, (void*)pyacArgs);
|
|
||||||
Py_INCREF(pyacArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMSetButtonAction(WMButton *bPtr, PyObject *pyacArgs) {
|
|
||||||
WMSetButtonAction(bPtr, PythonWMActionCallback, (void*)pyacArgs);
|
|
||||||
Py_INCREF(pyacArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMSetScrollerAction(WMScroller *sPtr, PyObject *pyacArgs) {
|
|
||||||
WMSetScrollerAction(sPtr, PythonWMActionCallback, (void*)pyacArgs);
|
|
||||||
Py_INCREF(pyacArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMSetListAction(WMList *lPtr, PyObject *pyacArgs) {
|
|
||||||
WMSetListAction(lPtr, PythonWMActionCallback, (void*)pyacArgs);
|
|
||||||
Py_INCREF(pyacArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMSetListDoubleAction(WMList *lPtr, PyObject *pyacArgs) {
|
|
||||||
WMSetListDoubleAction(lPtr, PythonWMActionCallback, (void*)pyacArgs);
|
|
||||||
Py_INCREF(pyacArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMSetBrowserAction(WMBrowser *bPtr, PyObject *pyacArgs) {
|
|
||||||
WMSetBrowserAction(bPtr, PythonWMActionCallback, (void*)pyacArgs);
|
|
||||||
Py_INCREF(pyacArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMSetBrowserDoubleAction(WMBrowser *bPtr, PyObject *pyacArgs) {
|
|
||||||
WMSetBrowserDoubleAction(bPtr, PythonWMActionCallback, (void*)pyacArgs);
|
|
||||||
Py_INCREF(pyacArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMSetMenuItemAction(WMMenuItem *miPtr, PyObject *pyacArgs) {
|
|
||||||
WMSetMenuItemAction(miPtr, PythonWMActionCallback, (void*)pyacArgs);
|
|
||||||
Py_INCREF(pyacArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMSetPopUpButtonAction(WMPopUpButton *pPtr, PyObject *pyacArgs) {
|
|
||||||
WMSetPopUpButtonAction(pPtr, PythonWMActionCallback, (void*)pyacArgs);
|
|
||||||
Py_INCREF(pyacArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMSetSliderAction(WMSlider *sPtr, PyObject *pyacArgs) {
|
|
||||||
WMSetSliderAction(sPtr, PythonWMActionCallback, (void*)pyacArgs);
|
|
||||||
Py_INCREF(pyacArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMSetRulerMoveAction(WMRuler *rPtr, PyObject *pyacArgs) {
|
|
||||||
WMSetRulerMoveAction(rPtr, PythonWMActionCallback, (void*)pyacArgs);
|
|
||||||
Py_INCREF(pyacArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMSetRulerReleaseAction(WMRuler *rPtr, PyObject *pyacArgs) {
|
|
||||||
WMSetRulerReleaseAction(rPtr, PythonWMActionCallback, (void*)pyacArgs);
|
|
||||||
Py_INCREF(pyacArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMSetColorPanelAction(WMColorPanel *panel, PyObject *pyacArgs) {
|
|
||||||
WMSetColorPanelAction(panel, (WMAction2*)PythonWMActionCallback, (void*)pyacArgs);
|
|
||||||
Py_INCREF(pyacArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void* pyWMAddTimerHandler(int miliseconds, PyObject *pycArgs) {
|
|
||||||
Py_INCREF(pycArgs);
|
|
||||||
return (void*)WMAddTimerHandler(miliseconds, PythonWMCallback,
|
|
||||||
(void*)pycArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void* pyWMAddPersistentTimerHandler(int miliseconds, PyObject *pycArgs) {
|
|
||||||
Py_INCREF(pycArgs);
|
|
||||||
return (void*)WMAddPersistentTimerHandler(miliseconds, PythonWMCallback,
|
|
||||||
(void*)pycArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* this doesn't work. we pass (func, data) as cdata at creation time, but
|
|
||||||
* only data at destruction, so it won't find it unless we change
|
|
||||||
* WMDeleteTimerWithClientData() to extract data from the tuple, and this
|
|
||||||
* requires access to the internals of WINGs
|
|
||||||
void pyWMDeleteTimerWithClientData(PyObject *pycData) {
|
|
||||||
WMDeleteTimerWithClientData((void*)pycData);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
void pyWMDeleteTimerHandler(void *handlerID) {
|
|
||||||
WMDeleteTimerHandler((WMHandlerID)handlerID);
|
|
||||||
}
|
|
||||||
|
|
||||||
void* pyWMAddIdleHandler(PyObject *pycArgs) {
|
|
||||||
Py_INCREF(pycArgs);
|
|
||||||
return (void*)WMAddIdleHandler(PythonWMCallback, (void*)pycArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pyWMDeleteIdleHandler(void *handlerID) {
|
|
||||||
WMDeleteIdleHandler((WMHandlerID)handlerID);
|
|
||||||
}
|
|
||||||
|
|
||||||
%}
|
|
||||||
|
|
||||||
|
|
||||||
%exception pyWMSetTextFieldDelegate {
|
|
||||||
$function
|
|
||||||
if (PyErr_Occurred()) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
%inline %{
|
|
||||||
void pyWMSetTextFieldDelegate(WMTextField *tPtr, PyObject *txtArgs) {
|
|
||||||
WMTextFieldDelegate *td;
|
|
||||||
|
|
||||||
if (!txtArgs || !PyTuple_Check(txtArgs) || PyTuple_Size(txtArgs)!=2) {
|
|
||||||
PyErr_SetString(PyExc_TypeError, "invalid setting of WMTextField "
|
|
||||||
"delegate. Should be '(self, delegate)'");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// how do I check if txtArgs[1] is an instance of WMTextFieldDelegate?
|
|
||||||
td = WMGetTextFieldDelegate(tPtr);
|
|
||||||
if (!td) {
|
|
||||||
td = (WMTextFieldDelegate*)wmalloc(sizeof(WMTextFieldDelegate));
|
|
||||||
td->didBeginEditing = pyTextFieldDidBeginEditing;
|
|
||||||
td->didChange = pyTextFieldDidChange;
|
|
||||||
td->didEndEditing = pyTextFieldDidEndEditing;
|
|
||||||
td->shouldBeginEditing = pyTextFieldShouldBeginEditing;
|
|
||||||
td->shouldEndEditing = pyTextFieldShouldEndEditing;
|
|
||||||
} else {
|
|
||||||
Py_XDECREF((PyObject*)td->data);
|
|
||||||
}
|
|
||||||
Py_INCREF(txtArgs);
|
|
||||||
td->data = txtArgs;
|
|
||||||
WMSetTextFieldDelegate(tPtr, td);
|
|
||||||
}
|
|
||||||
%}
|
|
||||||
|
|
||||||
|
|
||||||
%inline %{
|
|
||||||
PyObject* pyWMGetTextFieldDelegate(WMTextField *tPtr) {
|
|
||||||
WMTextFieldDelegate *td;
|
|
||||||
PyObject *result, *tuple;
|
|
||||||
|
|
||||||
td = WMGetTextFieldDelegate(tPtr);
|
|
||||||
if (!td) {
|
|
||||||
Py_INCREF(Py_None);
|
|
||||||
return Py_None;
|
|
||||||
}
|
|
||||||
|
|
||||||
tuple = (PyObject*)td->data;
|
|
||||||
if (!tuple || !PyTuple_Check(tuple) || PyTuple_Size(tuple)!=2) {
|
|
||||||
PyErr_SetString(PyExc_TypeError, "invalid TextField delegate");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = PyTuple_GetItem(tuple, 1);
|
|
||||||
if (!result)
|
|
||||||
result = Py_None;
|
|
||||||
|
|
||||||
Py_INCREF(result);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
%}
|
|
||||||
|
|
||||||
|
|
||||||
/* ignore structures we will not use */
|
|
||||||
%ignore ConnectionDelegate;
|
|
||||||
|
|
||||||
/* ignore functions we don't need */
|
|
||||||
// should we ignore vararg functions, or just convert them to functions with
|
|
||||||
// a fixed number of parameters?
|
|
||||||
%varargs(char*) wmessage;
|
|
||||||
//%ignore wmessage;
|
|
||||||
%ignore wwarning;
|
|
||||||
%ignore wfatal;
|
|
||||||
%ignore wsyserror;
|
|
||||||
%ignore wsyserrorwithcode;
|
|
||||||
%ignore WMCreatePLArray;
|
|
||||||
%ignore WMCreatePLDictionary;
|
|
||||||
|
|
||||||
%apply int *INPUT { int *argc };
|
|
||||||
|
|
||||||
#define Bool int
|
|
||||||
|
|
||||||
%include "WINGs/WUtil.h"
|
|
||||||
|
|
||||||
/* ignore structures we will not use */
|
|
||||||
|
|
||||||
/* ignore functions we don't need */
|
|
||||||
|
|
||||||
%include "WINGs/WINGs.h"
|
|
||||||
|
|
||||||
|
|
||||||
%{
|
|
||||||
void
|
|
||||||
WHandleEvents()
|
|
||||||
{
|
|
||||||
/* Check any expired timers */
|
|
||||||
W_CheckTimerHandlers();
|
|
||||||
|
|
||||||
/* Do idle and timer stuff while there are no input events */
|
|
||||||
/* Do not wait for input here. just peek to se if input is available */
|
|
||||||
while (!W_HandleInputEvents(False, -1) && W_CheckIdleHandlers()) {
|
|
||||||
/* dispatch timer events */
|
|
||||||
W_CheckTimerHandlers();
|
|
||||||
}
|
|
||||||
|
|
||||||
W_HandleInputEvents(True, -1);
|
|
||||||
|
|
||||||
/* Check any expired timers */
|
|
||||||
W_CheckTimerHandlers();
|
|
||||||
}
|
|
||||||
%}
|
|
||||||
|
|
||||||
|
|
||||||
/* rewrite functions originally defined as macros */
|
|
||||||
%inline %{
|
|
||||||
#undef WMDuplicateArray
|
|
||||||
WMArray* WMDuplicateArray(WMArray* array) {
|
|
||||||
return WMCreateArrayWithArray(array);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMPushInArray
|
|
||||||
void WMPushInArray(WMArray *array, void *item) {
|
|
||||||
WMAddToArray(array, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMSetInArray
|
|
||||||
void* WMSetInArray(WMArray *array, int index, void *item) {
|
|
||||||
return WMReplaceInArray(array, index, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMRemoveFromArray
|
|
||||||
int WMRemoveFromArray(WMArray *array, void *item) {
|
|
||||||
return WMRemoveFromArrayMatching(array, NULL, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMGetFirstInArray
|
|
||||||
int WMGetFirstInArray(WMArray *array, void *item) {
|
|
||||||
return WMFindInArray(array, NULL, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMCreateBag
|
|
||||||
WMBag* WMCreateBag(int size) {
|
|
||||||
return WMCreateTreeBag();
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMCreateBagWithDestructor
|
|
||||||
WMBag* WMCreateBagWithDestructor(int size, WMFreeDataProc *destructor) {
|
|
||||||
return WMCreateTreeBagWithDestructor(destructor);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMSetInBag
|
|
||||||
void* WMSetInBag(WMBag *bag, int index, void *item) {
|
|
||||||
return WMReplaceInBag(bag, index, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMAddItemToTree
|
|
||||||
WMTreeNode* WMAddItemToTree(WMTreeNode *parent, void *item) {
|
|
||||||
return WMInsertItemInTree(parent, -1, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMAddNodeToTree
|
|
||||||
WMTreeNode* WMAddNodeToTree(WMTreeNode *parent, WMTreeNode *aNode) {
|
|
||||||
return WMInsertNodeInTree(parent, -1, aNode);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMGetFirstInTree
|
|
||||||
/* Returns first tree node that has data == cdata */
|
|
||||||
WMTreeNode* WMGetFirstInTree(WMTreeNode *aTree, void *cdata) {
|
|
||||||
return WMFindInTree(aTree, NULL, cdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMFlushConnection
|
|
||||||
int WMFlushConnection(WMConnection *cPtr) {
|
|
||||||
return WMSendConnectionData(cPtr, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMGetConnectionQueuedData
|
|
||||||
WMArray* WMGetConnectionQueuedData(WMConnection *cPtr) {
|
|
||||||
return WMGetConnectionUnsentData(cPtr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMWidgetClass
|
|
||||||
W_Class WMWidgetClass(WMWidget *widget) {
|
|
||||||
return (((W_WidgetType*)(widget))->widgetClass);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMWidgetView
|
|
||||||
WMView* WMWidgetView(WMWidget *widget) {
|
|
||||||
return (((W_WidgetType*)(widget))->view);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMCreateCommandButton
|
|
||||||
WMButton* WMCreateCommandButton(WMWidget *parent) {
|
|
||||||
return WMCreateCustomButton(parent, WBBSpringLoadedMask|WBBPushInMask
|
|
||||||
|WBBPushLightMask|WBBPushChangeMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMCreateRadioButton
|
|
||||||
WMButton* WMCreateRadioButton(WMWidget *parent) {
|
|
||||||
return WMCreateButton(parent, WBTRadio);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMCreateSwitchButton
|
|
||||||
WMButton* WMCreateSwitchButton(WMWidget *parent) {
|
|
||||||
return WMCreateButton(parent, WBTSwitch);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMAddListItem
|
|
||||||
WMListItem* WMAddListItem(WMList *lPtr, char *text)
|
|
||||||
{
|
|
||||||
return WMInsertListItem(lPtr, -1, text);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMCreateText
|
|
||||||
WMText* WMCreateText(WMWidget *parent) {
|
|
||||||
return WMCreateTextForDocumentType(parent, NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMRefreshText
|
|
||||||
void WMRefreshText(WMText *tPtr) {
|
|
||||||
return WMThawText(tPtr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef WMClearText
|
|
||||||
void WMClearText(WMText *tPtr) {
|
|
||||||
return WMAppendTextStream(tPtr, NULL);
|
|
||||||
}
|
|
||||||
%}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,643 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import wings
|
|
||||||
|
|
||||||
# Some useful constants
|
|
||||||
|
|
||||||
False = 0
|
|
||||||
True = 1
|
|
||||||
|
|
||||||
# check about None as action for buttonAction/windowCloseAction ...
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# Exceptions
|
|
||||||
################################################################################
|
|
||||||
from exceptions import Exception, StandardError
|
|
||||||
|
|
||||||
class Error(StandardError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
del Exception, StandardError
|
|
||||||
|
|
||||||
class WMTimer:
|
|
||||||
def __init__(self, milliseconds, callback, cdata=None, persistent=False):
|
|
||||||
if persistent:
|
|
||||||
self._o = wings.pyWMAddPersistentTimerHandler(milliseconds, (callback, cdata))
|
|
||||||
else:
|
|
||||||
self._o = wings.pyWMAddTimerHandler(milliseconds, (callback, cdata))
|
|
||||||
self.__WMDeleteTimerHandler = wings.pyWMDeleteTimerHandler
|
|
||||||
|
|
||||||
def __del__(self):
|
|
||||||
self.__WMDeleteTimerHandler(self._o)
|
|
||||||
|
|
||||||
|
|
||||||
class WMPersistentTimer(WMTimer):
|
|
||||||
def __init__(self, milliseconds, callback, cdata=None):
|
|
||||||
WMTimer.__init__(self, milliseconds, callback, cdata, persistent=True)
|
|
||||||
|
|
||||||
|
|
||||||
class WMScreen:
|
|
||||||
__readonly = ('display', 'width', 'height', 'depth')
|
|
||||||
|
|
||||||
def __init__(self, appname, display="", simpleapp=False):
|
|
||||||
wings.WMInitializeApplication(appname, len(sys.argv), sys.argv)
|
|
||||||
self._o = wings.pyWMOpenScreen(display, simpleapp)
|
|
||||||
if not self._o:
|
|
||||||
raise Error, "Cannot open display %s" % display
|
|
||||||
self.__dict__['display'] = wings.WMScreenDisplay(self._o)
|
|
||||||
self.__dict__['width'] = wings.WMScreenWidth(self._o)
|
|
||||||
self.__dict__['height'] = wings.WMScreenHeight(self._o)
|
|
||||||
self.__dict__['depth'] = wings.WMScreenDepth(self._o)
|
|
||||||
|
|
||||||
def __setattr__(self, name ,value):
|
|
||||||
if name in self.__readonly:
|
|
||||||
#raise AttributeError, "'%s' is a read-only WMScreen attribute" % name
|
|
||||||
raise Error, "'%s' is a read-only WMScreen attribute" % name
|
|
||||||
self.__dict__[name] = value
|
|
||||||
|
|
||||||
def __delattr__(self, name):
|
|
||||||
if name in self.__readonly:
|
|
||||||
#raise AttributeError, "'%s' attribute cannot be deleted from WMScreen instance" % name
|
|
||||||
raise Error, "'%s' attribute cannot be deleted from WMScreen instance" % name
|
|
||||||
try:
|
|
||||||
del(self.__dict__[name])
|
|
||||||
except KeyError:
|
|
||||||
raise AttributeError, "%s instance has no attribute '%s'" % \
|
|
||||||
(self.__class__.__name__, name)
|
|
||||||
|
|
||||||
def mainLoop(self):
|
|
||||||
wings.pyWMScreenMainLoop(self._o)
|
|
||||||
|
|
||||||
def breakMainLoop(self):
|
|
||||||
wings.pyWMBreakScreenMainLoop(self._o)
|
|
||||||
|
|
||||||
def runModalLoop(self, view):
|
|
||||||
wings.pyWMRunModalLoop(self._o, view)
|
|
||||||
|
|
||||||
def breakModalLoop(self):
|
|
||||||
wings.WMBreakModalLoop(self._o)
|
|
||||||
|
|
||||||
def size(self):
|
|
||||||
return (self.width, self.height)
|
|
||||||
|
|
||||||
|
|
||||||
class WMView:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class WMWidget(WMView):
|
|
||||||
def __init__(self):
|
|
||||||
if self.__class__ == WMWidget:
|
|
||||||
raise Error, "a WMWidget can't be instantiated directly"
|
|
||||||
self._o = None
|
|
||||||
self.__WMDestroyWidget = wings.WMDestroyWidget
|
|
||||||
|
|
||||||
def __del__(self):
|
|
||||||
if self._o is not None:
|
|
||||||
self.__WMDestroyWidget(self._o)
|
|
||||||
|
|
||||||
def resize(self, width, height):
|
|
||||||
wings.WMResizeWidget(self._o, width, height)
|
|
||||||
|
|
||||||
def move(self, x, y):
|
|
||||||
wings.WMMoveWidget(self._o, x, y)
|
|
||||||
|
|
||||||
def realize(self):
|
|
||||||
wings.WMRealizeWidget(self._o)
|
|
||||||
|
|
||||||
def show(self):
|
|
||||||
wings.WMMapWidget(self._o)
|
|
||||||
|
|
||||||
def hide(self):
|
|
||||||
wings.WMUnmapWidget(self._o)
|
|
||||||
|
|
||||||
def redisplay(self):
|
|
||||||
wings.WMRedisplayWidget(self._o)
|
|
||||||
|
|
||||||
def width(self):
|
|
||||||
return wings.WMWidgetWidth(self._o)
|
|
||||||
|
|
||||||
def height(self):
|
|
||||||
return wings.WMWidgetHeight(self._o)
|
|
||||||
|
|
||||||
def screen(self):
|
|
||||||
return wings.WMWidgetScreen(self._o)
|
|
||||||
|
|
||||||
def view(self):
|
|
||||||
return wings.WMWidgetView(self._o)
|
|
||||||
|
|
||||||
def setFocusTo(self, other):
|
|
||||||
wings.WMSetFocusToWidget(other._o)
|
|
||||||
|
|
||||||
|
|
||||||
class WMWindow(WMWidget):
|
|
||||||
def __init__(self, screen, name, style=wings.WMTitledWindowMask
|
|
||||||
|wings.WMClosableWindowMask|wings.WMMiniaturizableWindowMask
|
|
||||||
|wings.WMResizableWindowMask):
|
|
||||||
WMWidget.__init__(self)
|
|
||||||
self._o = wings.WMCreateWindowWithStyle(screen._o, name, style)
|
|
||||||
|
|
||||||
def setMinSize(self, minWidth, minHeight):
|
|
||||||
wings.WMSetWindowMinSize(self._o, minWidth, minHeight)
|
|
||||||
|
|
||||||
def setMaxSize(self, maxWidth, maxHeight):
|
|
||||||
wings.WMSetWindowMaxSize(self._o, maxWidth, maxHeight)
|
|
||||||
|
|
||||||
def setInitialPosition(self, x, y):
|
|
||||||
wings.WMSetWindowInitialPosition(self._o, x, y)
|
|
||||||
|
|
||||||
def setTitle(self, title):
|
|
||||||
wings.WMSetWindowTitle(self._o, title)
|
|
||||||
|
|
||||||
def setCloseAction(self, action, data=None):
|
|
||||||
if action!=None and (not callable(action)):
|
|
||||||
raise Error, "action needs to be a callable object or None"
|
|
||||||
wings.pyWMSetWindowCloseAction(self._o, (self, action, data))
|
|
||||||
|
|
||||||
|
|
||||||
class WMPanel(WMWindow):
|
|
||||||
def __init__(self, owner, name, style=wings.WMTitledWindowMask
|
|
||||||
|wings.WMClosableWindowMask|wings.WMResizableWindowMask):
|
|
||||||
WMWidget.__init__(self)
|
|
||||||
self._o = wings.WMCreatePanelWithStyleForWindow(owner._o, name, style)
|
|
||||||
|
|
||||||
class WMFrame(WMWidget):
|
|
||||||
def __init__(self, parent, title=None):
|
|
||||||
WMWidget.__init__(self)
|
|
||||||
self._o = wings.WMCreateFrame(parent._o)
|
|
||||||
self.setTitle(title)
|
|
||||||
|
|
||||||
def setRelief(self, relief):
|
|
||||||
wings.WMSetFrameRelief(self._o, relief)
|
|
||||||
|
|
||||||
def setTitle(self, title=""):
|
|
||||||
wings.WMSetFrameTitle(self._o, title)
|
|
||||||
|
|
||||||
def setTitlePosition(self, position):
|
|
||||||
wings.WMSetFrameTitlePosition(self._o, position)
|
|
||||||
|
|
||||||
class WMLabel(WMWidget):
|
|
||||||
def __init__(self, parent, text=None):
|
|
||||||
WMWidget.__init__(self)
|
|
||||||
self._o = wings.WMCreateLabel(parent._o)
|
|
||||||
self.setText(text)
|
|
||||||
|
|
||||||
def setWraps(self, flag):
|
|
||||||
# bool(flag) for python2.2
|
|
||||||
wings.WMSetLabelWraps(self._o, flag)
|
|
||||||
|
|
||||||
def setRelief(self, relief):
|
|
||||||
wings.WMSetLabelRelief(self._o, relief)
|
|
||||||
|
|
||||||
def setText(self, text=""):
|
|
||||||
wings.WMSetLabelText(self._o, text)
|
|
||||||
|
|
||||||
def setTextColor(self, color):
|
|
||||||
wings.WMSetLabelTextColor(self._o, color)
|
|
||||||
|
|
||||||
def setFont(self, font):
|
|
||||||
wings.WMSetLabelFont(self._o, font)
|
|
||||||
|
|
||||||
def setTextAlignment(self, alignment):
|
|
||||||
wings.WMSetLabelTextAlignment(self._o, alignment)
|
|
||||||
|
|
||||||
def setImage(self, image):
|
|
||||||
wings.WMSetLabelImage(self._o, image)
|
|
||||||
|
|
||||||
def setImagePosition(self, position):
|
|
||||||
wings.WMSetLabelImagePosition(self._o, position)
|
|
||||||
|
|
||||||
def text(self):
|
|
||||||
return wings.WMGetLabelText(self._o)
|
|
||||||
|
|
||||||
def font(self):
|
|
||||||
return wings.WMGetLabelFont(self._o)
|
|
||||||
|
|
||||||
def image(self):
|
|
||||||
return wings.WMGetLabelImage(self._o)
|
|
||||||
|
|
||||||
|
|
||||||
class WMBox(WMWidget):
|
|
||||||
def __init__(self, parent):
|
|
||||||
WMWidget.__init__(self)
|
|
||||||
self._o = wings.WMCreateBox(parent._o)
|
|
||||||
|
|
||||||
def setHorizontal(self, flag):
|
|
||||||
# bool(flag) for python2.2
|
|
||||||
wings.WMSetBoxHorizontal(self._o, flag)
|
|
||||||
|
|
||||||
def setBorderWidth(self, width):
|
|
||||||
wings.WMSetBoxBorderWidth(self._o, width)
|
|
||||||
|
|
||||||
def addSubview(self, view, expand, fill, minSize, maxSize, space):
|
|
||||||
wings.WMAddBoxSubview(self._o, view, expand, fill, minSize, maxSixe, space)
|
|
||||||
|
|
||||||
def addSubviewAtEnd(self, view, expand, fill, minSize, maxSize, space):
|
|
||||||
wings.WMAddBoxSubviewAtEnd(self._o, view, expand, fill, minSize, maxSixe, space)
|
|
||||||
|
|
||||||
def removeSubview(self, view):
|
|
||||||
wings.WMRemoveBoxSubview(self._o, view)
|
|
||||||
|
|
||||||
|
|
||||||
class WMButton(WMWidget): # not for user instantiation
|
|
||||||
def __init__(self, parent):
|
|
||||||
WMWidget.__init__(self)
|
|
||||||
if self.__class__ == WMButton:
|
|
||||||
raise Error, "a WMButton can't be instantiated directly"
|
|
||||||
|
|
||||||
|
|
||||||
def setText(self, text=""):
|
|
||||||
wings.WMSetButtonText(self._o, text)
|
|
||||||
|
|
||||||
def setAction(self, action, data=None):
|
|
||||||
if action!=None and (not callable(action)):
|
|
||||||
raise Error, "action needs to be a callable object or None"
|
|
||||||
wings.pyWMSetButtonAction(self._o, (self, action, data))
|
|
||||||
|
|
||||||
def performClick(self):
|
|
||||||
wings.WMPerformButtonClick(self._o)
|
|
||||||
|
|
||||||
def setEnabled(self, flag):
|
|
||||||
# bool(flag) for python2.2
|
|
||||||
wings.WMSetButtonEnabled(self._o, flag)
|
|
||||||
|
|
||||||
def isEnabled(self):
|
|
||||||
return wings.WMGetButtonEnabled(self._o)
|
|
||||||
|
|
||||||
def setImageDimsWhenDisabled(self, flag):
|
|
||||||
# bool(flag)
|
|
||||||
wings.WMSetButtonImageDimsWhenDisabled(self._o, flag)
|
|
||||||
|
|
||||||
def setImage(self, image):
|
|
||||||
wings.WMSetButtonImage(self_.o, image)
|
|
||||||
|
|
||||||
def setAlternateImage(self, image):
|
|
||||||
wings.WMSetButtonAltImage(self._o, image)
|
|
||||||
|
|
||||||
def setImagePosition(self, position):
|
|
||||||
wings.WMSetButtonImagePosition(self._o, position)
|
|
||||||
|
|
||||||
def setImageDefault(self):
|
|
||||||
wings.WMSetButtonImageDefault(self._o)
|
|
||||||
|
|
||||||
|
|
||||||
class WMCommandButton(WMButton):
|
|
||||||
def __init__(self, parent):
|
|
||||||
WMButton.__init__(self, parent)
|
|
||||||
self._o = wings.WMCreateCommandButton(parent._o)
|
|
||||||
|
|
||||||
|
|
||||||
class WMSwitchButton(WMButton):
|
|
||||||
def __init__(self, parent):
|
|
||||||
WMButton.__init__(self, parent)
|
|
||||||
self._o = wings.WMCreateSwitchButton(parent._o)
|
|
||||||
|
|
||||||
|
|
||||||
class WMRadioButton(WMButton):
|
|
||||||
def __init__(self, parent, group=None):
|
|
||||||
WMButton.__init__(self, parent)
|
|
||||||
self._o = wings.WMCreateRadioButton(parent._o)
|
|
||||||
if group:
|
|
||||||
wings.WMGroupButtons(group._o, self._o)
|
|
||||||
|
|
||||||
|
|
||||||
class WMListItem:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class WMList(WMWidget):
|
|
||||||
def __init__(self, parent):
|
|
||||||
WMWidget.__init__(self)
|
|
||||||
self._o = wings.WMCreateList(parent._o)
|
|
||||||
|
|
||||||
def allowEmptySelection(self, flag):
|
|
||||||
# bool(flag)
|
|
||||||
wings.WMSetListAllowEmptySelection(self._o, flag)
|
|
||||||
|
|
||||||
def allowMultipleSelection(self, flag):
|
|
||||||
# bool(flag)
|
|
||||||
wings.WMSetListAllowMultipleSelection(self._o, flag)
|
|
||||||
|
|
||||||
def addItem(self, item):
|
|
||||||
wings.WMAddListItem(self._o, item)
|
|
||||||
|
|
||||||
def insertItem(self, row, item):
|
|
||||||
wings.WMInsertListItem(self._o, row, item)
|
|
||||||
|
|
||||||
def sortItems(self):
|
|
||||||
wings.WMSortListItems(self._o)
|
|
||||||
|
|
||||||
def rowWithTitle(self, title):
|
|
||||||
return wings.WMFindRowOfListItemWithTitle(self._o, title)
|
|
||||||
|
|
||||||
def selectedItemRow(self):
|
|
||||||
return wings.WMGetListSelectedItemRow(self._o)
|
|
||||||
|
|
||||||
def selectedItem(self):
|
|
||||||
return wings.WMGetListSelectedItem(self._o)
|
|
||||||
|
|
||||||
def removeItem(self, index):
|
|
||||||
wings.WMRemoveListItem(self._o, index)
|
|
||||||
|
|
||||||
def selectItem(self, index):
|
|
||||||
wings.WMSelectListItem(self._o, index)
|
|
||||||
|
|
||||||
def unselectItem(self, index):
|
|
||||||
wings.WMUnselectListItem(self._o, index)
|
|
||||||
|
|
||||||
|
|
||||||
class WMTextFieldDelegate:
|
|
||||||
__callbacks = ('didBeginEditing', 'didChange', 'didEndEditing',
|
|
||||||
'shouldBeginEditing', 'shouldEndEditing')
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self.__dict__['data'] = None
|
|
||||||
self.__dict__['didBeginEditing'] = None
|
|
||||||
self.__dict__['didChange'] = None
|
|
||||||
self.__dict__['didEndEditing'] = None
|
|
||||||
self.__dict__['shouldBeginEditing'] = None
|
|
||||||
self.__dict__['shouldEndEditing'] = None
|
|
||||||
|
|
||||||
def __setattr__(self, name ,value):
|
|
||||||
if name in self.__callbacks and value!=None and (not callable(value)):
|
|
||||||
#raise AttributeError, "%s.%s needs to be a callable object or None" % (self.__class__.__name__, name)
|
|
||||||
raise Error, "%s.%s needs to be a callable object or None" % (self.__class__.__name__, name)
|
|
||||||
else:
|
|
||||||
self.__dict__[name] = value
|
|
||||||
|
|
||||||
|
|
||||||
class WMTextField(WMWidget):
|
|
||||||
def __init__(self, parent, text=""):
|
|
||||||
WMWidget.__init__(self)
|
|
||||||
self._o = wings.WMCreateTextField(parent._o)
|
|
||||||
wings.WMSetTextFieldText(self._o, text)
|
|
||||||
|
|
||||||
def setDelegate(self, delegate):
|
|
||||||
if delegate.__class__ != WMTextFieldDelegate:
|
|
||||||
raise Error, "textfield delegate must be of type 'WMTextFieldDelegate'"
|
|
||||||
wings.pyWMSetTextFieldDelegate(self._o, (self, delegate))
|
|
||||||
|
|
||||||
def delegate(self):
|
|
||||||
return wings.pyWMGetTextFieldDelegate(self._o)
|
|
||||||
|
|
||||||
def text(self):
|
|
||||||
return wings.WMGetTextFieldText(self._o)
|
|
||||||
|
|
||||||
def setEditable(self, flag):
|
|
||||||
# bool(flag)
|
|
||||||
wings.WMSetTextFieldEditable(self._o, flag)
|
|
||||||
|
|
||||||
def setBordered(self, flag):
|
|
||||||
# bool(flag)
|
|
||||||
wings.WMSetTextFieldBordered(self._o, flag)
|
|
||||||
|
|
||||||
def setBeveled(self, flag):
|
|
||||||
# bool(flag)
|
|
||||||
wings.WMSetTextFieldBeveled(self._o, flag)
|
|
||||||
|
|
||||||
def setSecure(self, flag):
|
|
||||||
# bool(flag)
|
|
||||||
wings.WMSetTextFieldSecure(self._o, flag)
|
|
||||||
|
|
||||||
def setCursorPosition(self, position):
|
|
||||||
wings.WMSetTextFieldCursorPosition(self._o, position)
|
|
||||||
|
|
||||||
def setNextText(self, next):
|
|
||||||
wings.WMSetTextFieldNextTextField(self._o, next._o)
|
|
||||||
|
|
||||||
def setPreviousText(self, previous):
|
|
||||||
wings.WMSetTextFieldPrevTextField(self._o, previous._o)
|
|
||||||
|
|
||||||
def setTextAlignment(self, alignment):
|
|
||||||
wings.WMSetTextFieldAlignment(self._o, alignment)
|
|
||||||
|
|
||||||
def isEditable(self):
|
|
||||||
return wings.WMGetTextFieldEditable(self._o)
|
|
||||||
|
|
||||||
def insertText(self, text, position):
|
|
||||||
wings.WMInsertTextFieldText(self._o, text, position)
|
|
||||||
|
|
||||||
def deleteText(self, start, count):
|
|
||||||
wings.WMDeleteTextFieldRange(self._o, wings.wmkrange(start, count))
|
|
||||||
|
|
||||||
def selectText(self, start, count):
|
|
||||||
wings.WMSelectTextFieldRange(self._o, wings.wmkrange(start, count))
|
|
||||||
|
|
||||||
def setFont(self, font):
|
|
||||||
wings.WMSetTextFieldFont(self._o, font)
|
|
||||||
|
|
||||||
def font(self):
|
|
||||||
return wings.WMGetTextFieldFont(self._o)
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# wrap the WINGs constants so we don't need wings.constant_name
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
# WMWindow title style
|
|
||||||
WMTitledWindowMask = wings.WMTitledWindowMask
|
|
||||||
WMClosableWindowMask = wings.WMClosableWindowMask
|
|
||||||
WMMiniaturizableWindowMask = wings.WMMiniaturizableWindowMask
|
|
||||||
WMResizableWindowMask = wings.WMResizableWindowMask
|
|
||||||
|
|
||||||
# WMFrame title positions
|
|
||||||
WTPNoTitle = wings.WTPNoTitle
|
|
||||||
WTPAboveTop = wings.WTPAboveTop
|
|
||||||
WTPAtTop = wings.WTPAtTop
|
|
||||||
WTPBelowTop = wings.WTPBelowTop
|
|
||||||
WTPAboveBottom = wings.WTPAboveBottom
|
|
||||||
WTPAtBottom = wings.WTPAtBottom
|
|
||||||
WTPBelowBottom = wings.WTPBelowBottom
|
|
||||||
|
|
||||||
# Alingments
|
|
||||||
WALeft = wings.WALeft
|
|
||||||
WACenter = wings.WACenter
|
|
||||||
WARight = wings.WARight
|
|
||||||
WAJustified = wings.WAJustified # not valid for textfields
|
|
||||||
|
|
||||||
# Image positions
|
|
||||||
WIPNoImage = wings.WIPNoImage
|
|
||||||
WIPImageOnly = wings.WIPImageOnly
|
|
||||||
WIPLeft = wings.WIPLeft
|
|
||||||
WIPRight = wings.WIPRight
|
|
||||||
WIPBelow = wings.WIPBelow
|
|
||||||
WIPAbove = wings.WIPAbove
|
|
||||||
WIPOverlaps = wings.WIPOverlaps
|
|
||||||
|
|
||||||
# Relief types
|
|
||||||
WRFlat = wings.WRFlat
|
|
||||||
WRSimple = wings.WRSimple
|
|
||||||
WRRaised = wings.WRRaised
|
|
||||||
WRSunken = wings.WRSunken
|
|
||||||
WRGroove = wings.WRGroove
|
|
||||||
WRRidge = wings.WRRidge
|
|
||||||
WRPushed = wings.WRPushed
|
|
||||||
|
|
||||||
|
|
||||||
# TextField events
|
|
||||||
WMReturnTextMovement = wings.WMReturnTextMovement
|
|
||||||
WMEscapeTextMovement = wings.WMEscapeTextMovement
|
|
||||||
WMIllegalTextMovement = wings.WMIllegalTextMovement
|
|
||||||
WMTabTextMovement = wings.WMTabTextMovement
|
|
||||||
WMBacktabTextMovement = wings.WMBacktabTextMovement
|
|
||||||
WMLeftTextMovement = wings.WMLeftTextMovement
|
|
||||||
WMRightTextMovement = wings.WMRightTextMovement
|
|
||||||
WMUpTextMovement = wings.WMUpTextMovement
|
|
||||||
WMDownTextMovement = wings.WMDownTextMovement
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
def quit(obj, data):
|
|
||||||
#sys.exit()
|
|
||||||
scr.breakMainLoop()
|
|
||||||
|
|
||||||
def click(btn, list):
|
|
||||||
print win.width(), win.height()
|
|
||||||
print list.selectedItemRow()
|
|
||||||
win2.show()
|
|
||||||
scr.runModalLoop(win2.view())
|
|
||||||
print txt2.text()
|
|
||||||
|
|
||||||
def sayhi(btn, data):
|
|
||||||
print "hi"
|
|
||||||
|
|
||||||
def breakLoop(btn, data):
|
|
||||||
#sys.exit()
|
|
||||||
scr.breakModalLoop()
|
|
||||||
win2.hide()
|
|
||||||
|
|
||||||
def dc(object, data, action):
|
|
||||||
print "didChange:", object, data, action
|
|
||||||
|
|
||||||
def dbe(object, data, action):
|
|
||||||
print "didBeginEditing:", object, data, action
|
|
||||||
|
|
||||||
def dee(object, data, action):
|
|
||||||
if action == wings.WMReturnTextMovement:
|
|
||||||
if object == txt:
|
|
||||||
object.setFocusTo(txt2)
|
|
||||||
else:
|
|
||||||
object.setFocusTo(txt)
|
|
||||||
print "didEndEditing:", object, data, action, object.text()
|
|
||||||
|
|
||||||
def tcb(one):
|
|
||||||
old = list.selectedItemRow()
|
|
||||||
list.selectItem(list.index)
|
|
||||||
list.unselectItem(old)
|
|
||||||
list.index = (list.index+1) % 3
|
|
||||||
#print one
|
|
||||||
|
|
||||||
scr = WMScreen("foobar")
|
|
||||||
win = WMWindow(scr, "aWindow")
|
|
||||||
win.setCloseAction(quit)
|
|
||||||
win.setTitle("test window")
|
|
||||||
win.resize(400, 180)
|
|
||||||
win.setInitialPosition((scr.width-win.width())/2, (scr.height-win.height())/2)
|
|
||||||
|
|
||||||
btn = WMCommandButton(win)
|
|
||||||
btn.setText("Click Me")
|
|
||||||
btn.resize(100, 25)
|
|
||||||
btn.move(20, 20)
|
|
||||||
btn.show()
|
|
||||||
|
|
||||||
sw = WMSwitchButton(win)
|
|
||||||
sw.setText("Some option")
|
|
||||||
sw.resize(100, 25)
|
|
||||||
sw.move(20, 50)
|
|
||||||
sw.show()
|
|
||||||
|
|
||||||
radios = []
|
|
||||||
r = None
|
|
||||||
j = 0
|
|
||||||
for i in ["One", "Two", "Four"]:
|
|
||||||
r = WMRadioButton(win, r)
|
|
||||||
radios.append(r)
|
|
||||||
r.show()
|
|
||||||
r.setText(i)
|
|
||||||
r.move(20, 70+j*25)
|
|
||||||
r.resize(100, 25)
|
|
||||||
j=j+1
|
|
||||||
|
|
||||||
sw.setAction(sayhi)
|
|
||||||
|
|
||||||
list = WMList(win)
|
|
||||||
list.resize(100,100)
|
|
||||||
list.move(130, 20)
|
|
||||||
list.addItem("one")
|
|
||||||
list.addItem("two")
|
|
||||||
list.addItem("three")
|
|
||||||
list.allowMultipleSelection(1)
|
|
||||||
list.show()
|
|
||||||
list.index = 0
|
|
||||||
|
|
||||||
txtdel = WMTextFieldDelegate()
|
|
||||||
txtdel.data = 'mydata'
|
|
||||||
txtdel.didBeginEditing = dbe
|
|
||||||
txtdel.didEndEditing = dee
|
|
||||||
txtdel.didChange = dc
|
|
||||||
|
|
||||||
txt = WMTextField(win, "abc")
|
|
||||||
txt.resize(95, 20)
|
|
||||||
txt.move(295, 20)
|
|
||||||
txt.setDelegate(txtdel)
|
|
||||||
txt.show()
|
|
||||||
txt2 = WMTextField(win, "01234567890")
|
|
||||||
txt2.resize(95, 20)
|
|
||||||
txt2.move(295, 45)
|
|
||||||
txt2.setDelegate(txtdel)
|
|
||||||
txt2.show()
|
|
||||||
|
|
||||||
txt.setNextText(txt2)
|
|
||||||
txt2.setNextText(txt)
|
|
||||||
|
|
||||||
label = WMLabel(win, "Text1:")
|
|
||||||
label.setTextAlignment(WARight)
|
|
||||||
label.move(240, 20)
|
|
||||||
label.resize(55, 20)
|
|
||||||
label.show()
|
|
||||||
|
|
||||||
label2 = WMLabel(win, "mytext2:")
|
|
||||||
label2.setTextAlignment(WARight)
|
|
||||||
label2.move(240, 45)
|
|
||||||
label2.resize(55, 20)
|
|
||||||
label2.show()
|
|
||||||
|
|
||||||
btn.setAction(click, list)
|
|
||||||
|
|
||||||
frame = WMFrame(win, "My Frame")
|
|
||||||
frame.resize(150, 50)
|
|
||||||
frame.move(240, 70)
|
|
||||||
#frame.setRelief(WRPushed)
|
|
||||||
frame.show()
|
|
||||||
|
|
||||||
ebtn = WMCommandButton(win)
|
|
||||||
ebtn.setText("Exit")
|
|
||||||
ebtn.resize(100, 25)
|
|
||||||
ebtn.move(290, 147)
|
|
||||||
ebtn.setAction(quit)
|
|
||||||
ebtn.show()
|
|
||||||
|
|
||||||
win.realize()
|
|
||||||
win.show()
|
|
||||||
|
|
||||||
timer = WMPersistentTimer(1000, tcb, win)
|
|
||||||
#del(timer)
|
|
||||||
#timer.delete()
|
|
||||||
|
|
||||||
win2 = WMPanel(win, "anotherWindow", WMTitledWindowMask)
|
|
||||||
win2.setTitle("transient test window")
|
|
||||||
win2.resize(150, 50)
|
|
||||||
win2.setInitialPosition((scr.width-win2.width())/2, (scr.height-win2.height())/2)
|
|
||||||
|
|
||||||
btn7 = WMCommandButton(win2)
|
|
||||||
btn7.setText("Dismiss")
|
|
||||||
btn7.resize(100, 25)
|
|
||||||
btn7.move(27, 10)
|
|
||||||
btn7.show()
|
|
||||||
btn7.setAction(breakLoop)
|
|
||||||
|
|
||||||
win2.realize()
|
|
||||||
|
|
||||||
scr.mainLoop()
|
|
||||||
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
"""Setup script for the WINGs module distribution."""
|
|
||||||
|
|
||||||
import os, sys
|
|
||||||
from distutils.core import setup
|
|
||||||
from distutils.extension import Extension
|
|
||||||
|
|
||||||
## Get the include dirs
|
|
||||||
wings = os.popen("get-wings-flags --cflags", "r")
|
|
||||||
flags = wings.read().split()
|
|
||||||
include_dirs = [x[2:] for x in flags]
|
|
||||||
#include_dirs += [".."]
|
|
||||||
wings.close()
|
|
||||||
|
|
||||||
## Get the library dirs
|
|
||||||
wings = os.popen("get-wings-flags --ldflags", "r")
|
|
||||||
flags = wings.read().split()
|
|
||||||
library_dirs = [x[2:] for x in flags]
|
|
||||||
#library_dirs += [".."]
|
|
||||||
wings.close()
|
|
||||||
|
|
||||||
## Get the libraries
|
|
||||||
wings = os.popen("get-wings-flags --libs", "r")
|
|
||||||
flags = wings.read().split()
|
|
||||||
libraries = [x[2:] for x in flags]
|
|
||||||
wings.close()
|
|
||||||
|
|
||||||
runtime_library_dirs = []
|
|
||||||
extra_objects = []
|
|
||||||
extra_compile_args = ['-Wno-strict-prototypes', '-Wno-unused']
|
|
||||||
|
|
||||||
long_description = \
|
|
||||||
"""Python interface to the WINGs library
|
|
||||||
|
|
||||||
Python WINGs is an interface to WINGs, a small widget set with the
|
|
||||||
N*XTSTEP look and feel. It's API is inspired in OpenStep and it's
|
|
||||||
implementation borrows some ideas from Tk. It has a reasonable set of
|
|
||||||
widgets, sufficient for building small applications (like a CDPlayer
|
|
||||||
or hacking something like rxvt). It also has other functions that are
|
|
||||||
usefull for applications, like a User Defaults alike configuration
|
|
||||||
manager and a notification system.
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
setup (# Distribution meta-data
|
|
||||||
name = "Python-WINGs",
|
|
||||||
version = "0.81.0",
|
|
||||||
description = "A python interface to WINGs",
|
|
||||||
long_description=long_description,
|
|
||||||
author = "Dan Pascu",
|
|
||||||
author_email = "dan@windowmaker.info",
|
|
||||||
license = "GPL",
|
|
||||||
platforms = "ALL",
|
|
||||||
url = "http://windowmaker.info/",
|
|
||||||
|
|
||||||
# Description of the modules and packages in the distribution
|
|
||||||
|
|
||||||
py_modules = ["WINGs"],
|
|
||||||
|
|
||||||
ext_modules = [Extension(
|
|
||||||
name='wings',
|
|
||||||
sources=['WINGs.c'],
|
|
||||||
include_dirs=include_dirs,
|
|
||||||
library_dirs=library_dirs,
|
|
||||||
runtime_library_dirs=runtime_library_dirs,
|
|
||||||
libraries=libraries,
|
|
||||||
extra_objects=extra_objects,
|
|
||||||
extra_compile_args=extra_compile_args,
|
|
||||||
)],
|
|
||||||
)
|
|
||||||
@@ -1,159 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
import sys
|
|
||||||
from WINGs import *
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
def quit(obj, data):
|
|
||||||
#sys.exit()
|
|
||||||
scr.breakMainLoop()
|
|
||||||
|
|
||||||
def click(btn, list):
|
|
||||||
print win.width(), win.height()
|
|
||||||
print list.selectedItemRow()
|
|
||||||
win2.show()
|
|
||||||
scr.runModalLoop(win2.view())
|
|
||||||
print txt2.text()
|
|
||||||
|
|
||||||
def sayhi(btn, data):
|
|
||||||
print "hi"
|
|
||||||
|
|
||||||
def breakLoop(btn, data):
|
|
||||||
#sys.exit()
|
|
||||||
scr.breakModalLoop()
|
|
||||||
win2.hide()
|
|
||||||
|
|
||||||
def dc(object, data, action):
|
|
||||||
print "didChange:", object, data, action
|
|
||||||
|
|
||||||
def dbe(object, data, action):
|
|
||||||
print "didBeginEditing:", object, data, action
|
|
||||||
|
|
||||||
def dee(object, data, action):
|
|
||||||
if action == wings.WMReturnTextMovement:
|
|
||||||
if object == txt:
|
|
||||||
object.setFocusTo(txt2)
|
|
||||||
else:
|
|
||||||
object.setFocusTo(txt)
|
|
||||||
print "didEndEditing:", object, data, action, object.text()
|
|
||||||
|
|
||||||
def tcb(one):
|
|
||||||
old = list.selectedItemRow()
|
|
||||||
list.selectItem(list.index)
|
|
||||||
list.unselectItem(old)
|
|
||||||
list.index = (list.index+1) % 3
|
|
||||||
#print one
|
|
||||||
|
|
||||||
scr = WMScreen("foobar")
|
|
||||||
win = WMWindow(scr, "aWindow")
|
|
||||||
win.setCloseAction(quit)
|
|
||||||
win.setTitle("test window")
|
|
||||||
win.resize(400, 180)
|
|
||||||
win.setInitialPosition((scr.width-win.width())/2, (scr.height-win.height())/2)
|
|
||||||
|
|
||||||
btn = WMCommandButton(win)
|
|
||||||
btn.setText("Click Me")
|
|
||||||
btn.resize(100, 25)
|
|
||||||
btn.move(20, 20)
|
|
||||||
btn.show()
|
|
||||||
|
|
||||||
sw = WMSwitchButton(win)
|
|
||||||
sw.setText("Some option")
|
|
||||||
sw.resize(100, 25)
|
|
||||||
sw.move(20, 50)
|
|
||||||
sw.show()
|
|
||||||
|
|
||||||
radios = []
|
|
||||||
r = None
|
|
||||||
j = 0
|
|
||||||
for i in ["One", "Two", "Four"]:
|
|
||||||
r = WMRadioButton(win, r)
|
|
||||||
radios.append(r)
|
|
||||||
r.show()
|
|
||||||
r.setText(i)
|
|
||||||
r.move(20, 70+j*25)
|
|
||||||
r.resize(100, 25)
|
|
||||||
j=j+1
|
|
||||||
|
|
||||||
sw.setAction(sayhi)
|
|
||||||
|
|
||||||
list = WMList(win)
|
|
||||||
list.resize(100,100)
|
|
||||||
list.move(130, 20)
|
|
||||||
list.addItem("one")
|
|
||||||
list.addItem("two")
|
|
||||||
list.addItem("three")
|
|
||||||
list.allowMultipleSelection(1)
|
|
||||||
list.show()
|
|
||||||
list.index = 0
|
|
||||||
|
|
||||||
txtdel = WMTextFieldDelegate()
|
|
||||||
txtdel.data = 'mydata'
|
|
||||||
txtdel.didBeginEditing = dbe
|
|
||||||
txtdel.didEndEditing = dee
|
|
||||||
txtdel.didChange = dc
|
|
||||||
|
|
||||||
txt = WMTextField(win)
|
|
||||||
txt.resize(95, 20)
|
|
||||||
txt.move(295, 20)
|
|
||||||
txt.setDelegate(txtdel)
|
|
||||||
txt.show()
|
|
||||||
txt2 = WMTextField(win, "01234567890")
|
|
||||||
txt2.resize(95, 20)
|
|
||||||
txt2.move(295, 45)
|
|
||||||
txt2.setDelegate(txtdel)
|
|
||||||
txt2.show()
|
|
||||||
|
|
||||||
txt.setNextText(txt2)
|
|
||||||
txt2.setNextText(txt)
|
|
||||||
|
|
||||||
label = WMLabel(win, "Text1:")
|
|
||||||
label.setTextAlignment(WARight)
|
|
||||||
label.move(240, 20)
|
|
||||||
label.resize(55, 20)
|
|
||||||
label.show()
|
|
||||||
|
|
||||||
label2 = WMLabel(win, "mytext2:")
|
|
||||||
label2.setTextAlignment(WARight)
|
|
||||||
label2.move(240, 45)
|
|
||||||
label2.resize(55, 20)
|
|
||||||
label2.show()
|
|
||||||
|
|
||||||
btn.setAction(click, list)
|
|
||||||
|
|
||||||
frame = WMFrame(win, "My Frame")
|
|
||||||
frame.resize(150, 50)
|
|
||||||
frame.move(240, 70)
|
|
||||||
#frame.setRelief(WRPushed)
|
|
||||||
frame.show()
|
|
||||||
|
|
||||||
ebtn = WMCommandButton(win)
|
|
||||||
ebtn.setText("Exit")
|
|
||||||
ebtn.resize(100, 25)
|
|
||||||
ebtn.move(290, 147)
|
|
||||||
ebtn.setAction(quit)
|
|
||||||
ebtn.show()
|
|
||||||
|
|
||||||
win.realize()
|
|
||||||
win.show()
|
|
||||||
|
|
||||||
timer = WMPersistentTimer(1000, tcb, win)
|
|
||||||
#del(timer)
|
|
||||||
#timer.delete()
|
|
||||||
|
|
||||||
win2 = WMPanel(win, "anotherWindow", WMTitledWindowMask)
|
|
||||||
win2.setTitle("transient test window")
|
|
||||||
win2.resize(150, 50)
|
|
||||||
win2.setInitialPosition((scr.width-win2.width())/2, (scr.height-win2.height())/2)
|
|
||||||
|
|
||||||
btn7 = WMCommandButton(win2)
|
|
||||||
btn7.setText("Dismiss")
|
|
||||||
btn7.resize(100, 25)
|
|
||||||
btn7.move(27, 10)
|
|
||||||
btn7.show()
|
|
||||||
btn7.setAction(breakLoop)
|
|
||||||
|
|
||||||
win2.realize()
|
|
||||||
|
|
||||||
scr.mainLoop()
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user