[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59660] branches/soc-2013-ui_replay/source /blender/editors/interface/interface_panel.c: Operator buttons in custom panels can now be reordered by dragging up and down .

Vincent Akkermans vincent at ack-err.net
Fri Aug 30 13:54:30 CEST 2013


Revision: 59660
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59660
Author:   ack-err
Date:     2013-08-30 11:54:30 +0000 (Fri, 30 Aug 2013)
Log Message:
-----------
Operator buttons in custom panels can now be reordered by dragging up and down.

Modified Paths:
--------------
    branches/soc-2013-ui_replay/source/blender/editors/interface/interface_panel.c

Modified: branches/soc-2013-ui_replay/source/blender/editors/interface/interface_panel.c
===================================================================
--- branches/soc-2013-ui_replay/source/blender/editors/interface/interface_panel.c	2013-08-30 11:49:35 UTC (rev 59659)
+++ branches/soc-2013-ui_replay/source/blender/editors/interface/interface_panel.c	2013-08-30 11:54:30 UTC (rev 59660)
@@ -94,6 +94,7 @@
 	
 	/* dragging custom button */
 	OperatorListItem *oli;
+	int newindex;
 	
 } uiHandlePanelData;
 
@@ -1115,24 +1116,36 @@
 	ED_region_tag_redraw(ar);
 }
 
-static void ui_do_drag_button(const bContext *C, const wmEvent *event, Panel *panel)
+static void ui_do_drag_button(const bContext *C, const wmEvent *event, Panel *pa)
 {
-	uiHandlePanelData *data = panel->activedata;
-	ScrArea *sa = CTX_wm_area(C);
+	uiHandlePanelData *data = pa->activedata;
 	ARegion *ar = CTX_wm_region(C);
-
-	// TODO: deal with the reordering of buttons
+	int cur_index = BLI_findindex(&pa->operators, data->oli);
+	int dy, dunits;
 	
+	// Calculate the new index of the button based on the drag offset
+	dy = event->y - data->starty;
+	dunits = dy / UI_UNIT_Y;
+	data->newindex = MIN2(MAX2(cur_index - dunits, 0), BLI_countlist(&pa->operators));
+	
 	ED_region_tag_redraw(ar);
 }
 
-static void ui_do_drag_button_finish(const bContext *C, const wmEvent *event, Panel *panel)
+static void ui_do_drag_button_finish(const bContext *C, const wmEvent *event, Panel *pa)
 {
-	uiHandlePanelData *data = panel->activedata;
-	ScrArea *sa = CTX_wm_area(C);
+	uiHandlePanelData *data = pa->activedata;
 	ARegion *ar = CTX_wm_region(C);
+	int cur_index = BLI_findindex(&pa->operators, data->oli);
+	OperatorListItem *oli_target = BLI_findlink(&pa->operators, data->newindex);
 	
-	// TODO: finish and clean up the reordering of buttons
+	if (data->newindex < cur_index) {
+		BLI_remlink(&pa->operators, data->oli);
+		BLI_insertlinkbefore(&pa->operators, oli_target, data->oli);
+	}
+	else if (data->newindex > cur_index) {
+		BLI_remlink(&pa->operators, data->oli);
+		BLI_insertlinkafter(&pa->operators, oli_target, data->oli);
+	}
 	
 	ED_region_tag_redraw(ar);
 }
@@ -1558,6 +1571,7 @@
 
 		if (data->state == PANEL_STATE_DRAG_BUTTON)
 			ui_do_drag_button_finish(C, event, panel);
+		
 		if (align)
 			panel_activate_state(C, panel, PANEL_STATE_ANIMATION);
 		else
@@ -1688,18 +1702,37 @@
 	uiHandlePanelData *data = pa->activedata;
 	uiLayout *layout = pa->layout;
 	uiLayout *column = uiLayoutColumn(layout, TRUE);
-	const char *idname;
-	OperatorListItem *oli_drag = NULL, *oli;
+	OperatorListItem *oli;
 	int drag_state = data ? (data->state == PANEL_STATE_DRAG_BUTTON) : 0;
+	int i = 0;
 	
 	for (oli = pa->operators.first; oli; oli = oli->next) {
-		if (drag_state && data->oli == oli) {
-			uiItemS(column);
-			uiItemS(column);
+		if (drag_state) {
+			// draw an empty space for where the button was
+			if (oli == data->oli) {
+				uiItemS(column);
+			}
+			// draw a separator for where it's being dragged to
+			else if (i == data->newindex) {
+				// Don't draw a separator for its current position
+				int cur_index = BLI_findindex(&pa->operators, data->oli);
+				// draw it before or after the button that currently has the new index
+				if (data->newindex < cur_index) {
+					uiItemO(column, NULL, ICON_NONE, data->oli->optype_idname);
+					uiItemO(column, NULL, ICON_NONE, oli->optype_idname);
+				}
+				else if (data->newindex > cur_index) {
+					uiItemO(column, NULL, ICON_NONE, oli->optype_idname);
+					uiItemO(column, NULL, ICON_NONE, data->oli->optype_idname);
+				}
+			}
+			// otherwise just draw normally
+			else
+				uiItemO(column, NULL, ICON_NONE, oli->optype_idname);
 		}
-		else {
+		else
 			uiItemO(column, NULL, ICON_NONE, oli->optype_idname);
-		}
+		i++;
 	}
 }
 




More information about the Bf-blender-cvs mailing list