[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21925] branches/blender2.5/blender/source /blender: 2.5
Ton Roosendaal
ton at blender.org
Sun Jul 26 14:52:47 CEST 2009
Revision: 21925
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21925
Author: ton
Date: 2009-07-26 14:52:39 +0200 (Sun, 26 Jul 2009)
Log Message:
-----------
2.5
First step towards keymap editor!
Before getting too excited:
- doesn't save yet
- no rna properties can be defined
- no insert/remove keymap options yet
- no option yet to set 'key press/release'
But what does work;
- Keymap list is in outliner, new category
(Keymaps are listed in order as being created now)
- enable/disable a keymap entry: click on dot icon
- it displays python api names for ops
- browse new operator for keymap (menu button)
- set keymap to use other keys, mouse or tweak events
- four modifier key options
I first intent to test it all well, there are still
quite some modal map conflicts (like border select) and
there's problems assigning items to tweaks
Another issue is that a visual editor for keymaps might be
quite hard to use... the amount of data and options is just not
so fun for a buttons menu. There are ways to improve this though.
Maybe do this via a script?
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/editors/animation/anim_markers.c
branches/blender2.5/blender/source/blender/editors/interface/interface.c
branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c
branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c
branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c
branches/blender2.5/blender/source/blender/editors/space_outliner/outliner_header.c
branches/blender2.5/blender/source/blender/editors/space_outliner/outliner_intern.h
branches/blender2.5/blender/source/blender/makesdna/DNA_space_types.h
branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
branches/blender2.5/blender/source/blender/makesrna/intern/rna_wm.c
branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_keymap.c
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
Modified: branches/blender2.5/blender/source/blender/editors/animation/anim_markers.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/anim_markers.c 2009-07-26 12:49:43 UTC (rev 21924)
+++ branches/blender2.5/blender/source/blender/editors/animation/anim_markers.c 2009-07-26 12:52:39 UTC (rev 21925)
@@ -85,6 +85,7 @@
}
/* Get the marker that is closest to this point */
+/* XXX for select, the min_dist should be small */
TimeMarker *ED_markers_find_nearest_marker (ListBase *markers, float x)
{
TimeMarker *marker, *nearest=NULL;
@@ -828,6 +829,7 @@
/* XXX marker context */
for(marker= markers->first; marker; marker= marker->next) {
if ((marker->frame > xminf) && (marker->frame <= xmaxf)) {
+ /* XXX weak... */
switch (event_type) {
case LEFTMOUSE:
if ((marker->flag & SELECT) == 0)
Modified: branches/blender2.5/blender/source/blender/editors/interface/interface.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface.c 2009-07-26 12:49:43 UTC (rev 21924)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface.c 2009-07-26 12:52:39 UTC (rev 21925)
@@ -740,7 +740,7 @@
push= 2;
break;
case KEYEVT:
- if (value==-1) push= 1;
+ push= 2;
break;
case TOGBUT:
case TOG:
Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c 2009-07-26 12:49:43 UTC (rev 21924)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c 2009-07-26 12:52:39 UTC (rev 21925)
@@ -1805,7 +1805,10 @@
{
if(data->state == BUTTON_STATE_HIGHLIGHT) {
if(ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val==KM_PRESS) {
- button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT);
+ short event= (short)ui_get_but_val(but);
+ /* hardcoded prevention from editing or assigning ESC */
+ if(event!=ESCKEY)
+ button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT);
return WM_UI_HANDLER_BREAK;
}
}
@@ -1814,7 +1817,7 @@
return WM_UI_HANDLER_CONTINUE;
if(event->val==KM_PRESS) {
- if(WM_key_event_string(event->type)[0])
+ if(event->type!=ESCKEY && WM_key_event_string(event->type)[0])
ui_set_but_val(but, event->type);
else
data->cancel= 1;
Modified: branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c 2009-07-26 12:49:43 UTC (rev 21924)
+++ branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c 2009-07-26 12:52:39 UTC (rev 21925)
@@ -151,6 +151,12 @@
/* request updates to be done... */
ED_area_tag_redraw(vpd->sa);
UI_view2d_sync(vpd->sc, vpd->sa, v2d, V2D_LOCK_COPY);
+
+ /* exceptions */
+ if(vpd->sa->spacetype==SPACE_OUTLINER) {
+ SpaceOops *soops= vpd->sa->spacedata.first;
+ soops->storeflag |= SO_TREESTORE_REDRAW;
+ }
}
/* cleanup temp customdata */
Modified: branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c 2009-07-26 12:49:43 UTC (rev 21924)
+++ branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c 2009-07-26 12:52:39 UTC (rev 21925)
@@ -1123,6 +1123,45 @@
}
}
}
+ else if(type == TSE_KEYMAP) {
+ wmKeyMap *km= (wmKeyMap *)idv;
+ wmKeymapItem *kmi;
+ char opname[OP_MAX_TYPENAME];
+
+ te->directdata= idv;
+ te->name= km->nameid;
+
+ if(!(tselem->flag & TSE_CLOSED)) {
+
+ for (kmi= km->keymap.first; kmi; kmi= kmi->next) {
+ const char *key= WM_key_event_string(kmi->type);
+
+ if(key[0]) {
+ wmOperatorType *ot= NULL;
+
+ if(kmi->propvalue);
+ else ot= WM_operatortype_find(kmi->idname, 0);
+
+ if(ot || kmi->propvalue) {
+ TreeElement *ten= outliner_add_element(soops, &te->subtree, kmi, te, TSE_KEYMAP_ITEM, a);
+
+ ten->directdata= kmi;
+
+ if(kmi->propvalue) {
+ ten->name= "Modal map, not yet";
+ }
+ else {
+ WM_operator_py_idname(opname, ot->idname);
+ ten->name= BLI_strdup(opname);
+ ten->flag |= TE_FREE_NAME;
+ }
+ }
+ }
+ }
+ }
+ else
+ te->flag |= TE_LAZY_CLOSED;
+ }
return te;
}
@@ -1376,6 +1415,14 @@
tselem->flag &= ~TSE_CLOSED;
}
}
+ else if(soops->outlinevis==SO_KEYMAP) {
+ wmWindowManager *wm= mainvar->wm.first;
+ wmKeyMap *km;
+
+ for(km= wm->keymaps.first; km; km= km->next) {
+ ten= outliner_add_element(soops, &soops->tree, (void*)km, NULL, TSE_KEYMAP, 0);
+ }
+ }
else {
ten= outliner_add_element(soops, &soops->tree, OBACT, NULL, 0, 0);
if(ten) ten->directdata= BASACT;
@@ -2193,6 +2240,21 @@
return(0);
}
+static int tree_element_active_keymap_item(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set)
+{
+ wmKeymapItem *kmi= te->directdata;
+
+ if(set==0) {
+ if(kmi->inactive) return 0;
+ return 1;
+ }
+ else {
+ kmi->inactive= !kmi->inactive;
+ }
+ return 0;
+}
+
+
/* generic call for non-id data to make/check active in UI */
/* Context can be NULL when set==0 */
static int tree_element_type_active(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, TreeStoreElem *tselem, int set)
@@ -2213,10 +2275,8 @@
break;
case TSE_LINKED_PSYS:
return tree_element_active_psys(C, scene, te, tselem, set);
- break;
case TSE_POSE_BASE:
return tree_element_active_pose(C, scene, te, tselem, set);
- break;
case TSE_POSE_CHANNEL:
return tree_element_active_posechannel(C, scene, te, tselem, set);
case TSE_CONSTRAINT:
@@ -2227,10 +2287,11 @@
return tree_element_active_posegroup(C, scene, te, tselem, set);
case TSE_SEQUENCE:
return tree_element_active_sequence(C, te, tselem, set);
- break;
case TSE_SEQUENCE_DUP:
return tree_element_active_sequence_dup(C, scene, te, tselem, set);
- break;
+ case TSE_KEYMAP_ITEM:
+ return tree_element_active_keymap_item(C, te, tselem, set);
+
}
return 0;
}
@@ -4953,6 +5014,241 @@
}
}
+static void operator_call_cb(struct bContext *C, void *arg_kmi, void *arg2)
+{
+ wmOperatorType *ot= arg2;
+ wmKeymapItem *kmi= arg_kmi;
+
+ if(ot)
+ BLI_strncpy(kmi->idname, ot->idname, OP_MAX_TYPENAME);
+}
+
+static void operator_search_cb(const struct bContext *C, void *arg_kmi, char *str, uiSearchItems *items)
+{
+ wmOperatorType *ot = WM_operatortype_first();
+
+ for(; ot; ot= ot->next) {
+
+ if(BLI_strcasestr(ot->idname, str)) {
+ char name[OP_MAX_TYPENAME];
+
+ /* display name for menu */
+ WM_operator_py_idname(name, ot->idname);
+
+ if(0==uiSearchItemAdd(items, name, ot, 0))
+ break;
+ }
+ }
+}
+
+/* operator Search browse menu, open */
+static uiBlock *operator_search_menu(bContext *C, ARegion *ar, void *arg_kmi)
+{
+ static char search[OP_MAX_TYPENAME];
+ wmEvent event;
+ wmWindow *win= CTX_wm_window(C);
+ wmKeymapItem *kmi= arg_kmi;
+ wmOperatorType *ot= WM_operatortype_find(kmi->idname, 0);
+ uiBlock *block;
+ uiBut *but;
+
+ /* clear initial search string, then all items show */
+ search[0]= 0;
+
+ block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS);
+ uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_RET_1);
+
+ /* fake button, it holds space for search items */
+ uiDefBut(block, LABEL, 0, "", 10, 15, 150, uiSearchBoxhHeight(), NULL, 0, 0, 0, 0, NULL);
+
+ but= uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, 256, 10, 0, 150, 19, "");
+ uiButSetSearchFunc(but, operator_search_cb, arg_kmi, operator_call_cb, ot);
+
+ uiBoundsBlock(block, 6);
+ uiBlockSetDirection(block, UI_DOWN);
+ uiEndBlock(C, block);
+
+ event= *(win->eventstate); /* XXX huh huh? make api call */
+ event.type= EVT_BUT_OPEN;
+ event.val= KM_PRESS;
+ event.customdata= but;
+ event.customdatafree= FALSE;
+ wm_event_add(win, &event);
+
+ return block;
+}
+
+#define OL_KM_KEYBOARD 0
+#define OL_KM_MOUSE 1
+#define OL_KM_TWEAK 2
+#define OL_KM_SPECIALS 3
+
+static short keymap_menu_type(short type)
+{
+ if(ISKEYBOARD(type)) return OL_KM_KEYBOARD;
+ if(WM_key_event_is_tweak(type)) return OL_KM_TWEAK;
+ if(type >= LEFTMOUSE && type <= WHEELOUTMOUSE) return OL_KM_MOUSE;
+// return OL_KM_SPECIALS;
+ return 0;
+}
+
+static char *keymap_type_menu(void)
+{
+ static char string[500];
+ static char formatstr[] = "|%s %%x%d";
+ char *str= string;
+
+ str += sprintf(str, "Event Type %%t");
+
+ str += sprintf(str, formatstr, "Keyboard", OL_KM_KEYBOARD);
+ str += sprintf(str, formatstr, "Mouse", OL_KM_MOUSE);
+ str += sprintf(str, formatstr, "Tweak", OL_KM_TWEAK);
+// str += sprintf(str, formatstr, "Specials", OL_KM_SPECIALS);
+
+ return string;
+}
+
+static char *keymap_mouse_menu(void)
+{
+ static char string[500];
+ static char formatstr[] = "|%s %%x%d";
+ char *str= string;
+
+ str += sprintf(str, "Mouse Event %%t");
+
+ str += sprintf(str, formatstr, "Left Mouse", LEFTMOUSE);
+ str += sprintf(str, formatstr, "Middle Mouse", MIDDLEMOUSE);
+ str += sprintf(str, formatstr, "Right Mouse", RIGHTMOUSE);
+ str += sprintf(str, formatstr, "Action Mouse", ACTIONMOUSE);
+ str += sprintf(str, formatstr, "Select Mouse", SELECTMOUSE);
+ str += sprintf(str, formatstr, "Mouse Move", MOUSEMOVE);
+ str += sprintf(str, formatstr, "Wheel Up", WHEELUPMOUSE);
+ str += sprintf(str, formatstr, "Wheel Down", WHEELDOWNMOUSE);
+ str += sprintf(str, formatstr, "Wheel In", WHEELINMOUSE);
+ str += sprintf(str, formatstr, "Wheel Out", WHEELOUTMOUSE);
+
+ return string;
+}
+
+static char *keymap_tweak_menu(void)
+{
+ static char string[500];
+ static char formatstr[] = "|%s %%x%d";
+ char *str= string;
+
+ str += sprintf(str, "Tweak Event %%t");
+
+ str += sprintf(str, formatstr, "Left Mouse", EVT_TWEAK_L);
+ str += sprintf(str, formatstr, "Middle Mouse", EVT_TWEAK_M);
+ str += sprintf(str, formatstr, "Right Mouse", EVT_TWEAK_R);
+ str += sprintf(str, formatstr, "Action Mouse", EVT_TWEAK_A);
+ str += sprintf(str, formatstr, "Select Mouse", EVT_TWEAK_S);
+
+ return string;
+}
+
+static void keymap_type_cb(bContext *C, void *kmi_v, void *unused_v)
+{
+ wmKeymapItem *kmi= kmi_v;
+ short maptype= keymap_menu_type(kmi->type);
+
+ if(maptype!=kmi->maptype) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list