Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Leung <aligorith@gmail.com>2009-11-27 14:51:34 +0300
committerJoshua Leung <aligorith@gmail.com>2009-11-27 14:51:34 +0300
commit65c4149f2036100b1e5ee7911085188bbf9f2299 (patch)
treefa6a810ae1e4ecb38c8ce750784afa62480f6094 /source/blender/editors/screen
parent692115356c45e3da8ff8dd7531c4a237dea8e317 (diff)
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...
Diffstat (limited to 'source/blender/editors/screen')
-rw-r--r--source/blender/editors/screen/screen_ops.c64
1 files changed, 59 insertions, 5 deletions
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 9f2b8113119..456671b3d75 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -2121,6 +2121,60 @@ static void SCREEN_OT_region_flip(wmOperatorType *ot)
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 @@ static int header_toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
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 @@ void ED_operatortypes_screen(void)
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_flip);
WM_operatortype_append(SCREEN_OT_region_scale);
+ WM_operatortype_append(SCREEN_OT_region_flip);
+ 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);