[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24945] trunk/blender/source/blender/ editors/screen/screen_ops.c: Fix for problems with region-flip operator not working from the RMB context menu .
Joshua Leung
aligorith at gmail.com
Fri Nov 27 12:51:36 CET 2009
Revision: 24945
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24945
Author: aligorith
Date: 2009-11-27 12:51:34 +0100 (Fri, 27 Nov 2009)
Log Message:
-----------
Fix for problems with region-flip operator not working from the RMB context menu.
I've had to add a special operator for this, since the generic region-flip operator doesn't seem to be getting the right region from RNA. This operator explicitly searches for an appropriate header region before beginning. I suspect by default, operators get the main region set as being context target...
Modified Paths:
--------------
trunk/blender/source/blender/editors/screen/screen_ops.c
Modified: trunk/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_ops.c 2009-11-27 11:19:13 UTC (rev 24944)
+++ trunk/blender/source/blender/editors/screen/screen_ops.c 2009-11-27 11:51:34 UTC (rev 24945)
@@ -2121,6 +2121,60 @@
ot->flag= 0;
}
+/* ************** header flip operator ***************************** */
+
+/* flip a header region alignment */
+static int header_flip_exec(bContext *C, wmOperator *op)
+{
+ ARegion *ar= CTX_wm_region(C);
+
+ /* find the header region
+ * - try context first, but upon failing, search all regions in area...
+ */
+ if((ar == NULL) || (ar->regiontype != RGN_TYPE_HEADER)) {
+ ScrArea *sa= CTX_wm_area(C);
+
+ /* loop over all regions until a matching one is found */
+ for (ar= sa->regionbase.first; ar; ar= ar->next) {
+ if(ar->regiontype == RGN_TYPE_HEADER)
+ break;
+ }
+
+ /* don't do anything if no region */
+ if(ar == NULL)
+ return OPERATOR_CANCELLED;
+ }
+
+ /* copied from SCREEN_OT_region_flip */
+ if(ar->alignment==RGN_ALIGN_TOP)
+ ar->alignment= RGN_ALIGN_BOTTOM;
+ else if(ar->alignment==RGN_ALIGN_BOTTOM)
+ ar->alignment= RGN_ALIGN_TOP;
+ else if(ar->alignment==RGN_ALIGN_LEFT)
+ ar->alignment= RGN_ALIGN_RIGHT;
+ else if(ar->alignment==RGN_ALIGN_RIGHT)
+ ar->alignment= RGN_ALIGN_LEFT;
+
+ WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
+ printf("executed header region flip\n");
+
+ return OPERATOR_FINISHED;
+}
+
+
+static void SCREEN_OT_header_flip(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Flip Header Region";
+ ot->idname= "SCREEN_OT_header_flip";
+
+ /* api callbacks */
+ ot->exec= header_flip_exec;
+
+ ot->poll= ED_operator_areaactive;
+ ot->flag= 0;
+}
+
/* ************** header tools operator ***************************** */
static int header_toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
@@ -2133,16 +2187,15 @@
pup= uiPupMenuBegin(C, "Header", 0);
layout= uiPupMenuLayout(pup);
- uiLayoutSetOperatorContext(layout, WM_OP_EXEC_REGION_WIN); // XXX still can't manage to get the right region flipped
+ // XXX SCREEN_OT_region_flip doesn't work - gets wrong context for active region, so added custom operator
if (ar->alignment == RGN_ALIGN_TOP)
- uiItemO(layout, "Flip to Bottom", 0, "SCREEN_OT_region_flip");
+ uiItemO(layout, "Flip to Bottom", 0, "SCREEN_OT_header_flip");
else
- uiItemO(layout, "Flip to Top", 0, "SCREEN_OT_region_flip");
+ uiItemO(layout, "Flip to Top", 0, "SCREEN_OT_header_flip");
uiItemS(layout);
/* file browser should be fullscreen all the time, but other regions can be maximised/restored... */
- uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT);
if (sa->spacetype != SPACE_FILE) {
if (sa->full)
uiItemO(layout, "Tile Window", 0, "SCREEN_OT_screen_full_area");
@@ -3601,8 +3654,9 @@
WM_operatortype_append(SCREEN_OT_area_dupli);
WM_operatortype_append(SCREEN_OT_area_swap);
WM_operatortype_append(SCREEN_OT_region_foursplit);
+ WM_operatortype_append(SCREEN_OT_region_scale);
WM_operatortype_append(SCREEN_OT_region_flip);
- WM_operatortype_append(SCREEN_OT_region_scale);
+ WM_operatortype_append(SCREEN_OT_header_flip);
WM_operatortype_append(SCREEN_OT_header_toolbox);
WM_operatortype_append(SCREEN_OT_screen_set);
WM_operatortype_append(SCREEN_OT_screen_full_area);
More information about the Bf-blender-cvs
mailing list