~ubuntu-branches/ubuntu/gutsy/blender/gutsy-security

« back to all changes in this revision

Viewing changes to source/blender/src/header_view3d.c

  • Committer: Bazaar Package Importer
  • Author(s): Florian Ernst
  • Date: 2005-11-06 12:40:03 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20051106124003-3pgs7tcg5rox96xg
Tags: 2.37a-1.1
* Non-maintainer upload.
* Split out parts of 01_SConstruct_debian.dpatch again: root_build_dir
  really needs to get adjusted before the clean target runs - closes: #333958,
  see #288882 for reference

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
 * Functions to draw the "3D Viewport" window header
5
5
 * and handle user events sent to it.
6
6
 * 
7
 
 * $Id: header_view3d.c,v 1.51 2004/05/12 16:53:11 broken Exp $
 
7
 * $Id: header_view3d.c,v 1.113 2005/05/29 04:18:59 broken Exp $
8
8
 *
9
9
 * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
10
10
 *
42
42
#include <config.h>
43
43
#endif
44
44
 
45
 
#ifdef WIN32
46
 
#include "BLI_winstuff.h"
47
 
#endif
48
 
 
49
45
#include "BMF_Api.h"
50
46
#include "BIF_language.h"
51
 
#ifdef INTERNATIONAL
52
 
#include "FTF_Api.h"
53
 
#endif
54
47
 
55
48
#include "MEM_guardedalloc.h"
56
49
 
62
55
#include "DNA_space_types.h"
63
56
#include "DNA_view3d_types.h"
64
57
#include "DNA_image_types.h"
 
58
#include "DNA_text_types.h" /* for space handlers */
65
59
#include "DNA_texture_types.h"
66
60
 
67
61
#include "BKE_library.h"
73
67
#include "BKE_mesh.h"
74
68
#include "BKE_image.h"
75
69
 
 
70
#include "BLI_arithb.h"
76
71
#include "BLI_blenlib.h"
77
72
 
78
73
#include "BSE_edit.h"
90
85
 
91
86
#include "BIF_editlattice.h"
92
87
#include "BIF_editarmature.h"
 
88
#include "BIF_editdeform.h"
93
89
#include "BIF_editfont.h"
94
90
#include "BIF_editmesh.h"
 
91
#include "BIF_editmode_undo.h"
95
92
#include "BIF_editview.h"
96
93
#include "BIF_interface.h"
97
94
#include "BIF_mainqueue.h"
 
95
#include "BIF_meshtools.h"
98
96
#include "BIF_poseobject.h"
99
97
#include "BIF_renderwin.h"
100
98
#include "BIF_resources.h"
103
101
#include "BIF_toets.h"
104
102
#include "BIF_toolbox.h"
105
103
#include "BIF_gl.h"
 
104
#include "BIF_transform.h"
 
105
 
 
106
#include "BPY_extern.h"
 
107
#include "BPY_menus.h"
106
108
 
107
109
#include "blendef.h"
108
110
#include "mydevice.h"
170
172
        scrarea_queue_headredraw(curarea);
171
173
        
172
174
        if(curarea->spacetype==SPACE_OOPS) allqueue(REDRAWVIEW3D, 1); /* 1==also do headwin */
173
 
        
 
175
        if(G.vd->drawtype == OB_SHADED) reshadeall_displist();  
174
176
}
175
177
 
176
178
static void do_view3d_view_cameracontrolsmenu(void *arg, int event)
292
294
                /* This ugly hack is a symptom of the nasty persptoetsen function, 
293
295
                 * but at least it works for now.
294
296
                 */
295
 
                G.qual |= LR_SHIFTKEY;
 
297
                G.qual |= LR_CTRLKEY|LR_ALTKEY;
296
298
                persptoetsen(PAD0);
297
 
                G.qual &= ~LR_SHIFTKEY;
 
299
                G.qual &= ~(LR_CTRLKEY|LR_ALTKEY);
298
300
                break;
299
301
        case 5: /* Align View to Selected (object mode) */
300
302
                mainqenter(PADASTERKEY, 1);
301
303
                break;
 
304
        case 6: /* Center View and Cursor to Origin */
 
305
                view3d_home(1);
 
306
                curs= give_cursor();
 
307
                curs[0]=curs[1]=curs[2]= 0.0;
 
308
                break;
302
309
        }
303
310
        allqueue(REDRAWVIEW3D, 0);
304
311
}
312
319
        block= uiNewBlock(&curarea->uiblocks, "view3d_view_alignviewmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
313
320
        uiBlockSetButmFunc(block, do_view3d_view_alignviewmenu, NULL);
314
321
 
315
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Centre View to Cursor|C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
316
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align Active Camera to View|Shift NumPad 0",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");   
 
322
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center View to Cursor|C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
 
323
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center Cursor and View All|Shift C",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
 
324
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align Active Camera to View|Ctrl Alt NumPad 0",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");   
317
325
 
318
326
        if (((G.obedit) && (G.obedit->type == OB_MESH)) || (G.f & G_FACESELECT)) {
319
327
                uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Top)|Shift V",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
328
336
        return block;
329
337
}
330
338
 
 
339
static void do_view3d_view_spacehandlers(void *arg, int event)
 
340
{
 
341
        Text *text = G.main->text.first;
 
342
        unsigned short menu_evt_num = 0;
 
343
 
 
344
        if (event > 0) {
 
345
                while (text) {
 
346
                        if (++menu_evt_num == event) {
 
347
 
 
348
                                if (BPY_has_spacehandler(text, curarea))
 
349
                                        BPY_del_spacehandler(text, curarea);
 
350
                                else
 
351
                                        BPY_add_spacehandler(text, curarea, SPACE_VIEW3D);
 
352
 
 
353
                                break;
 
354
                        }
 
355
                        text = text->id.next;
 
356
                }
 
357
        }
 
358
 
 
359
        allqueue(REDRAWVIEW3D, 1);
 
360
}
 
361
 
 
362
static uiBlock *view3d_view_spacehandlers(void *arg_unused)
 
