Browse Source

Merge pull request #97878 from WhalesState/bottom-panel

Fix `BottomPanel` excessive width.
Thaddeus Crews 7 months ago
parent
commit
23c7b87784
2 changed files with 77 additions and 2 deletions
  1. 70 2
      editor/gui/editor_bottom_panel.cpp
  2. 7 0
      editor/gui/editor_bottom_panel.h

+ 70 - 2
editor/gui/editor_bottom_panel.cpp

@@ -39,6 +39,7 @@
 #include "editor/themes/editor_scale.h"
 #include "scene/gui/box_container.h"
 #include "scene/gui/button.h"
+#include "scene/gui/scroll_container.h"
 #include "scene/gui/split_container.h"
 
 void EditorBottomPanel::_notification(int p_what) {
@@ -46,6 +47,19 @@ void EditorBottomPanel::_notification(int p_what) {
 		case NOTIFICATION_THEME_CHANGED: {
 			pin_button->set_button_icon(get_editor_theme_icon(SNAME("Pin")));
 			expand_button->set_button_icon(get_editor_theme_icon(SNAME("ExpandBottomDock")));
+			left_button->set_button_icon(get_editor_theme_icon(SNAME("Back")));
+			right_button->set_button_icon(get_editor_theme_icon(SNAME("Forward")));
+		} break;
+
+		case NOTIFICATION_TRANSLATION_CHANGED:
+		case NOTIFICATION_LAYOUT_DIRECTION_CHANGED: {
+			if (is_layout_rtl()) {
+				bottom_hbox->move_child(left_button, button_scroll->get_index() + 1);
+				bottom_hbox->move_child(right_button, 0);
+			} else {
+				bottom_hbox->move_child(right_button, button_scroll->get_index() + 1);
+				bottom_hbox->move_child(left_button, 0);
+			}
 		} break;
 	}
 }
@@ -59,6 +73,33 @@ void EditorBottomPanel::_switch_by_control(bool p_visible, Control *p_control, b
 	}
 }
 
+void EditorBottomPanel::_scroll(bool p_right) {
+	HScrollBar *h_scroll = button_scroll->get_h_scroll_bar();
+	if (Input::get_singleton()->is_key_pressed(Key::CTRL)) {
+		h_scroll->set_value(p_right ? h_scroll->get_max() : 0);
+	} else if (Input::get_singleton()->is_key_pressed(Key::SHIFT)) {
+		h_scroll->set_value(h_scroll->get_value() + h_scroll->get_page() * (p_right ? 1 : -1));
+	} else {
+		h_scroll->set_value(h_scroll->get_value() + (h_scroll->get_page() * 0.5) * (p_right ? 1 : -1));
+	}
+}
+
+void EditorBottomPanel::_update_scroll_buttons() {
+	bool show_arrows = button_hbox->get_size().width > button_scroll->get_size().width;
+	left_button->set_visible(show_arrows);
+	right_button->set_visible(show_arrows);
+
+	if (show_arrows) {
+		_update_disabled_buttons();
+	}
+}
+
+void EditorBottomPanel::_update_disabled_buttons() {
+	HScrollBar *h_scroll = button_scroll->get_h_scroll_bar();
+	left_button->set_disabled(h_scroll->get_value() == 0);
+	right_button->set_disabled(h_scroll->get_value() + h_scroll->get_page() == h_scroll->get_max());
+}
+
 void EditorBottomPanel::_switch_to_item(bool p_visible, int p_idx, bool p_ignore_lock) {
 	ERR_FAIL_INDEX(p_idx, items.size());
 
@@ -93,6 +134,7 @@ void EditorBottomPanel::_switch_to_item(bool p_visible, int p_idx, bool p_ignore
 		if (expand_button->is_pressed()) {
 			EditorNode::get_top_split()->hide();
 		}
+		callable_mp(button_scroll, &ScrollContainer::ensure_control_visible).call_deferred(items[p_idx].button);
 	} else {
 		add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("BottomPanel"), EditorStringName(EditorStyles)));
 		items[p_idx].button->set_pressed_no_signal(false);
