Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWillian Padovani Germano <wpgermano@gmail.com>2004-09-21 09:28:17 +0400
committerWillian Padovani Germano <wpgermano@gmail.com>2004-09-21 09:28:17 +0400
commite7d3039d127d8bb4a57c6baeb883d0cf32fd21f3 (patch)
treece33cb6959dc1c17e979ed68ff6ed4a098874b53 /source/blender/python/api2_2x/windowTheme.c
parente5e621ad242824d2fb3be4a05425a3970bd9c1ae (diff)
- Blender: added option 'scriptsdir' to Blender.Get();
- small updates to the docs; - Object: small fix to getMatrix: check during_script() to avoid undesired loops; added old behavior (pre 2.34) as option: .getMatrix('oldlocal'); - tentative fix for bug #1275: scene REDRAW scriptlinks were not being executed (the call to do so was missing): http://projects.blender.org/tracker/index.php?func=detail&aid=1275&group_id=9&atid=125 added the call in drawview.c, in drawview3dspace(). This causes the scriptlink to be called for each visible view3d, but that's what happens with object redraw scriptlinks, too. Anyway, this is still a test. The place was chosen based on the idea that a scene redraw scriptlink is like an object redraw one, but for all objs in the scene at once. - Window.Theme: new submodule, to get/set theme options in Blender; - Added the script save_theme.py (Help menu for now), to save the current theme in Blender as an executable script (currently shown in the Scripts->Misc menu). There's more work to do for themes, like defining a proper place for them in the interface, adding documentation (for now the added script and the ones it generates can give a pretty good idea of how to use the new module), probably extending themes to support SpaceScript and so on.
Diffstat (limited to 'source/blender/python/api2_2x/windowTheme.c')
-rw-r--r--source/blender/python/api2_2x/windowTheme.c706
1 files changed, 706 insertions, 0 deletions
diff --git a/source/blender/python/api2_2x/windowTheme.c b/source/blender/python/api2_2x/windowTheme.c
new file mode 100644
index 00000000000..56901520fb9
--- /dev/null
+++ b/source/blender/python/api2_2x/windowTheme.c
@@ -0,0 +1,706 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * This is a new part of Blender.
+ *
+ * Contributor(s): Willian P. Germano
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+*/
+
+#include <MEM_guardedalloc.h>
+#include <BLI_blenlib.h>
+#include <DNA_screen_types.h>
+#include "windowTheme.h"
+#include "charRGBA.h"
+#include "gen_utils.h"
+
+#define EXPP_THEME_VTX_SIZE_MIN 1
+#define EXPP_THEME_VTX_SIZE_MAX 10
+#define EXPP_THEME_DRAWTYPE_MIN 1
+#define EXPP_THEME_DRAWTYPE_MAX 4
+
+#define EXPP_THEME_NUMBEROFTHEMES 14
+static const EXPP_map_pair themes_map[] = {
+ {"ui", -1},
+ {"buts", SPACE_BUTS},
+ {"view3d", SPACE_VIEW3D},
+ {"file", SPACE_FILE},
+ {"ipo", SPACE_IPO},
+ {"info", SPACE_INFO},
+ {"sound", SPACE_SOUND},
+ {"action", SPACE_ACTION},
+ {"nla", SPACE_NLA},
+ {"seq", SPACE_SEQ},
+ {"image", SPACE_IMAGE},
+ {"imasel", SPACE_IMASEL},
+ {"text", SPACE_TEXT},
+ {"oops", SPACE_OOPS},
+ {NULL, 0}
+};
+
+static PyObject *M_Theme_New (PyObject *self, PyObject *args);
+static PyObject *M_Theme_Get (PyObject *self, PyObject *args);
+
+static char M_Theme_doc[] = "The Blender Theme module\n\n\
+This module provides access to UI Theme data in Blender";
+
+static char M_Theme_New_doc[] =
+"Theme.New (name = 'New Theme'):\n\
+ Return a new Theme Data object with the given type and name.";
+
+static char M_Theme_Get_doc[] = "Theme.Get (name = None):\n\
+ Return the theme data with the given 'name', None if not found, or\n\
+ Return a list with all Theme Data objects if no argument was given.";
+
+/*****************************************************************************/
+/* Python method structure definition for Blender.Theme module: */
+/*****************************************************************************/
+struct PyMethodDef M_Theme_methods[] = {
+ {"New", M_Theme_New, METH_VARARGS, M_Theme_New_doc},
+ {"Get", M_Theme_Get, METH_VARARGS, M_Theme_Get_doc},
+ {NULL, NULL, 0, NULL}
+};
+
+static void ThemeSpace_dealloc (BPy_ThemeSpace *self);
+static int ThemeSpace_compare (BPy_ThemeSpace *a, BPy_ThemeSpace *b);
+static PyObject *ThemeSpace_repr (BPy_ThemeSpace *self);
+static PyObject *ThemeSpace_getAttr (BPy_ThemeSpace *self, char *name);
+static int ThemeSpace_setAttr (BPy_ThemeSpace *self, char *name, PyObject *val);
+
+static PyMethodDef BPy_ThemeSpace_methods[] = {
+ {NULL, NULL, 0, NULL}
+};
+
+PyTypeObject ThemeSpace_Type = {
+ PyObject_HEAD_INIT (NULL) 0, /* ob_size */
+ "Blender Space Theme", /* tp_name */
+ sizeof (BPy_Theme), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ /* methods */
+ (destructor) ThemeSpace_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ (getattrfunc) ThemeSpace_getAttr, /* tp_getattr */
+ (setattrfunc) ThemeSpace_setAttr, /* tp_setattr */
+ (cmpfunc) ThemeSpace_compare, /* tp_compare */
+ (reprfunc) ThemeSpace_repr, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_as_hash */
+ 0, 0, 0, 0, 0, 0,
+ 0, /* tp_doc */
+ 0, 0, 0, 0, 0, 0,
+ 0, //BPy_ThemeSpace_methods, /* tp_methods */
+ 0, /* tp_members */
+};
+
+static void ThemeSpace_dealloc (BPy_ThemeSpace *self)
+{
+ PyObject_DEL (self);
+}
+
+#define ELSEIF_TSP_RGBA(attr)\
+ else if (!strcmp(name, #attr))\
+ attrib = charRGBA_New(&tsp->attr[0]);
+
+/* Example: ELSEIF_TSP_RGBA(outline) becomes:
+ * else if (!strcmp(name, "back")
+ * attr = charRGBA_New(&tsp->back[0])
+ */
+
+static PyObject *ThemeSpace_getAttr (BPy_ThemeSpace *self, char *name)
+{
+ PyObject *attrib = Py_None;
+ ThemeSpace *tsp = self->tsp;
+
+ if (!strcmp (name, "theme"))
+ attrib = PyString_FromString (self->theme->name);
+ ELSEIF_TSP_RGBA(back)
+ ELSEIF_TSP_RGBA(text)
+ ELSEIF_TSP_RGBA(text_hi)
+ ELSEIF_TSP_RGBA(header)
+ ELSEIF_TSP_RGBA(panel)
+ ELSEIF_TSP_RGBA(shade1)
+ ELSEIF_TSP_RGBA(shade2)
+ ELSEIF_TSP_RGBA(hilite)
+ ELSEIF_TSP_RGBA(grid)
+ ELSEIF_TSP_RGBA(wire)
+ ELSEIF_TSP_RGBA(select)
+ ELSEIF_TSP_RGBA(active)
+ ELSEIF_TSP_RGBA(transform)
+ ELSEIF_TSP_RGBA(vertex)
+ ELSEIF_TSP_RGBA(vertex_select)
+ ELSEIF_TSP_RGBA(edge)
+ ELSEIF_TSP_RGBA(edge_select)
+ ELSEIF_TSP_RGBA(edge_seam)
+ ELSEIF_TSP_RGBA(edge_facesel)
+ ELSEIF_TSP_RGBA(face)
+ ELSEIF_TSP_RGBA(face_select)
+ ELSEIF_TSP_RGBA(normal)
+ else if (!strcmp (name, "vertex_size"))
+ attrib = Py_BuildValue("i", tsp->vertex_size);
+ else if (!strcmp (name, "__members__"))
+ attrib = Py_BuildValue("[ssssssssssssssssssssssss]", "theme",
+ "back", "text", "text_hi", "header", "panel", "shade1", "shade2",
+ "hilite", "grid", "wire", "select", "active", "transform",
+ "vertex", "vertex_select", "edge", "edge_select", "edge_seam",
+ "edge_facesel", "face", "face_select", "normal", "vertex_size");
+
+ if (attrib != Py_None) return attrib;
+
+ return Py_FindMethod(BPy_ThemeSpace_methods, (PyObject *)self, name);
+}
+
+static int ThemeSpace_setAttr (BPy_ThemeSpace *self, char *name,
+ PyObject *value)
+{
+ PyObject *attrib = NULL;
+ ThemeSpace *tsp = self->tsp;
+ int ret = -1;
+
+ if (!strcmp (name, "back"))
+ attrib = charRGBA_New(&tsp->back[0]);
+ ELSEIF_TSP_RGBA(back)
+ ELSEIF_TSP_RGBA(text)
+ ELSEIF_TSP_RGBA(text_hi)
+ ELSEIF_TSP_RGBA(header)
+ ELSEIF_TSP_RGBA(panel)
+ ELSEIF_TSP_RGBA(shade1)
+ ELSEIF_TSP_RGBA(shade2)
+ ELSEIF_TSP_RGBA(hilite)
+ ELSEIF_TSP_RGBA(grid)
+ ELSEIF_TSP_RGBA(wire)
+ ELSEIF_TSP_RGBA(select)
+ ELSEIF_TSP_RGBA(active)
+ ELSEIF_TSP_RGBA(transform)
+ ELSEIF_TSP_RGBA(vertex)
+ ELSEIF_TSP_RGBA(vertex_select)
+ ELSEIF_TSP_RGBA(edge)
+ ELSEIF_TSP_RGBA(edge_select)
+ ELSEIF_TSP_RGBA(edge_seam)
+ ELSEIF_TSP_RGBA(edge_facesel)
+ ELSEIF_TSP_RGBA(face)
+ ELSEIF_TSP_RGBA(face_select)
+ ELSEIF_TSP_RGBA(normal)
+ else if (!strcmp (name, "vertex_size")) {
+ int val;
+
+ if (!PyInt_Check(value))
+ return EXPP_ReturnIntError (PyExc_TypeError, "expected integer value");
+
+ val = (int)PyInt_AsLong(value);
+ tsp->vertex_size = EXPP_ClampInt(val,
+ EXPP_THEME_VTX_SIZE_MIN, EXPP_THEME_VTX_SIZE_MAX);
+ ret = 0;
+ }
+ else
+ return EXPP_ReturnIntError (PyExc_AttributeError, "attribute not found");
+
+ if (attrib) {
+ PyObject *pyret = NULL;
+ PyObject *valtuple = Py_BuildValue("(O)", value);
+
+ if (!valtuple)
+ return EXPP_ReturnIntError (PyExc_MemoryError, "couldn't create tuple!");
+
+ pyret = charRGBA_setCol((BPy_charRGBA *)attrib, valtuple);
+ Py_DECREF(valtuple);
+
+ if (pyret == Py_None) {
+ Py_DECREF (Py_None); /* was increfed by charRGBA_setCol */
+ ret = 0;
+ }
+
+ Py_DECREF(attrib); /* we're done with it */
+ }
+
+ return ret; /* 0 if all went well */
+}
+
+static int ThemeSpace_compare (BPy_ThemeSpace *a, BPy_ThemeSpace *b)
+{
+ ThemeSpace *pa = a->tsp, *pb = b->tsp;
+ return (pa == pb) ? 0 : -1;
+}
+
+static PyObject *ThemeSpace_repr (BPy_ThemeSpace *self)
+{
+ return PyString_FromFormat ("[Space theme from theme \"%s\"]",
+ self->theme->name);
+}
+
+static void ThemeUI_dealloc (BPy_ThemeUI *self);
+static int ThemeUI_compare (BPy_ThemeUI *a, BPy_ThemeUI *b);
+static PyObject *ThemeUI_repr (BPy_ThemeUI *self);
+static PyObject *ThemeUI_getAttr (BPy_ThemeUI *self, char *name);
+static int ThemeUI_setAttr (BPy_ThemeUI *self, char *name, PyObject *val);
+
+static PyMethodDef BPy_ThemeUI_methods[] = {
+ {NULL, NULL, 0, NULL}
+};
+
+PyTypeObject ThemeUI_Type = {
+ PyObject_HEAD_INIT (NULL) 0, /* ob_size */
+ "Blender UI Theme", /* tp_name */
+ sizeof (BPy_Theme), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ /* methods */
+ (destructor) ThemeUI_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ (getattrfunc) ThemeUI_getAttr, /* tp_getattr */
+ (setattrfunc) ThemeUI_setAttr, /* tp_setattr */
+ (cmpfunc) ThemeUI_compare, /* tp_compare */
+ (reprfunc) ThemeUI_repr, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_as_hash */
+ 0, 0, 0, 0, 0, 0,
+ 0, /* tp_doc */
+ 0, 0, 0, 0, 0, 0,
+ 0, //BPy_ThemeUI_methods, /* tp_methods */
+ 0, /* tp_members */
+};
+
+static void ThemeUI_dealloc (BPy_ThemeUI *self)
+{
+ PyObject_DEL (self);
+}
+
+#define ELSEIF_TUI_RGBA(attr)\
+ else if (!strcmp(name, #attr))\
+ attrib = charRGBA_New(&tui->attr[0]);
+
+/* Example: ELSEIF_TUI_RGBA(outline) becomes:
+ * else if (!strcmp(name, "outline")
+ * attr = charRGBA_New(&tui->outline[0])
+ */
+
+static PyObject *ThemeUI_getAttr (BPy_ThemeUI *self, char *name)
+{
+ PyObject *attrib = Py_None;
+ ThemeUI *tui = self->tui;
+
+ if (!strcmp (name, "theme"))
+ attrib = PyString_FromString (self->theme->name);
+ ELSEIF_TUI_RGBA(outline)
+ ELSEIF_TUI_RGBA(neutral)
+ ELSEIF_TUI_RGBA(action)
+ ELSEIF_TUI_RGBA(setting)
+ ELSEIF_TUI_RGBA(setting1)
+ ELSEIF_TUI_RGBA(setting2)
+ ELSEIF_TUI_RGBA(num)
+ ELSEIF_TUI_RGBA(textfield)
+ ELSEIF_TUI_RGBA(popup)
+ ELSEIF_TUI_RGBA(text)
+ ELSEIF_TUI_RGBA(text_hi)
+ ELSEIF_TUI_RGBA(menu_back)
+ ELSEIF_TUI_RGBA(menu_item)
+ ELSEIF_TUI_RGBA(menu_hilite)
+ ELSEIF_TUI_RGBA(menu_text)
+ ELSEIF_TUI_RGBA(menu_text_hi)
+ else if (!strcmp (name, "drawType"))
+ attrib = PyInt_FromLong((char)tui->but_drawtype);
+ else if (!strcmp (name, "__members__"))
+ attrib = Py_BuildValue("[ssssssssssssssssss]", "theme",
+ "outline", "neutral", "action", "setting", "setting1", "setting2",
+ "num", "textfield", "popup", "text", "text_hi", "menu_back", "menu_item",
+ "menu_hilite", "menu_text", "menu_text_hi", "drawType");
+
+ if (attrib != Py_None) return attrib;
+
+ return Py_FindMethod(BPy_ThemeUI_methods, (PyObject *)self, name);
+}
+
+static int ThemeUI_setAttr (BPy_ThemeUI *self, char *name, PyObject *value)
+{
+ PyObject *attrib = NULL;
+ ThemeUI *tui = self->tui;
+ int ret = -1;
+
+ if (!strcmp (name, "outline"))
+ attrib = charRGBA_New(&tui->outline[0]);
+ ELSEIF_TUI_RGBA(neutral)
+ ELSEIF_TUI_RGBA(action)
+ ELSEIF_TUI_RGBA(setting)
+ ELSEIF_TUI_RGBA(setting1)
+ ELSEIF_TUI_RGBA(setting2)
+ ELSEIF_TUI_RGBA(num)
+ ELSEIF_TUI_RGBA(textfield)
+ ELSEIF_TUI_RGBA(popup)
+ ELSEIF_TUI_RGBA(text)
+ ELSEIF_TUI_RGBA(text_hi)
+ ELSEIF_TUI_RGBA(menu_back)
+ ELSEIF_TUI_RGBA(menu_item)
+ ELSEIF_TUI_RGBA(menu_hilite)
+ ELSEIF_TUI_RGBA(menu_text)
+ ELSEIF_TUI_RGBA(menu_text_hi)
+ else if (!strcmp (name, "drawType")) {
+ int val;
+
+ if (!PyInt_Check(value))
+ return EXPP_ReturnIntError (PyExc_TypeError, "expected integer value");
+
+ val = (int)PyInt_AsLong(value);
+ tui->but_drawtype = EXPP_ClampInt(val,
+ EXPP_THEME_DRAWTYPE_MIN, EXPP_THEME_DRAWTYPE_MAX);
+ ret = 0;
+ }
+ else
+ return EXPP_ReturnIntError (PyExc_AttributeError, "attribute not found");
+
+ if (attrib) {
+ PyObject *pyret = NULL;
+ PyObject *valtuple = Py_BuildValue("(O)", value);
+
+ if (!valtuple)
+ return EXPP_ReturnIntError (PyExc_MemoryError, "couldn't create tuple!");
+
+ pyret = charRGBA_setCol((BPy_charRGBA *)attrib, valtuple);
+ Py_DECREF(valtuple);
+
+ if (pyret == Py_None) {
+ Py_DECREF (Py_None); /* was increfed by charRGBA_setCol */
+ ret = 0;
+ }
+
+ Py_DECREF(attrib); /* we're done with it */
+ }
+
+ return ret; /* 0 if all went well */
+}
+
+
+static int ThemeUI_compare (BPy_ThemeUI *a, BPy_ThemeUI *b)
+{
+ ThemeUI *pa = a->tui, *pb = b->tui;
+ return (pa == pb) ? 0 : -1;
+}
+
+static PyObject *ThemeUI_repr (BPy_ThemeUI *self)
+{
+ return PyString_FromFormat("[UI theme from theme \"%s\"]", self->theme->name);
+}
+
+static void Theme_dealloc (BPy_Theme *self);
+static int Theme_compare (BPy_Theme *a, BPy_Theme *b);
+static PyObject *Theme_getAttr (BPy_Theme *self, char *name);
+static PyObject *Theme_repr (BPy_Theme *self);
+
+static PyObject *Theme_get(BPy_Theme *self, PyObject *args);
+static PyObject *Theme_getName(BPy_Theme *self);
+static PyObject *Theme_setName(BPy_Theme *self, PyObject *args);
+
+static PyMethodDef BPy_Theme_methods[] = {
+ {"get", (PyCFunction) Theme_get, METH_VARARGS,
+ "(param) - Return UI or Space theme object.\n\
+(param) - the chosen theme object as an int or a string:\n\
+- () - default: UI;\n\
+- (i) - int: an entry from the Blender.Window.Types dictionary;\n\
+- (s) - string: 'UI' or a space name, like 'VIEW3D', etc."},
+ {"getName", (PyCFunction) Theme_getName, METH_NOARGS,
+ "() - Return Theme name"},
+ {"setName", (PyCFunction) Theme_setName, METH_VARARGS,
+ "(s) - Set Theme name"},
+ {NULL, NULL, 0, NULL}
+};
+
+PyTypeObject Theme_Type = {
+ PyObject_HEAD_INIT (NULL) 0, /* ob_size */
+ "Blender Theme", /* tp_name */
+ sizeof (BPy_Theme), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ /* methods */
+ (destructor) Theme_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ (getattrfunc) Theme_getAttr, /* tp_getattr */
+ 0,//(setattrfunc) Theme_setAttr, /* tp_setattr */
+ (cmpfunc) Theme_compare, /* tp_compare */
+ (reprfunc) Theme_repr, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_as_hash */
+ 0, 0, 0, 0, 0, 0,
+ 0, /* tp_doc */
+ 0, 0, 0, 0, 0, 0,
+ 0, //BPy_Theme_methods, /* tp_methods */
+ 0, /* tp_members */
+};
+
+static PyObject *M_Theme_New (PyObject *self, PyObject *args)
+{
+ char *name = "New Theme";
+ BPy_Theme *pytheme = NULL, *base_pytheme = NULL;
+ bTheme *btheme = NULL, *newtheme = NULL;
+
+ if (!PyArg_ParseTuple (args, "|sO!", &name, &Theme_Type, &base_pytheme))
+ return EXPP_ReturnPyObjError (PyExc_AttributeError,
+ "expected nothing or a name and optional theme object as arguments");
+
+ if (base_pytheme) btheme = base_pytheme->theme;
+ if (!btheme) btheme = U.themes.first;
+
+ newtheme = MEM_callocN(sizeof(bTheme), "theme");
+
+ if (newtheme) pytheme = PyObject_New (BPy_Theme, &Theme_Type);
+ if (!pytheme) return EXPP_ReturnPyObjError (PyExc_RuntimeError,
+ "couldn't create Theme Data in Blender");
+
+ memcpy(newtheme, btheme, sizeof(bTheme));
+ BLI_addhead(&U.themes, newtheme);
+ BLI_strncpy(newtheme->name, name, 32);
+
+ pytheme->theme = newtheme;
+
+ return (PyObject *)pytheme;
+}
+
+static PyObject *M_Theme_Get (PyObject *self, PyObject *args)
+{
+ char *name = NULL;
+ bTheme *iter;
+ PyObject *ret;
+
+ if (!PyArg_ParseTuple (args, "|s", &name))
+ return EXPP_ReturnPyObjError (PyExc_TypeError,
+ "expected string argument (or nothing)");
+
+ iter = U.themes.first;
+
+ if (name) { /* (name) - return requested theme */
+ BPy_Theme *wanted = NULL;
+
+ while (iter) {
+ if (strcmp (name, iter->name) == 0) {
+ wanted = PyObject_New(BPy_Theme, &Theme_Type);
+ wanted->theme = iter;
+ break;
+ }
+ iter = iter->next;
+ }
+
+ if (!wanted) {
+ char emsg[64];
+ PyOS_snprintf (emsg, sizeof (emsg), "Theme \"%s\" not found", name);
+ return EXPP_ReturnPyObjError (PyExc_NameError, emsg);
+ }
+
+ ret = (PyObject *)wanted;
+ }
+
+ else { /* () - return list with all themes */
+ int index = 0;
+ PyObject *list = NULL;
+ BPy_Theme *pytheme = NULL;
+
+ list = PyList_New (BLI_countlist (&(U.themes)));
+
+ if (!list)
+ return EXPP_ReturnPyObjError(PyExc_MemoryError,"couldn't create PyList");
+
+ while (iter) {
+ pytheme = PyObject_New(BPy_Theme, &Theme_Type);
+ pytheme->theme = iter;
+
+ if (!pytheme)
+ return EXPP_ReturnPyObjError (PyExc_MemoryError,
+ "couldn't create Theme PyObject");
+
+ PyList_SET_ITEM (list, index, (PyObject *)pytheme);
+
+ iter = iter->next;
+ index++;
+ }
+
+ ret = list;
+ }
+
+ return ret;
+}
+
+static PyObject *Theme_get(BPy_Theme *self, PyObject *args)
+{
+ bTheme *btheme = self->theme;
+ ThemeUI *tui = NULL;
+ ThemeSpace *tsp = NULL;
+ PyObject *pyob = NULL;
+ BPy_ThemeUI *retUI = NULL;
+ BPy_ThemeSpace *retSpc = NULL;
+ int type;
+
+ if (!PyArg_ParseTuple(args, "|O", &pyob))
+ return EXPP_ReturnPyObjError (PyExc_TypeError,
+ "expected string or int argument or nothing");
+
+ if (!pyob) { /* (): return list with all names */
+ PyObject *ret = PyList_New(EXPP_THEME_NUMBEROFTHEMES);
+
+ if (!ret)
+ return EXPP_ReturnPyObjError (PyExc_MemoryError,
+ "couldn't create pylist!");
+
+ type = 0; /* using as a counter only */
+
+ while (type < EXPP_THEME_NUMBEROFTHEMES) {
+ PyList_SET_ITEM(ret, type, PyString_FromString(themes_map[type].sval));
+ type++;
+ }
+
+ return ret;
+ }
+
+ else if (PyInt_Check(pyob)) /* (int) */
+ type = (int)PyInt_AsLong(pyob);
+ else if (PyString_Check(pyob)) { /* (str) */
+ char *str = PyString_AsString(pyob);
+ if (!EXPP_map_case_getIntVal(themes_map, str, &type))
+ return EXPP_ReturnPyObjError (PyExc_AttributeError,
+ "unknown string argument");
+ }
+ else return EXPP_ReturnPyObjError (PyExc_TypeError,
+ "expected string or int argument or nothing");
+
+ switch (type) {
+ case -1: /* UI */
+ tui = &btheme->tui;
+ break;
+ case SPACE_BUTS:
+ tsp = &btheme->tbuts;
+ break;
+ case SPACE_VIEW3D:
+ tsp = &btheme->tv3d;
+ break;
+ case SPACE_FILE:
+ tsp = &btheme->tfile;
+ break;
+ case SPACE_IPO:
+ tsp = &btheme->tipo;
+ break;
+ case SPACE_INFO:
+ tsp = &btheme->tinfo;
+ break;
+ case SPACE_SOUND:
+ tsp = &btheme->tsnd;
+ break;
+ case SPACE_ACTION:
+ tsp = &btheme->tact;
+ break;
+ case SPACE_NLA:
+ tsp = &btheme->tnla;
+ break;
+ case SPACE_SEQ:
+ tsp = &btheme->tseq;
+ break;
+ case SPACE_IMAGE:
+ tsp = &btheme->tima;
+ break;
+ case SPACE_IMASEL:
+ tsp = &btheme->timasel;
+ break;
+ case SPACE_TEXT:
+ tsp = &btheme->text;
+ break;
+ case SPACE_OOPS:
+ tsp = &btheme->toops;
+ break;
+ }
+
+ if (tui) {
+ retUI = PyObject_New(BPy_ThemeUI, &ThemeUI_Type);
+ retUI->theme = btheme;
+ retUI->tui = tui;
+ return (PyObject *)retUI;
+ }
+ else if (tsp) {
+ retSpc = PyObject_New(BPy_ThemeSpace, &ThemeSpace_Type);
+ retSpc->theme = btheme;
+ retSpc->tsp = tsp;
+ return (PyObject *)retSpc;
+ }
+ else return EXPP_ReturnPyObjError (PyExc_AttributeError,
+ "invalid parameter");
+}
+
+static PyObject *Theme_getName(BPy_Theme *self)
+{
+ return PyString_FromString (self->theme->name);
+}
+
+static PyObject *Theme_setName(BPy_Theme *self, PyObject *args)
+{
+ char *name = NULL;
+
+ if (!PyArg_ParseTuple(args, "s", &name))
+ return EXPP_ReturnPyObjError (PyExc_TypeError,
+ "expected string argument");
+
+ BLI_strncpy(self->theme->name, name, 32);
+
+ return EXPP_incr_ret (Py_None);
+}
+
+PyObject *Theme_Init (void)
+{
+ PyObject *submodule;
+
+ Theme_Type.ob_type = &PyType_Type;
+
+ submodule = Py_InitModule3 ("Blender.Window.Theme",
+ M_Theme_methods, M_Theme_doc);
+
+ return submodule;
+}
+
+static void Theme_dealloc (BPy_Theme *self)
+{
+ PyObject_DEL (self);
+}
+
+static PyObject *Theme_getAttr (BPy_Theme *self, char *name)
+{
+ PyObject *attr = Py_None;
+
+ if (!strcmp (name, "name"))
+ attr = PyString_FromString (self->theme->name);
+ else if (!strcmp (name, "__members__"))
+ attr = Py_BuildValue("[s]", "name");
+
+ if (attr != Py_None) return attr;
+
+ return Py_FindMethod(BPy_Theme_methods, (PyObject *)self, name);
+}
+
+static int Theme_compare (BPy_Theme *a, BPy_Theme *b)
+{
+ bTheme *pa = a->theme, *pb = b->theme;
+ return (pa == pb) ? 0 : -1;
+}
+
+static PyObject *Theme_repr (BPy_Theme *self)
+{
+ return PyString_FromFormat ("[Theme \"%s\"]", self->theme->name);
+}