363
{
 
364
        uiBlock *block;
 
365
        short yco= 0, menuwidth=120;
 
366
        Text *text = G.main->text.first;
 
367
        ScrArea *sa = curarea;
 
368
        unsigned short handlertype;
 
369
        int icontype, slinks_num = 0;
 
370
        unsigned short menu_evt_num = 0;
 
371
        char menustr[64];
 
372
        static char msg_tog_on[] = "Click to enable";
 
373
        static char msg_tog_off[]= "Click to disable";
 
374
        char *tip = NULL;
 
375
        
 
376
        block= uiNewBlock(&curarea->uiblocks, "view3d_view_spacehandlers", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
 
377
        uiBlockSetButmFunc(block, do_view3d_view_spacehandlers, NULL);
 
378
 
 
379
        while (text) {
 
380
                menu_evt_num++;
 
381
                handlertype = BPY_is_spacehandler(text, SPACE_VIEW3D);
 
382
 
 
383
                if (handlertype) {
 
384
                        slinks_num++;
 
385
 
 
386
                        /* mark text as script, so we can remove its link if its header
 
387
                         * becomes corrupt and it's not recognized anymore */
 
388
                        if (!(text->flags & TXT_ISSCRIPT)) text->flags |= TXT_ISSCRIPT;
 
389
 
 
390
                        if (handlertype == SPACEHANDLER_VIEW3D_EVENT)
 
391
                                BLI_strncpy(menustr, "Event: ", 8);
 
392
                        else
 
393
                                BLI_strncpy(menustr, "Draw:  ", 8);
 
394
                        BLI_strncpy(menustr+7, text->id.name+2, 22);
 
395
 
 
396
                        if (BPY_has_spacehandler(text, sa)) {
 
397
                                icontype = ICON_CHECKBOX_HLT;
 
398
                                tip = msg_tog_off;
 
399
                        }
 
400
                        else {
 
401
                                icontype = ICON_CHECKBOX_DEHLT;
 
402
                                tip = msg_tog_on;
 
403
                        }
 
404
 
 
405
                        uiDefIconTextBut(block, BUTM, 1, icontype, menustr,             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, menu_evt_num, tip);
 
406
                }
 
407
                else if (text->flags & TXT_ISSCRIPT) {
 
408
                        /* if bit set, text was a space handler, but its header got corrupted,
 
409
                         * so we need to remove the link here */
 
410
                        BPY_del_spacehandler(text, sa);
 
411
                        text->flags &=~TXT_ISSCRIPT;
 
412
                }
 
413
 
 
414
                text = text->id.next;
 
415
        }
 
416
 
 
417
        if (slinks_num == 0) {
 
418
                uiDefIconTextBut(block, BUTM, 1, ICON_SCRIPT, "None Available", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, -1, "None of the texts in the Text Editor is a 3D View space handler");
 
419
        }
 
420
 
 
421
        uiBlockSetDirection(block, UI_RIGHT);
 
422
        uiTextBoundsBlock(block, 50);
 
423
 
 
424
        return block;
 
425
}
 
426
 
331
427
static void do_view3d_viewmenu(void *arg, int event)
332
428
{
333
429
        extern int play_anim(int mode);
379
475
                add_blockhandler(curarea, VIEW3D_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
380
476
                break;
381
477
        }
382
 
        allqueue(REDRAWVIEW3D, 0);
 
478
        allqueue(REDRAWVIEW3D, 1);
383
479
}
384
480
 
385
481
static uiBlock *view3d_viewmenu(void *arg_unused)
437
533
        
438
534
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation|Alt A",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 13, "");
439
535
 
 
536
        uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 
537
        uiDefIconTextBlockBut(block, view3d_view_spacehandlers, NULL, ICON_RIGHTARROW_THIN, "Space Handler Scripts", 0, yco-=20, 120, 19, "");
 
538
 
440
539
        if(curarea->headertype==HEADERTOP) {
441
540
                uiBlockSetDirection(block, UI_DOWN);
442
541
        }
522
621
 
523
622
void do_view3d_select_object_layermenu(void *arg, int event)
524
623
{
525
 
        extern void selectall_layer(int layernum);
 
624
        extern void selectall_layer(unsigned int layernum);
526
625
        
527
626
        switch(event) {
528
627
        case 0:
874
973
        block= uiNewBlock(&curarea->uiblocks, "view3d_select_metaballmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
875
974
        uiBlockSetButmFunc(block, do_view3d_select_metaballmenu, NULL);
876
975
        
877
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
878
 
        
879
 
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
880
 
        
881
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
 
976
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
 
977
        
 
978
        uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 
979
        
 
980
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
882
981
                
883
982
        if(curarea->headertype==HEADERTOP) {
884
983
                uiBlockSetDirection(block, UI_DOWN);
1018
1117
static void do_view3d_select_faceselmenu(void *arg, int event)
1019
1118
{
1020
1119
//      extern void borderselect(void);
1021
 
        
 
1120
 
 
1121
        /* events >= 6 are registered bpython scripts */
 
1122
        if (event >= 6) BPY_menu_do_python(PYMENU_FACESELECT, event - 6);
 
1123
 
1022
1124
        switch(event) {
1023
 
                        case 0: /* border select */
 
1125
                case 0: /* border select */
1024
1126
                        borderselect();
1025
1127
                        break;
1026
1128
                case 2: /* Select/Deselect all */
1032
1134
                case 4: /* Select Same UV */
1033
1135
                        get_same_uv();
1034
1136
                        break;
 
1137
                case 5: /* Select Linked */
 
1138
                        select_linked_tfaces(2);
 
1139
                        break;
1035
1140
        }
1036
1141
        allqueue(REDRAWVIEW3D, 0);
1037
1142
}
1040
1145
{
1041
1146
        uiBlock *block;
1042
1147
        short yco= 0, menuwidth=120;
1043
 
        
 
1148
        BPyMenu *pym;
 
1149
        int i = 0;
 
1150
 
1044
1151
        block= uiNewBlock(&curarea->uiblocks, "view3d_select_faceselmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1045
1152
        uiBlockSetButmFunc(block, do_view3d_select_faceselmenu, NULL);
1046
1153
        
1052
1159
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1053
1160
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same UV",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1054
1161
 
 
1162
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 
1163
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked Faces|Ctrl L",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
 
1164
 
 
1165
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 
1166
 
 
1167
        /* note that we account for the 6 previous entries with i+6: */
 
1168
        for (pym = BPyMenuTable[PYMENU_FACESELECT]; pym; pym = pym->next, i++) {
 
1169
                uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20,
 
1170
                        menuwidth, 19, NULL, 0.0, 0.0, 1, i+6,
 
1171
                        pym->tooltip?pym->tooltip:pym->filename);
 
1172
        }
 
1173
 
1055
1174
        if(curarea->headertype==HEADERTOP) {
1056
1175
                uiBlockSetDirection(block, UI_DOWN);
1057
1176
        }
1108
1227
 
1109
1228
void do_view3d_transform_moveaxismenu(void *arg, int event)
1110
1229
{
 
1230
        float mat[3][3];
 
1231
        
 
1232
        Mat3One(mat);
 
1233
        
1111
1234
        switch(event)
1112
1235
        {
1113
1236
            case 0: /* X Global */
1114
 
                    transform('g'*'X');
 
1237
                        initTransform(TFM_TRANSLATION, CTX_NONE);
 
1238
                        BIF_setSingleAxisConstraint(mat[0], " X");
 
1239
                        Transform();
1115
1240
                        break;
1116
1241
                case 1: /* Y Global */
1117
 
                        transform('g'*'Y');
 
1242
                        initTransform(TFM_TRANSLATION, CTX_NONE);
 
1243
                        BIF_setSingleAxisConstraint(mat[1], " Y");
 
1244
                        Transform();
1118
1245
                        break;
1119
1246
                case 2: /* Z Global */
1120
 
                        transform('g'*'Z');
 
1247
                        initTransform(TFM_TRANSLATION, CTX_NONE);
 
1248
                        BIF_setSingleAxisConstraint(mat[2], " Z");
 
1249
                        Transform();
1121
1250
                        break;
1122
1251
                case 3: /* X Local */
1123
 
                        transform('g'*'x');
 
1252
                        initTransform(TFM_TRANSLATION, CTX_NONE);
 
1253
                        BIF_setLocalAxisConstraint('X', " X");
 
1254
                        Transform();
1124
1255
                        break;
1125
1256
                case 4: /* Y Local */
1126
 
                        transform('g'*'y');
 
1257
                        initTransform(TFM_TRANSLATION, CTX_NONE);
 
1258
                        BIF_setLocalAxisConstraint('Y', " Y");
 
1259
                        Transform();
1127
1260
                        break;
1128
1261
                case 5: /* Z Local */
1129
 
                        transform('g'*'z');
 
1262
                        initTransform(TFM_TRANSLATION, CTX_NONE);
 
1263
                        BIF_setLocalAxisConstraint('Z', " Z");
 
1264
                        Transform();
1130
1265
                        break;
1131
1266
        }
1132
1267
        allqueue(REDRAWVIEW3D, 0);
1158
1293
 
1159
1294
void do_view3d_transform_rotateaxismenu(void *arg, int event)
1160
1295
{
 
1296
        float mat[3][3];
 
1297
        
 
1298
        Mat3One(mat);
 
1299
        
1161
1300
        switch(event)
1162
1301
        {
1163
1302
            case 0: /* X Global */
1164
 
                    transform('r'*'X');
 
1303
                        initTransform(TFM_ROTATION, CTX_NONE);
 
1304
                        BIF_setSingleAxisConstraint(mat[0], " X");
 
1305
                        Transform();
1165
1306
                        break;
1166
1307
                case 1: /* Y Global */
1167
 
                        transform('r'*'Y');
 
1308
                        initTransform(TFM_ROTATION, CTX_NONE);
 
1309
                        BIF_setSingleAxisConstraint(mat[1], " Y");
 
1310
                        Transform();
1168
1311
                        break;
1169
1312
                case 2: /* Z Global */
1170
 
                        transform('r'*'Z');
1171
 
                        break;
 
1313
                        initTransform(TFM_ROTATION, CTX_NONE);
 
1314
                        BIF_setSingleAxisConstraint(mat[2], " Z");
 
1315
                        Transform();
 
1316
                        break;
1172
1317
                case 3: /* X Local */
1173
 
                        transform('r'*'x');
 
1318
                        initTransform(TFM_ROTATION, CTX_NONE);
 
1319
                        BIF_setLocalAxisConstraint('X', " X");
 
1320
                        Transform();
1174
1321
                        break;
1175
1322
                case 4: /* Y Local */
1176
 
                        transform('r'*'y');
 
1323
                        initTransform(TFM_ROTATION, CTX_NONE);
 
1324
                        BIF_setLocalAxisConstraint('Y', " Y");
 
1325
                        Transform();
1177
1326
                        break;
1178
1327
                case 5: /* Z Local */
1179
 
                        transform('r'*'z');
 
1328
                        initTransform(TFM_ROTATION, CTX_NONE);
 
1329
                        BIF_setLocalAxisConstraint('Z', " Z");
 
1330
                        Transform();
1180
1331
                        break;
1181
1332
        }
1182
1333
        allqueue(REDRAWVIEW3D, 0);
1208
1359
 
1209
1360
void do_view3d_transform_scaleaxismenu(void *arg, int event)
1210
1361
{
 
1362
        float mat[3][3];
 
1363
        
 
1364
        Mat3One(mat);
 
1365
        
1211
1366
        switch(event)
1212
1367
        {
1213
1368
            case 0: /* X Global */
1214
 
                    transform('s'*'X');
 
1369
                        initTransform(TFM_RESIZE, CTX_NONE);
 
1370
                        BIF_setSingleAxisConstraint(mat[0], " X");
 
1371
                        Transform();
1215
1372
                        break;
1216
1373
                case 1: /* Y Global */
1217
 
                        transform('s'*'Y');
 
1374
                        initTransform(TFM_RESIZE, CTX_NONE);
 
1375
                        BIF_setSingleAxisConstraint(mat[1], " Y");
 
1376
                        Transform();
1218
1377
                        break;
1219
1378
                case 2: /* Z Global */
1220
 
                        transform('s'*'Z');
 
1379
                        initTransform(TFM_RESIZE, CTX_NONE);
 
1380
                        BIF_setSingleAxisConstraint(mat[2], " Z");
 
1381
                        Transform();
1221
1382
                        break;
1222
1383
                case 3: /* X Local */
1223
 
                        transform('s'*'x');
 
1384
                        initTransform(TFM_RESIZE, CTX_NONE);
 
1385
                        BIF_setLocalAxisConstraint('X', " X");
 
1386
                        Transform();
1224
1387
                        break;
1225
1388
                case 4: /* Y Local */
1226
 
                        transform('s'*'y');
 
1389
                        initTransform(TFM_RESIZE, CTX_NONE);
 
1390
                        BIF_setLocalAxisConstraint('X', " X");
 
1391
                        Transform();
1227
1392
                        break;
1228
1393
                case 5: /* Z Local */
1229
 
                        transform('s'*'z');
 
1394
                        initTransform(TFM_RESIZE, CTX_NONE);
 
1395
                        BIF_setLocalAxisConstraint('X', " X");
 
1396
                        Transform();
1230
1397
                        break;
1231
1398
        }
1232
1399
        allqueue(REDRAWVIEW3D, 0);
1256
1423
        return block;
1257
1424
}
1258
1425
 
1259
 
void do_view3d_transformmenu(void *arg, int event)
 
1426
static void do_view3d_transformmenu(void *arg, int event)
1260
1427
{
1261
1428
        switch(event) {
1262
1429
        case 1:
1263
 
                transform('g');
 
1430
                initTransform(TFM_TRANSLATION, CTX_NONE);
 
1431
                Transform();
1264
1432
                break;
1265
1433
        case 2:
1266
 
                transform('r');
 
1434
                initTransform(TFM_ROTATION, CTX_NONE);
 
1435
                Transform();
1267
1436
                break;
1268
1437
        case 3:
1269
 
                transform('s');
 
1438
                initTransform(TFM_RESIZE, CTX_NONE);
 
1439
                Transform();
 
1440
                break;
 
1441
        case 4:
 
1442
                image_aspect();
 
1443
                break;
 
1444
        case 5:
 
1445
                initTransform(TFM_TOSPHERE, CTX_NONE);
 
1446
                Transform();
 
1447
                break;
 
1448
        case 6:
 
1449
                initTransform(TFM_SHEAR, CTX_NONE);
 
1450
                Transform();
 
1451
                break;
 
1452
        case 7:
 
1453
                initTransform(TFM_WARP, CTX_NONE);
 
1454
                Transform();
 
1455
                break;
 
1456
        case 8:
 
1457
                initTransform(TFM_PUSHPULL, CTX_NONE);
 
1458
                Transform();
 
1459
                break;
 
1460
        case 9:
 
1461
                if (G.obedit) {
 
1462
                        if (G.obedit->type == OB_MESH)
 
1463
                                initTransform(TFM_SHRINKFATTEN, CTX_NONE);
 
1464
                                Transform();
 
1465
                } else error("Only meshes can be shrinked/fattened");
1270
1466
                break;
1271
1467
        }
1272
1468
        allqueue(REDRAWVIEW3D, 0);
1289
1485
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale|S",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1290
1486
        uiDefIconTextBlockBut(block, view3d_transform_scaleaxismenu, NULL, ICON_RIGHTARROW_THIN, "Scale on Axis", 0, yco-=20, 120, 19, "");
1291
1487
 
 
1488
        uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 
1489
        
 
1490
        if (G.obedit) {
 
1491
                if (G.obedit->type == OB_MESH)
 
1492
                        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shrink/Fatten Along Normals|Alt S",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
 
1493
        }
 
1494
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Sphere|Ctrl Shift S",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
 
1495
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl Alt S",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
 
1496
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Shift W",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
 
1497
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Push/Pull|Shift P",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
 
1498
        
 
1499
        if (!G.obedit) {
 
1500
                uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 
1501
                
 
1502
                uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale to Image Aspect Ratio|Alt V",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
 
1503
        }
 
1504
        
1292
1505
        uiBlockSetDirection(block, UI_RIGHT);
1293
1506
        uiTextBoundsBlock(block, 60);
1294
1507
        return block;
1300
1513
                case 1:
1301
1514
                case 2:
1302
1515
                case 3:
1303
 
                        mirror_object(event);
 
1516
                        Mirror(event + 3); // + 3 because the first three modes are global
1304
1517
                        break;
1305
1518
        }
1306
1519
        allqueue(REDRAWVIEW3D, 0);
1338
1551
        case 3: /* clear location */
1339
1552
                clear_object('g');
1340
1553
                break;
1341
 
        case 4: /* apply deformation */
 
1554
        case 4:
 
1555
                object_apply_deform(OBACT);
 
1556
                break;
 
1557
        case 5: /* make duplis real */
1342
1558
                make_duplilist_real();
1343
1559
                break;
1344
 
        case 5: /* apply size/rotation */
 
1560
        case 6: /* apply size/rotation or deformation */
1345
1561
                apply_object();
1346
1562
                break;  
1347
1563
        }
1356
1572
        block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_transformmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1357
1573
        uiBlockSetButmFunc(block, do_view3d_edit_object_transformmenu, NULL);
1358
1574
        
1359
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Size/Rotation|Ctrl A",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
 
1575
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Size/Rotation|Ctrl A",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1360
1576
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Deformation|Ctrl Shift A",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1361
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Duplicates Real|Ctrl Shift A",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
 
1577
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Duplicates Real|Ctrl Shift A",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1362
1578
        
1363
1579
        uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1364
1580
        
1622
1838
        return block;
1623
1839
}
1624
1840
 
 
1841
static void do_view3d_edit_object_scriptsmenu(void *arg, int event)
 
1842
{
 
1843
        BPY_menu_do_python(PYMENU_OBJECT, event);
 
1844
 
 
1845
        allqueue(REDRAWVIEW3D, 0);
 
1846
}
 
1847
 
 
1848
static uiBlock *view3d_edit_object_scriptsmenu(void *arg_unused)
 
1849
{
 
1850
        uiBlock *block;
 
1851
        short yco = 20, menuwidth = 120;
 
1852
        BPyMenu *pym;
 
1853
        int i = 0;
 
1854
 
 
1855
        block= uiNewBlock(&curarea->uiblocks, "v3d_eobject_pymenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
 
1856
        uiBlockSetButmFunc(block, do_view3d_edit_object_scriptsmenu, NULL);
 
1857
 
 
1858
        for (pym = BPyMenuTable[PYMENU_OBJECT]; pym; pym = pym->next, i++) {
 
1859
                uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i, pym->tooltip?pym->tooltip:pym->filename);
 
1860
        }
 
1861
 
 
1862
        uiBlockSetDirection(block, UI_RIGHT);
 
1863
        uiTextBoundsBlock(block, 60);
 
1864
 
 
1865
        return block;
 
1866
}
 
1867
 
1625
1868
static void do_view3d_edit_objectmenu(void *arg, int event)
1626
1869
{
1627
1870
        /* needed to check for valid selected objects */
1725
1968
        
1726
1969
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move to Layer...|M",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1727
1970
 
 
1971
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 
1972
        uiDefIconTextBlockBut(block, view3d_edit_object_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
 
1973
 
1728
1974
                
1729
1975
        if(curarea->headertype==HEADERTOP) {
1730
1976
                uiBlockSetDirection(block, UI_DOWN);
1741
1987
 
1742
1988
static void do_view3d_edit_propfalloffmenu(void *arg, int event)
1743
1989
{
1744
 
        extern int prop_mode;
1745
 
        
1746
 
        switch(event) {
1747
 
        case 0: /* proportional edit - sharp*/
1748
 
                prop_mode = 0;
1749
 
                break;
1750
 
        case 1: /* proportional edit - smooth*/
1751
 
                prop_mode = 1;
1752
 
                break;
1753
 
                }
1754
 
        allqueue(REDRAWVIEW3D, 0);
 
1990
        
 
1991
        G.scene->prop_mode= event;
 
1992
        
 
1993
        allqueue(REDRAWVIEW3D, 1);
1755
1994
}
1756
1995
 
1757
1996
static uiBlock *view3d_edit_propfalloffmenu(void *arg_unused)
1758
1997
{
1759
1998
        uiBlock *block;
1760
1999
        short yco = 20, menuwidth = 120;
1761
 
        extern int prop_mode;
1762
2000
 
1763
2001
        block= uiNewBlock(&curarea->uiblocks, "view3d_edit_propfalloffmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1764
2002
        uiBlockSetButmFunc(block, do_view3d_edit_propfalloffmenu, NULL);
1765
2003
        
1766
 
        if (prop_mode==0) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Sharp|Shift O",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1767
 
        else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sharp|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1768
 
        if (prop_mode==1) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Smooth|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1769
 
        else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Smooth|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
 
2004
        if (G.scene->prop_mode==PROP_SMOOTH) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Smooth|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SMOOTH, "");
 
2005
        else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Smooth|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SMOOTH, "");
 
2006
        if (G.scene->prop_mode==PROP_SPHERE) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Sphere|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SPHERE, "");
 
2007
        else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sphere|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SPHERE, "");
 
2008
        if (G.scene->prop_mode==PROP_ROOT) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Root|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_ROOT, "");
 
2009
        else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Root|Shift O",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_ROOT, "");
 
2010
        if (G.scene->prop_mode==PROP_SHARP) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Sharp|Shift O",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SHARP, "");
 
2011
        else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sharp|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SHARP, "");
 
2012
        if (G.scene->prop_mode==PROP_LIN) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Linear|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_LIN, "");
 
2013
        else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Linear|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_LIN, "");
 
2014
        if (G.scene->prop_mode==PROP_CONST) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Constant|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_CONST, "");
 
2015
        else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Constant|Shift O",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_CONST, "");
1770
2016
                
1771
2017
        uiBlockSetDirection(block, UI_RIGHT);
1772
2018
        uiTextBoundsBlock(block, 60);
1773
2019
        return block;
1774
2020
}
1775
2021
 
1776
 
static void do_view3d_edit_mesh_undohistorymenu(void *arg, int event)
1777
 
{
1778
 
        TEST_EDITMESH
1779
 
        
1780
 
        if(event<1) return;
1781
 
 
1782
 
        if (event==1) remake_editMesh();
1783
 
        else undo_pop_mesh(G.undo_edit_level-event+3);
1784
 
        
1785
 
        allqueue(REDRAWVIEW3D, 0);
1786
 
}
1787
 
 
1788
 
static uiBlock *view3d_edit_mesh_undohistorymenu(void *arg_unused)
1789
 
{
1790
 
        uiBlock *block;
1791
 
        short yco = 20, menuwidth = 120;
1792
 
        int i, lasti;
1793
 
 
1794
 
        lasti = (G.undo_edit_level>25) ? G.undo_edit_level-25 : 0;
1795
 
        
1796
 
        block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_undohistorymenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1797
 
        uiBlockSetButmFunc(block, do_view3d_edit_mesh_undohistorymenu, NULL);
1798
 
        
1799
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo All Changes|Ctrl U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1800
 
        
1801
 
        for (i=G.undo_edit_level; i>=lasti; i--) {
1802
 
                if (i == G.undo_edit_level) uiDefBut(block, SEPR, 0, "",                                0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1803
 
                uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, G.undo_edit[i].name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, (float)i+2, "");
1804
 
        }
1805
 
        
1806
 
        uiBlockSetDirection(block, UI_RIGHT);
1807
 
        uiTextBoundsBlock(block, 60);
1808
 
        return block;
1809
 
}
1810
2022
 
1811
2023
void do_view3d_edit_mesh_verticesmenu(void *arg, int event)
1812
2024
{
1832
2044
        case 5: /*merge */
1833
2045
                mergemenu();
1834
2046
                break;
 
2047
        case 6: /* add hook */
 
2048
                add_hook();
 
2049
                break;
1835
2050
        }
1836
2051
        allqueue(REDRAWVIEW3D, 0);
1837
2052
}
1855
2070
        
