diff options
Diffstat (limited to 'plugins/pychrysa/gtkext/viewpanel.c')
-rw-r--r-- | plugins/pychrysa/gtkext/viewpanel.c | 126 |
1 files changed, 95 insertions, 31 deletions
diff --git a/plugins/pychrysa/gtkext/viewpanel.c b/plugins/pychrysa/gtkext/viewpanel.c index f680487..8c85fbd 100644 --- a/plugins/pychrysa/gtkext/viewpanel.c +++ b/plugins/pychrysa/gtkext/viewpanel.c @@ -31,16 +31,22 @@ #include <gtkext/gtkviewpanel.h> -#include "../quirks.h" +#include "../helpers.h" +#include "../arch/vmpa.h" /* Crée un nouvel objet Python de type 'ViewPanel'. */ +#if 0 static PyObject *py_view_panel_new(PyTypeObject *, PyObject *, PyObject *); +#endif /* S'assure qu'une adresse donnée est visible à l'écran. */ static PyObject *py_view_panel_scroll_to_address(PyObject *, PyObject *); +/* Définit les constantes pour les panneaux de vue. */ +static bool py_view_panel_define_constants(PyTypeObject *); + /****************************************************************************** @@ -56,7 +62,7 @@ static PyObject *py_view_panel_scroll_to_address(PyObject *, PyObject *); * Remarques : - * * * ******************************************************************************/ - +#if 0 static PyObject *py_view_panel_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { #if 0 @@ -86,10 +92,7 @@ static PyObject *py_view_panel_new(PyTypeObject *type, PyObject *args, PyObject Py_RETURN_NONE; } - - - - +#endif /****************************************************************************** @@ -108,47 +111,75 @@ static PyObject *py_view_panel_new(PyTypeObject *type, PyObject *args, PyObject static PyObject *py_view_panel_scroll_to_address(PyObject *self, PyObject *args) { GtkViewPanel *panel; /* Panneau à manipuler */ - vmpa_t addr; /* Adresse demandée en visuel */ + PyObject *py_vmpa; /* Localisation version Python */ int ret; /* Bilan de lecture des args. */ + vmpa2t *addr; /* Adresse visée par l'opérat° */ - panel = GTK_VIEW_PANEL(pygobject_get(self)); + ret = PyArg_ParseTuple(args, "O", &py_vmpa); + if (!ret) return NULL; - ret = PyArg_ParseTuple(args, "K", &addr); - if (!ret) Py_RETURN_NONE; + ret = PyObject_IsInstance(py_vmpa, (PyObject *)get_python_vmpa_type()); + if (!ret) return NULL; + + addr = get_internal_vmpa(py_vmpa); + if (addr == NULL) return NULL; + + panel = GTK_VIEW_PANEL(pygobject_get(self)); - //gtk_view_panel_scroll_to_address(panel, addr); + gtk_view_panel_scroll_to_address(panel, addr, SPT_RAW); Py_RETURN_NONE; } +/****************************************************************************** +* * +* Paramètres : obj_type = type dont le dictionnaire est à compléter. * +* * +* Description : Définit les constantes pour les panneaux de vue. * +* * +* Retour : true en cas de succès de l'opération, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool py_view_panel_define_constants(PyTypeObject *obj_type) +{ + bool result; /* Bilan à retourner */ + result = true; + result &= PyDict_AddIntMacro(obj_type, SPT_RAW); + result &= PyDict_AddIntMacro(obj_type, SPT_TOP); + result &= PyDict_AddIntMacro(obj_type, SPT_CENTER); + result &= PyDict_AddIntMacro(obj_type, SPT_BOTTOM); + + return result; + +} /****************************************************************************** * * -* Paramètres : module = module dont la définition est à compléter. * +* Paramètres : - * * * -* Description : Prend en charge l'objet 'pychrysalide.gtkext.ViewPanel'. * +* Description : Fournit un accès à une définition de type à diffuser. * * * -* Retour : Bilan de l'opération. * +* Retour : Définition d'objet pour Python. * * * * Remarques : - * * * ******************************************************************************/ -bool register_python_view_panel(PyObject *module) +PyTypeObject *get_python_view_panel_type(void) { - PyObject *parent_mod; /* Module Python-EditorItem */ - int ret; /* Bilan d'un appel */ - static PyMethodDef py_view_panel_methods[] = { { "scroll_to_address", (PyCFunction)py_view_panel_scroll_to_address, METH_VARARGS, - "Ensure a given address is displayed in the view panel." + "scroll_to_address($self, addr, tweak, /)\n--\n\nEnsure a given address is displayed in the view panel." }, { NULL } }; @@ -159,37 +190,70 @@ bool register_python_view_panel(PyObject *module) static PyTypeObject py_view_panel_type = { - PyObject_HEAD_INIT(NULL) + PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "pychrysalide.gtkext.ViewPanel", .tp_basicsize = sizeof(PyGObject), .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_doc = "PyChrysalide view panel", + .tp_doc = "PyChrysalide view panel.", .tp_methods = py_view_panel_methods, .tp_getset = py_view_panel_getseters, - .tp_new = (newfunc)py_view_panel_new, - .tp_init = (initproc)pychrysalide_allow_args_for_gobjects + //.tp_new = (newfunc)py_view_panel_new, + //.tp_init = (initproc)pychrysalide_allow_args_for_gobjects }; - parent_mod = PyImport_ImportModule("gtk"); + return &py_view_panel_type; + +} + + +/****************************************************************************** +* * +* Paramètres : module = module dont la définition est à compléter. * +* * +* Description : Prend en charge l'objet 'pychrysalide.gtkext.ViewPanel'. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool register_python_view_panel(PyObject *module) +{ + PyTypeObject *py_view_panel_type; /* Type Python 'ViewPanel' */ + PyObject *parent_mod; /* Module Python Fixed */ + int ret; /* Bilan d'un appel */ + PyObject *dict; /* Dictionnaire du module */ + + py_view_panel_type = get_python_view_panel_type(); + + parent_mod = PyImport_ImportModule("gi.repository.Gtk"); if (parent_mod == NULL) return false; - py_view_panel_type.tp_base = (PyTypeObject *)PyObject_GetAttrString(parent_mod, "Fixed"); + py_view_panel_type->tp_base = (PyTypeObject *)PyObject_GetAttrString(parent_mod, "Fixed"); Py_DECREF(parent_mod); - if (PyType_Ready(&py_view_panel_type) < 0) + py_view_panel_type->tp_basicsize = py_view_panel_type->tp_base->tp_basicsize; + + if (PyType_Ready(py_view_panel_type) != 0) + return false; + + if (!py_view_panel_define_constants(py_view_panel_type)) return false; - Py_INCREF(&py_view_panel_type); - ret = PyModule_AddObject(module, "ViewPanel", (PyObject *)&py_view_panel_type); + Py_INCREF(py_view_panel_type); + ret = PyModule_AddObject(module, "ViewPanel", (PyObject *)py_view_panel_type); + if (ret != 0) return false; - pygobject_register_class(module, "GtkViewPanel", GTK_TYPE_VIEW_PANEL, &py_view_panel_type, - Py_BuildValue("(O)", py_view_panel_type.tp_base)); + dict = PyModule_GetDict(module); + pygobject_register_class(dict, "ViewPanel", GTK_TYPE_VIEW_PANEL, py_view_panel_type, + Py_BuildValue("(O)", py_view_panel_type->tp_base)); - return (ret == 0); + return true; } |