@@ -259,9 +301,35 @@ EditorBottomPanel::EditorBottomPanel() {
 	bottom_hbox->set_custom_minimum_size(Size2(0, 24 * EDSCALE)); // Adjust for the height of the "Expand Bottom Dock" icon.
 	item_vbox->add_child(bottom_hbox);
 
+	left_button = memnew(Button);
+	left_button->set_tooltip_text(TTR("Scroll Left\nHold Ctrl to scroll to the begin.\nHold Shift to scroll one page."));
+	left_button->set_theme_type_variation("BottomPanelButton");
+	left_button->set_focus_mode(Control::FOCUS_NONE);
+	left_button->connect(SceneStringName(pressed), callable_mp(this, &EditorBottomPanel::_scroll).bind(false));
+	bottom_hbox->add_child(left_button);
+	left_button->hide();
+
+	button_scroll = memnew(ScrollContainer);
+	button_scroll->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+	button_scroll->set_horizontal_scroll_mode(ScrollContainer::SCROLL_MODE_SHOW_NEVER);
+	button_scroll->set_vertical_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED);
+	button_scroll->get_h_scroll_bar()->connect(CoreStringName(changed), callable_mp(this, &EditorBottomPanel::_update_scroll_buttons), CONNECT_DEFERRED);
+	button_scroll->get_h_scroll_bar()->connect(SceneStringName(value_changed), callable_mp(this, &EditorBottomPanel::_update_disabled_buttons).unbind(1), CONNECT_DEFERRED);
+	bottom_hbox->add_child(button_scroll);
+
+	right_button = memnew(Button);
+	right_button->set_tooltip_text(TTR("Scroll Right\nHold Ctrl to scroll to the end.\nHold Shift to scroll one page."));
+	right_button->set_theme_type_variation("BottomPanelButton");
+	right_button->set_focus_mode(Control::FOCUS_NONE);
+	right_button->connect(SceneStringName(pressed), callable_mp(this, &EditorBottomPanel::_scroll).bind(true));
+	bottom_hbox->add_child(right_button);
+	right_button->hide();
+
+	callable_mp(this, &EditorBottomPanel::_update_scroll_buttons).call_deferred();
+
 	button_hbox = memnew(HBoxContainer);
-	button_hbox->set_h_size_flags(Control::SIZE_EXPAND_FILL);
-	bottom_hbox->add_child(button_hbox);
+	button_hbox->set_h_size_flags(Control::SIZE_EXPAND | Control::SIZE_SHRINK_BEGIN);
+	button_scroll->add_child(button_hbox);
 
 	editor_toaster = memnew(EditorToaster);
 	bottom_hbox->add_child(editor_toaster);

+ 7 - 0
editor/gui/editor_bottom_panel.h

@@ -38,6 +38,7 @@ class ConfigFile;
 class EditorToaster;
 class HBoxContainer;
 class VBoxContainer;
+class ScrollContainer;
 
 class EditorBottomPanel : public PanelContainer {
 	GDCLASS(EditorBottomPanel, PanelContainer);
@@ -53,6 +54,9 @@ class EditorBottomPanel : public PanelContainer {
 
 	VBoxContainer *item_vbox = nullptr;
 	HBoxContainer *bottom_hbox = nullptr;
+	Button *left_button = nullptr;
+	Button *right_button = nullptr;
+	ScrollContainer *button_scroll = nullptr;
 	HBoxContainer *button_hbox = nullptr;
 	EditorToaster *editor_toaster = nullptr;
 	Button *pin_button = nullptr;
@@ -63,6 +67,9 @@ class EditorBottomPanel : public PanelContainer {
 	void _switch_to_item(bool p_visible, int p_idx, bool p_ignore_lock = false);
 	void _pin_button_toggled(bool p_pressed);
 	void _expand_button_toggled(bool p_pressed);
+	void _scroll(bool p_right);
+	void _update_scroll_buttons();
+	void _update_disabled_buttons();
 
 	bool _button_drag_hover(const Vector2 &, const Variant &, Button *p_button, Control *p_control);