1856
2071
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1857
2072
 
1858
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Vertex Parent|Ctrl P",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
 
2073
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Vertex Parent|Ctrl P",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
 
2074
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Hook|Ctrl H",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1859
2075
 
1860
2076
        uiBlockSetDirection(block, UI_RIGHT);
1861
2077
        uiTextBoundsBlock(block, 60);
1871
2087
        switch(event) {
1872
2088
                 
1873
2089
        case 0: /* subdivide smooth */
1874
 
                undo_push_mesh("Subdivide Smooth");
1875
2090
                subdivideflag(1, 0.0, editbutflag | B_SMOOTH);
 
2091
                BIF_undo_push("Subdivide Smooth");
1876
2092
                break;
1877
2093
        case 1: /*subdivide fractal */
1878
 
                undo_push_mesh("Subdivide Fractal");
1879
2094
                randfac= 10;
1880
2095
                if(button(&randfac, 1, 100, "Rand fac:")==0) return;
1881
2096
                fac= -( (float)randfac )/100;
1882
2097
                subdivideflag(1, fac, editbutflag);
 
2098
                BIF_undo_push("Subdivide Fractal");
1883
2099
                break;
1884
2100
        case 2: /* subdivide */
1885
 
                undo_push_mesh("Subdivide");
1886
2101
                subdivideflag(1, 0.0, editbutflag);
 
2102
                BIF_undo_push("Subdivide");
1887
2103
                break;
1888
2104
        case 3: /* knife subdivide */
1889
2105
                KnifeSubdivide(KNIFE_PROMPT);
1892
2108
                loopoperations(LOOP_CUT);
1893
2109
                break;
1894
2110
        case 5: /* Make Edge/Face */
1895
 
                addedgevlak_mesh();
 
2111
                addedgeface_mesh();
1896
2112
                break;
1897
2113
        case 6:
1898
2114
                bevel_menu();
1899
2115
                break;
 
2116
        case 7: /* Mark Seam */
 
2117
                editmesh_mark_seam(0);
 
2118
                break;
 
2119
        case 8: /* Clear Seam */
 
2120
                editmesh_mark_seam(1);
 
2121
                break;
 
2122
        case 9: /* Cease SubSurf */
 
2123
                initTransform(TFM_CREASE, CTX_EDGE);
 
2124
                Transform();
 
2125
                break;
 
2126
        case 10: /* Rotate Edge */
 
2127
                edge_rotate_selected(2);
 
2128
                break;
 
2129
        case 11: /* Rotate Edge */
 
2130
                edge_rotate_selected(1);
 
2131
                break;
1900
2132
        }
