1 /* File : Fl_Menu_.i */ 2 //%module Fl_Menu_ 3 4 %feature("docstring") ::Fl_Menu_ 5 """ 6 All widgets that have a menu in FLTK are subclassed off of this class. 7 Currently FLTK provides you with Fl_Menu_Button, Fl_Menu_Bar, and Fl_Choice . 8 9 The class contains a pointer to an array of structures of type Fl_Menu_Item. 10 The array may either be supplied directly by the user program, or it may be 11 'private': a dynamically allocated array managed by the Fl_Menu_. 12 """ ; 13 14 %{ 15 #include "FL/Fl_Menu_.H" 16 #include <menu_item.h> 17 %} 18 19 %include "macros.i" 20 21 CHANGE_OWNERSHIP(Fl_Menu_) 22 23 24 %ignore Fl_Menu_::global(); 25 %ignore Fl_Menu_::menu(const Fl_Menu_Item *m); 26 //%ignore Fl_Menu_::menu(); 27 %ignore Fl_Menu_::add(const char* label, const char* shortcut, Fl_Callback*, void *user_data, int flags); 28 %ignore Fl_Menu_::menu(const Fl_Menu_Item*); 29 %ignore Fl_Menu_::copy(const Fl_Menu_Item*); 30 %ignore Fl_Menu_::value(const Fl_Menu_Item*); 31 32 33 %include "FL/Fl_Menu_.H" 34 35 36 %extend Fl_Menu_ { 37 38 void copy(PyObject *args, PyObject *user_data = 0) { 39 PyObject *menuList; 40 if (!PyTuple_Check(args)) 41 { 42 printf("Fl_Menu_.menu: not a tuple\n"); 43 return; 44 } 45 46 menuList = args; 47 Fl_Menu_Item *theMenuItems = createFl_Menu_Item_Array( NULL, menuList); 48 49 // call the C++ object to add the menu 50 self->copy(theMenuItems, user_data); 51 52 delete [] theMenuItems; 53 54 } 55 menu(PyObject * args)56 void menu(PyObject *args) { 57 PyObject *menuList; 58 if (!PyTuple_Check(args)) 59 { 60 printf("Fl_Menu_.menu: not a tuple\n"); 61 return; 62 } 63 64 menuList = args; 65 Fl_Menu_Item *theMenuItems = createFl_Menu_Item_Array( NULL, menuList); 66 67 // call the C++ object to add the menu 68 self->copy(theMenuItems); 69 70 delete [] theMenuItems; 71 72 } 73 74 int add(PyObject *lObj, PyObject *sObj, PyObject *cObj, PyObject* uObj=0, PyObject* fObj=0) { 75 76 //char *pyLabel=PyString_AsString(lObj); 77 char* pyLabel = SWIG_Python_str_AsChar(lObj); 78 79 int shortcut=PyInt_AsLong(sObj); 80 PyObject *callback=cObj; 81 PyObject *userData=uObj; 82 int flags=0; 83 if (fObj) 84 flags=PyInt_AsLong(fObj); 85 Fl_Callback *callback_=(Fl_Callback*)0; 86 void *user_data_=0; 87 88 89 // got all the values 90 if (callback && PyCallable_Check(callback)) 91 { 92 CallbackStruct *cb = new CallbackStruct( callback, userData, SWIGTYPE_p_Fl_Menu_Item ); 93 Py_INCREF(callback); 94 //self->callback(PythonCallBack, (void *)cb); 95 callback_ = (Fl_Callback *)PythonCallBack; 96 user_data_ = (void *)cb; 97 } 98 99 return self->add(pyLabel, shortcut, callback_, user_data_, flags); 100 } 101 menu()102 PyObject* menu() { 103 // returns the Fl_Menu_Item structure of the menu 104 // as a Python list 105 const Fl_Menu_Item* items = self->menu(); 106 int length = self->size(); 107 PyObject *result = PyList_New(length); 108 for (int i = 0; i < length; i++) { 109 PyObject *o = Py_None; 110 if (items[i].text != NULL) { 111 if (items[i].callback_) { 112 // registered callback, 113 // caution, callback information is in user_data 114 CallbackStruct *cb = (CallbackStruct*)items[i].user_data_; 115 o = Py_BuildValue("zlOOl", items[i].text, items[i].shortcut_, cb->func, cb->data, items[i].flags); 116 } 117 else { 118 // no callback, return Py_None 119 o = Py_BuildValue("zlOOl", items[i].text, items[i].shortcut_, Py_None, Py_None, items[i].flags); 120 } 121 } 122 else { 123 // empty item 124 o = Py_BuildValue("OOOOO", Py_None, Py_None, Py_None, Py_None, Py_None); 125 } 126 PyList_SetItem(result, i, o); 127 } 128 return result; 129 } 130 } 131 132 133 134 135 136