diff options
author | Ton Roosendaal <ton@blender.org> | 2009-01-01 16:15:35 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2009-01-01 16:15:35 +0300 |
commit | e9a3b4f85df2261cafea0bfc9f0a885708cdf9d6 (patch) | |
tree | d4ebc689eb2f61a1af93ccd13b882e55e635c455 /source/blender/editors | |
parent | a1c4d1c735c59b5911dbd0d8557b8f2b32263fe5 (diff) |
2.5
- Edit mode Mesh undo/redo back
(undo for editmodes needed recode, todo for curve/lattice/etc)
- Added border select for edit mesh
- Added Akey (de)select all for edit mesh
- Added notifiers for mode changes.
This is also the first trial to dynamically add/remove
keymap handlers, based on modes. For that reason the Object
keymap was split in 2, modal and non-modal. On TABkey, the
view3d listener removes and adds maps.
The view3d keymap still handles generic mouse/border selection.
Internally it will verify modes.
The modes are not re-implemented still... have to move this
to scene context.
Diffstat (limited to 'source/blender/editors')
25 files changed, 413 insertions, 164 deletions
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index 7a042aa286d..5a093484461 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -31,7 +31,12 @@ struct View3D; struct ARegion; struct EditMesh; +struct EditVert; +struct EditEdge; +struct EditFace; struct bContext; +struct wmWindowManager; +struct EditSelection; // edge and face flag both #define EM_FGON 2 @@ -67,39 +72,48 @@ typedef struct ViewContext { /* meshtools.c */ -intptr_t mesh_octree_table(Object *ob, EditMesh *em, float *co, char mode); -EditVert *editmesh_get_x_mirror_vert(Object *ob, EditMesh *em, float *co); +intptr_t mesh_octree_table(Object *ob, struct EditMesh *em, float *co, char mode); +struct EditVert *editmesh_get_x_mirror_vert(Object *ob, struct EditMesh *em, float *co); + +/* mesh_ops.c */ +void ED_operatortypes_mesh(void); +void ED_keymap_mesh(struct wmWindowManager *wm); + /* editmesh.c */ +void ED_spacetypes_init(void); +void ED_keymap_mesh(struct wmWindowManager *wm); + void make_editMesh(Scene *scene, Object *ob); void load_editMesh(Scene *scene, Object *ob); void remake_editMesh(Scene *scene, Object *ob); -void free_editMesh(EditMesh *em); +void free_editMesh(struct EditMesh *em); void EM_init_index_arrays(struct EditMesh *em, int forVert, int forEdge, int forFace); void EM_free_index_arrays(void); -EditVert *EM_get_vert_for_index(int index); -EditEdge *EM_get_edge_for_index(int index); -EditFace *EM_get_face_for_index(int index); +struct EditVert *EM_get_vert_for_index(int index); +struct EditEdge *EM_get_edge_for_index(int index); +struct EditFace *EM_get_face_for_index(int index); int EM_texFaceCheck(struct EditMesh *em); int EM_vertColorCheck(struct EditMesh *em); -void undo_push_mesh(char *name); + +void undo_push_mesh(struct bContext *C, char *name); /* editmesh_lib.c */ -EditFace *EM_get_actFace(struct EditMesh *em, int sloppy); +struct EditFace *EM_get_actFace(struct EditMesh *em, int sloppy); -void EM_select_edge(EditEdge *eed, int sel); -void EM_select_face_fgon(struct EditMesh *em, EditFace *efa, int val); +void EM_select_edge(struct EditEdge *eed, int sel); +void EM_select_face_fgon(struct EditMesh *em, struct EditFace *efa, int val); void EM_selectmode_flush(struct EditMesh *em); void EM_deselect_flush(struct EditMesh *em); /* exported to transform */ -int EM_get_actSelection(EditMesh *em, EditSelection *ese); -void EM_editselection_normal(float *normal, EditSelection *ese); -void EM_editselection_plane(float *plane, EditSelection *ese); +int EM_get_actSelection(struct EditMesh *em, struct EditSelection *ese); +void EM_editselection_normal(float *normal, struct EditSelection *ese); +void EM_editselection_plane(float *plane, struct EditSelection *ese); /* editmesh_mods.c */ diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index 1f3d156d0b2..95ac858bb09 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -94,6 +94,9 @@ int ED_operator_node_active(struct bContext *C); int ED_operator_ipo_active(struct bContext *C); int ED_operator_sequencer_active(struct bContext *C); +int ED_operator_object_active(struct bContext *C); +int ED_operator_editmesh(struct bContext *C); +int ED_operator_editcurve(struct bContext *C); /* default keymaps, bitflags */ #define ED_KEYMAP_UI 1 diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h index 411c3f250da..4fe7112bc26 100644 --- a/source/blender/editors/include/ED_util.h +++ b/source/blender/editors/include/ED_util.h @@ -46,14 +46,19 @@ void ED_OT_undo (struct wmOperatorType *ot); void ED_OT_redo (struct wmOperatorType *ot); /* undo_editmode.c */ -void undo_editmode_push (char *name, void (*freedata)(void *), - void (*to_editmode)(void *), void *(*from_editmode)(void), - int (*validate_undo)(void *)); +void undo_editmode_push(struct bContext *C, char *name, + void * (*getdata)(struct bContext *C), + void (*freedata)(void *), + void (*to_editmode)(void *, void *), + void *(*from_editmode)(void *), + int (*validate_undo)(void *, void *)); + + void *undo_editmode_get_prev (struct Object *ob); struct uiBlock *editmode_undohistorymenu(struct bContext *C, struct uiMenuBlockHandle *handle, void *arg_unused); -void undo_editmode_menu (void); +void undo_editmode_menu (struct bContext *C); void undo_editmode_clear (void); -void undo_editmode_step (int step); +void undo_editmode_step (struct bContext *C, int step); /* ************** XXX OLD CRUFT WARNING ************* */ diff --git a/source/blender/editors/mesh/Makefile b/source/blender/editors/mesh/Makefile index daa5702f1fd..60b1fa1c329 100644 --- a/source/blender/editors/mesh/Makefile +++ b/source/blender/editors/mesh/Makefile @@ -47,6 +47,7 @@ CPPFLAGS += -I../../blenkernel CPPFLAGS += -I../../blenloader CPPFLAGS += -I../../blenlib CPPFLAGS += -I../../makesdna +CPPFLAGS += -I../../makesrna CPPFLAGS += -I../../imbuf CPPFLAGS += -I../../gpu CPPFLAGS += -I../../render/extern/include diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c index 69d73846710..61bfc8b8a0f 100644 --- a/source/blender/editors/mesh/editface.c +++ b/source/blender/editors/mesh/editface.c @@ -79,7 +79,7 @@ #include "WM_types.h" /* own include */ -#include "editmesh.h" +#include "mesh_intern.h" /* Pupmenu codes: */ diff --git a/source/blender/editors/mesh/editmesh.c b/source/blender/editors/mesh/editmesh.c index d3be73fed0c..80e5d0f910a 100644 --- a/source/blender/editors/mesh/editmesh.c +++ b/source/blender/editors/mesh/editmesh.c @@ -81,7 +81,7 @@ #include "ED_util.h" /* own include */ -#include "editmesh.h" +#include "mesh_intern.h" /* editmesh.c: @@ -1877,10 +1877,10 @@ static void free_undoMesh(void *umv) MEM_freeN(um); } -static void *editMesh_to_undoMesh(void) +static void *editMesh_to_undoMesh(void *emv) { - EditMesh *em= NULL; // XXX - Scene *scene= NULL; + EditMesh *em= (EditMesh *)emv; +// Scene *scene= NULL; UndoMesh *um; EditVert *eve; EditEdge *eed; @@ -1891,7 +1891,7 @@ static void *editMesh_to_undoMesh(void) EditFaceC *efac=NULL; EditSelectionC *esec=NULL; int a; - return NULL; // XXX + um= MEM_callocN(sizeof(UndoMesh), "undomesh"); um->selectmode = em->selectmode; @@ -1972,7 +1972,7 @@ static void *editMesh_to_undoMesh(void) } // XXX um->retopo_paint_data= retopo_paint_data_copy(em->retopo_paint_data); - um->retopo_mode= scene->toolsettings->retopo_mode; +// um->retopo_mode= scene->toolsettings->retopo_mode; { Multires *mr= get_mesh(G.obedit)->mr; @@ -1996,10 +1996,10 @@ static void *editMesh_to_undoMesh(void) return um; } -static void undoMesh_to_editMesh(void *umv) +static void undoMesh_to_editMesh(void *umv, void *emv) { - EditMesh *em= NULL; // XXX - UndoMesh *um= (UndoMesh*)umv; + EditMesh *em= (EditMesh *)emv; + UndoMesh *um= (UndoMesh *)umv; EditVert *eve, **evar=NULL; EditEdge *eed; EditFace *efa; @@ -2009,7 +2009,7 @@ static void undoMesh_to_editMesh(void *umv) EditFaceC *efac; EditSelectionC *esec; int a=0; - return; // XXX + em->selectmode = um->selectmode; free_editMesh(em); @@ -2110,11 +2110,20 @@ static void undoMesh_to_editMesh(void *umv) } } +static void *getEditMesh(bContext *C) +{ + Object *obedit= CTX_data_edit_object(C); + if(obedit) { + Mesh *me= obedit->data; + return me->edit_mesh; + } + return NULL; +} /* and this is all the undo system needs to know */ -void undo_push_mesh(char *name) +void undo_push_mesh(bContext *C, char *name) { - undo_editmode_push(name, free_undoMesh, undoMesh_to_editMesh, editMesh_to_undoMesh, NULL); + undo_editmode_push(C, name, getEditMesh, free_undoMesh, undoMesh_to_editMesh, editMesh_to_undoMesh, NULL); } diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c index 241d992bdee..60d821b9801 100644 --- a/source/blender/editors/mesh/editmesh_add.c +++ b/source/blender/editors/mesh/editmesh_add.c @@ -61,7 +61,7 @@ #include "ED_multires.h" #include "ED_view3d.h" -#include "editmesh.h" +#include "mesh_intern.h" /* bpymenu removed XXX */ diff --git a/source/blender/editors/mesh/editmesh_lib.c b/source/blender/editors/mesh/editmesh_lib.c index 667c8d5ac45..115207736c9 100644 --- a/source/blender/editors/mesh/editmesh_lib.c +++ b/source/blender/editors/mesh/editmesh_lib.c @@ -56,7 +56,7 @@ editmesh_lib: generic (no UI, no menus) operations/evaluators for editmesh data #include "ED_mesh.h" -#include "editmesh.h" +#include "mesh_intern.h" /* this replaces the active flag used in uv/face mode */ void EM_set_actFace(EditMesh *em, EditFace *efa) diff --git a/source/blender/editors/mesh/editmesh_loop.c b/source/blender/editors/mesh/editmesh_loop.c index a3e02cdd1c1..d12c2845718 100644 --- a/source/blender/editors/mesh/editmesh_loop.c +++ b/source/blender/editors/mesh/editmesh_loop.c @@ -69,7 +69,7 @@ editmesh_loop: tools with own drawing subloops, select, knife, subdiv #include "ED_mesh.h" #include "ED_view3d.h" -#include "editmesh.h" +#include "mesh_intern.h" /* **** XXX ******** */ static void BIF_undo_push() {} diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index 5dae6a686c0..c62c64564f4 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -76,14 +76,18 @@ editmesh_mods.c, UI level access, no geometry changes #include "WM_api.h" #include "WM_types.h" +#include "RNA_access.h" +#include "RNA_define.h" + #include "ED_multires.h" #include "ED_mesh.h" +#include "ED_screen.h" #include "ED_view3d.h" #include "BIF_gl.h" #include "BIF_glutil.h" -#include "editmesh.h" +#include "mesh_intern.h" #include "BLO_sys_types.h" // for intptr_t support @@ -2174,6 +2178,7 @@ static void mouse_mesh_loop(ViewContext *vc) /* here actual select happens */ +/* gets called via generic mouse select operator */ void mouse_mesh(bContext *C, short mval[2], short extend) { ViewContext vc; @@ -3225,22 +3230,41 @@ void selectswap_mesh(EditMesh *em) /* UI level */ } -void deselectall_mesh(EditMesh *em) /* this toggles!!!, UI level */ +/* ******************** (de)select all operator **************** */ + +static int toggle_select_all_exec(bContext *C, wmOperator *op) { + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= ((Mesh *)obedit->data)->edit_mesh; - if( EM_nvertices_selected(em) ) { - EM_clear_flag_all(em, SELECT); - BIF_undo_push("Deselect All"); - } - else { - EM_set_flag_all(em, SELECT); - BIF_undo_push("Select All"); - } + if( EM_nvertices_selected(em) ) { + EM_clear_flag_all(em, SELECT); + BIF_undo_push("Deselect All"); + } + else { + EM_set_flag_all(em, SELECT); + BIF_undo_push("Select All"); + } // if (EM_texFaceCheck()) + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, G.obedit); + return OPERATOR_FINISHED; +} +void MESH_OT_de_select_all(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Select or Deselect All"; + ot->idname= "MESH_OT_de_select_all"; + + /* api callbacks */ + ot->exec= toggle_select_all_exec; + ot->poll= ED_operator_editmesh; } +/* ******************** **************** */ + void EM_select_more(EditMesh *em) { EditVert *eve; diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 2374ef62bfc..663ed2ef2c1 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -82,7 +82,7 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise #include "ED_mesh.h" #include "ED_view3d.h" -#include "editmesh.h" +#include "mesh_intern.h" /* XXX */ static void BIF_undo_push() {} diff --git a/source/blender/editors/mesh/editmesh.h b/source/blender/editors/mesh/mesh_intern.h index 67badd3f462..02b139476b0 100644 --- a/source/blender/editors/mesh/editmesh.h +++ b/source/blender/editors/mesh/mesh_intern.h @@ -29,10 +29,11 @@ /* Internal for editmesh_xxxx.c functions */ -#ifndef EDITMESH_H -#define EDITMESH_H +#ifndef MESH_INTERN_H +#define MESH_INTERN_H struct bContext; +struct wmOperatorType; #define TEST_EDITMESH if(G.obedit==0) return; /* layer test XXX */ @@ -164,6 +165,9 @@ extern struct EditFace *EM_face_from_faces(EditMesh *em, struct EditFace *efa1, /* ******************* editmesh_mods.c */ + +void MESH_OT_de_select_all(struct wmOperatorType *ot); + extern EditEdge *findnearestedge(ViewContext *vc, int *dist); extern void EM_automerge(int update); void editmesh_select_by_material(EditMesh *em, int index); @@ -195,5 +199,5 @@ void esubdivideflag(EditMesh *em, int flag, float rad, int beauty, int numcuts, int EdgeSlide(EditMesh *em, short immediate, float imperc); -#endif +#endif // MESH_INTERN_H diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c new file mode 100644 index 00000000000..a1ee2475fd2 --- /dev/null +++ b/source/blender/editors/mesh/mesh_ops.c @@ -0,0 +1,78 @@ +/** + * $Id: + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2009 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include <stdlib.h> +#include <math.h> + +#include "MEM_guardedalloc.h" + +#include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "DNA_screen_types.h" +#include "DNA_space_types.h" +#include "DNA_userdef_types.h" +#include "DNA_view3d_types.h" +#include "DNA_windowmanager_types.h" + +#include "BLI_arithb.h" +#include "BLI_blenlib.h" +#include "BLI_editVert.h" + +#include "BKE_context.h" +#include "BKE_global.h" +#include "BKE_utildefines.h" + +#include "RNA_access.h" +#include "RNA_define.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "ED_screen.h" +#include "ED_mesh.h" + +#include "mesh_intern.h" + + +/* ************************** registration **********************************/ + +void ED_operatortypes_mesh(void) +{ + WM_operatortype_append(MESH_OT_de_select_all); +} + +/* note mesh keymap also for other space? */ +void ED_keymap_mesh(wmWindowManager *wm) +{ + ListBase *keymap= WM_keymap_listbase(wm, "EditMesh", 0, 0); + + WM_keymap_add_item(keymap, "MESH_OT_de_select_all", AKEY, KM_PRESS, 0, 0); + +// RNA_int_set(WM_keymap_add_item(keymap, "OBJECT_OT_viewzoom", PADPLUSKEY, KM_PRESS, 0, 0)->ptr, "delta", 1); +} + diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c index 00ff434978e..97ce1ec617a 100644 --- a/source/blender/editors/mesh/meshtools.c +++ b/source/blender/editors/mesh/meshtools.c @@ -84,7 +84,7 @@ #include "ED_object.h" /* own include */ -#include "editmesh.h" +#include "mesh_intern.h" /* from rendercode.c */ diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 4ef8cd43865..0c85d4c9eb5 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -2061,7 +2061,7 @@ static void exit_editmode(bContext *C, wmOperator *op, int flag) /* freedata==0 // if(flag & EM_WAITCURSOR) waitcursor(0); - WM_event_add_notifier(C, NC_SCENE|ND_OB_EDIT, scene); + WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, ob); } @@ -2097,9 +2097,7 @@ static void enter_editmode(bContext *C, wmOperator *op) make_editMesh(scene, ob); - // XXX if (EM_texFaceCheck()) - // allqueue(REDRAWIMAGE, 0); - + WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_MESH, ob); } if (ob->type==OB_ARMATURE){ bArmature *arm= base->object->data; @@ -2122,7 +2120,7 @@ static void enter_editmode(bContext *C, wmOperator *op) /* to ensure all goes in restposition and without striding */ DAG_object_flush_update(scene, G.obedit, OB_RECALC); - allqueue (REDRAWVIEW3D,0); + WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_ARMATURE, ob); } else if(ob->type==OB_FONT) { G.obedit= ob; @@ -2144,19 +2142,16 @@ static void enter_editmode(bContext *C, wmOperator *op) G.obedit= ob; // XXX make_editNurb(); } - allqueue(REDRAWBUTSEDIT, 0); - allqueue(REDRAWOOPS, 0); if(ok) { - allqueue(REDRAWVIEW3D, 1); DAG_object_flush_update(scene, G.obedit, OB_RECALC_DATA); } - else G.obedit= NULL; - -// if(wc) waitcursor(0); - WM_event_add_notifier(C, NC_SCENE|ND_OB_EDIT, scene); + else { + G.obedit= NULL; + WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, ob); + } } diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 1084dac142b..af8818e58fd 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -75,12 +75,16 @@ void ED_operatortypes_object(void) } -/* note object keymap also for other space? */ void ED_keymap_object(wmWindowManager *wm) { - ListBase *keymap= WM_keymap_listbase(wm, "View3D Object", SPACE_VIEW3D, 0); + ListBase *keymap= WM_keymap_listbase(wm, "Object Non-modal", 0, 0); + /* Note: this keymap works disregarding mode */ WM_keymap_add_item(keymap, "OBJECT_OT_toggle_editmode", TABKEY, KM_PRESS, 0, 0); + + /* Note: this keymap gets disabled in non-objectmode, */ + keymap= WM_keymap_listbase(wm, "Object Mode", 0, 0); + WM_keymap_add_item(keymap, "OBJECT_OT_de_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "OBJECT_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "OBJECT_OT_select_random", PADASTERKEY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 94c003f2f3b..d65c4d0f504 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -35,6 +35,9 @@ #include "BKE_screen.h" #include "BKE_utildefines.h" +#include "DNA_object_types.h" +#include "DNA_mesh_types.h" +#include "DNA_curve_types.h" #include "DNA_scene_types.h" #include "WM_api.h" @@ -134,6 +137,26 @@ int ED_operator_sequencer_active(bContext *C) return ed_spacetype_test(C, SPACE_SEQ); } +int ED_operator_object_active(bContext *C) +{ + return NULL != CTX_data_active_object(C); +} + +int ED_operator_editmesh(bContext *C) +{ + Object *obedit= CTX_data_edit_object(C); + if(obedit && obedit->type==OB_MESH) + return NULL != ((Mesh *)obedit->data)->edit_mesh; + return 0; +} + +int ED_operator_editcurve(bContext *C) +{ + Object *obedit= CTX_data_edit_object(C); + if(obedit && obedit->type==OB_CURVE) + return NULL != ((Mesh *)obedit->data)->edit_mesh; + return 0; +} /* *************************** action zone operator ************************** */ diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c index a40659cfe1b..325227a2fc5 100644 --- a/source/blender/editors/space_api/spacetypes.c +++ b/source/blender/editors/space_api/spacetypes.c @@ -27,6 +27,8 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_windowmanager_types.h" #include "BKE_context.h" @@ -39,6 +41,7 @@ #include "ED_screen.h" #include "ED_object.h" +#include "ED_mesh.h" #include "ED_space_api.h" #include "ED_anim_api.h" @@ -85,6 +88,7 @@ void ED_spacetypes_init(void) ED_operatortypes_anim(); ED_operatortypes_animchannels(); // XXX have this as part of anim() ones instead? ED_operatortypes_object(); + ED_operatortypes_mesh(); ui_view2d_operatortypes(); spacetypes = BKE_spacetypes_list(); @@ -105,6 +109,7 @@ void ED_spacetypes_keymap(wmWindowManager *wm) ED_keymap_anim(wm); ED_keymap_animchannels(wm); ED_keymap_object(wm); + ED_keymap_mesh(wm); UI_view2d_keymap(wm); spacetypes = BKE_spacetypes_list(); diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c index fa1b53e45fb..6311b698419 100644 --- a/source/blender/editors/space_outliner/space_outliner.c +++ b/source/blender/editors/space_outliner/space_outliner.c @@ -117,8 +117,8 @@ static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn) case NC_SCENE: switch(wmn->data) { case ND_OB_ACTIVE: - case ND_OB_EDIT: case ND_OB_SELECT: + case ND_MODE: ED_region_tag_redraw(ar); break; } diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index 450e7902218..232b9d9d974 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -197,10 +197,34 @@ static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar) /* own keymap */ keymap= WM_keymap_listbase(wm, "View3D", SPACE_VIEW3D, 0); - WM_event_add_keymap_handler_bb(&ar->handlers, keymap, NULL, NULL); - /* object ops, modal later... */ - keymap= WM_keymap_listbase(wm, "View3D Object", SPACE_VIEW3D, 0); - WM_event_add_keymap_handler_bb(&ar->handlers, keymap, NULL, NULL); + WM_event_add_keymap_handler(&ar->handlers, keymap); + + /* object ops. */ + keymap= WM_keymap_listbase(wm, "Object Non-modal", 0, 0); + WM_event_add_keymap_handler(&ar->handlers, keymap); + + /* object modal ops default */ + keymap= WM_keymap_listbase(wm, "Object Mode", 0, 0); + WM_event_add_keymap_handler(&ar->handlers, keymap); + +} + +static void view3d_modal_keymaps(wmWindowManager *wm, ARegion *ar, int stype) +{ + ListBase *keymap; + + keymap= WM_keymap_listbase(wm, "Object Mode", 0, 0); + if(stype==NS_MODE_OBJECT) + WM_event_add_keymap_handler(&ar->handlers, keymap); + else + WM_event_remove_keymap_handler(&ar->handlers, keymap); + + + keymap= WM_keymap_listbase(wm, "EditMesh", 0, 0); + if(stype==NS_EDITMODE_MESH) + WM_event_add_keymap_handler(&ar->handlers, keymap); + else + WM_event_remove_keymap_handler(&ar->handlers, keymap); } @@ -212,10 +236,13 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn) switch(wmn->data) { case ND_FRAME: case ND_OB_ACTIVE: - case ND_OB_EDIT: case ND_OB_SELECT: ED_region_tag_redraw(ar); break; + case ND_MODE: + view3d_modal_keymaps(wmn->wm, ar, wmn->subtype); + ED_region_tag_redraw(ar); + break; } break; case NC_OBJECT: @@ -258,6 +285,24 @@ static void view3d_header_area_draw(const bContext *C, ARegion *ar) UI_view2d_view_restore(C); } +static void view3d_header_area_listener(ARegion *ar, wmNotifier *wmn) +{ + /* context changes */ + switch(wmn->category) { + case NC_SCENE: + switch(wmn->data) { + case ND_FRAME: + case ND_OB_ACTIVE: + case ND_OB_SELECT: + case ND_MODE: + ED_region_tag_redraw(ar); + break; + } + break; + } +} + + static int view3d_context(const bContext *C, const bContextDataMember *member, bContextDataResult *result) { View3D *v3d= (View3D*)CTX_wm_space_data(C); @@ -343,7 +388,7 @@ void ED_spacetype_view3d(void) art->regionid = RGN_TYPE_HEADER; art->minsizey= HEADERY; art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D; - art->listener= view3d_main_area_listener; + art->listener= view3d_header_area_listener; art->init= view3d_header_area_init; art->draw= view3d_header_area_draw; diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index 1396ad2929b..32eb3dabfa5 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -1228,7 +1228,7 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op) vc.scene= scene; vc.v3d= v3d; vc.obact= OBACT; - + vc.obedit= G.obedit; val= RNA_int_get(op->ptr, "event_type"); rect.xmin= RNA_int_get(op->ptr, "xmin"); @@ -1247,10 +1247,11 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op) if(G.obedit) { if(G.obedit->type==OB_MESH) { + Mesh *me= G.obedit->data; + vc.em= me->edit_mesh; do_mesh_box_select(&vc, &rect, (val==LEFTMOUSE)); -// allqueue(REDRAWVIEW3D, 0); // if (EM_texFaceCheck()) -// allqueue(REDRAWIMAGE, 0); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, G.obedit); } else if(ELEM(G.obedit->type, OB_CURVE, OB_SURF)) { @@ -1411,18 +1412,22 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op) } MEM_freeN(vbuffer); } - - BIF_undo_push("Border select"); return OPERATOR_FINISHED; } /* *****************Selection Operators******************* */ +static EnumPropertyItem prop_select_types[] = { + {0, "EXCLUSIVE", "Exclusive", ""}, + {1, "EXTEND", "Extend", ""}, + {0, NULL, NULL, NULL} +}; /* ****** Border Select ****** */ void VIEW3D_OT_borderselect(wmOperatorType *ot) { + PropertyRNA *prop; /* identifiers */ ot->name= "Border Select"; @@ -1441,15 +1446,13 @@ void VIEW3D_OT_borderselect(wmOperatorType *ot) RNA_def_property(ot->srna, "xmax", PROP_INT, PROP_NONE); RNA_def_property(ot->srna, "ymin", PROP_INT, PROP_NONE); RNA_def_property(ot->srna, "ymax", PROP_INT, PROP_NONE); + + prop = RNA_def_property(ot->srna, "type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, prop_select_types); } /* ****** Mouse Select ****** */ -static EnumPropertyItem prop_select_types[] = { - {0, "EXCLUSIVE", "Exclusive", ""}, - {1, "EXTEND", "Extend", ""}, - {0, NULL, NULL, NULL} -}; static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event) { diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c index 034b8a1576b..6de980beff4 100644 --- a/source/blender/editors/util/ed_util.c +++ b/source/blender/editors/util/ed_util.c @@ -52,6 +52,9 @@ void ED_editors_exit(bContext *C) { + /* frees all editmode undos */ + undo_editmode_clear(); + if(CTX_data_edit_object(C)) { Object *ob= CTX_data_edit_object(C); diff --git a/source/blender/editors/util/editmode_undo.c b/source/blender/editors/util/editmode_undo.c index 05813b72ad0..2237f403f01 100644 --- a/source/blender/editors/util/editmode_undo.c +++ b/source/blender/editors/util/editmode_undo.c @@ -61,16 +61,17 @@ Add this in your local code: -void undo_editmode_push(char *name, +void undo_editmode_push(bContext *C, char *name, + void * (*getdata)(bContext *C), // use context to retrieve current editdata void (*freedata)(void *), // pointer to function freeing data - void (*to_editmode)(void *), // data to editmode conversion - void * (*from_editmode)(void)) // editmode to data conversion - int (*validate_undo)(void *)) // check if undo data is still valid + void (*to_editmode)(void *, void *), // data to editmode conversion + void * (*from_editmode)(void *)) // editmode to data conversion + int (*validate_undo)(void *, void *)) // check if undo data is still valid Further exported for UI is: -void undo_editmode_step(int step); // undo and redo +void undo_editmode_step(bContext *C, int step); // undo and redo void undo_editmode_clear(void) // free & clear all data void undo_editmode_menu(void) // history menu @@ -92,10 +93,11 @@ typedef struct UndoElem { void *undodata; uintptr_t undosize; char name[MAXUNDONAME]; + void * (*getdata)(bContext *C); void (*freedata)(void *); - void (*to_editmode)(void *); - void * (*from_editmode)(void); - int (*validate_undo)(void *); + void (*to_editmode)(void *, void *); + void * (*from_editmode)(void *); + int (*validate_undo)(void *, void *); } UndoElem; static ListBase undobase={NULL, NULL}; @@ -104,19 +106,23 @@ static UndoElem *curundo= NULL; /* ********************* xtern api calls ************* */ -static void undo_restore(UndoElem *undo) +static void undo_restore(UndoElem *undo, void *editdata) { if(undo) { - undo->to_editmode(undo->undodata); + undo->to_editmode(undo->undodata, editdata); } } /* name can be a dynamic string */ -void undo_editmode_push(char *name, void (*freedata)(void *), - void (*to_editmode)(void *), void *(*from_editmode)(void), - int (*validate_undo)(void *)) +void undo_editmode_push(bContext *C, char *name, + void * (*getdata)(bContext *C), + void (*freedata)(void *), + void (*to_editmode)(void *, void *), + void *(*from_editmode)(void *), + int (*validate_undo)(void *, void *)) { UndoElem *uel; + void *editdata; int nr; uintptr_t memused, totmem, maxmem; @@ -131,10 +137,11 @@ void undo_editmode_push(char *name, void (*freedata)(void *), } /* make new */ - curundo= uel= MEM_callocN(sizeof(UndoElem), "undo file"); + curundo= uel= MEM_callocN(sizeof(UndoElem), "undo editmode"); strncpy(uel->name, name, MAXUNDONAME-1); BLI_addtail(&undobase, uel); + uel->getdata= getdata; uel->freedata= freedata; uel->to_editmode= to_editmode; uel->from_editmode= from_editmode; @@ -158,7 +165,8 @@ void undo_editmode_push(char *name, void (*freedata)(void *), /* copy */ memused= MEM_get_memory_in_use(); - curundo->undodata= curundo->from_editmode(); + editdata= getdata(C); + curundo->undodata= curundo->from_editmode(editdata); curundo->undosize= MEM_get_memory_in_use() - memused; curundo->ob= G.obedit; curundo->id= G.obedit->id; @@ -190,7 +198,7 @@ void undo_editmode_push(char *name, void (*freedata)(void *), } /* helper to remove clean other objects from undo stack */ -static void undo_clean_stack(void) +static void undo_clean_stack(bContext *C) { UndoElem *uel, *next; int mixed= 0; @@ -200,19 +208,27 @@ static void undo_clean_stack(void) uel= undobase.first; while(uel) { + void *editdata= uel->getdata(C); + int isvalid= 0; next= uel->next; /* for when objects are converted, renamed, or global undo changes pointers... */ - if(uel->type==G.obedit->type && strcmp(uel->id.name, G.obedit->id.name)==0 && - (!uel->validate_undo || uel->validate_undo(uel->undodata))) { - uel->ob= G.obedit; + if(uel->type==G.obedit->type) { + if(strcmp(uel->id.name, G.obedit->id.name)==0) { + if(uel->validate_undo==NULL) + isvalid= 1; + else if(uel->validate_undo(uel->undodata, editdata)) + isvalid= 1; + } } + if(isvalid) + uel->ob= G.obedit; else { mixed= 1; uel->freedata(uel->undodata); BLI_freelinkN(&undobase, uel); } - + uel= next; } @@ -220,14 +236,14 @@ static void undo_clean_stack(void) } /* 1= an undo, -1 is a redo. we have to make sure 'curundo' remains at current situation */ -void undo_editmode_step(int step) +void undo_editmode_step(bContext *C, int step) { /* prevent undo to happen on wrong object, stack can be a mix */ - undo_clean_stack(); + undo_clean_stack(C); if(step==0) { - undo_restore(curundo); + undo_restore(curundo, curundo->getdata(C)); } else if(step==1) { @@ -235,7 +251,7 @@ void undo_editmode_step(int step) else { if(G.f & G_DEBUG) printf("undo %s\n", curundo->name); curundo= curundo->prev; - undo_restore(curundo); + undo_restore(curundo, curundo->getdata(C)); } } else { @@ -243,7 +259,7 @@ void undo_editmode_step(int step) if(curundo==NULL || curundo->next==NULL) error("No more steps to redo"); else { - undo_restore(curundo->next); + undo_restore(curundo->next, curundo->getdata(C)); curundo= curundo->next; if(G.f & G_DEBUG) printf("redo %s\n", curundo->name); } @@ -267,7 +283,7 @@ void undo_editmode_clear(void) } /* based on index nr it does a restore */ -static void undo_number(int nr) +static void undo_number(bContext *C, int nr) { UndoElem *uel; int a=1; @@ -276,19 +292,19 @@ static void undo_number(int nr) if(a==nr) break; } curundo= uel; - undo_editmode_step(0); + undo_editmode_step(C, 0); } /* ************** for interaction with menu/pullown */ -void undo_editmode_menu(void) +void undo_editmode_menu(bContext *C) { UndoElem *uel; DynStr *ds= BLI_dynstr_new(); short event; char *menu; - undo_clean_stack(); // removes other objects from it + undo_clean_stack(C); // removes other objects from it BLI_dynstr_append(ds, "Editmode Undo History %t"); @@ -303,7 +319,7 @@ void undo_editmode_menu(void) // XXX event= pupmenu_col(menu, 20); MEM_freeN(menu); - if(event>0) undo_number(event); + if(event>0) undo_number(C, event); } static void do_editmode_undohistorymenu(bContext *C, void *arg, int event) @@ -311,7 +327,7 @@ static void do_editmode_undohistorymenu(bContext *C, void *arg, int event) if(G.obedit==NULL || event<1) return; - undo_number(event-1); + undo_number(C, event-1); } @@ -322,7 +338,7 @@ uiBlock *editmode_undohistorymenu(bContext *C, uiMenuBlockHandle *handle, void * short yco = 20, menuwidth = 120; short item= 1; - undo_clean_stack(); // removes other objects from it + undo_clean_stack(C); // removes other objects from it block= uiBeginBlock(C, handle->region, "view3d_edit_mesh_undohistorymenu", UI_EMBOSSP, UI_HELV); uiBlockSetButmFunc(block, do_editmode_undohistorymenu, NULL); diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c index 6773575ca84..b7923990101 100644 --- a/source/blender/editors/util/undo.c +++ b/source/blender/editors/util/undo.c @@ -86,7 +86,7 @@ void ED_undo_push(bContext *C, char *str) if (U.undosteps == 0) return; if(G.obedit->type==OB_MESH) - undo_push_mesh(str); + undo_push_mesh(C, str); else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) undo_push_curve(str); else if (G.obedit->type==OB_FONT) @@ -109,40 +109,45 @@ void ED_undo_push(bContext *C, char *str) } } -static void undo_do(bContext *C) -{ - if(U.uiflag & USER_GLOBALUNDO) { -#ifndef DISABLE_PYTHON -// XXX BPY_scripts_clear_pyobjects(); -#endif - BKE_undo_step(C, 1); - sound_initialize_sounds(); - } - -} - -static int ed_undo_exec(bContext *C, wmOperator *op) +static int ed_undo_step(bContext *C, wmOperator *op, int step) { ScrArea *sa= CTX_wm_area(C); if(G.obedit) { if ELEM7(G.obedit->type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE) - undo_editmode_step(1); + undo_editmode_step(C, step); } else { + int do_glob_undo= 0; + if(G.f & G_TEXTUREPAINT) - undo_imagepaint_step(1); + undo_imagepaint_step(step); else if(sa->spacetype==SPACE_IMAGE) { SpaceImage *sima= (SpaceImage *)sa->spacedata.first; if(sima->flag & SI_DRAWTOOL) - undo_imagepaint_step(1); + undo_imagepaint_step(step); + else + do_glob_undo= 1; + } + else if(G.f & G_PARTICLEEDIT) { + if(step==1) + PE_undo(); else - undo_do(C); + PE_redo(); } - else if(G.f & G_PARTICLEEDIT) - PE_undo(); else { - undo_do(C); + do_glob_undo= 1; + } + + if(do_glob_undo) { + if(U.uiflag & USER_GLOBALUNDO) { +#ifndef DISABLE_PYTHON + // XXX BPY_scripts_clear_pyobjects(); +#endif + BKE_undo_step(C, step); + sound_initialize_sounds(); + } + } } @@ -151,39 +156,13 @@ static int ed_undo_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int ed_undo_exec(bContext *C, wmOperator *op) +{ + return ed_undo_step(C, op, 1); +} static int ed_redo_exec(bContext *C, wmOperator *op) { - ScrArea *sa= CTX_wm_area(C); - - if(G.obedit) { - //if ELEM7(G.obedit->type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE) - // undo_editmode_step(-1); - } - else { - if(G.f & G_TEXTUREPAINT) - undo_imagepaint_step(-1); - else if(sa->spacetype==SPACE_IMAGE) { - SpaceImage *sima= (SpaceImage *)sa->spacedata.first; - if(sima->flag & SI_DRAWTOOL) - undo_imagepaint_step(-1); - else { - BKE_undo_step(C, -1); - sound_initialize_sounds(); - } - } - else if(G.f & G_PARTICLEEDIT) - PE_redo(); - else { - /* includes faceselect now */ - if(U.uiflag & USER_GLOBALUNDO) { - BKE_undo_step(C, -1); - sound_initialize_sounds(); - } - } - } - WM_event_add_notifier(C, NC_WINDOW, NULL); - return OPERATOR_FINISHED; - + return ed_undo_step(C, op, -1); } void ED_undo_menu(bContext *C) diff --git a/source/blender/editors/util/util_intern.h b/source/blender/editors/util/util_intern.h new file mode 100644 index 00000000000..37e6c5c25e1 --- /dev/null +++ b/source/blender/editors/util/util_intern.h @@ -0,0 +1,38 @@ +/** + * $Id: + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2008 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef ED_UTIL_INTERN_H +#define ED_UTIL_INTERN_H + +/* internal exports only */ + +/* editmode_undo.c */ +void undo_editmode_clear(void); + +#endif /* ED_UTIL_INTERN_H */ + |