1901
2133
        allqueue(REDRAWVIEW3D, 0);
1902
2134
}
1905
2137
{
1906
2138
        uiBlock *block;
1907
2139
        short yco = 20, menuwidth = 120;
 
2140
        
 
2141
        Mesh *me= get_mesh(OBACT);
1908
2142
 
1909
2143
        block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_edgesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1910
2144
        uiBlockSetButmFunc(block, do_view3d_edit_mesh_edgesmenu, NULL);
1913
2147
        
1914
2148
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1915
2149
        
1916
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel|W, 11",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
 
2150
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel|W, Alt 1",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1917
2151
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Loop Subdivide...|Ctrl R",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1918
2152
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Knife Subdivide...|Shift K",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1919
2153
        
1923
2157
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Fractal|W, 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1924
2158
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Smooth|W, 3",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1925
2159
 
 
2160
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 
2161
 
 
2162
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Seam|Ctrl E",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
 
2163
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Seam|Ctrl E",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
 
2164
 
 
2165
        if (me->flag & ME_SUBSURF) {
 
2166
                uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 
2167
                uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Crease SubSurf|Shift E",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
 
2168
        }
 
2169
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 
2170
 
 
2171
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate Edge CW|Ctrl E",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
 
2172
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate Edge CCW|Ctrl E",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");  
 
2173
        
1926
2174
        uiBlockSetDirection(block, UI_RIGHT);
1927
2175
        uiTextBoundsBlock(block, 60);
1928
2176
        return block;
1950
2198
                edge_flip();
1951
2199
                break;
1952
2200
        case 5: /* Make Edge/Face */
1953
 
                addedgevlak_mesh();
 
2201
                addedgeface_mesh();
1954
2202
                break;
1955
2203
        }
1956
2204
        allqueue(REDRAWVIEW3D, 0);
1966
2214
        
1967
2215
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1968
2216
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Fill|Shift F",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1969
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Beauty Fill|Alt F",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
 
2217
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Beautify Fill|Alt F",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1970
2218
        
1971
2219
        uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1972
2220
        
2027
2275
                case 7:
2028
2276
                case 8:
2029
2277
                case 9:
2030
 
                        mirror_edit(event);
 
2278
                        Mirror(event);
2031
2279
                        break;
2032
2280
        }
2033
2281
        allqueue(REDRAWVIEW3D, 0);
2097
2345
        return block;
2098
2346
}
2099
2347
 
 
2348
static void do_view3d_edit_mesh_scriptsmenu(void *arg, int event)
 
2349
{
 
2350
        BPY_menu_do_python(PYMENU_MESH, event);
 
2351
 
 
2352
        allqueue(REDRAWVIEW3D, 0);
 
2353
}
 
2354
 
 
2355
static uiBlock *view3d_edit_mesh_scriptsmenu(void *arg_unused)
 
2356
{
 
2357
        uiBlock *block;
 
2358
        short yco = 20, menuwidth = 120;
 
2359
        BPyMenu *pym;
 
2360
        int i = 0;
 
2361
 
 
2362
        block= uiNewBlock(&curarea->uiblocks, "v3d_emesh_pymenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
 
2363
        uiBlockSetButmFunc(block, do_view3d_edit_mesh_scriptsmenu, NULL);
 
2364
 
 
2365
        for (pym = BPyMenuTable[PYMENU_MESH]; pym; pym = pym->next, i++) {
 
2366
                uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i, pym->tooltip?pym->tooltip:pym->filename);
 
2367
        }
 
2368
 
 
2369
        uiBlockSetDirection(block, UI_RIGHT);
 
2370
        uiTextBoundsBlock(block, 60);
 
2371
 
 
2372
        return block;
 
2373
}
 
2374
 
2100
2375
static void do_view3d_edit_meshmenu(void *arg, int event)
2101
2376
{
2102
2377
        switch(event) {
2103
2378
        
2104
2379
        case 0: /* Undo Editing */
2105
 
                undo_pop_mesh(1);
 
2380
                BIF_undo();
2106
2381
                break;
2107
2382
        case 1: /* Redo Editing */
2108
 
                undo_redo_mesh();
 
2383
                BIF_redo();
2109
2384
                break;
2110
2385
        case 2: /* transform properties */
2111
2386
                add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, 0);
2119
2394
        case 6: /* duplicate */
2120
2395
                duplicate_context_selected();
2121
2396
                break;
 
2397
        case 7: /* make edge face */
 
2398
                addedgeface_mesh();
 
2399
                break;
2122
2400
        case 8: /* delete */
2123
2401
                delete_context_selected();
2124
2402
                break;
2125
2403
        case 9: /* Shrink/Fatten Along Normals */
2126
 
                transform('N');
 
2404
                initTransform(TFM_SHRINKFATTEN, CTX_NONE);
 
2405
                Transform();
2127
2406
                break;
2128
2407
        case 10: /* Shear */
2129
 
                transform('S');
 
2408
                initTransform(TFM_SHEAR, CTX_NONE);
 
2409
                Transform();
2130
2410
                break;
2131
2411
        case 11: /* Warp */
2132
 
                transform('w');
 
2412
                initTransform(TFM_WARP, CTX_NONE);
 
2413
                Transform();
2133
2414
                break;
2134
2415
        case 12: /* proportional edit (toggle) */
2135
 
                if(G.f & G_PROPORTIONAL) G.f &= ~G_PROPORTIONAL;
2136
 
                else G.f |= G_PROPORTIONAL;
 
2416
                if(G.scene->proportional) G.scene->proportional= 0;
 
2417
                else G.scene->proportional= 1;
2137
2418
                break;
2138
2419
        }
2139
2420
        allqueue(REDRAWVIEW3D, 0);
2148
2429
        block= uiNewBlock(&curarea->uiblocks, "view3d_edit_meshmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2149
2430
        uiBlockSetButmFunc(block, do_view3d_edit_meshmenu, NULL);
2150
2431
                
2151
 
        /*
2152
 
        uiDefIconTextBlockBut(block, view3d_edit_mesh_facesmenu, NULL, ICON_RIGHTARROW_THIN, "Move", 0, yco-=20, 120, 19, "");
2153
 
        uiDefIconTextBlockBut(block, view3d_edit_mesh_facesmenu, NULL, ICON_RIGHTARROW_THIN, "Rotate", 0, yco-=20, 120, 19, "");
2154
 
        uiDefIconTextBlockBut(block, view3d_edit_mesh_facesmenu, NULL, ICON_RIGHTARROW_THIN, "Scale", 0, yco-=20, 120, 19, "");
2155
 
        */
2156
2432
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|U",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2157
2433
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Redo Editing|Shift U",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2158
 
        uiDefIconTextBlockBut(block, view3d_edit_mesh_undohistorymenu, NULL, ICON_RIGHTARROW_THIN, "Undo History", 0, yco-=20, 120, 19, "");
 
2434
        uiDefIconTextBlockBut(block, editmode_undohistorymenu, NULL, ICON_RIGHTARROW_THIN, "Undo History", 0, yco-=20, 120, 19, "");
2159
2435
        
2160
2436
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2161
2437
        
2162
2438
        uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2163
2439
        uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
 
2440
        uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, 120, 19, "");
2164
2441
        uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
2165
2442
        
2166
2443
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2182
2459
        uiDefIconTextBlockBut(block, view3d_edit_mesh_normalsmenu, NULL, ICON_RIGHTARROW_THIN, "Normals", 0, yco-=20, 120, 19, "");
2183
2460
        
2184
2461
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2185
 
        
2186
 
        uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, 120, 19, "");
2187
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shrink/Fatten Along Normals|Alt S",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2188
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl S",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2189
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Shift W",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
2190
 
        
2191
 
        uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2192
 
        
