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:
Diffstat (limited to 'source/blender/src/toolbox.c')
-rw-r--r--source/blender/src/toolbox.c1454
1 files changed, 1454 insertions, 0 deletions
diff --git a/source/blender/src/toolbox.c b/source/blender/src/toolbox.c
new file mode 100644
index 00000000000..d811c740d3c
--- /dev/null
+++ b/source/blender/src/toolbox.c
@@ -0,0 +1,1454 @@
+/**
+ * $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.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#define PY_TOOLBOX 1
+#include <math.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+#ifndef WIN32
+#include <unistd.h>
+#else
+#include <io.h>
+#include "BLI_winstuff.h"
+#endif
+
+#include <fcntl.h>
+#include "MEM_guardedalloc.h"
+
+#include "BMF_Api.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_editVert.h"
+
+#include "DNA_image_types.h"
+#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_view3d_types.h"
+
+#include "BKE_plugin_types.h"
+#include "BKE_utildefines.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
+
+#include "BIF_gl.h"
+#include "BIF_graphics.h"
+#include "BIF_mainqueue.h"
+#include "BIF_interface.h"
+#include "BIF_toolbox.h"
+#include "BIF_mywindow.h"
+#include "BIF_editarmature.h"
+#include "BIF_editfont.h"
+#include "BIF_editmesh.h"
+#include "BIF_editseq.h"
+#include "BIF_editlattice.h"
+#include "BIF_editsima.h"
+#include "BIF_screen.h"
+#include "BIF_tbcallback.h"
+#include "BIF_editnla.h"
+
+#include "BDR_editobject.h"
+#include "BDR_editcurve.h"
+#include "BDR_editmball.h"
+
+#include "BSE_editipo.h"
+#include "BSE_buttons.h"
+
+#include "IMB_imbuf.h"
+
+#include "mydevice.h"
+#include "blendef.h"
+
+#include "interface.h"
+#include "render.h"
+
+/* ******** NOTES *********** *****************************
+
+ - Toolbox items zelf invullen
+ - de colormap kleuren staan met comments in de bgntoolbox()
+ - de funktie extern_qread eventueel vervangen
+ - let op de benaming van bijzondere toetsen (NumL etc)
+ - meelinken: Button.c, ivm rawcodes
+
+ ***************************** *****************************
+*/
+
+
+static int tbx1, tbx2, tby1, tby2, tbfontyofs, tbmain=0;
+static int tbmemx=TBOXX/2, tbmemy=(TBOXEL-0.5)*TBOXH, tboldwin, addmode= 0;
+static int oldcursor;
+
+ /* variabelen per item */
+static char *tbstr, *tbstr1, *keystr;
+static void (*tbfunc)(int);
+static int tbval;
+
+/* *********** PC PATCH ************* */
+
+void ColorFunc(int i)
+{
+ if(i==TBOXBLACK) glColor3ub(0, 0, 0);
+ else if(i==TBOXWHITE) glColor3ub(240, 240, 240);
+ else if(i==TBOXGREY) glColor3ub(160, 160, 160);
+ else glColor3ub(0, 0, 0);
+}
+
+/* ********************* PYTHON TOOLBOX CALLBACK ************************* */
+
+#ifdef PY_TOOLBOX
+/* see bpython/intern/py_toolbox.c */
+
+/* moved to BIF_toolbox.h */
+/* typedef char** (*tbox_callback)(int, int); */
+
+TBcallback *callback_dummy(int level, int entry)
+{
+ return NULL;
+}
+
+/* callback func ptr for py_toolbox */
+Tbox_callbackfunc g_toolbox_menucallback = &callback_dummy;
+
+void tboxSetCallback(Tbox_callbackfunc f)
+{
+ g_toolbox_menucallback = f;
+}
+
+#endif
+
+/* ********************* TOOLBOX ITEMS ************************* */
+
+void tbox_setinfo(int x, int y)
+{
+ /* afhankelijk van tbmain worden vars gezet */
+ tbstr= 0;
+ tbstr1= 0;
+ tbfunc= 0;
+ tbval= 0;
+ keystr = NULL;
+
+/* main menu entries: defined in BIF_toolbox.h */
+
+ if(x==0) {
+ switch(y) {
+ case TBOX_MAIN_FILE: tbstr= "FILE"; break;
+ case TBOX_MAIN_EDIT: tbstr= "EDIT"; break;
+ case TBOX_MAIN_ADD:
+ if (addmode==OB_MESH) tbstr= " MESH";
+ else if(addmode==OB_CURVE) tbstr= " CURVE";
+ else if(addmode==OB_SURF) tbstr= " SURF";
+ else tbstr= "ADD";
+ break;
+ case TBOX_MAIN_OBJECT1: tbstr= "OBJECT"; break;
+ case TBOX_MAIN_OBJECT2: tbstr= "OBJECT"; break;
+ case TBOX_MAIN_MESH: tbstr= "MESH"; break;
+ case TBOX_MAIN_CURVE: tbstr= "CURVE"; break;
+ case TBOX_MAIN_KEY: tbstr= "KEY"; break;
+ case TBOX_MAIN_RENDER: tbstr= "RENDER"; break;
+ case TBOX_MAIN_VIEW: tbstr= "VIEW"; break;
+#ifdef PY_TOOLBOX
+ case TBOX_MAIN_PYTOOL:
+ {
+ if (g_toolbox_menucallback(0, 0)) // valid callback?
+ tbstr= "PYTOOL";
+ break;
+ }
+#endif
+ }
+ }
+
+/* TOPICS */
+ else {
+
+
+/* FILE TOPICS */
+ if(tbmain==TBOX_MAIN_FILE) {
+ switch(y) {
+ case 0: tbstr= "New"; tbstr1= "c|x"; keystr= "Ctrl X"; break;
+ case 1: tbstr= "Open"; tbstr1= "F1"; keystr= "F1"; break;
+ case 2: tbstr= "Reopen Last"; tbstr1= "c|o"; keystr= "Ctrl O"; break;
+ case 3: tbstr= "Append"; tbstr1= "shift+F1"; keystr= "Shift F1"; break;
+ case 4: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 5: tbstr= "Save As"; tbstr1= "F2"; keystr= "F2"; break;
+ case 6: tbstr= "Save"; tbstr1= "c|w"; keystr= "Ctrl W"; break;
+ case 7: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 8: tbstr= "Save Image"; tbstr1= "F3"; keystr= "F3"; break;
+ case 9: tbstr= "Save VRML"; tbstr1= "c|F2"; keystr= "Ctrl F2"; break;
+ case 10: tbstr= "Save DXF"; tbstr1= "shift+F2"; keystr= "Shift F2"; break;
+ case 11: tbstr= "Save VideoScape"; tbstr1= "a|w"; keystr= "Alt W"; break;
+/* case 12: tbstr= ""; tbstr1= ""; keystr= ""; break; */
+ case 13: tbstr= "Quit"; tbstr1= "q"; keystr= "Q"; break;
+ }
+ }
+
+/* EDIT TOPICS */
+ if(tbmain==TBOX_MAIN_EDIT) {
+ switch(y) {
+ case 0: tbstr= "(De)Select All"; tbstr1= "a"; keystr= "A"; break;
+ case 1: tbstr= "Border Select"; tbstr1= "b"; keystr= "B"; break;
+ case 2: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 3: tbstr= "Duplicate"; tbstr1= "D"; keystr= "Shift D"; break;
+ case 4: tbstr= "Delete"; tbstr1= "x"; keystr= "X"; break;
+ case 5: tbstr= "Edit Mode"; tbstr1= "Tab"; keystr= "Tab"; break;
+ case 6: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 7: tbstr= "Grabber"; tbstr1= "g"; keystr= "G"; break;
+ case 8: tbstr= "Rotate"; tbstr1= "r"; keystr= "R"; break;
+ case 9: tbstr= "Scale"; tbstr1= "s"; keystr= "S"; break;
+/* case 10: tbstr= ""; tbstr1= ""; keystr= ""; break; */
+ case 11: tbstr= "Shear"; tbstr1= "c|s"; keystr= "Ctrl S"; break;
+ case 12: tbstr= "Warp/Bend"; tbstr1= "W"; keystr= "Shift W"; break;
+ case 13: tbstr= "Snap Menu"; tbstr1= "S"; keystr= "Shift S"; break;
+ }
+ }
+
+/* ADD TOPICS */
+ if(tbmain==TBOX_MAIN_ADD) {
+
+ if(addmode==0) {
+ switch(y) {
+ case 0: tbstr= "Mesh"; tbstr1= ">>"; keystr= ">>"; tbval=OB_MESH; break;
+ case 1: tbstr= "Curve"; tbstr1= ">>"; keystr= ">>"; tbval=OB_CURVE; ; break;
+ case 2: tbstr= "Surface"; tbstr1= ">>"; keystr= ">>"; tbval=OB_SURF; break;
+ case 3: tbstr= "Text"; tbstr1= ""; keystr= ""; tbval=OB_FONT; tbfunc= add_primitiveFont; break;
+ case 4: tbstr= "MetaBall"; tbstr1= ""; keystr= ""; tbval=OB_MBALL; tbfunc= add_primitiveMball; break;
+ case 5: tbstr= "Empty"; tbstr1= "A"; keystr= ""; tbval=OB_EMPTY; break;
+ case 6: tbstr= ""; tbstr1= ""; keystr= ""; tbval=0; break;
+ case 7: tbstr= "Camera"; tbstr1= "A"; keystr= ""; tbval=OB_CAMERA; break;
+ case 8: tbstr= "Lamp"; tbstr1= "A"; keystr= ""; tbval=OB_LAMP; break;
+ case 9: tbstr= "Armature"; tbstr1= ""; keystr= ""; tbval=OB_ARMATURE; tbfunc=add_primitiveArmature; break;
+ case 10: tbstr= ""; tbstr1= ""; keystr= ""; tbval=0; break;
+ case 11: tbstr= "Lattice"; tbstr1= "A"; keystr= ""; tbval=OB_LATTICE; break;
+ case 12: tbstr= ""; tbstr1= ""; keystr= ""; tbval=0; break;
+ case 13: tbstr= ""; tbstr1= ""; keystr= ""; tbval=0; break;
+ }
+ if(tbstr1 && tbstr1[0]=='A') tbfunc= (void (*)(int) )add_object_draw;
+ }
+ else if(addmode==OB_MESH) {
+ switch(y) {
+ case 0: tbstr= ">Plane"; tbstr1= "A"; keystr= ""; tbval=0; break;
+ case 1: tbstr= ">Cube"; tbstr1= "A"; keystr= ""; tbval=1; break;
+ case 2: tbstr= ">Circle"; tbstr1= "A"; keystr= ""; tbval=4; break;
+ case 3: tbstr= ">UVsphere"; tbstr1= "A"; keystr= ""; tbval=11; break;
+ case 4: tbstr= ">Icosphere";tbstr1= "A"; keystr= ""; tbval=12; break;
+ case 5: tbstr= ">Cylinder"; tbstr1= "A"; keystr= ""; tbval=5; break;
+ case 6: tbstr= ">Tube"; tbstr1= "A"; keystr= ""; tbval=6; break;
+ case 7: tbstr= ">Cone"; tbstr1= "A"; keystr= ""; tbval=7; break;
+ case 8: tbstr= ">"; tbstr1= ""; keystr= ""; break;
+ case 9: tbstr= ">Grid"; tbstr1= "A"; keystr= ""; tbval=10; break;
+ case 13: tbstr= ">Monkey"; tbstr1= "A"; keystr= ""; tbval=13; break;
+ }
+ if(tbstr1 && tbstr1[0]=='A') tbfunc= add_primitiveMesh;
+ }
+ else if(addmode==OB_SURF) {
+ switch(y) {
+ case 0: tbstr= ">Curve"; tbstr1= "A"; keystr= ""; tbval=0; break;
+ case 1: tbstr= ">Circle"; tbstr1= "A"; keystr= ""; tbval=1; break;
+ case 2: tbstr= ">Surface"; tbstr1= "A"; keystr= ""; tbval=2; break;
+ case 3: tbstr= ">Tube"; tbstr1= "A"; keystr= ""; tbval=3; break;
+ case 4: tbstr= ">Sphere"; tbstr1= "A"; keystr= ""; tbval=4; break;
+ case 5: tbstr= ">Donut"; tbstr1= "A"; keystr= ""; tbval=5; break;
+ }
+ if(tbstr1 && tbstr1[0]=='A') tbfunc= add_primitiveNurb;
+ }
+/* else if (addmode==OB_ARMATURE){
+ switch(y) {
+ case 0: tbstr= ">Bone"; tbstr1= "A"; keystr= ""; tbval=0; break;
+ case 1: tbstr= ">Hand"; tbstr1= "A"; keystr= ""; tbval=1; break;
+ case 2: tbstr= ">Biped"; tbstr1= "A"; keystr= ""; tbval=2; break;
+ }
+ if(tbstr1 && tbstr1[0]=='A') tbfunc= add_primitiveArmature;
+ }
+*/
+ else if(addmode==OB_CURVE) {
+ switch(y) {
+ case 0: tbstr= ">Bezier Curve"; tbstr1= "A"; keystr= ""; tbval=10; break;
+ case 1: tbstr= ">Bezier Circle"; tbstr1= "A"; keystr= ""; tbval=11; break;
+ case 2: tbstr= ">"; tbstr1= ""; keystr= ""; break;
+ case 3: tbstr= ">Nurbs Curve"; tbstr1= "A"; keystr= ""; tbval=40; break;
+ case 4: tbstr= ">Nurbs Circle"; tbstr1= "A"; keystr= ""; tbval=41; break;
+ case 5: tbstr= ">"; tbstr1= ""; keystr= ""; break;
+ case 6: tbstr= ">Path"; tbstr1= "A"; keystr= ""; tbval=46; break;
+ }
+ if(tbstr1 && tbstr1[0]=='A') tbfunc= add_primitiveCurve;
+ }
+/* else if(addmode==OB_MBALL) {
+ switch(y) {
+ case 0: tbstr= "Ball"; tbstr1= "A"; tbval=1; break;
+ case 1: tbstr= ""; tbstr1= ""; break;
+ case 2: tbstr= ""; tbstr1= ""; break;
+ case 3: tbstr= ""; tbstr1= ""; break;
+ case 4: tbstr= ""; tbstr1= ""; break;
+ case 5: tbstr= ""; tbstr1= ""; break;
+ case 6: tbstr= ""; tbstr1= ""; break;
+ case 7: tbstr= ""; tbstr1= ""; break;
+ case 8: tbstr= ""; tbstr1= ""; break;
+ case 9: tbstr= ""; tbstr1= ""; break;
+ case 10: tbstr= ""; tbstr1= ""; break;
+ case 11: tbstr= "Duplicate";tbstr1= "D"; break;
+ }
+ if(tbstr1 && tbstr1[0]=='A') tbfunc= add_primitiveMball;
+ }*/
+ }
+
+/* OB TOPICS 1 */
+ else if(tbmain==TBOX_MAIN_OBJECT1) {
+ switch(y) {
+ case 0: tbstr= "Clear Size"; tbstr1= "a|s"; keystr= "Alt S"; break;
+ case 1: tbstr= "Clear Rotation"; tbstr1= "a|r"; keystr= "Alt R"; break;
+ case 2: tbstr= "Clear Location"; tbstr1= "a|g"; keystr= "Alt G"; break;
+ case 3: tbstr= "Clear Origin"; tbstr1= "a|o"; keystr= "Alt O"; break;
+ case 4: tbstr= "Make Parent"; tbstr1= "c|p"; keystr= "Ctrl P"; break;
+ case 5: tbstr= "Clear Parent"; tbstr1= "a|p"; keystr= "Alt P"; break;
+ case 6: tbstr= "Make Track"; tbstr1= "c|t"; keystr= "Ctrl T"; break;
+ case 7: tbstr= "Clear Track"; tbstr1= "a|t"; keystr= "Alt T"; break;
+/* case 8: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 9: tbstr= ""; tbstr1= ""; keystr= ""; break; */
+ case 10: tbstr= "Image Displist"; tbstr1= "c|d"; keystr= "Ctrl D"; break;
+ case 11: tbstr= "Image Aspect"; tbstr1= "a|v"; keystr= "Alt V"; break;
+ }
+ }
+
+/* OB TOPICS 2 */
+ else if(tbmain==TBOX_MAIN_OBJECT2) {
+ switch(y) {
+ case 0: tbstr= "Edit Mode"; tbstr1= "Tab"; keystr= "Tab"; break;
+ case 1: tbstr= "Move To Layer"; tbstr1= "m"; keystr= "M"; break;
+ case 2: tbstr= "Delete"; tbstr1= "x"; keystr= "X"; break;
+ case 3: tbstr= "Delete All"; tbstr1= "c|x"; keystr= "Ctrl X"; break;
+ case 4: tbstr= "Apply Size/Rot"; tbstr1= "c|a"; keystr= "Ctrl A"; break;
+ case 5: tbstr= "Apply Deform"; tbstr1= "c|A"; keystr= "Ctrl Shift A"; break;
+ case 6: tbstr= "Join"; tbstr1= "c|j"; keystr= "Ctrl J"; break;
+ case 7: tbstr= "Make Local"; tbstr1= "l"; keystr= "L"; break;
+ case 8: tbstr= "Select Linked"; tbstr1= "L"; keystr= "Shift L"; break;
+ case 9: tbstr= "Make Links"; tbstr1= "c|l"; keystr= "Ctrl L"; break;
+ case 10: tbstr= "Copy Menu"; tbstr1= "c|c"; keystr= "Ctrl C"; break;
+ case 11: tbstr= "Convert Menu"; tbstr1= "a|c"; keystr= "Alt C"; break;
+ }
+ }
+
+/* mesh TOPICS */
+ else if(tbmain==TBOX_MAIN_MESH) {
+ switch(y) {
+ case 0: tbstr= "Select Linked"; tbstr1= "l"; keystr= "L"; break;
+ case 1: tbstr= "Deselect Linked"; tbstr1= "L"; keystr= "Shift L"; break;
+ case 2: tbstr= "Extrude"; tbstr1= "e"; keystr= "E"; break;
+ case 3: tbstr= "Delete Menu"; tbstr1= "x"; keystr= "X"; break;
+ case 4: tbstr= "Make edge/face"; tbstr1= "f"; keystr= "F"; break;
+ case 5: tbstr= "Fill"; tbstr1= "F"; keystr= "Shift F"; break;
+ case 6: tbstr= "Split"; tbstr1= "y"; keystr= "Y"; break;
+ case 7: tbstr= "Undo/reload"; tbstr1= "u"; keystr= "U"; break;
+ case 8: tbstr= "Calc Normals"; tbstr1= "c|n"; keystr= "Ctrl N"; break;
+ case 9: tbstr= "Separate"; tbstr1= "p"; keystr= "P"; break;
+ case 10: tbstr= "Write Videosc"; tbstr1= "a|w"; keystr= "Alt W"; break;
+/* case 11: tbstr= ""; tbstr1= ""; keystr= ""; break; */
+ }
+ }
+
+/* CURVE TOPICS */
+ else if(tbmain==TBOX_MAIN_CURVE) {
+ switch(y) {
+ case 0: tbstr= "Select Linked"; tbstr1= "l"; keystr= "L"; break;
+ case 1: tbstr= "Deselect Linked"; tbstr1= "L"; keystr= "Shift L"; break;
+ case 2: tbstr= "Extrude"; tbstr1= "e"; keystr= "E"; break;
+ case 3: tbstr= "Delete Menu"; tbstr1= "x"; keystr= "X"; break;
+ case 4: tbstr= "Make Segment"; tbstr1= "f"; keystr= "F"; break;
+ case 5: tbstr= "Cyclic"; tbstr1= "c"; keystr= "C"; break;
+/* case 6: tbstr= ""; tbstr1= ""; keystr= ""; break; */
+ case 7: tbstr= "Select Row"; tbstr1= "R"; keystr= "Shift R"; break;
+ case 8: tbstr= "Calc Handle"; tbstr1= "h"; keystr= "H"; break;
+ case 9: tbstr= "Auto Handle"; tbstr1= "H"; keystr= "Shift H"; break;
+ case 10: tbstr= "Vect Handle"; tbstr1= "v"; keystr= "V"; break;
+ case 11: tbstr= "Specials"; tbstr1= "w"; keystr= "W"; break;
+ }
+ }
+
+/* KEY TOPICS */
+ else if(tbmain==TBOX_MAIN_KEY) {
+ switch(y) {
+ case 0: tbstr= "Insert"; tbstr1= "i"; keystr= "I"; break;
+ case 1: tbstr= "Show"; tbstr1= "k"; keystr= "K"; break;
+ case 2: tbstr= "Next"; tbstr1= "PageUp"; keystr= "PgUp"; break;
+ case 3: tbstr= "Prev"; tbstr1= "PageDn"; keystr= "PgDn"; break;
+ case 4: tbstr= "Show+Sel"; tbstr1= "K"; keystr= "Shift K"; break;
+/* case 5: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 6: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 7: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 8: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 9: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 10: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 11: tbstr= ""; tbstr1= ""; keystr= ""; break; */
+ }
+ }
+
+/* RENDER TOPICS */
+ else if(tbmain==TBOX_MAIN_RENDER) {
+ switch(y) {
+ case 0: tbstr= "Render Window"; tbstr1= "F11"; keystr= "F11"; break;
+ case 1: tbstr= "Render"; tbstr1= "F12"; keystr= "F12"; break;
+ case 2: tbstr= "Set Border"; tbstr1= "B"; keystr= "Shift B"; break;
+ case 3: tbstr= "Image Zoom"; tbstr1= "z"; keystr= "Z"; break;
+/* case 4: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 5: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 6: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 7: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 8: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 9: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 10: tbstr= ""; tbstr1= ""; keystr= ""; break;
+ case 11: tbstr= ""; tbstr1= ""; keystr= ""; break; */
+ }
+ }
+
+/* VIEW TOPICS */
+ else if(tbmain==TBOX_MAIN_VIEW) {
+ switch(y) {
+/* case 0: tbstr= ""; tbstr1= ""; break;
+ case 1: tbstr= ""; tbstr1= ""; break;
+ case 2: tbstr= ""; tbstr1= ""; break;
+ case 3: tbstr= ""; tbstr1= ""; break; */
+ case 4: tbstr= "Centre"; tbstr1= "c"; keystr= "C"; break;
+ case 5: tbstr= "Home"; tbstr1= "C"; keystr= "Shift C"; break;
+/* case 6: tbstr= ""; tbstr1= ""; break;
+ case 7: tbstr= ""; tbstr1= ""; break;
+ case 8: tbstr= ""; tbstr1= ""; break;*/
+ case 9: tbstr= "Z-Buffer"; tbstr1= "z"; keystr= "Z"; break;
+/* case 10: tbstr= ""; tbstr1= ""; break;
+ case 11: tbstr= ""; tbstr1= ""; break;*/
+ }
+ }
+#ifdef PY_TOOLBOX
+ else if(tbmain==TBOX_MAIN_PYTOOL) {
+ TBcallback *t= g_toolbox_menucallback(0, y); // call python menu constructor
+ if (t) {
+ tbstr = t->desc;
+ keystr = t->key;
+ tbfunc = t->cb;
+ tbval = t->val;
+ }
+ }
+#endif
+ }
+}
+
+/* ******************** INIT ************************** */
+
+void dummy(void)
+{
+
+}
+
+
+void bgnpupdraw(int startx, int starty, int endx, int endy)
+{
+ #if defined(__sgi) || defined(__sun__)
+ /* this is a dirty patch: XgetImage gets sometimes the backbuffer */
+ my_get_frontbuffer_image(0, 0, 1, 1);
+ my_put_frontbuffer_image();
+ #endif
+
+ tboldwin= mywinget();
+
+ mywinset(G.curscreen->mainwin);
+
+ /* pietsje groter, 1 pixel aan de rand */
+
+ glReadBuffer(GL_FRONT);
+ glDrawBuffer(GL_FRONT);
+
+ glFinish();
+
+ my_get_frontbuffer_image(startx-1, starty-4, endx-startx+5, endy-starty+6);
+
+ oldcursor= get_cursor();
+ set_cursor(CURSOR_STD);
+
+ tbfontyofs= (TBOXH-11)/2; /* toolbox, hier stond ooit getheigh */
+}
+
+void endpupdraw(void)
+{
+ glFinish();
+ my_put_frontbuffer_image();
+
+ if(tboldwin) {
+ mywinset(tboldwin);
+ set_cursor(oldcursor);
+ }
+
+ glReadBuffer(GL_BACK);
+ glDrawBuffer(GL_BACK);
+}
+
+/* ********************************************** */
+
+void asciitoraw(int ch, unsigned short *event, unsigned short *qual)
+{
+ if( isalpha(ch)==0 ) return;
+
+ if( isupper(ch) ) {
+ *qual= LEFTSHIFTKEY;
+ ch= tolower(ch);
+ }
+
+ switch(ch) {
+ case 'a': *event= AKEY; break;
+ case 'b': *event= BKEY; break;
+ case 'c': *event= CKEY; break;
+ case 'd': *event= DKEY; break;
+ case 'e': *event= EKEY; break;
+ case 'f': *event= FKEY; break;
+ case 'g': *event= GKEY; break;
+ case 'h': *event= HKEY; break;
+ case 'i': *event= IKEY; break;
+ case 'j': *event= JKEY; break;
+ case 'k': *event= KKEY; break;
+ case 'l': *event= LKEY; break;
+ case 'm': *event= MKEY; break;
+ case 'n': *event= NKEY; break;
+ case 'o': *event= OKEY; break;
+ case 'p': *event= PKEY; break;
+ case 'q': *event= QKEY; break;
+ case 'r': *event= RKEY; break;
+ case 's': *event= SKEY; break;
+ case 't': *event= TKEY; break;
+ case 'u': *event= UKEY; break;
+ case 'v': *event= VKEY; break;
+ case 'w': *event= WKEY; break;
+ case 'x': *event= XKEY; break;
+ case 'y': *event= YKEY; break;
+ case 'z': *event= ZKEY; break;
+ }
+}
+
+void tbox_execute(void)
+{
+ /* als tbfunc: functie aanroepen */
+ /* als tbstr1 is een string: value tbval in queue stopen */
+ unsigned short event=0;
+ unsigned short qual1=0, qual2=0;
+
+ if(tbfunc) {
+ tbfunc(tbval);
+ }
+ else if(tbstr1) {
+ if(strcmp(tbstr1, "Tab")==0) {
+ event= TABKEY;
+ }
+ else if(strcmp(tbstr1, "PageUp")==0) {
+ event= PAGEUPKEY;
+ }
+ else if(strcmp(tbstr1, "PageDn")==0) {
+ event= PAGEDOWNKEY;
+ }
+ else if(strcmp(tbstr1, "shift+F1")==0) {
+ qual1= LEFTSHIFTKEY;
+ event= F1KEY;
+ }
+ else if(strcmp(tbstr1, "shift+F2")==0) {
+ qual1= LEFTSHIFTKEY;
+ event= F2KEY;
+ }
+ /* ctrl-s (Shear): switch into editmode ### */
+ else if(strcmp(tbstr1, "c|s")==0) {
+ if (!G.obedit) {
+ enter_editmode();
+ /* ### put these into a deselectall_gen() */
+ if(G.obedit->type==OB_MESH) deselectall_mesh();
+ else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) deselectall_nurb();
+ else if(G.obedit->type==OB_MBALL) deselectall_mball();
+ else if(G.obedit->type==OB_LATTICE) deselectall_Latt();
+ /* ### */
+ }
+ qual1 = LEFTCTRLKEY;
+ event = SKEY;
+ }
+ else if(strcmp(tbstr1, "W")==0) {
+ if (!G.obedit) {
+ enter_editmode();
+ /* ### put these into a deselectall_gen() */
+ if(G.obedit->type==OB_MESH) deselectall_mesh();
+ else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) deselectall_nurb();
+ else if(G.obedit->type==OB_MBALL) deselectall_mball();
+ else if(G.obedit->type==OB_LATTICE) deselectall_Latt();
+ /* ### */
+ }
+ qual1 = LEFTSHIFTKEY;
+ event = WKEY;
+ }
+
+ else if(strlen(tbstr1)<4 || (strlen(tbstr1)==4 && tbstr1[2]=='F')) {
+
+ if(tbstr1[1]=='|') {
+ if(tbstr1[0]=='c') qual1= LEFTCTRLKEY;
+ else if(tbstr1[0]=='a') qual1= LEFTALTKEY;
+
+ if (tbstr1[2]=='F') {
+ switch(tbstr1[3]) {
+ case '1': event= F1KEY; break;
+ case '2': event= F2KEY; break;
+ case '3': event= F3KEY; break;
+ case '4': event= F4KEY; break;
+ case '5': event= F5KEY; break;
+ case '6': event= F6KEY; break;
+ case '7': event= F7KEY; break;
+ case '8': event= F8KEY; break;
+ case '9': event= F9KEY; break;
+ }
+ }
+ else asciitoraw(tbstr1[2], &event, &qual2);
+ }
+ else if(tbstr1[1]==0) {
+ asciitoraw(tbstr1[0], &event, &qual2);
+ }
+ else if(tbstr1[0]=='F') {
+ event= atoi(tbstr1+1);
+ switch(event) {
+ case 1: event= F1KEY; break;
+ case 2: event= F2KEY; break;
+ case 3: event= F3KEY; break;
+ case 4: event= F4KEY; break;
+ case 5: event= F5KEY; break;
+ case 6: event= F6KEY; break;
+ case 7: event= F7KEY; break;
+ case 8: event= F8KEY; break;
+ case 9: event= F9KEY; break;
+ case 10: event= F10KEY; break;
+ case 11: event= F11KEY; break;
+ case 12: event= F12KEY; break;
+ }
+ }
+ }
+
+ if(event) {
+ if(qual1) mainqenter(qual1, 1);
+ if(qual2) mainqenter(qual2, 1);
+ mainqenter(event, 1);
+ mainqenter(event, 0);
+ mainqenter(EXECUTE, 1);
+ if(qual1) mainqenter(qual1, 0);
+ if(qual2) mainqenter(qual2, 0);
+ }
+ }
+
+}
+
+void tbox_getmouse(mval)
+short *mval;
+{
+
+ getmouseco_sc(mval);
+
+}
+
+void tbox_setmain(int val)
+{
+ tbmain= val;
+
+ if(tbmain==0 && G.obedit) {
+ addmode= G.obedit->type;
+ }
+}
+
+void bgntoolbox(void)
+{
+ short xmax, ymax, mval[2];
+
+ xmax = G.curscreen->sizex;
+ ymax = G.curscreen->sizey;
+
+ tbox_getmouse(mval);
+
+ if(mval[0]<95) mval[0]= 95;
+ if(mval[0]>xmax-95) mval[0]= xmax-95;
+
+ warp_pointer(mval[0], mval[1]);
+
+ tbx1= mval[0]-tbmemx;
+ tby1= mval[1]-tbmemy;
+ if(tbx1<10) tbx1= 10;
+ if(tby1<10) tby1= 10;
+
+ tbx2= tbx1+TBOXX;
+ tby2= tby1+TBOXY;
+ if(tbx2>xmax) {
+ tbx2= xmax-10;
+ tbx1= tbx2-TBOXX;
+ }
+ if(tby2>ymax) {
+ tby2= ymax-10;
+ tby1= tby2-TBOXY;
+ }
+
+ bgnpupdraw(tbx1, tby1, tbx2, tby2);
+}
+
+void endtoolbox(void)
+{
+ short mval[2];
+
+ tbox_getmouse(mval);
+ if(mval[0]>tbx1 && mval[0]<tbx2)
+ if(mval[1]>tby1 && mval[1]<tby2) {
+ tbmemx= mval[0]-(tbx1);
+ tbmemy= mval[1]-(tby1);
+ }
+
+ endpupdraw();
+}
+
+
+void tbox_embossbox(short x1, short y1, short x2, short y2, short type)
+/* type: 0=menu, 1=menusel, 2=topic, 3=topicsel */
+{
+
+ if(type==0) {
+ glColor3ub(160, 160, 160);
+ glRects(x1+1, y1+1, x2-1, y2-1);
+ }
+ if(type==1) {
+ glColor3ub(50, 50, 100);
+ glRects(x1+1, y1+1, x2-1, y2-1);
+ }
+ if(type==2) {
+ glColor3ub(190, 190, 190);
+ glRects(x1+1, y1+1, x2-1, y2-1);
+ }
+ if(type==3) {
+ cpack(0xc07070);
+ glRects(x1+1, y1+1, x2-1, y2-1);
+ }
+
+ if(type & 1) cpack(0xFFFFFF);
+ else cpack(0x0);
+}
+
+
+void tbox_drawelem_body(x, y, type)
+{
+ int x1 = 0, y1, x2 = 0, y2;
+
+ if(x==0) {
+ x1= tbx1; x2= tbx1+TBOXXL;
+ }
+ else if(x==1) {
+ x1= tbx1+TBOXXL;
+ x2= x1+ TBOXXR-1;
+ }
+
+ y1= tby1+ (TBOXEL-y-1)*TBOXH;
+ y2= y1+TBOXH-1;
+
+ tbox_embossbox(x1, y1, x2, y2, type);
+
+}
+
+void tbox_drawelem_text(x, y, type)
+{
+ int x1 = 0, y1, x2 = 0, y2, len1, len2;
+
+ if(x==0) {
+ x1= tbx1; x2= tbx1+TBOXXL;
+ }
+ else if(x==1) {
+ x1= tbx1+TBOXXL;
+ x2= x1+ TBOXXR-1;
+ }
+
+ y1= tby1+ (TBOXEL-y-1)*TBOXH;
+ y2= y1+TBOXH-1;
+
+ if(type==0 || type==2) {
+ ColorFunc(TBOXBLACK);
+ }
+ else {
+ glColor3ub(240, 240, 240);
+ }
+
+ /* tekst */
+ tbox_setinfo(x, y);
+ if(tbstr && tbstr[0]) {
+ len1= 5+BMF_GetStringWidth(G.font, tbstr);
+// if(tbstr1) len2= 5+BMF_GetStringWidth(G.font, tbstr1); else len2= 0;
+ if(keystr) len2= 5+BMF_GetStringWidth(G.font, keystr); else len2= 0;
+
+ while(len1>0 && (len1+len2+5>x2-x1) ) {
+ tbstr[strlen(tbstr)-1]= 0;
+ len1= BMF_GetStringWidth(G.font, tbstr);
+ }
+
+ glRasterPos2i(x1+5, y1+tbfontyofs);
+ BMF_DrawString(G.font, tbstr);
+
+// if(tbstr1 && tbstr1[0]) {
+ if(keystr && keystr[0]) {
+ if(type & 1) {
+ ColorFunc(TBOXBLACK);
+
+ glRecti(x2-len2-2, y1+2, x2-3, y2-2);
+ ColorFunc(TBOXWHITE);
+ glRasterPos2i(x2-len2, y1+tbfontyofs);
+// BMF_DrawString(G.font, tbstr1);
+ BMF_DrawString(G.font, keystr);
+ }
+ else {
+ ColorFunc(TBOXBLACK);
+ glRasterPos2i(x2-len2, y1+tbfontyofs);
+// BMF_DrawString(G.font, tbstr1);
+ BMF_DrawString(G.font, keystr);
+ }
+ }
+ }
+}
+
+
+void tbox_drawelem(x, y, type)
+int x, y, type;
+{
+ /* type: 0=menu, 1=menusel, 2=topic, 3=topicsel */
+
+ tbox_drawelem_body(x, y, type);
+ tbox_drawelem_text(x, y, type);
+
+}
+
+void tbox_getactive(x, y)
+int *x, *y;
+{
+ short mval[2];
+
+ tbox_getmouse(mval);
+
+ mval[0]-=tbx1;
+ if(mval[0]<TBOXXL) *x= 0;
+ else *x= 1;
+
+ *y= mval[1]-tby1;
+ *y/= TBOXH;
+ *y= TBOXEL- *y-1;
+ if(*y<0) *y= 0;
+ if(*y>TBOXEL-1) *y= TBOXEL-1;
+
+}
+
+void drawtoolbox(void)
+{
+ int x, y, actx, acty, type;
+
+ tbox_getactive(&actx, &acty);
+
+ /* de background */
+ for(x=0; x<2; x++) {
+
+ for(y=0; y<TBOXEL; y++) {
+
+ if(x==0) type= 0;
+ else type= 2;
+
+ if(actx==x && acty==y) type++;
+ if(type==0) {
+ if(tbmain==y) type= 1;
+ }
+
+ tbox_drawelem_body(x, y, type);
+
+ }
+ }
+
+ /* de text */
+ for(x=0; x<2; x++) {
+
+ for(y=0; y<TBOXEL; y++) {
+
+ if(x==0) type= 0;
+ else type= 2;
+
+ if(actx==x && acty==y) type++;
+ if(type==0) {
+ if(tbmain==y) type= 1;
+ }
+
+ tbox_drawelem_text(x, y, type);
+
+ }
+ }
+ glFinish(); /* for geforce, to show it in the frontbuffer */
+
+}
+
+
+void toolbox(void)
+{
+ int actx, acty, y;
+ unsigned short event;
+ short val, mval[2], xo= -1, yo=0;
+
+ bgntoolbox();
+ glColor3ub(0xB0, 0xB0, 0xB0);
+ uiDrawMenuBox((float)tbx1, (float)tby1-1, (float)tbx2, (float)tby2);
+ drawtoolbox();
+
+ /*
+ * De aktieve window wordt in queue terug gestopt.
+ */
+
+ while(1) {
+ event= extern_qread(&val);
+ if(event) {
+ switch(event) {
+ case LEFTMOUSE: case MIDDLEMOUSE: case RIGHTMOUSE: case RETKEY: case PADENTER:
+ if(val==1) {
+ tbox_getactive(&actx, &acty);
+ tbox_setinfo(actx, acty);
+
+ if(event==RIGHTMOUSE) {
+ if(addmode) {
+ addmode= 0;
+ drawtoolbox();
+ }
+ }
+ else if(tbstr1 && tbstr1[0]=='>') {
+ addmode= tbval;
+ drawtoolbox();
+ }
+ else {
+ endtoolbox();
+ tbox_execute();
+ return;
+ }
+ }
+ break;
+ case ESCKEY:
+ /* altkeys: om conflicten met overdraw en stow/push/pop te voorkomen */
+#ifndef MAART
+/* Temporary for making screen dumps (Alt+PrtSc) */
+ case LEFTALTKEY:
+ case RIGHTALTKEY:
+#endif /* MAART */
+ if(val) endtoolbox();
+ return;
+ }
+ }
+
+ tbox_getmouse(mval);
+ if(mval[0]<tbx1-10 || mval[0]>tbx2+10 || mval[1]<tby1-10 || mval[1]>tby2+10) break;
+
+ tbox_getactive(&actx, &acty);
+
+ /* muisafhandeling en redraw */
+ if(xo!=actx || yo!=acty) {
+ if(actx==0) {
+ if (acty==0) addmode=0;
+
+ tbox_drawelem(0, tbmain, 0);
+ tbox_drawelem(0, acty, 1);
+
+ tbmain= acty;
+ addmode= 0;
+ for(y=0; y<TBOXEL; y++) tbox_drawelem(1, y, 2);
+ }
+ else if(xo> -1) {
+ if(xo==0) tbox_drawelem(xo, yo, 1);
+ else tbox_drawelem(xo, yo, 2);
+ tbox_drawelem(actx, acty, 3);
+ }
+
+ glFinish(); /* for geforce, to show it in the frontbuffer */
+
+ xo= actx;
+ yo= acty;
+ }
+ }
+
+ endtoolbox();
+}
+
+/* ************************************ */
+
+static int vconfirm(char *title, char *itemfmt, va_list ap)
+{
+ char *s, buf[512];
+
+ s= buf;
+ if (title) s+= sprintf(s, "%s%%t|", title);
+ vsprintf(s, itemfmt, ap);
+
+ return (pupmenu(buf)>=0);
+}
+
+static int confirm(char *title, char *itemfmt, ...)
+{
+ va_list ap;
+ int ret;
+
+ va_start(ap, itemfmt);
+ ret= vconfirm(title, itemfmt, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+int okee(char *str, ...)
+{
+ va_list ap;
+ int ret;
+
+ va_start(ap, str);
+ ret= vconfirm("OK?", str, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+void notice(char *str, ...)
+{
+ va_list ap;
+
+ va_start(ap, str);
+ vconfirm(NULL, str, ap);
+ va_end(ap);
+}
+
+void error(char *fmt, ...)
+{
+ va_list ap;
+ char nfmt[256];
+
+ sprintf(nfmt, "ERROR: %s", fmt);
+
+ va_start(ap, fmt);
+ if (G.background || !G.curscreen) {
+ vprintf(nfmt, ap);
+ printf("\n");
+ } else {
+ vconfirm(NULL, nfmt, ap);
+ }
+ va_end(ap);
+}
+
+int saveover(char *file)
+{
+ return (!BLI_exists(file) || confirm("SAVE OVER", file));
+}
+
+/* ****************** EXTRAATJE **************** */
+
+short button(short *var, short min, short max, char *str)
+{
+ uiBlock *block;
+ ListBase listb={0, 0};
+ short x1,y1;
+ short mval[2], ret=0;
+
+ if(min>max) min= max;
+
+ getmouseco_sc(mval);
+
+ if(mval[0]<150) mval[0]=150;
+ if(mval[1]<30) mval[1]=30;
+ if(mval[0]>G.curscreen->sizex) mval[0]= G.curscreen->sizex-10;
+ if(mval[1]>G.curscreen->sizey) mval[1]= G.curscreen->sizey-10;
+
+ block= uiNewBlock(&listb, "button", UI_EMBOSSX, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_RET_1);
+
+ x1=mval[0]-150;
+ y1=mval[1]-20;
+
+ uiDefButS(block, NUM, 0, str, (short)(x1+5),(short)(y1+10),125,20, var,(float)min,(float)max, 0, 0, "");
+ uiDefBut(block, BUT, 1, "OK", (short)(x1+136),(short)(y1+10),25,20, NULL, 0, 0, 0, 0, "");
+
+ uiBoundsBlock(block, 5);
+
+ ret= uiDoBlocks(&listb, 0);
+
+ if(ret==UI_RETURN_OK) return 1;
+ return 0;
+}
+
+short sbutton(char *var, float min, float max, char *str)
+{
+ uiBlock *block;
+ ListBase listb={0, 0};
+ short x1,y1;
+ short mval[2], ret=0;
+
+ if(min>max) min= max;
+
+ getmouseco_sc(mval);
+
+ if(mval[0]<150) mval[0]=150;
+ if(mval[1]<30) mval[1]=30;
+ if(mval[0]>G.curscreen->sizex) mval[0]= G.curscreen->sizex-10;
+ if(mval[1]>G.curscreen->sizey) mval[1]= G.curscreen->sizey-10;
+
+ block= uiNewBlock(&listb, "button", UI_EMBOSSX, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_RET_1);
+
+ x1=mval[0]-150;
+ y1=mval[1]-20;
+
+ uiDefButC(block, TEX, 0, str, x1+5,y1+10,125,20, var,(float)min,(float)max, 0, 0, "");
+ uiDefBut(block, BUT, 1, "OK", x1+136,y1+10,25,20, NULL, 0, 0, 0, 0, "");
+
+ uiBoundsBlock(block, 5);
+
+ ret= uiDoBlocks(&listb, 0);
+
+ if(ret==UI_RETURN_OK) return 1;
+ return 0;
+}
+
+short fbutton(float *var, float min, float max, char *str)
+{
+ uiBlock *block;
+ ListBase listb={0, 0};
+ short x1,y1;
+ short mval[2], ret=0;
+
+ if(min>max) min= max;
+
+ getmouseco_sc(mval);
+
+ if(mval[0]<150) mval[0]=150;
+ if(mval[1]<30) mval[1]=30;
+ if(mval[0]>G.curscreen->sizex) mval[0]= G.curscreen->sizex-10;
+ if(mval[1]>G.curscreen->sizey) mval[1]= G.curscreen->sizey-10;
+
+ block= uiNewBlock(&listb, "button", UI_EMBOSSX, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_RET_1);
+
+ x1=mval[0]-150;
+ y1=mval[1]-20;
+
+ uiDefButF(block, NUM, 0, str,(short)(x1+5),(short)(y1+10),125,20, var, min, max, 0, 0, "");
+ uiDefBut(block, BUT, 1, "OK",(short)(x1+136),(short)(y1+10), 35, 20, NULL, 0, 0, 0, 0, "");
+
+ uiBoundsBlock(block, 2);
+
+ ret= uiDoBlocks(&listb, 0);
+
+ if(ret==UI_RETURN_OK) return 1;
+ return 0;
+}
+
+int movetolayer_buts(unsigned int *lay)
+{
+ uiBlock *block;
+ ListBase listb={0, 0};
+ int dx, dy, a, x1, y1, sizex=160, sizey=30;
+ short pivot[2], mval[2], ret=0;
+
+ if(G.vd->localview) {
+ error("Not in localview ");
+ return ret;
+ }
+
+ getmouseco_sc(mval);
+
+ pivot[0]= CLAMPIS(mval[0], (sizex+10), G.curscreen->sizex-30);
+ pivot[1]= CLAMPIS(mval[1], (sizey/2)+10, G.curscreen->sizey-(sizey/2)-10);
+
+ if (pivot[0]!=mval[0] || pivot[1]!=mval[1])
+ warp_pointer(pivot[0], pivot[1]);
+
+ mywinset(G.curscreen->mainwin);
+
+ x1= pivot[0]-sizex+10;
+ y1= pivot[1]-sizey/2;
+
+ block= uiNewBlock(&listb, "button", UI_EMBOSSX, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_NUMSELECT|UI_BLOCK_RET_1);
+
+ dx= (sizex-5)/12;
+ dy= sizey/2;
+
+ for(a=0; a<10; a++) {
+ uiDefButI(block, TOGR|BIT|a, 0, "",(short)(x1+a*dx),(short)(y1+dy),(short)dx,(short)dy, lay, 0, 0, 0, 0, "");
+ if(a==4) x1+= 5;
+ }
+ x1-= 5;
+
+ for(a=0; a<10; a++) {
+ uiDefButI(block, TOGR|BIT|(a+10), 0, "",(short)(x1+a*dx),(short)y1,(short)dx,(short)dy, lay, 0, 0, 0, 0, "");
+ if(a==4) x1+= 5;
+ }
+ x1-= 5;
+
+ uiDefBut(block, BUT, 1, "OK", (short)(x1+10*dx+10), (short)y1, (short)(3*dx), (short)(2*dy), NULL, 0, 0, 0, 0, "");
+
+ uiBoundsBlock(block, 2);
+
+ ret= uiDoBlocks(&listb, 0);
+
+ if(ret==UI_RETURN_OK) return 1;
+ return 0;
+}
+
+/* ********************** CLEVER_NUMBUTS ******************** */
+
+#define MAXNUMBUTS 24
+
+VarStruct numbuts[MAXNUMBUTS];
+void *numbpoin[MAXNUMBUTS];
+int numbdata[MAXNUMBUTS];
+
+void draw_numbuts_tip(char *str, int x1, int y1, int x2, int y2)
+{
+ static char *last=0; /* avoid ugly updates! */
+ int temp;
+
+ if(str==last) return;
+ last= str;
+ if(str==0) return;
+
+ glColor3ub(160, 160, 160); /* MGREY */
+ glRecti(x1+4, y2-36, x2-4, y2-16);
+
+ cpack(0x0);
+
+ temp= 0;
+ while( BMF_GetStringWidth(G.fonts, str+temp)>(x2 - x1-24)) temp++;
+ glRasterPos2i(x1+16, y2-30);
+ BMF_DrawString(G.fonts, str+temp);
+}
+
+int do_clever_numbuts(char *name, int tot, int winevent)
+{
+ ListBase listb= {NULL, NULL};
+ uiBlock *block;
+ VarStruct *varstr;
+ int a, sizex, sizey, x1, y2;
+ short mval[2], event;
+
+ if(tot<=0 || tot>MAXNUMBUTS) return 0;
+
+ getmouseco_sc(mval);
+
+ /* size */
+ sizex= 235;
+ sizey= 30+20*(tot+1);
+
+ /* midden */
+ if(mval[0]<sizex/2) mval[0]=sizex/2;
+ if(mval[1]<sizey/2) mval[1]=sizey/2;
+ if(mval[0]>G.curscreen->sizex -sizex/2) mval[0]= G.curscreen->sizex -sizex/2;
+ if(mval[1]>G.curscreen->sizey -sizey/2) mval[1]= G.curscreen->sizey -sizey/2;
+
+ mywinset(G.curscreen->mainwin);
+
+ x1= mval[0]-sizex/2;
+ y2= mval[1]+sizey/2;
+
+ block= uiNewBlock(&listb, "numbuts", UI_EMBOSSX, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_RET_1|UI_BLOCK_ENTER_OK);
+
+ /* LET OP: TEX BUTTON UITZONDERING */
+ /* WAARSCHUWING: ALLEEN EEN ENKELE BITJES-BUTTON MOGELIJK: ER WORDT OP KOPIEDATA GEWERKT! */
+
+ uiDefBut(block, LABEL, 0, name, (short)(x1+15), (short)(y2-35), (short)(sizex-60), 19, 0, 1.0, 0.0, 0, 0, "");
+
+ if(name[0]=='A' && name[7]=='O') {
+ y2 -= 20;
+ uiDefBut(block, LABEL, 0, "Rotations in degrees!", (short)(x1+15), (short)(y2-35), (short)(sizex-60), 19, 0, 0.0, 0.0, 0, 0, "");
+ }
+
+ varstr= &numbuts[0];
+ for(a=0; a<tot; a++, varstr++) {
+ if(varstr->type==TEX) {
+ uiDefBut(block, TEX, 0, varstr->name,(short)(x1+15),(short)(y2-55-20*a),(short)(sizex-60), 19, numbpoin[a], varstr->min, varstr->max, 0, 0, varstr->tip);
+ }
+ else {
+ uiDefBut(block, varstr->type, 0, varstr->name,(short)(x1+15),(short)(y2-55-20*a), (short)(sizex-60), 19, &(numbdata[a]), varstr->min, varstr->max, 100, 0, varstr->tip);
+ }
+ }
+
+ uiDefBut(block, BUT, 4000, "OK", (short)(x1+sizex-40),(short)(y2-35-20*a), 25, (short)(sizey-50), 0, 0, 0, 0, 0, "OK: Assign Values");
+
+ uiBoundsBlock(block, 5);
+
+ event= uiDoBlocks(&listb, 0);
+
+ areawinset(curarea->win);
+
+ if(event & UI_RETURN_OK) {
+
+ varstr= &numbuts[0];
+ for(a=0; a<tot; a++, varstr++) {
+ if(varstr->type==TEX);
+ else if ELEM( (varstr->type & BUTPOIN), FLO, INT ) memcpy(numbpoin[a], numbdata+a, 4);
+ else if((varstr->type & BUTPOIN)==SHO ) *((short *)(numbpoin[a]))= *( (short *)(numbdata+a));
+
+ if( strncmp(varstr->name, "Rot", 3)==0 ) {
+ float *fp;
+
+ fp= numbpoin[a];
+ fp[0]= M_PI*fp[0]/180.0;
+ }
+ }
+
+ if(winevent) {
+ ScrArea *sa;
+
+ sa= G.curscreen->areabase.first;
+ while(sa) {
+ if(sa->spacetype==curarea->spacetype) addqueue(sa->win, winevent, 1);
+ sa= sa->next;
+ }
+ }
+
+ return 1;
+ }
+ return 0;
+}
+
+void add_numbut(int nr, int type, char *str, float min, float max, void *poin, char *tip)
+{
+ if(nr>=MAXNUMBUTS) return;
+
+ numbuts[nr].type= type;
+ strcpy(numbuts[nr].name, str);
+ numbuts[nr].min= min;
+ numbuts[nr].max= max;
+ if(tip) strcpy(numbuts[nr].tip, tip);
+
+ /* LET OP: TEX BUTTON UITZONDERING */
+
+ numbpoin[nr]= poin;
+
+ if ELEM( (type & BUTPOIN), FLO, INT ) memcpy(numbdata+nr, poin, 4);
+ if((type & BUTPOIN)==SHO ) *((short *)(numbdata+nr))= *( (short *)poin);
+
+ if( strncmp(numbuts[nr].name, "Rot", 3)==0 ) {
+ float *fp;
+
+ fp= (float *)(numbdata+nr);
+ fp[0]= 180.0*fp[0]/M_PI;
+ }
+
+}
+
+void clever_numbuts(void)
+{
+ Object *ob;
+ float lim;
+ char str[128];
+
+ if(curarea->spacetype==SPACE_VIEW3D) {
+ lim= 1000.0*MAX2(1.0, G.vd->grid);
+
+ if(G.obpose){
+ if (G.obpose->type == OB_ARMATURE) clever_numbuts_posearmature();
+ }
+ else if(G.obedit==0) {
+ ob= OBACT;
+ if(ob==0) return;
+
+ add_numbut(0, NUM|FLO, "LocX:", -lim, lim, ob->loc, 0);
+ add_numbut(1, NUM|FLO, "LocY:", -lim, lim, ob->loc+1, 0);
+ add_numbut(2, NUM|FLO, "LocZ:", -lim, lim, ob->loc+2, 0);
+
+ add_numbut(3, NUM|FLO, "RotX:", -10.0*lim, 10.0*lim, ob->rot, 0);
+ add_numbut(4, NUM|FLO, "RotY:", -10.0*lim, 10.0*lim, ob->rot+1, 0);
+ add_numbut(5, NUM|FLO, "RotZ:", -10.0*lim, 10.0*lim, ob->rot+2, 0);
+
+ add_numbut(6, NUM|FLO, "SizeX:", -lim, lim, ob->size, 0);
+ add_numbut(7, NUM|FLO, "SizeY:", -lim, lim, ob->size+1, 0);
+ add_numbut(8, NUM|FLO, "SizeZ:", -lim, lim, ob->size+2, 0);
+
+ sprintf(str, "Active Object: %s", ob->id.name+2);
+ do_clever_numbuts(str, 9, REDRAW);
+
+ }
+ else if(G.obedit->type==OB_MESH) clever_numbuts_mesh();
+ else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) clever_numbuts_curve();
+ else if (G.obedit->type==OB_ARMATURE) clever_numbuts_armature();
+ }
+ else if(curarea->spacetype==SPACE_NLA){
+ clever_numbuts_nla();
+ }
+ else if(curarea->spacetype==SPACE_IPO) {
+ clever_numbuts_ipo();
+ }
+ else if(curarea->spacetype==SPACE_SEQ) {
+ clever_numbuts_seq();
+ }
+ else if(curarea->spacetype==SPACE_IMAGE) {
+ clever_numbuts_sima();
+ }
+ else if(curarea->spacetype==SPACE_BUTS){
+ clever_numbuts_buts();
+ }
+
+
+}
+
+
+void replace_names_but(void)
+{
+ Image *ima= G.main->image.first;
+ short len, tot=0;
+ char old[64], new[64], temp[80];
+
+ strcpy(old, "/");
+ strcpy(new, "/");
+
+ add_numbut(0, TEX, "Old:", 0, 63, old, 0);
+ add_numbut(1, TEX, "New:", 0, 63, new, 0);
+
+ if (do_clever_numbuts("Replace image name", 2, REDRAW) ) {
+
+ len= strlen(old);
+
+ while(ima) {
+
+ if(strncmp(old, ima->name, len)==0) {
+
+ strcpy(temp, new);
+ strcat(temp, ima->name+len);
+ BLI_strncpy(ima->name, temp, sizeof(ima->name));
+
+ if(ima->ibuf) IMB_freeImBuf(ima->ibuf);
+ ima->ibuf= 0;
+ ima->ok= 1;
+
+ tot++;
+ }
+
+ ima= ima->id.next;
+ }
+
+ notice("Replaced %d names", tot);
+ }
+
+}