[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19260] branches/blender2.5/blender/source /blender: 2.5 / Area management
Nathan Letwory
jesterking at letwory.net
Wed Mar 11 21:22:07 CET 2009
Revision: 19260
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19260
Author: jesterking
Date: 2009-03-11 21:22:06 +0100 (Wed, 11 Mar 2009)
Log Message:
-----------
2.5 / Area management
* Add Area Swap: hold alt and drag with LMB from either actionzone. Release LMB on area you want to swap with. I added a matching cute cursor for this (and to make it a politically delicate issue, it's white on black).
Note, there are still some error totblocks that I haven't been able to track down properly yet, so that's still a bit WIP.
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c
branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
branches/blender2.5/blender/source/blender/editors/screen/area.c
branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_cursors.c
branches/blender2.5/blender/source/blender/windowmanager/wm_cursors.h
branches/blender2.5/blender/source/blender/windowmanager/wm_window.h
Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h 2009-03-11 17:28:37 UTC (rev 19259)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h 2009-03-11 20:22:06 UTC (rev 19260)
@@ -139,6 +139,7 @@
/* spacedata */
void BKE_spacedata_freelist(ListBase *lb);
void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2);
+void BKE_spacedata_copyfirst(ListBase *lb1, ListBase *lb2);
/* area/regions */
struct ARegion *BKE_area_region_copy(struct SpaceType *st, struct ARegion *ar);
Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c 2009-03-11 17:28:37 UTC (rev 19259)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c 2009-03-11 20:22:06 UTC (rev 19260)
@@ -214,6 +214,27 @@
}
}
+/* lb1 should be empty */
+void BKE_spacedata_copyfirst(ListBase *lb1, ListBase *lb2)
+{
+ SpaceLink *sl;
+
+ lb1->first= lb2->last= NULL; /* to be sure */
+
+ sl= lb2->first;
+ if(sl) {
+ SpaceType *st= BKE_spacetype_from_id(sl->spacetype);
+
+ if(st && st->duplicate) {
+ SpaceLink *slnew= st->duplicate(sl);
+
+ BLI_addtail(lb1, slnew);
+
+ region_copylist(st, &slnew->regionbase, &sl->regionbase);
+ }
+ }
+}
+
/* not region itself */
void BKE_area_region_free(SpaceType *st, ARegion *ar)
{
Modified: branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_screen.h 2009-03-11 17:28:37 UTC (rev 19259)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen.h 2009-03-11 20:22:06 UTC (rev 19260)
@@ -73,6 +73,7 @@
void ED_area_headerprint(ScrArea *sa, const char *str);
void ED_area_newspace(struct bContext *C, ScrArea *sa, int type);
void ED_area_prevspace(struct bContext *C);
+void ED_area_swapspace(struct bContext *C, ScrArea *sa1, ScrArea *sa2);
/* screens */
void ED_screens_initialize(struct wmWindowManager *wm);
Modified: branches/blender2.5/blender/source/blender/editors/screen/area.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/area.c 2009-03-11 17:28:37 UTC (rev 19259)
+++ branches/blender2.5/blender/source/blender/editors/screen/area.c 2009-03-11 20:22:06 UTC (rev 19260)
@@ -660,12 +660,15 @@
sa1->spacetype= sa2->spacetype;
sa1->butspacetype= sa2->butspacetype;
- if(swap_space) {
+ if(swap_space == 1) {
SWAP(ListBase, sa1->spacedata, sa2->spacedata);
/* exception: ensure preview is reset */
// if(sa1->spacetype==SPACE_VIEW3D)
// XXX BIF_view3d_previewrender_free(sa1->spacedata.first);
}
+ else if (swap_space == 2) {
+ BKE_spacedata_copylist(&sa1->spacedata, &sa2->spacedata);
+ }
else {
BKE_spacedata_freelist(&sa1->spacedata);
BKE_spacedata_copylist(&sa1->spacedata, &sa2->spacedata);
@@ -674,10 +677,12 @@
/* Note; SPACE_EMPTY is possible on new screens */
/* regions */
- st= BKE_spacetype_from_id(sa1->spacetype);
- for(ar= sa1->regionbase.first; ar; ar= ar->next)
- BKE_area_region_free(st, ar);
- BLI_freelistN(&sa1->regionbase);
+ if(swap_space<2) {
+ st= BKE_spacetype_from_id(sa1->spacetype);
+ for(ar= sa1->regionbase.first; ar; ar= ar->next)
+ BKE_area_region_free(st, ar);
+ BLI_freelistN(&sa1->regionbase);
+ }
st= BKE_spacetype_from_id(sa2->spacetype);
for(ar= sa2->regionbase.first; ar; ar= ar->next) {
@@ -695,6 +700,38 @@
/* *********** Space switching code *********** */
+void ED_area_swapspace(bContext *C, ScrArea *sa1, ScrArea *sa2)
+{
+ SpaceType *st;
+ SpaceLink *sl;
+ SpaceLink *slold;
+ ScrArea *tmp= MEM_callocN(sizeof(ScrArea), "addscrarea");
+
+ ED_area_exit(C, sa1);
+ ED_area_exit(C, sa2);
+
+ tmp->spacetype= sa1->spacetype;
+ tmp->butspacetype= sa1->butspacetype;
+ BKE_spacedata_copyfirst(&tmp->spacedata, &sa1->spacedata);
+
+ area_copy_data(tmp, sa1, 2);
+ area_copy_data(sa1, sa2, 0);
+ area_copy_data(sa2, tmp, 0);
+ ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa1);
+ ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa2);
+
+ BKE_screen_area_free(tmp);
+ MEM_freeN(tmp);
+
+ /* tell WM to refresh, cursor types etc */
+ WM_event_add_mousemove(C);
+
+ ED_area_tag_redraw(sa1);
+ ED_area_tag_refresh(sa1);
+ ED_area_tag_redraw(sa2);
+ ED_area_tag_refresh(sa2);
+}
+
void ED_area_newspace(bContext *C, ScrArea *sa, int type)
{
if(sa->spacetype != type) {
Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c 2009-03-11 17:28:37 UTC (rev 19259)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c 2009-03-11 20:22:06 UTC (rev 19260)
@@ -438,14 +438,122 @@
RNA_def_int(ot->srna, "modifier", 0, 0, 2, "modifier", "modifier state", 0, 2);
}
+/* ************** swap area operator *********************************** */
+/* operator state vars used:
+ sa1 start area
+ sa2 area to swap with
+
+ functions:
+
+ init() set custom data for operator, based on actionzone event custom data
+
+ cancel() cancel the operator
+
+ exit() cleanup, send notifier
+
+ callbacks:
+
+ invoke() gets called on shift+lmb drag in actionzone
+ call init(), add handler
+
+ modal() accept modal events while doing it
+
+*/
+
+typedef struct sAreaSwapData {
+ ScrArea *sa1, *sa2;
+} sAreaSwapData;
+
+static int area_swap_init(bContext *C, wmOperator *op, wmEvent *event)
+{
+ sAreaSwapData *sd= NULL;
+ sActionzoneData *sad= event->customdata;
+
+ if(sad==NULL || sad->sa1==NULL)
+ return 0;
+
+ sd= MEM_callocN(sizeof(sAreaSwapData), "sAreaSwapData");
+ sd->sa1= sad->sa1;
+ sd->sa2= sad->sa2;
+ op->customdata= sd;
+
+ return 1;
+}
+
+
+static void area_swap_exit(bContext *C, wmOperator *op)
+{
+ if(op->customdata)
+ MEM_freeN(op->customdata);
+ op->customdata= NULL;
+}
+
+static int area_swap_cancel(bContext *C, wmOperator *op)
+{
+ area_swap_exit(C, op);
+ return OPERATOR_CANCELLED;
+}
+
+static int area_swap_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+
+ if(!area_swap_init(C, op, event))
+ return OPERATOR_PASS_THROUGH;
+
+ /* add modal handler */
+ WM_cursor_modal(CTX_wm_window(C), BC_SWAPAREA_CURSOR);
+ WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+
+ return OPERATOR_RUNNING_MODAL;
+
+}
+
+static int area_swap_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+ sActionzoneData *sad= op->customdata;
+
+ switch(event->type) {
+ case MOUSEMOVE:
+ /* second area, for join */
+ sad->sa2= screen_areahascursor(CTX_wm_screen(C), event->x, event->y);
+ break;
+ case LEFTMOUSE: /* release LMB */
+ if(event->val==0) {
+ if(sad->sa1 == sad->sa2) {
+
+ return area_swap_cancel(C, op);
+ }
+ ED_area_swapspace(C, sad->sa1, sad->sa2);
+
+ area_swap_exit(C, op);
+
+ WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
+
+ return OPERATOR_FINISHED;
+ }
+ break;
+
+ case ESCKEY:
+ return area_swap_cancel(C, op);
+ }
+ return OPERATOR_RUNNING_MODAL;
+}
+
+void SCREEN_OT_area_swap(wmOperatorType *ot)
+{
+ ot->name= "Swap areas";
+ ot->idname= "SCREEN_OT_area_swap";
+
+ ot->invoke= area_swap_invoke;
+ ot->modal= area_swap_modal;
+ ot->poll= ED_operator_areaactive;
+}
+
/* *********** Duplicate area as new window operator ****************** */
-
/* operator callback */
-/* (ton) removed attempt to merge ripped area with another, don't think this is desired functionality.
-conventions: 'atomic' and 'dont think for user' :) */
-static int screen_area_dupli_new_op(bContext *C, wmOperator *op, wmEvent *event)
+static int area_dupli_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
wmWindow *newwin, *win;
bScreen *newsc, *sc;
@@ -454,15 +562,17 @@
sActionzoneData *sad= event->customdata;
if(sad==NULL)
- return OPERATOR_CANCELLED;
+ return OPERATOR_PASS_THROUGH;
win= CTX_wm_window(C);
sc= CTX_wm_screen(C);
sa= sad->sa1;
/* poll() checks area context, but we don't accept full-area windows */
- if(sc->full != SCREENNORMAL)
+ if(sc->full != SCREENNORMAL) {
+ actionzone_exit(C, op);
return OPERATOR_CANCELLED;
+ }
/* adds window to WM */
rect= sa->totrct;
@@ -478,16 +588,18 @@
/* screen, areas init */
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
+
+ actionzone_exit(C, op);
return OPERATOR_FINISHED;
}
-void SCREEN_OT_area_dupli_new(wmOperatorType *ot)
+void SCREEN_OT_area_dupli(wmOperatorType *ot)
{
ot->name= "Duplicate Area into New Window";
- ot->idname= "SCREEN_OT_area_dupli_new";
+ ot->idname= "SCREEN_OT_area_dupli";
- ot->invoke= screen_area_dupli_new_op;
+ ot->invoke= area_dupli_invoke;
ot->poll= ED_operator_areaactive;
}
@@ -2308,7 +2420,8 @@
WM_operatortype_append(SCREEN_OT_area_move);
WM_operatortype_append(SCREEN_OT_area_split);
WM_operatortype_append(SCREEN_OT_area_join);
- WM_operatortype_append(SCREEN_OT_area_dupli_new);
+ WM_operatortype_append(SCREEN_OT_area_dupli);
+ WM_operatortype_append(SCREEN_OT_area_swap);
WM_operatortype_append(SCREEN_OT_region_split);
WM_operatortype_append(SCREEN_OT_region_foursplit);
WM_operatortype_append(SCREEN_OT_region_flip);
@@ -2339,16 +2452,16 @@
/* standard timers */
WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", TIMER0, KM_ANY, KM_ANY, 0);
- /*WM_keymap_verify_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, 0, 0);*/
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "modifier", 0);
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "modifier", 1);
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "modifier", 2);
/* screen tools */
WM_keymap_verify_item(keymap, "SCREEN_OT_area_move", LEFTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "SCREEN_OT_area_split", EVT_ACTIONZONE, 0, KM_ANY, 0);
- WM_keymap_verify_item(keymap, "SCREEN_OT_area_join", EVT_ACTIONZONE, 0, KM_ANY, 0);
- WM_keymap_verify_item(keymap, "SCREEN_OT_area_dupli_new", EVT_ACTIONZONE, 0, KM_ANY, 0);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list