2193
 
        if(G.f & G_PROPORTIONAL) {
 
2462
                
 
2463
        if(G.scene->proportional) {
2194
2464
                uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
2195
2465
        } else {
2196
2466
                uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
2200
2470
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2201
2471
        
2202
2472
        uiDefIconTextBlockBut(block, view3d_edit_mesh_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Vertices", 0, yco-=20, 120, 19, "");
 
2473
 
 
2474
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 
2475
        uiDefIconTextBlockBut(block, view3d_edit_mesh_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
2203
2476
        
2204
2477
        if(curarea->headertype==HEADERTOP) {
2205
2478
                uiBlockSetDirection(block, UI_DOWN);
2217
2490
{
2218
2491
        switch(event) {
2219
2492
        case 0: /* tilt */
2220
 
                transform('t');
 
2493
                initTransform(TFM_TILT, CTX_NONE);
 
2494
                Transform();
2221
2495
                break;
2222
2496
        case 1: /* clear tilt */
2223
2497
                clear_tilt();
2237
2511
        case 5: /* make vertex parent */
2238
2512
                make_parent();
2239
2513
                break;
2240
 
                }
 
2514
        case 6: /* add hook */
 
2515
                add_hook();
 
2516
                break;
 
2517
        case 7:
 
2518
                separate_nurb();
 
2519
                break;
 
2520
        }
2241
2521
        allqueue(REDRAWVIEW3D, 0);
2242
2522
}
2243
2523
 
2252
2532
        if (OBACT->type == OB_CURVE) {
2253
2533
                uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tilt|T",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2254
2534
                uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Tilt|Alt T",                               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
 
2535
                uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate|P",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2255
2536
                
2256
2537
                uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2257
2538
                
2258
2539
                uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Automatic|Shift H",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2259
2540
                uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Toggle Free/Aligned|H",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2260
2541
                uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Vector|V",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2261
 
                
 
2542
 
 
2543
                uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");             
2262
2544
        }
2263
2545
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Vertex Parent|Ctrl P",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
 
2546
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Hook|Ctrl H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2264
2547
        
2265
2548
        uiBlockSetDirection(block, UI_RIGHT);
2266
2549
        uiTextBoundsBlock(block, 60);
2363
2646
                delete_context_selected();
2364
2647
                break;
2365
2648
        case 9: /* proportional edit (toggle) */
2366
 
                if(G.f & G_PROPORTIONAL) G.f &= ~G_PROPORTIONAL;
2367
 
                else G.f |= G_PROPORTIONAL;
 
2649
                if(G.scene->proportional) G.scene->proportional= 0;
 
2650
                else G.scene->proportional= 1;
2368
2651
                break;
2369
2652
        case 13: /* Shear */
2370
 
                transform('S');
 
2653
                initTransform(TFM_SHEAR, CTX_NONE);
 
2654
                Transform();
2371
2655
                break;
2372
2656
        case 14: /* Warp */
2373
 
                transform('w');
 
2657
                initTransform(TFM_WARP, CTX_NONE);
 
2658
                Transform();
2374
2659
                break;
2375
2660
        }
2376
2661
        allqueue(REDRAWVIEW3D, 0);
2390
2675
        
2391
2676
        uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2392
2677
        uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
 
2678
        uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");      
2393
2679
        uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
2394
2680
        
2395
2681
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2411
2697
        
2412
2698
        uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2413
2699
        
2414
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl S",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
2415
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Ctrl W",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
2416
 
        
2417
 
        uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2418
 
        
2419
 
        if(G.f & G_PROPORTIONAL) {
 
2700
        if(G.scene->proportional) {
2420
2701
                uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2421
2702
        } else {
2422
2703
                uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2439
2720
        return block;
2440
2721
}
2441
2722
 
 
2723
static void do_view3d_edit_mball_showhidemenu(void *arg, int event)
 
2724
{
 
2725
        switch(event) {
 
2726
        case 10: /* show hidden control points */
 
2727
                reveal_mball();
 
2728
                break;
 
2729
        case 11: /* hide selected control points */
 
2730
                hide_mball(0);
 
2731
                break;
 
2732
        case 12: /* hide deselected control points */
 
2733
                hide_mball(1);
 
2734
                break;
 
2735
                }
 
2736
        allqueue(REDRAWVIEW3D, 0);
 
2737
}
 
2738
 
 
2739
static uiBlock *view3d_edit_mball_showhidemenu(void *arg_unused)
 
2740
{
 
2741
        uiBlock *block;
 
2742
        short yco = 20, menuwidth = 120;
 
2743
 
 
2744
        block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mball_showhidemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
 
2745
        uiBlockSetButmFunc(block, do_view3d_edit_mball_showhidemenu, NULL);
 
2746
        
 
2747
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
 
2748
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
 
2749
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Deselected|Shift H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
 
2750
 
 
2751
        uiBlockSetDirection(block, UI_RIGHT);
 
2752
        uiTextBoundsBlock(block, 60);
 
2753
        return block;
 
2754
}
2442
2755
static void do_view3d_edit_metaballmenu(void *arg, int event)
2443
2756
{
2444
2757
        switch(event) {
2445
 
        case 1: /* duplicate */
 
2758
        case 1: /* undo */
 
2759
                BIF_undo();
 
2760
                break;
 
2761
        case 2: /* redo */
 
2762
                BIF_redo();
 
2763
                break;
 
2764
        case 3: /* duplicate */
2446
2765
                duplicate_context_selected();
2447
2766
                break;
2448
 
        case 2: /* delete */
 
2767
        case 4: /* delete */
2449
2768
                delete_context_selected();
2450
2769
                break;
2451
 
        case 3: /* Shear */
2452
 
                transform('S');
2453
 
                break;
2454
 
        case 4: /* Warp */
2455
 
                transform('w');
 
2770
        case 5: /* Shear */
 
2771
                initTransform(TFM_SHEAR, CTX_NONE);
 
2772
                Transform();
 
2773
                break;
 
2774
        case 6: /* Warp */
 
2775
                initTransform(TFM_WARP, CTX_NONE);
 
2776
                Transform();
 
2777
                break;
 
2778
        case 7: /* Transform Properties */
 
2779
                add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, 0);
2456
2780
                break;
2457
2781
        }
2458
2782
        allqueue(REDRAWVIEW3D, 0);
2466
2790
        block= uiNewBlock(&curarea->uiblocks, "view3d_edit_metaballmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2467
2791
        uiBlockSetButmFunc(block, do_view3d_edit_metaballmenu, NULL);
2468
2792
 
2469
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2470
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2471
 
        
2472
 
        uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2473
 
        
2474
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl S",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2475
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Ctrl W",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
 
2793
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|Ctrl Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
 
2794
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Redo Editing|Shift Ctrl Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
 
2795
        uiDefIconTextBlockBut(block, editmode_undohistorymenu, NULL, ICON_RIGHTARROW_THIN, "Undo History", 0, yco-=20, 120, 19, "");
 
2796
 
 
2797
        uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 
2798
        
 
2799
        uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N",0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
 
2800
        uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
 
2801
        uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
 
2802
        uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
 
2803
        
 
2804
        uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 
2805
 
 
2806
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
 
2807
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
 
2808
 
 
2809
        uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 
2810
 
 
2811
        uiDefIconTextBlockBut(block, view3d_edit_mball_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Hide MetaElems", 0, yco-=20, 120, 19, "");
2476
2812
 
2477
2813
        if(curarea->headertype==HEADERTOP) {
2478
2814
                uiBlockSetDirection(block, UI_DOWN);
2640
2976
                common_insertkey();
2641
2977
                break;
2642
2978
        case 3: /* Shear */
2643
 
                transform('S');
 
2979
                initTransform(TFM_SHEAR, CTX_NONE);
 
2980
                Transform();
2644
2981
                break;
2645
2982
        case 4: /* Warp */
2646
 
                transform('w');
 
2983
                initTransform(TFM_WARP, CTX_NONE);
 
2984
                Transform();
2647
2985
                break;
2648
2986
        case 5: /* proportional edit (toggle) */
2649
 
                if(G.f & G_PROPORTIONAL) G.f &= ~G_PROPORTIONAL;
2650
 
                else G.f |= G_PROPORTIONAL;
 
2987
                if(G.scene->proportional) G.scene->proportional= 0;
 
2988
                else G.scene->proportional= 1;
2651
2989
                break;
2652
2990
        }
2653
2991
        allqueue(REDRAWVIEW3D, 0);
2665
3003
        
2666
3004
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2667
3005
        
 
3006
        uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
 
3007
        uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");              
2668
3008
        uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
2669
3009
        
2670
3010
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2672
3012
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2673
3013
        
2674
3014
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2675
 
 
2676
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl S",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2677
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Ctrl W",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2678
 
        
2679
 
        uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2680
 
        
2681
 
        if(G.f & G_PROPORTIONAL) {
 
3015
        
 
3016
        if(G.scene->proportional) {
2682
3017
                uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2683
3018
        } else {
2684
3019
                uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2717
3052
                delete_context_selected();
2718
3053
                break;
2719
3054
        case 6: /* Shear */
2720
 
                transform('S');
 
3055
                initTransform(TFM_SHEAR, CTX_NONE);
 
3056
                Transform();
2721
3057
                break;
2722
3058
        case 7: /* Warp */
2723
 
                transform('w');
 
3059
                initTransform(TFM_WARP, CTX_NONE);
 
3060
                Transform();
2724
3061
                break;
2725
3062
        }
2726
3063
        allqueue(REDRAWVIEW3D, 0);
2740
3077
        
2741
3078
        uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2742
3079
        uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
 
3080
        uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
2743
3081
        uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
2744
3082
        
2745
3083
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2748
3086
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2749
3087
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X",                               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2750
3088
        
2751
 
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2752
 
 
2753
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl S",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2754
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Ctrl W",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2755
 
 
2756
3089
        if(curarea->headertype==HEADERTOP) {
2757
3090
                uiBlockSetDirection(block, UI_DOWN);
2758
3091
        }
3104
3437
        uiTextBoundsBlock(block, 60);
3105
3438
        return block;
3106
3439
}
 
3440
 
3107
3441
static void do_view3d_faceselmenu(void *arg, int event)
3108
3442
{
3109
3443
        /* code copied from buttons.c :(        
3207
3541
 
3208
3542
static char *view3d_modeselect_pup(void)
3209
3543
{
 
3544
        Object *ob= OBACT;
3210
3545
        static char string[1024];
3211
3546
        char formatstr[1024];
3212
3547
        char tempstr[1024];
3217
3552
        sprintf(tempstr, formatstr, "Object Mode", V3D_OBJECTMODE_SEL, ICON_OBJECT);
3218
3553
        strcat(string, tempstr);
3219
3554
        
 
3555
        if(ob==NULL) return string;
 
3556
        
3220
3557
        /* if active object is editable */
3221
 
        if (OBACT && ((OBACT->type == OB_MESH) || (OBACT->type == OB_ARMATURE)
3222
 
                || (OBACT->type == OB_CURVE) || (OBACT->type == OB_SURF) || (OBACT->type == OB_FONT)
3223
 
                || (OBACT->type == OB_MBALL) || (OBACT->type == OB_LATTICE))) {
 
3558
        if ( ((ob->type == OB_MESH) || (ob->type == OB_ARMATURE)
 
3559
                || (ob->type == OB_CURVE) || (ob->type == OB_SURF) || (ob->type == OB_FONT)
 
3560
                || (ob->type == OB_MBALL) || (ob->type == OB_LATTICE))) {
3224
3561
                
3225
3562
                sprintf(tempstr, formatstr, "Edit Mode", V3D_EDITMODE_SEL, ICON_EDITMODE_HLT);
3226
3563
                strcat(string, tempstr);
3227
3564
        }
3228
3565
 
3229
 
        if (OBACT && OBACT->type == OB_MESH) {
 
3566
        if (ob->type == OB_MESH) {
3230
3567
        
3231
3568
                sprintf(tempstr, formatstr, "UV Face Select", V3D_FACESELECTMODE_SEL, ICON_FACESEL_HLT);
3232
3569
                strcat(string, tempstr);
3236
3573
                strcat(string, tempstr);
3237
3574
 
3238
3575
        
3239
 
                if ( ((Mesh*)(OBACT->data))->dvert)  {
 
3576
                if ( ((Mesh*)(ob->data))->dvert)  {
3240
3577
                        sprintf(tempstr, formatstr, "Weight Paint", V3D_WEIGHTPAINTMODE_SEL, ICON_WPAINT_HLT);
3241
3578
                        strcat(string, tempstr);
3242
3579
                }
3244
3581
 
3245
3582
        
3246
3583
        /* if active object is an armature */
3247
 
        if (OBACT && OBACT->type==OB_ARMATURE) {
 
3584
        if (ob->type==OB_ARMATURE) {
3248
3585
                sprintf(tempstr, formatstr, "Pose Mode", V3D_POSEMODE_SEL, ICON_POSE_HLT);
3249
3586
                strcat(string, tempstr);
3250
3587
        }
3257
3594
{
3258
3595
        static char string[512];
3259
3596
 
3260
 
        strcpy(string, "Draw type:%t"); 
 
3597
        strcpy(string, "Draw type: %t"); 
3261
3598
        strcat(string, "|Bounding Box %x1"); 
3262
3599
        strcat(string, "|Wireframe %x2");
3263
3600
        strcat(string, "|Solid %x3");
3269
3606
{
3270
3607
        static char string[512];
3271
3608
 
3272
 
        strcpy(string, "Pivot:%t"); 
 
3609
        strcpy(string, "Pivot: %t"); 
3273
3610
        strcat(string, "|Bounding Box Center %x0"); 
3274
3611
        strcat(string, "|Median Point %x3");
3275
3612
        strcat(string, "|3D Cursor %x1");
3276
3613
        strcat(string, "|Individual Object Centers %x2");
 
3614
        strcat(string, "|Active Object %x4");
3277
3615
        return (string);
3278
3616
}
3279
3617
 
3280
 
char *propfalloff_pup(void)
 
3618
static char *propfalloff_pup(void)
3281
3619
{
3282
3620
        static char string[512];
3283
3621
 
3284
 
        strcpy(string, "Falloff:%t"); 
3285
 
        strcat(string, "|Sharp Falloff%x0"); 
3286
 
        strcat(string, "|Smooth Falloff%x1");
 
3622
        strcpy(string, "Falloff: %t"); 
 
3623
        strcat(string, "|Smooth Falloff%x0");
 
3624
        strcat(string, "|Sphere Falloff%x1");
 
3625
        strcat(string, "|Root Falloff%x2"); 
 
3626
        strcat(string, "|Sharp Falloff%x3"); 
 
3627
        strcat(string, "|Linear Falloff%x4");
 
3628
        strcat(string, "|Constant, No Falloff%x5");
3287
3629
        return (string);
3288
3630
}
3289
3631
 
3335
3677
                        G.f &= ~G_TEXTUREPAINT;
3336
3678
                }
3337
3679
#endif /* NAN_VPT */
3338
 
                if(G.obedit==0) enter_editmode();
3339
 
                else exit_editmode(1);
 
3680
                if(G.obedit==NULL) {
 
3681
                        enter_editmode();
 
3682
                        BIF_undo_push("Original");      // here, because all over code enter_editmode is abused
 
3683
                }
 
3684
                else exit_editmode(2); // freedata, and undo
3340
3685
                scrarea_queue_headredraw(curarea);
3341
3686
                break;
3342
3687
        case B_POSEMODE:
3490
3835
                        G.f &= ~G_WEIGHTPAINT;          /* Switch off weight paint */
3491
3836
                        G.f &= ~G_FACESELECT;           /* Switch off face select */
3492
3837
                        if (G.obpose) exit_posemode(1); /* exit posemode */
3493
 
                        if(G.obedit) exit_editmode(1);  /* exit editmode */
 
3838
                        if(G.obedit) exit_editmode(2);  /* exit editmode and undo */
3494
3839
                } else if (G.vd->modeselect == V3D_EDITMODE_SEL) {
3495
3840
                        if(!G.obedit) {
3496
3841
                                G.vd->flag &= ~V3D_MODE;
3500
3845
                                if (G.obpose) exit_posemode(1); /* exit posemode */
3501
3846
                                        
3502
3847
                                enter_editmode();
 
3848
                                BIF_undo_push("Original");      // here, because all over code enter_editmode is abused
3503
3849
                        }
3504
3850
                } else if (G.vd->modeselect == V3D_FACESELECTMODE_SEL) {
3505
3851
                        if ((G.obedit) && (G.f & G_FACESELECT)) {
3506
 
                                exit_editmode(1); /* exit editmode */
 
3852
                                exit_editmode(2); /* exit editmode and undo */
3507
3853
                        } else if ((G.f & G_FACESELECT) && (G.f & G_VERTEXPAINT)) {
3508
3854
                                G.f &= ~G_VERTEXPAINT;  
3509
3855
                        } else if ((G.f & G_FACESELECT) && (G.f & G_TEXTUREPAINT)) {
3514
3860
                                G.f &= ~G_TEXTUREPAINT;         /* Switch off texture paint */
3515
3861
                                G.f &= ~G_WEIGHTPAINT;          /* Switch off weight paint */
3516
3862
                                if (G.obpose) exit_posemode(1); /* exit posemode */
3517
 
                                if (G.obedit) exit_editmode(1); /* exit editmode */
 
3863
                                if (G.obedit) exit_editmode(2); /* exit editmode and undo */
3518
3864
                                
3519
3865
                                set_faceselect();
3520
3866
                        }
3524
3870
                                G.f &= ~G_TEXTUREPAINT;         /* Switch off texture paint */
3525
3871
                                G.f &= ~G_WEIGHTPAINT;          /* Switch off weight paint */
3526
3872
                                if (G.obpose) exit_posemode(1); /* exit posemode */
3527
 
                                if(G.obedit) exit_editmode(1);  /* exit editmode */
 
3873
                                if(G.obedit) exit_editmode(2);  /* exit editmode and undo */
3528
3874
                                        
3529
3875
                                set_vpaint();
3530
3876
                        }
3534
3880
                                G.f &= ~G_VERTEXPAINT;          /* Switch off vertex paint */
3535
3881
                                G.f &= ~G_WEIGHTPAINT;          /* Switch off weight paint */
3536
3882
                                if (G.obpose) exit_posemode(1); /* exit posemode */
3537
 
                                if(G.obedit) exit_editmode(1);  /* exit editmode */
 
3883
                                if(G.obedit) exit_editmode(2);  /* exit editmode and undo */
3538
3884
                                        
3539
3885
                                G.f |= G_TEXTUREPAINT;          /* Switch on texture paint flag */
3540
3886
                        }
3544
3890
                                G.f &= ~G_VERTEXPAINT;          /* Switch off vertex paint */
3545
3891
                                G.f &= ~G_TEXTUREPAINT;         /* Switch off texture paint */
3546
3892
                                if (G.obpose) exit_posemode(1); /* exit posemode */
3547
 
                                if(G.obedit) exit_editmode(1);  /* exit editmode */
 
3893
                                if(G.obedit) exit_editmode(2);  /* exit editmode and undo */
3548
3894
                                
3549
3895
                                set_wpaint();
3550
3896
                        }
3551
3897
                } else if (G.vd->modeselect == V3D_POSEMODE_SEL) {
3552
3898
                        if (!G.obpose) {
3553
3899
                                G.vd->flag &= ~V3D_MODE;
3554
 
                                if(G.obedit) exit_editmode(1);  /* exit editmode */
 
3900
                                if(G.obedit) exit_editmode(2);  /* exit editmode and undo */
3555
3901
                                        
3556
3902
                                enter_posemode();
3557
3903
                        }
3558
3904
                }
3559
 
                allqueue(REDRAWVIEW3D, 0);
 
3905
                allqueue(REDRAWVIEW3D, 1);
 
3906
                break;
 
3907
        case B_AROUND:
 
3908
                handle_view3d_around(); // copies to other 3d windows
 
3909
                allqueue(REDRAWVIEW3D, 1);
 
3910
                break;
 
3911
                
 
3912
        case B_SEL_VERT:
 
3913
                if( (G.qual & LR_SHIFTKEY)==0 || G.scene->selectmode==0)
 
3914
                        G.scene->selectmode= SCE_SELECT_VERTEX;
 
3915
                EM_selectmode_set();
 
3916
                allqueue(REDRAWVIEW3D, 1);
 
3917
                break;
 
3918
        case B_SEL_EDGE:
 
3919
                if( (G.qual & LR_SHIFTKEY)==0 || G.scene->selectmode==0)
 
3920
                        G.scene->selectmode= SCE_SELECT_EDGE;
 
3921
                EM_selectmode_set();
 
3922
                allqueue(REDRAWVIEW3D, 1);
 
3923
                break;
 
3924
        case B_SEL_FACE:
 
3925
                if( (G.qual & LR_SHIFTKEY)==0 || G.scene->selectmode==0)
 
3926
                        G.scene->selectmode= SCE_SELECT_FACE;
 
3927
                EM_selectmode_set();
 
3928
                allqueue(REDRAWVIEW3D, 1);
3560
3929
                break;
3561
3930
        
 
3931
        case B_MAN_TRANS:
 
3932
                if( (G.qual & LR_SHIFTKEY)==0 || G.vd->twtype==0)
 
3933
                        G.vd->twtype= V3D_MANIP_TRANSLATE;
 
3934
                allqueue(REDRAWVIEW3D, 1);
 
3935
                break;
 
3936
        case B_MAN_ROT:
 
3937
                if( (G.qual & LR_SHIFTKEY)==0 || G.vd->twtype==0)
 
3938
                        G.vd->twtype= V3D_MANIP_ROTATE;
 
3939
                allqueue(REDRAWVIEW3D, 1);
 
3940
                break;
 
3941
        case B_MAN_SCALE:
 
3942
                if( (G.qual & LR_SHIFTKEY)==0 || G.vd->twtype==0)
 
3943
                        G.vd->twtype= V3D_MANIP_SCALE;
 
3944
                allqueue(REDRAWVIEW3D, 1);
 
3945
                break;
 
3946
                
3562
3947
        default:
3563
3948
 
3564
3949
                if(event>=B_LAY && event<B_LAY+31) {
3587
3972
                                G.vd->layact= G.vd->lay;
3588
3973
                                scrarea_queue_headredraw(curarea);
3589
3974
                        }
 
3975
                        
 
3976
                        if(G.vd->scenelock) handle_view3d_lock();
 
3977
                        
3590
3978
                        scrarea_queue_winredraw(curarea);
3591
3979
                        countall();
3592
3980
 
3593
 
                        if(G.vd->scenelock) handle_view3d_lock();
3594
3981
                        allqueue(REDRAWOOPS, 0);
3595
3982
                }
3596
3983
                break;
3616
4003
         * height of the header */
3617
4004
        
3618
4005
        xmax= GetButStringLength("View");
3619
 
        uiDefBlockBut(block, view3d_viewmenu, NULL, "View", xco, -2, xmax-3, 24, "");
 
4006
        uiDefPulldownBut(block, view3d_viewmenu, NULL, "View", xco, -2, xmax-3, 24, "");
3620
4007
        xco+= xmax;
3621
4008
        
3622
4009
        xmax= GetButStringLength("Select");
3623
4010
        if (G.obedit) {
3624
4011
                if (OBACT && OBACT->type == OB_MESH) {
3625
 
                        uiDefBlockBut(block, view3d_select_meshmenu, NULL, "Select",    xco,-2, xmax-3, 24, "");
 
4012
                        uiDefPulldownBut(block, view3d_select_meshmenu, NULL, "Select", xco,-2, xmax-3, 24, "");
3626
4013
                } else if (OBACT && (OBACT->type == OB_CURVE || OBACT->type == OB_SURF)) {
3627
 
                        uiDefBlockBut(block, view3d_select_curvemenu, NULL, "Select", xco,-2, xmax-3, 24, "");
 
4014
                        uiDefPulldownBut(block, view3d_select_curvemenu, NULL, "Select", xco,-2, xmax-3, 24, "");
3628
4015
                } else if (OBACT && OBACT->type == OB_FONT) {
3629
 
                        uiDefBlockBut(block, view3d_select_meshmenu, NULL, "Select",    xco, -2, xmax-3, 24, "");
 
4016
                        uiDefPulldownBut(block, view3d_select_meshmenu, NULL, "Select", xco, -2, xmax-3, 24, "");
3630
4017
                } else if (OBACT && OBACT->type == OB_MBALL) {
3631
 
                        uiDefBlockBut(block, view3d_select_metaballmenu, NULL, "Select",        xco,-2, xmax-3, 24, "");
 
4018
                        uiDefPulldownBut(block, view3d_select_metaballmenu, NULL, "Select",     xco,-2, xmax-3, 24, "");
3632
4019
                } else if (OBACT && OBACT->type == OB_LATTICE) {
3633
 
                        uiDefBlockBut(block, view3d_select_latticemenu, NULL, "Select", xco,-2, xmax-3, 24, "");
 
4020
                        uiDefPulldownBut(block, view3d_select_latticemenu, NULL, "Select", xco,-2, xmax-3, 24, "");
3634
4021
                } else if (OBACT && OBACT->type == OB_ARMATURE) {
3635
 
                        uiDefBlockBut(block, view3d_select_armaturemenu, NULL, "Select",        xco,-2, xmax-3, 24, "");
 
4022
                        uiDefPulldownBut(block, view3d_select_armaturemenu, NULL, "Select",     xco,-2, xmax-3, 24, "");
3636
4023
                }
3637
4024
        } else if (G.f & G_FACESELECT) {
3638
4025
                if (OBACT && OBACT->type == OB_MESH) {
3639
 
                        uiDefBlockBut(block, view3d_select_faceselmenu, NULL, "Select", xco,-2, xmax-3, 24, "");
 
4026
                        uiDefPulldownBut(block, view3d_select_faceselmenu, NULL, "Select", xco,-2, xmax-3, 24, "");
3640
4027
                }
3641
4028
        } else if (G.obpose) {
3642
4029
                if (OBACT && OBACT->type == OB_ARMATURE) {
3643
 
                        uiDefBlockBut(block, view3d_select_pose_armaturemenu, NULL, "Select", xco,-2, xmax-3, 24, "");
 
4030
                        uiDefPulldownBut(block, view3d_select_pose_armaturemenu, NULL, "Select", xco,-2, xmax-3, 24, "");
3644
4031
                }
3645
4032
        } else if ((G.f & G_VERTEXPAINT) || (G.f & G_TEXTUREPAINT) || (G.f & G_WEIGHTPAINT)) {
3646
4033
                uiDefBut(block, LABEL,0,"", xco, 0, xmax, 20, 0, 0, 0, 0, 0, "");
3647
4034
        } else {
3648
 
                uiDefBlockBut(block, view3d_select_objectmenu, NULL, "Select",  xco,-2, xmax-3, 24, "");
 
4035
                uiDefPulldownBut(block, view3d_select_objectmenu, NULL, "Select",       xco,-2, xmax-3, 24, "");
3649
4036
        }
3650
4037
        xco+= xmax;
3651
4038
        
3653
4040
        if (G.obedit) {
3654
4041
                if (OBACT && OBACT->type == OB_MESH) {
3655
4042
                        xmax= GetButStringLength("Mesh");
3656
 
                        uiDefBlockBut(block, view3d_edit_meshmenu, NULL, "Mesh",        xco,-2, xmax-3, 24, "");
 
4043
                        uiDefPulldownBut(block, view3d_edit_meshmenu, NULL, "Mesh",     xco,-2, xmax-3, 24, "");
3657
4044
                        xco+= xmax;
3658
4045
                } else if (OBACT && OBACT->type == OB_CURVE) {
3659
4046
                        xmax= GetButStringLength("Curve");
3660
 
                        uiDefBlockBut(block, view3d_edit_curvemenu, NULL, "Curve",      xco,-2, xmax-3, 24, "");
 
4047
                        uiDefPulldownBut(block, view3d_edit_curvemenu, NULL, "Curve",   xco,-2, xmax-3, 24, "");
3661
4048
                        xco+= xmax;
3662
4049
                } else if (OBACT && OBACT->type == OB_SURF) {
3663
4050
                        xmax= GetButStringLength("Surface");
3664
 
                        uiDefBlockBut(block, view3d_edit_curvemenu, NULL, "Surface",    xco,-2, xmax-3, 24, "");
 
4051
                        uiDefPulldownBut(block, view3d_edit_curvemenu, NULL, "Surface", xco,-2, xmax-3, 24, "");
3665
4052
                        xco+= xmax;
3666
4053
                } else if (OBACT && OBACT->type == OB_FONT) {
3667
4054
                        xmax= GetButStringLength("Text");
3668
 
                        uiDefBlockBut(block, view3d_edit_textmenu, NULL, "Text",        xco,-2, xmax-3, 24, "");
 
4055
                        uiDefPulldownBut(block, view3d_edit_textmenu, NULL, "Text",     xco,-2, xmax-3, 24, "");
3669
4056
                        xco+= xmax;
3670
4057
                } else if (OBACT && OBACT->type == OB_MBALL) {
3671
4058
                        xmax= GetButStringLength("Metaball");
3672
 
                        uiDefBlockBut(block, view3d_edit_metaballmenu, NULL, "Metaball",        xco,-2, xmax-3, 24, "");
 
4059
                        uiDefPulldownBut(block, view3d_edit_metaballmenu, NULL, "Metaball",     xco,-2, xmax-3, 24, "");
3673
4060
                        xco+= xmax;
3674
4061
                } else if (OBACT && OBACT->type == OB_LATTICE) {
3675
4062
                        xmax= GetButStringLength("Lattice");
3676
 
                        uiDefBlockBut(block, view3d_edit_latticemenu, NULL, "Lattice",  xco,-2, xmax-3, 24, "");
 
4063
                        uiDefPulldownBut(block, view3d_edit_latticemenu, NULL, "Lattice",       xco,-2, xmax-3, 24, "");
3677
4064
                        xco+= xmax;
3678
4065
                } else if (OBACT && OBACT->type == OB_ARMATURE) {
3679
4066
                        xmax= GetButStringLength("Armature");
3680
 
                        uiDefBlockBut(block, view3d_edit_armaturemenu, NULL, "Armature",        xco,-2, xmax-3, 24, "");
 
4067
                        uiDefPulldownBut(block, view3d_edit_armaturemenu, NULL, "Armature",     xco,-2, xmax-3, 24, "");
3681
4068
                        xco+= xmax;
3682
4069
                }
3683
4070
        }
3684
4071
        else if ((G.f & G_VERTEXPAINT) || (G.f & G_TEXTUREPAINT) || (G.f & G_WEIGHTPAINT)) {
3685
4072
                xmax= GetButStringLength("Paint");
3686
 
                uiDefBlockBut(block, view3d_paintmenu, NULL, "Paint", xco,-2, xmax-3, 24, "");
 
4073
                uiDefPulldownBut(block, view3d_paintmenu, NULL, "Paint", xco,-2, xmax-3, 24, "");
3687
4074
                xco+= xmax;
3688
4075
        } 
3689
4076
        else if (G.f & G_FACESELECT) {
3690
4077
                if (OBACT && OBACT->type == OB_MESH) {
3691
4078
                        xmax= GetButStringLength("Face");
3692
 
                        uiDefBlockBut(block, view3d_faceselmenu, NULL, "Face",  xco,-2, xmax-3, 24, "");
 
4079
                        uiDefPulldownBut(block, view3d_faceselmenu, NULL, "Face",       xco,-2, xmax-3, 24, "");
3693
4080
                        xco+= xmax;
3694
4081
                }
3695
4082
        } else if (G.obpose) {
3696
4083
                if (OBACT && OBACT->type == OB_ARMATURE) {
3697
4084
                        xmax= GetButStringLength("Armature");
3698
 
                        uiDefBlockBut(block, view3d_pose_armaturemenu, NULL, "Armature",        xco,-2, xmax-3, 24, "");
 
4085
                        uiDefPulldownBut(block, view3d_pose_armaturemenu, NULL, "Armature",     xco,-2, xmax-3, 24, "");
3699
4086
                        xco+= xmax;
3700
4087
                }
3701
4088
        } else {
3702
4089
                xmax= GetButStringLength("Object");
3703
 
                uiDefBlockBut(block, view3d_edit_objectmenu, NULL, "Object",    xco,-2, xmax-3, 24, "");
 
4090
                uiDefPulldownBut(block, view3d_edit_objectmenu, NULL, "Object", xco,-2, xmax-3, 24, "");
3704
4091
                xco+= xmax;
3705
4092
        }
3706
4093
 
3772
4159
        /* DRAWTYPE */
3773
4160
        uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_BBOX, drawtype_pup(), xco,0,XIC+10,YIC, &(G.vd->drawtype), 1.0, 5.0, 0, 0, "Viewport Shading (Hotkeys: Z, Shift Z, Ctrl Z, Alt Z");
3774
4161
 
3775
 
        // uiDefIconButS(block, ICONROW, B_REDR, ICON_BBOX,     xco,0,XIC+10,YIC, &(G.vd->drawtype), 1.0, 5.0, 0, 0, "Drawtype: boundbox/wire/solid/shaded (ZKEY, SHIFT+Z)");
3776
 
 
3777
 
        // uiDefIconTextButS(block, MENU, REDRAWVIEW3D, (ICON_BBOX+G.vd->drawtype-1), "Viewport Shading%t|Bounding Box %x1|Wireframe %x2|Solid %x3|Shaded %x4|Textured %x5",    
3778
 
        //                                                                                                              xco,0,124,20, &(G.vd->drawtype), 0, 0, 0, 0, "Viewport Shading");
3779
 
        //      uiDefButS(block, MENU, REDRAWVIEW3D, "Viewport Shading%t|Bounding Box %x1|Wireframe %x2|Solid %x3|Shaded %x4|Textured %x5", 
3780
 
        //                                                                                                                              xco,0,110,20, &(G.vd->drawtype), 0, 0, 0, 0, "Viewport Shading");
3781
 
        
3782
 
        
3783
4162
        /* around */
3784
4163
        xco+= XIC+18;
3785
 
        uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_ROTATE, around_pup(), xco,0,XIC+10,YIC, &(G.vd->around), 0, 3.0, 0, 0, "Rotation/Scaling Pivot (Hotkeys: Comma, Period) ");
3786
 
        /*
3787
 
        uiDefIconButS(block, ROW, 1, ICON_ROTATE, xco+=XIC,0,XIC,YIC, &G.vd->around, 3.0, 0.0, 0, 0, "Enables Rotation or Scaling around boundbox center (COMMAKEY)");
3788
 
        uiDefIconButS(block, ROW, 1, ICON_ROTATECENTER, xco+=XIC,0,XIC,YIC, &G.vd->around, 3.0, 3.0, 0, 0, "Enables Rotation or Scaling around median point");
3789
 
        uiDefIconButS(block, ROW, 1, ICON_CURSOR, xco+=XIC,0,XIC,YIC, &G.vd->around, 3.0, 1.0, 0, 0, "Enables Rotation or Scaling around cursor (DOTKEY)");
3790
 
        uiDefIconButS(block, ROW, 1, ICON_ROTATECOLLECTION, xco+=XIC,0,XIC,YIC, &G.vd->around, 3.0, 2.0, 0, 0, "Enables Rotation or Scaling around individual object centers");
3791
 
        */
3792
 
        
3793
 
        
3794
 
        
3795
 
        xco+= XIC+18;
 
4164
        
 
4165
        uiBlockBeginAlign(block);
 
4166
        uiDefIconTextButS(block, ICONTEXTROW,B_AROUND, ICON_ROTATE, around_pup(), xco,0,XIC+10,YIC, &(G.vd->around), 0, 3.0, 0, 0, "Rotation/Scaling Pivot (Hotkeys: Comma, Period) ");
 
4167
 
 
4168
        xco+= XIC+10;
 
4169
        
 
4170
        uiDefIconButS(block, TOG|BIT|10, B_AROUND, ICON_ALIGN,
 
4171
                                xco,0,XIC,YIC,
 
4172
                                &G.vd->flag, 0, 0, 0, 0, "Move object centers only");   
 
4173
        uiBlockEndAlign(block);
 
4174
        
 
4175
        xco+= XIC+8;
 
4176
 
 
4177
        /* Transform widget / manipulators */
 
4178
        uiBlockBeginAlign(block);
 
4179
        uiDefIconButS(block, TOG|BIT|0, B_REDR, ICON_MANIPUL,xco,0,XIC,YIC, &G.vd->twflag, 0, 0, 0, 0, "Use 3d transform widgets (CTRL+Space)");        
 
4180
        xco+= XIC;
 
4181
        
 
4182
        if(G.vd->twflag & V3D_USE_MANIPULATOR) {
 
4183
                uiDefIconButS(block, TOG|BIT|0, B_MAN_TRANS, ICON_MAN_TRANS, xco,0,XIC,YIC, &G.vd->twtype, 1.0, 0.0, 0, 0, "Translate widget mode (CTRL+Space)");
 
4184
                xco+= XIC;
 
4185
                uiDefIconButS(block, TOG|BIT|1, B_MAN_ROT, ICON_MAN_ROT, xco,0,XIC,YIC, &G.vd->twtype, 1.0, 0.0, 0, 0, "Rotate widget mode (CTRL+Space)");
 
4186
                xco+= XIC;
 
4187
                uiDefIconButS(block, TOG|BIT|2, B_MAN_SCALE, ICON_MAN_SCALE, xco,0,XIC,YIC, &G.vd->twtype, 1.0, 0.0, 0, 0, "Scale widget mode (CTRL+Space)");
 
4188
                xco+= XIC;
 
4189
                uiDefButS(block, MENU, REDRAWVIEW3D, "Orientation%t|Global%x0|Local%x1|Normal%x2",                    xco,0,60,YIC, &G.vd->twmode, 0, 0, 0, 0, "Widget orientation (ALT+Space)");
 
4190
                xco+= 60;
 
4191
        }
 
4192
        uiBlockEndAlign(block);
 
4193
        xco+= 8;
 
4194
        
3796
4195
        /* LAYERS */
3797
 
        if(G.vd->localview==0) {
 
4196
        if(G.obedit==NULL && G.vd->localview==0) {
3798
4197
                
3799
4198
                uiBlockBeginAlign(block);
3800
4199
                for(a=0; a<5; a++)
3818
4217
                xco+= XIC+10;
3819
4218
 
3820
4219
        }
3821
 
        else xco+= (10+1)*(XIC/2)+10;
3822
4220
        
3823
 
        if(G.obedit && (OBACT->type == OB_MESH || OBACT->type == OB_CURVE || OBACT->type == OB_SURF || OBACT->type == OB_LATTICE)) {
3824
 
                extern int prop_mode;
3825
 
                if(G.f & G_PROPORTIONAL) {
3826
 
                        uiDefIconTextButI(block, ICONTEXTROW,B_REDR, ICON_SHARPCURVE, propfalloff_pup(), xco,0,XIC+10,YIC, &(prop_mode), 0, 1.0, 0, 0, "Proportional Edit Falloff (Hotkey: Shift O) ");
3827
 
                        xco+= XIC+20;
3828
 
                }
 
4221
        /* proportional falloff */
 
4222
        if(G.obedit && (G.obedit->type == OB_MESH || G.obedit->type == OB_CURVE || G.obedit->type == OB_SURF || G.obedit->type == OB_LATTICE)) {
 
4223
                
 
4224
                uiBlockBeginAlign(block);
 
4225
                uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_PROP_OFF, "Proportional %t|Off %x0|On %x1|Connected %x2", xco,0,XIC+10,YIC, &(G.scene->proportional), 0, 1.0, 0, 0, "Proportional Edit Falloff (Hotkey: O) ");
 
4226
                xco+= XIC+10;
 
4227
                
 
4228
                if(G.scene->proportional) {
 
4229
                        uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_SMOOTHCURVE, propfalloff_pup(), xco,0,XIC+10,YIC, &(G.scene->prop_mode), 0.0, 0.0, 0, 0, "Proportional Edit Falloff (Hotkey: Shift O) ");
 
4230
                        xco+= XIC+10;
 
4231
                }
 
4232
                xco+= 10;
 
4233
        }
 
4234
 
 
4235
        /* selection modus */
 
4236
        if(G.obedit && (G.obedit->type == OB_MESH)) {
 
4237
                uiBlockBeginAlign(block);
 
4238
                uiDefIconButS(block, TOG|BIT|0, B_SEL_VERT, ICON_VERTEXSEL, xco,0,XIC,YIC, &G.scene->selectmode, 1.0, 0.0, 0, 0, "Vertex select mode");
 
4239
                xco+= XIC;
 
4240
                uiDefIconButS(block, TOG|BIT|1, B_SEL_EDGE, ICON_EDGESEL, xco,0,XIC,YIC, &G.scene->selectmode, 1.0, 0.0, 0, 0, "Edge select mode");
 
4241
                xco+= XIC;
 
4242
                uiDefIconButS(block, TOG|BIT|2, B_SEL_FACE, ICON_FACESEL, xco,0,XIC,YIC, &G.scene->selectmode, 1.0, 0.0, 0, 0, "Face select mode");
 
4243
                xco+= XIC;
 
4244
                uiBlockEndAlign(block);
 
4245
                if(G.vd->drawtype > OB_WIRE) {
 
4246
                        uiDefIconButS(block, TOG|BIT|12, B_REDR, ICON_ORTHO, xco,0,XIC,YIC, &G.vd->flag, 1.0, 0.0, 0, 0, "Limit selection to visible (clipped with depth buffer)");
 
4247
                        xco+= XIC;
 
4248
                }
 
4249
                xco+= 20;
3829
4250
        }
3830
4251
 
3831
4252
        uiDefIconBut(block, BUT, B_VIEWRENDER, ICON_SCENE_DEHLT, xco,0,XIC,YIC, NULL, 0, 1.0, 0, 0, "Render this window (hold CTRL for anim)");