You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
Add a lifecycle method for manual theme item caching to Control
This commit is contained in:
@@ -76,9 +76,7 @@ void SplitContainer::_resort() {
|
||||
bool second_expanded = (vertical ? second->get_v_size_flags() : second->get_h_size_flags()) & SIZE_EXPAND;
|
||||
|
||||
// Determine the separation between items
|
||||
Ref<Texture2D> g = get_theme_icon(SNAME("grabber"));
|
||||
int sep = get_theme_constant(SNAME("separation"));
|
||||
sep = (dragger_visibility != DRAGGER_HIDDEN_COLLAPSED) ? MAX(sep, vertical ? g->get_height() : g->get_width()) : 0;
|
||||
int sep = (dragger_visibility != DRAGGER_HIDDEN_COLLAPSED) ? MAX(theme_cache.separation, vertical ? theme_cache.grabber_icon->get_height() : theme_cache.grabber_icon->get_width()) : 0;
|
||||
|
||||
// Compute the minimum size
|
||||
Size2 ms_first = first->get_combined_minimum_size();
|
||||
@@ -131,9 +129,7 @@ Size2 SplitContainer::get_minimum_size() const {
|
||||
/* Calculate MINIMUM SIZE */
|
||||
|
||||
Size2i minimum;
|
||||
Ref<Texture2D> g = get_theme_icon(SNAME("grabber"));
|
||||
int sep = get_theme_constant(SNAME("separation"));
|
||||
sep = (dragger_visibility != DRAGGER_HIDDEN_COLLAPSED) ? MAX(sep, vertical ? g->get_height() : g->get_width()) : 0;
|
||||
int sep = (dragger_visibility != DRAGGER_HIDDEN_COLLAPSED) ? MAX(theme_cache.separation, vertical ? theme_cache.grabber_icon->get_height() : theme_cache.grabber_icon->get_width()) : 0;
|
||||
|
||||
for (int i = 0; i < 2; i++) {
|
||||
if (!_getch(i)) {
|
||||
@@ -162,6 +158,14 @@ Size2 SplitContainer::get_minimum_size() const {
|
||||
return minimum;
|
||||
}
|
||||
|
||||
void SplitContainer::_update_theme_item_cache() {
|
||||
Container::_update_theme_item_cache();
|
||||
|
||||
theme_cache.separation = get_theme_constant(SNAME("separation"));
|
||||
theme_cache.autohide = get_theme_constant(SNAME("autohide"));
|
||||
theme_cache.grabber_icon = get_theme_icon(SNAME("grabber"));
|
||||
}
|
||||
|
||||
void SplitContainer::_notification(int p_what) {
|
||||
switch (p_what) {
|
||||
case NOTIFICATION_TRANSLATION_CHANGED:
|
||||
@@ -175,7 +179,7 @@ void SplitContainer::_notification(int p_what) {
|
||||
|
||||
case NOTIFICATION_MOUSE_EXIT: {
|
||||
mouse_inside = false;
|
||||
if (get_theme_constant(SNAME("autohide"))) {
|
||||
if (theme_cache.autohide) {
|
||||
queue_redraw();
|
||||
}
|
||||
} break;
|
||||
@@ -185,7 +189,7 @@ void SplitContainer::_notification(int p_what) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (collapsed || (!dragging && !mouse_inside && get_theme_constant(SNAME("autohide")))) {
|
||||
if (collapsed || (!dragging && !mouse_inside && theme_cache.autohide)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -193,8 +197,8 @@ void SplitContainer::_notification(int p_what) {
|
||||
return;
|
||||
}
|
||||
|
||||
int sep = dragger_visibility != DRAGGER_HIDDEN_COLLAPSED ? get_theme_constant(SNAME("separation")) : 0;
|
||||
Ref<Texture2D> tex = get_theme_icon(SNAME("grabber"));
|
||||
int sep = dragger_visibility != DRAGGER_HIDDEN_COLLAPSED ? theme_cache.separation : 0;
|
||||
Ref<Texture2D> tex = theme_cache.grabber_icon;
|
||||
Size2 size = get_size();
|
||||
|
||||
if (vertical) {
|
||||
@@ -222,16 +226,14 @@ void SplitContainer::gui_input(const Ref<InputEvent> &p_event) {
|
||||
if (mb.is_valid()) {
|
||||
if (mb->get_button_index() == MouseButton::LEFT) {
|
||||
if (mb->is_pressed()) {
|
||||
int sep = get_theme_constant(SNAME("separation"));
|
||||
|
||||
if (vertical) {
|
||||
if (mb->get_position().y > middle_sep && mb->get_position().y < middle_sep + sep) {
|
||||
if (mb->get_position().y > middle_sep && mb->get_position().y < middle_sep + theme_cache.separation) {
|
||||
dragging = true;
|
||||
drag_from = mb->get_position().y;
|
||||
drag_ofs = split_offset;
|
||||
}
|
||||
} else {
|
||||
if (mb->get_position().x > middle_sep && mb->get_position().x < middle_sep + sep) {
|
||||
if (mb->get_position().x > middle_sep && mb->get_position().x < middle_sep + theme_cache.separation) {
|
||||
dragging = true;
|
||||
drag_from = mb->get_position().x;
|
||||
drag_ofs = split_offset;
|
||||
@@ -248,14 +250,14 @@ void SplitContainer::gui_input(const Ref<InputEvent> &p_event) {
|
||||
if (mm.is_valid()) {
|
||||
bool mouse_inside_state = false;
|
||||
if (vertical) {
|
||||
mouse_inside_state = mm->get_position().y > middle_sep && mm->get_position().y < middle_sep + get_theme_constant(SNAME("separation"));
|
||||
mouse_inside_state = mm->get_position().y > middle_sep && mm->get_position().y < middle_sep + theme_cache.separation;
|
||||
} else {
|
||||
mouse_inside_state = mm->get_position().x > middle_sep && mm->get_position().x < middle_sep + get_theme_constant(SNAME("separation"));
|
||||
mouse_inside_state = mm->get_position().x > middle_sep && mm->get_position().x < middle_sep + theme_cache.separation;
|
||||
}
|
||||
|
||||
if (mouse_inside != mouse_inside_state) {
|
||||
mouse_inside = mouse_inside_state;
|
||||
if (get_theme_constant(SNAME("autohide"))) {
|
||||
if (theme_cache.autohide) {
|
||||
queue_redraw();
|
||||
}
|
||||
}
|
||||
@@ -281,14 +283,12 @@ Control::CursorShape SplitContainer::get_cursor_shape(const Point2 &p_pos) const
|
||||
}
|
||||
|
||||
if (!collapsed && _getch(0) && _getch(1) && dragger_visibility == DRAGGER_VISIBLE) {
|
||||
int sep = get_theme_constant(SNAME("separation"));
|
||||
|
||||
if (vertical) {
|
||||
if (p_pos.y > middle_sep && p_pos.y < middle_sep + sep) {
|
||||
if (p_pos.y > middle_sep && p_pos.y < middle_sep + theme_cache.separation) {
|
||||
return CURSOR_VSPLIT;
|
||||
}
|
||||
} else {
|
||||
if (p_pos.x > middle_sep && p_pos.x < middle_sep + sep) {
|
||||
if (p_pos.x > middle_sep && p_pos.x < middle_sep + theme_cache.separation) {
|
||||
return CURSOR_HSPLIT;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user