[Bf-blender-cvs] [3b0d86d8b1e] master: UI: Draw subpanels on top while dragging

Hans Goudey noreply at git.blender.org
Wed Apr 15 20:11:57 CEST 2020


Commit: 3b0d86d8b1e963550da92a469c3b3799a026841d
Author: Hans Goudey
Date:   Wed Apr 15 13:11:48 2020 -0500
Branches: master
https://developer.blender.org/rB3b0d86d8b1e963550da92a469c3b3799a026841d

UI: Draw subpanels on top while dragging

Currently the background of a panel is drawn on top of its subpanels
when it is dragged. The solution is to also "select" the subpanels so they
are drawn on top in UI_panels_draw.

Differential Revision: https://developer.blender.org/D7440

===================================================================

M	source/blender/editors/interface/interface_panel.c

===================================================================

diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index d1c61925d40..b8f87a4300c 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -742,7 +742,7 @@ void ui_draw_aligned_panel(uiStyle *style,
   /* an open panel */
   else {
     /* in some occasions, draw a border */
-    if (panel->flag & PNL_SELECT) {
+    if (panel->flag & PNL_SELECT && !is_subpanel) {
       if (panel->control & UI_PNL_SOLID) {
         UI_draw_roundbox_corner_set(UI_CNR_ALL);
       }
@@ -2457,6 +2457,24 @@ static void ui_handler_remove_panel(bContext *C, void *userdata)
   panel_activate_state(C, panel, PANEL_STATE_EXIT);
 }
 
+/**
+ * Set selection state for a panel and its subpanels. The subpanels need to know they are selected
+ * too so they can be drawn above their parent when it is dragged.
+ */
+static void set_panel_selection(Panel *panel, bool value)
+{
+  if (value) {
+    panel->flag |= PNL_SELECT;
+  }
+  else {
+    panel->flag &= ~PNL_SELECT;
+  }
+
+  LISTBASE_FOREACH (Panel *, child, &panel->children) {
+    set_panel_selection(child, value);
+  }
+}
+
 static void panel_activate_state(const bContext *C, Panel *panel, uiHandlePanelState state)
 {
   uiHandlePanelData *data = panel->activedata;
@@ -2479,10 +2497,10 @@ static void panel_activate_state(const bContext *C, Panel *panel, uiHandlePanelS
       check_panel_overlap(region, NULL); /* clears */
     }
 
-    panel->flag &= ~PNL_SELECT;
+    set_panel_selection(panel, false);
   }
   else {
-    panel->flag |= PNL_SELECT;
+    set_panel_selection(panel, true);
   }
 
   if (data && data->animtimer) {



More information about the Bf-blender-cvs mailing list