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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to