Path: blob/master/tests/scene/test_split_container.h
10277 views
/**************************************************************************/1/* test_split_container.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#include "scene/gui/split_container.h"33#include "scene/main/window.h"3435#include "tests/test_macros.h"3637namespace TestSplitContainer {3839static inline void check_positions(SplitContainer *p_sc, const Vector<int> &p_positions, int p_sep, bool p_horizontal = true) {40// Checks the rects of each split container child.41CHECK(p_sc->get_child_count(false) == p_positions.size() + 1);42int last_pos = 0;43for (int i = 0; i < p_sc->get_child_count(false); i++) {44// Assuming there is no invalid children.45Control *c = Object::cast_to<Control>(p_sc->get_child(i, false));46int pos = i >= p_positions.size() ? p_sc->get_size()[p_horizontal ? 0 : 1] : p_positions[i];47Rect2 rect;48if (p_horizontal) {49rect.size.y = p_sc->get_size().y;50rect.position.x = last_pos;51rect.size.x = pos - last_pos;52} else {53rect.size.x = p_sc->get_size().x;54rect.position.y = last_pos;55rect.size.y = pos - last_pos;56}57CHECK_MESSAGE(c->get_rect() == rect, vformat("Child %s is the wrong size.", i));58last_pos = pos + p_sep;59}60}6162static inline void check_position(SplitContainer *p_sc, int p_position, int p_sep, bool p_horizontal = true) {63check_positions(p_sc, { p_position }, p_sep, p_horizontal);64}6566static inline void check_positions_rtl(SplitContainer *p_sc, const Vector<int> &p_positions, int p_sep) {67// Checks the rects of each split container child. Right to left layout.68CHECK(p_sc->get_child_count(false) == p_positions.size() + 1);69int last_pos = p_sc->get_size().x;70for (int i = 0; i < p_sc->get_child_count(false); i++) {71// Assuming there is no invalid children.72Control *c = Object::cast_to<Control>(p_sc->get_child(i, false));73int pos = i >= p_positions.size() ? 0 : p_sc->get_size().x - p_positions[i];74Rect2 rect;75rect.size.y = p_sc->get_size().y;76rect.position.x = pos;77rect.size.x = last_pos - pos;78CHECK_MESSAGE(c->get_rect() == rect, vformat("Child %s is the wrong size.", i));79last_pos = pos - p_sep;80}81}8283static inline void check_position_rtl(SplitContainer *p_sc, int p_position, int p_sep) {84check_positions_rtl(p_sc, { p_position }, p_sep);85}8687TEST_CASE("[SceneTree][SplitContainer] Add children") {88SplitContainer *split_container = memnew(SplitContainer);89split_container->set_size(Size2(500, 500));90SceneTree::get_singleton()->get_root()->add_child(split_container);9192SUBCASE("[SplitContainer] One child") {93Control *child_a = memnew(Control);94split_container->add_child(child_a);95MessageQueue::get_singleton()->flush();9697// One child will fill the entire area.98CHECK(child_a->get_rect() == split_container->get_rect());99100split_container->set_vertical(true);101CHECK(child_a->get_rect() == split_container->get_rect());102103memdelete(child_a);104}105106SUBCASE("[SplitContainer] Preserve split offset") {107// The split offset is preserved through adding, removing, and changing visibility of children.108split_container->set_split_offset(100);109CHECK(split_container->get_split_offset() == 100);110111Control *child_a = memnew(Control);112split_container->add_child(child_a);113MessageQueue::get_singleton()->flush();114CHECK(split_container->get_split_offset() == 100);115116Control *child_b = memnew(Control);117split_container->add_child(child_b);118MessageQueue::get_singleton()->flush();119CHECK(split_container->get_split_offset() == 100);120121child_a->hide();122MessageQueue::get_singleton()->flush();123CHECK(split_container->get_split_offset() == 100);124125child_b->hide();126MessageQueue::get_singleton()->flush();127CHECK(split_container->get_split_offset() == 100);128129child_b->show();130MessageQueue::get_singleton()->flush();131CHECK(split_container->get_split_offset() == 100);132133child_a->show();134MessageQueue::get_singleton()->flush();135CHECK(split_container->get_split_offset() == 100);136137split_container->remove_child(child_a);138MessageQueue::get_singleton()->flush();139CHECK(split_container->get_split_offset() == 100);140141split_container->add_child(child_a);142MessageQueue::get_singleton()->flush();143CHECK(split_container->get_split_offset() == 100);144145memdelete(child_a);146memdelete(child_b);147}148149memdelete(split_container);150}151152TEST_CASE("[SceneTree][SplitContainer] Dragger visibility") {153SplitContainer *split_container = memnew(SplitContainer);154split_container->set_size(Size2(500, 500));155SceneTree::get_singleton()->get_root()->add_child(split_container);156Control *child_a = memnew(Control);157Control *child_b = memnew(Control);158split_container->add_child(child_a);159split_container->add_child(child_b);160SplitContainerDragger *dragger = Object::cast_to<SplitContainerDragger>(split_container->get_child(2, true));161162split_container->add_theme_constant_override("autohide", 0);163MessageQueue::get_singleton()->flush();164165const int sep_constant = split_container->get_theme_constant("separation");166const Size2i separator_size = Size2i(MAX(sep_constant, split_container->get_theme_icon("h_grabber")->get_width()), MAX(sep_constant, split_container->get_theme_icon("v_grabber")->get_height()));167168SUBCASE("[SplitContainer] Visibility based on child count") {169split_container->remove_child(child_a);170split_container->remove_child(child_b);171MessageQueue::get_singleton()->flush();172173// No children, not visible.174CHECK_FALSE(dragger->is_visible());175176// Add one child, not visible.177split_container->add_child(child_a);178MessageQueue::get_singleton()->flush();179CHECK_FALSE(dragger->is_visible());180181// Two children, visible.182split_container->add_child(child_b);183MessageQueue::get_singleton()->flush();184CHECK(dragger->is_visible());185186// Remove a child, not visible.187split_container->remove_child(child_b);188MessageQueue::get_singleton()->flush();189CHECK_FALSE(dragger->is_visible());190}191192SUBCASE("[SplitContainer] Set dragger visibility") {193split_container->set_dragger_visibility(SplitContainer::DRAGGER_HIDDEN);194MessageQueue::get_singleton()->flush();195check_position(split_container, 0, separator_size.x);196// Can't check the visibility since it happens in draw.197198split_container->set_dragger_visibility(SplitContainer::DRAGGER_HIDDEN_COLLAPSED);199MessageQueue::get_singleton()->flush();200check_position(split_container, 0, 0);201202split_container->set_dragger_visibility(SplitContainer::DRAGGER_VISIBLE);203MessageQueue::get_singleton()->flush();204check_position(split_container, 0, separator_size.x);205}206207SUBCASE("[SplitContainer] Not visible when collapsed") {208split_container->set_collapsed(true);209MessageQueue::get_singleton()->flush();210CHECK_FALSE(dragger->is_visible());211212split_container->set_collapsed(false);213MessageQueue::get_singleton()->flush();214CHECK(dragger->is_visible());215}216217memdelete(child_a);218memdelete(child_b);219memdelete(split_container);220}221222TEST_CASE("[SceneTree][SplitContainer] Collapsed") {223DisplayServerMock *DS = (DisplayServerMock *)(DisplayServer::get_singleton());224225SplitContainer *split_container = memnew(SplitContainer);226split_container->set_size(Size2(500, 500));227SceneTree::get_singleton()->get_root()->add_child(split_container);228Control *child_a = memnew(Control);229split_container->add_child(child_a);230Control *child_b = memnew(Control);231split_container->add_child(child_b);232MessageQueue::get_singleton()->flush();233234const int sep_constant = split_container->get_theme_constant("separation");235const Size2i separator_size = Size2i(MAX(sep_constant, split_container->get_theme_icon("h_grabber")->get_width()), MAX(sep_constant, split_container->get_theme_icon("v_grabber")->get_height()));236237SUBCASE("[SplitContainer] Dragging and cursor") {238split_container->set_collapsed(true);239240// Cursor is default.241SEND_GUI_MOUSE_MOTION_EVENT(Point2(1, 1), MouseButtonMask::NONE, Key::NONE);242CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_ARROW);243244// Dragger is disabled, cannot drag.245SEND_GUI_MOUSE_BUTTON_EVENT(Point2(1, 1), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);246MessageQueue::get_singleton()->flush();247check_position(split_container, 0, separator_size.x);248CHECK(split_container->get_split_offset() == 0);249SEND_GUI_MOUSE_MOTION_EVENT(Point2(10, 1), MouseButtonMask::LEFT, Key::NONE);250MessageQueue::get_singleton()->flush();251check_position(split_container, 0, separator_size.x);252CHECK(split_container->get_split_offset() == 0);253}254255SUBCASE("[SplitContainer] No expand flags") {256int def_pos = 0;257258split_container->set_split_offset(10);259MessageQueue::get_singleton()->flush();260check_position(split_container, def_pos + 10, separator_size.x);261262split_container->set_collapsed(true);263MessageQueue::get_singleton()->flush();264265// The split offset is treated as 0 when collapsed.266check_position(split_container, def_pos, separator_size.x);267CHECK(split_container->get_split_offset() == 10);268}269270SUBCASE("[SplitContainer] First child expanded") {271int def_pos = split_container->get_size().x - separator_size.x;272child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);273split_container->set_split_offset(-10);274MessageQueue::get_singleton()->flush();275276check_position(split_container, def_pos - 10, separator_size.x);277278split_container->set_collapsed(true);279MessageQueue::get_singleton()->flush();280281// The split offset is treated as 0 when collapsed.282check_position(split_container, def_pos, separator_size.x);283CHECK(split_container->get_split_offset() == -10);284}285286SUBCASE("[SplitContainer] Second child expanded") {287int def_pos = 0;288child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);289split_container->set_split_offset(10);290MessageQueue::get_singleton()->flush();291292check_position(split_container, def_pos + 10, separator_size.x);293294split_container->set_collapsed(true);295MessageQueue::get_singleton()->flush();296297// The split offset is treated as 0 when collapsed.298check_position(split_container, def_pos, separator_size.x);299CHECK(split_container->get_split_offset() == 10);300}301302SUBCASE("[SplitContainer] Both children expanded") {303int def_pos = (split_container->get_size().y - separator_size.y) / 2;304child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);305child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);306split_container->set_split_offset(10);307MessageQueue::get_singleton()->flush();308309check_position(split_container, def_pos + 10, separator_size.x);310311split_container->set_collapsed(true);312MessageQueue::get_singleton()->flush();313314// The split offset is treated as 0 when collapsed.315check_position(split_container, def_pos, separator_size.x);316CHECK(split_container->get_split_offset() == 10);317}318319memdelete(child_a);320memdelete(child_b);321memdelete(split_container);322}323324TEST_CASE("[SceneTree][SplitContainer] Cursor shape") {325DisplayServerMock *DS = (DisplayServerMock *)(DisplayServer::get_singleton());326327SplitContainer *split_container = memnew(SplitContainer);328split_container->set_size(Size2(500, 500));329SceneTree::get_singleton()->get_root()->add_child(split_container);330Control *child_a = memnew(Control);331split_container->add_child(child_a);332Control *child_b = memnew(Control);333split_container->add_child(child_b);334MessageQueue::get_singleton()->flush();335336Point2 on_dragger = Point2(1, 1);337Point2 not_on_dragger = Point2(50, 50);338339// Default cursor shape.340SEND_GUI_MOUSE_MOTION_EVENT(not_on_dragger, MouseButtonMask::NONE, Key::NONE);341CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_ARROW);342343// Horizontal cursor shape.344SEND_GUI_MOUSE_MOTION_EVENT(on_dragger, MouseButtonMask::NONE, Key::NONE);345CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_HSPLIT);346347// Vertical cursor shape.348split_container->set_vertical(true);349SEND_GUI_MOUSE_MOTION_EVENT(on_dragger, MouseButtonMask::NONE, Key::NONE);350CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_VSPLIT);351352// Move off, default cursor shape.353SEND_GUI_MOUSE_MOTION_EVENT(not_on_dragger, MouseButtonMask::NONE, Key::NONE);354CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_ARROW);355356memdelete(child_a);357memdelete(child_b);358memdelete(split_container);359}360361TEST_CASE("[SceneTree][SplitContainer] Two children") {362SplitContainer *split_container = memnew(SplitContainer);363split_container->set_size(Size2(500, 500));364SceneTree::get_singleton()->get_root()->add_child(split_container);365Control *child_a = memnew(Control);366Control *child_b = memnew(Control);367split_container->add_child(child_a);368split_container->add_child(child_b);369MessageQueue::get_singleton()->flush();370371const int sep_constant = split_container->get_theme_constant("separation");372const Size2i separator_size = Size2i(MAX(sep_constant, split_container->get_theme_icon("h_grabber")->get_width()), MAX(sep_constant, split_container->get_theme_icon("v_grabber")->get_height()));373374SUBCASE("[SplitContainer] Minimum size") {375// Minimum size is the sum of both children's minimum sizes and the separator depending on the vertical axis.376child_a->set_custom_minimum_size(Size2(100, 200));377child_b->set_custom_minimum_size(Size2(100, 200));378MessageQueue::get_singleton()->flush();379380Size2 min_size = split_container->get_minimum_size();381CHECK(min_size.x == 200 + separator_size.x);382CHECK(min_size.y == 200);383384split_container->set_vertical(true);385MessageQueue::get_singleton()->flush();386min_size = split_container->get_minimum_size();387CHECK(min_size.x == 100);388CHECK(min_size.y == 400 + separator_size.y);389}390391SUBCASE("[SplitContainer] Default position") {392SUBCASE("[SplitContainer] Vertical") {393// Make sure clamping the split offset doesn't change it or the position.394split_container->set_vertical(true);395396// No expand flags set.397MessageQueue::get_singleton()->flush();398int def_pos = 0;399check_position(split_container, def_pos, separator_size.y, false);400split_container->clamp_split_offset();401MessageQueue::get_singleton()->flush();402CHECK(split_container->get_split_offset() == 0);403check_position(split_container, def_pos, separator_size.y, false);404405// First expand flags set.406child_a->set_v_size_flags(Control::SIZE_EXPAND_FILL);407child_b->set_v_size_flags(Control::SIZE_FILL);408MessageQueue::get_singleton()->flush();409def_pos = split_container->get_size().y - separator_size.y;410check_position(split_container, def_pos, separator_size.y, false);411split_container->clamp_split_offset();412MessageQueue::get_singleton()->flush();413CHECK(split_container->get_split_offset() == 0);414check_position(split_container, def_pos, separator_size.y, false);415416// Second expand flags set.417child_a->set_v_size_flags(Control::SIZE_FILL);418child_b->set_v_size_flags(Control::SIZE_EXPAND_FILL);419MessageQueue::get_singleton()->flush();420def_pos = 0;421check_position(split_container, 0, separator_size.y, false);422split_container->clamp_split_offset();423MessageQueue::get_singleton()->flush();424CHECK(split_container->get_split_offset() == 0);425check_position(split_container, def_pos, separator_size.y, false);426427// Both expand flags set.428child_a->set_v_size_flags(Control::SIZE_EXPAND_FILL);429child_b->set_v_size_flags(Control::SIZE_EXPAND_FILL);430MessageQueue::get_singleton()->flush();431def_pos = (split_container->get_size().y - separator_size.y) / 2;432check_position(split_container, def_pos, separator_size.y, false);433split_container->clamp_split_offset();434MessageQueue::get_singleton()->flush();435CHECK(split_container->get_split_offset() == 0);436check_position(split_container, def_pos, separator_size.y, false);437438// Unequal stretch ratios.439child_a->set_stretch_ratio(2.0);440MessageQueue::get_singleton()->flush();441def_pos = (split_container->get_size().y * 2 / 3) - separator_size.y / 2;442check_position(split_container, def_pos, separator_size.y, false);443split_container->clamp_split_offset();444MessageQueue::get_singleton()->flush();445CHECK(split_container->get_split_offset() == 0);446check_position(split_container, def_pos, separator_size.y, false);447}448449SUBCASE("[SplitContainer] Right to left") {450split_container->set_layout_direction(Control::LAYOUT_DIRECTION_RTL);451split_container->set_position(Point2(0, 0));452453// No expand flags set.454MessageQueue::get_singleton()->flush();455int def_pos = 0;456check_position_rtl(split_container, def_pos, separator_size.y);457split_container->clamp_split_offset();458MessageQueue::get_singleton()->flush();459CHECK(split_container->get_split_offset() == 0);460check_position_rtl(split_container, def_pos, separator_size.y);461462// First expand flags set.463child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);464child_b->set_h_size_flags(Control::SIZE_FILL);465MessageQueue::get_singleton()->flush();466def_pos = split_container->get_size().y - separator_size.y;467check_position_rtl(split_container, def_pos, separator_size.y);468split_container->clamp_split_offset();469MessageQueue::get_singleton()->flush();470CHECK(split_container->get_split_offset() == 0);471check_position_rtl(split_container, def_pos, separator_size.y);472473// Second expand flags set.474child_a->set_h_size_flags(Control::SIZE_FILL);475child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);476MessageQueue::get_singleton()->flush();477def_pos = 0;478check_position_rtl(split_container, 0, separator_size.y);479split_container->clamp_split_offset();480MessageQueue::get_singleton()->flush();481CHECK(split_container->get_split_offset() == 0);482check_position_rtl(split_container, def_pos, separator_size.y);483484// Both expand flags set.485child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);486child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);487MessageQueue::get_singleton()->flush();488def_pos = (split_container->get_size().y - separator_size.y) / 2;489check_position_rtl(split_container, def_pos, separator_size.y);490split_container->clamp_split_offset();491MessageQueue::get_singleton()->flush();492CHECK(split_container->get_split_offset() == 0);493check_position_rtl(split_container, def_pos, separator_size.y);494495// Unequal stretch ratios.496child_a->set_stretch_ratio(2.0);497MessageQueue::get_singleton()->flush();498def_pos = (split_container->get_size().y * 2 / 3) - separator_size.y / 2;499check_position_rtl(split_container, def_pos, separator_size.y);500split_container->clamp_split_offset();501MessageQueue::get_singleton()->flush();502CHECK(split_container->get_split_offset() == 0);503check_position_rtl(split_container, def_pos, separator_size.y);504}505506SUBCASE("[SplitContainer] No expand flags") {507int def_pos = 0;508509check_position(split_container, def_pos, separator_size.x);510511split_container->clamp_split_offset();512MessageQueue::get_singleton()->flush();513CHECK(split_container->get_split_offset() == 0);514check_position(split_container, def_pos, separator_size.x);515516// Minimum sizes affect default position.517518// First child with minimum size.519child_a->set_custom_minimum_size(Size2(400, 0));520MessageQueue::get_singleton()->flush();521def_pos = 400;522check_position(split_container, def_pos, separator_size.x);523split_container->clamp_split_offset();524MessageQueue::get_singleton()->flush();525CHECK(split_container->get_split_offset() == def_pos);526check_position(split_container, def_pos, separator_size.x);527528// Second child with minimum size.529child_a->set_custom_minimum_size(Size2(0, 0));530child_b->set_custom_minimum_size(Size2(400, 0));531MessageQueue::get_singleton()->flush();532def_pos = split_container->get_size().x - 400 - separator_size.x;533check_position(split_container, def_pos, separator_size.x);534split_container->clamp_split_offset();535MessageQueue::get_singleton()->flush();536CHECK(split_container->get_split_offset() == def_pos);537check_position(split_container, def_pos, separator_size.x);538539// Both children with minimum size.540child_a->set_custom_minimum_size(Size2(200, 0));541child_b->set_custom_minimum_size(Size2(288, 0));542MessageQueue::get_singleton()->flush();543def_pos = 200;544check_position(split_container, def_pos, separator_size.x);545split_container->clamp_split_offset();546MessageQueue::get_singleton()->flush();547CHECK(split_container->get_split_offset() == def_pos);548check_position(split_container, def_pos, separator_size.x);549}550551SUBCASE("[SplitContainer] First child expanded") {552const int def_pos = split_container->get_size().x - separator_size.x;553child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);554MessageQueue::get_singleton()->flush();555556check_position(split_container, def_pos, separator_size.x);557558split_container->clamp_split_offset();559MessageQueue::get_singleton()->flush();560CHECK(split_container->get_split_offset() == 0);561check_position(split_container, def_pos, separator_size.x);562563// Minimum sizes affect default position.564565// First child with minimum size.566child_a->set_custom_minimum_size(Size2(400, 0));567MessageQueue::get_singleton()->flush();568check_position(split_container, def_pos, separator_size.x);569split_container->clamp_split_offset();570MessageQueue::get_singleton()->flush();571CHECK(split_container->get_split_offset() == 0);572check_position(split_container, def_pos, separator_size.x);573574// Second child with minimum size.575child_a->set_custom_minimum_size(Size2(0, 0));576child_b->set_custom_minimum_size(Size2(400, 0));577MessageQueue::get_singleton()->flush();578int pos = split_container->get_size().x - 400 - separator_size.x;579check_position(split_container, pos, separator_size.x);580split_container->clamp_split_offset();581MessageQueue::get_singleton()->flush();582CHECK(split_container->get_split_offset() == pos - def_pos);583check_position(split_container, pos, separator_size.x);584585// Both children with minimum size.586child_a->set_custom_minimum_size(Size2(200, 0));587child_b->set_custom_minimum_size(Size2(288, 0));588MessageQueue::get_singleton()->flush();589pos = 200;590check_position(split_container, pos, separator_size.x);591split_container->clamp_split_offset();592MessageQueue::get_singleton()->flush();593CHECK(split_container->get_split_offset() == pos - def_pos);594check_position(split_container, pos, separator_size.x);595}596597SUBCASE("[SplitContainer] Second child expanded") {598int def_pos = 0;599child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);600MessageQueue::get_singleton()->flush();601602check_position(split_container, def_pos, separator_size.x);603604split_container->clamp_split_offset();605MessageQueue::get_singleton()->flush();606CHECK(split_container->get_split_offset() == 0);607check_position(split_container, def_pos, separator_size.x);608609// Minimum sizes affect default position.610611// First child with minimum size.612child_a->set_custom_minimum_size(Size2(400, 0));613MessageQueue::get_singleton()->flush();614def_pos = 400;615check_position(split_container, def_pos, separator_size.x);616split_container->clamp_split_offset();617MessageQueue::get_singleton()->flush();618CHECK(split_container->get_split_offset() == def_pos);619check_position(split_container, def_pos, separator_size.x);620621// Second child with minimum size.622child_a->set_custom_minimum_size(Size2(0, 0));623child_b->set_custom_minimum_size(Size2(400, 0));624MessageQueue::get_singleton()->flush();625def_pos = 500 - 400 - separator_size.x;626check_position(split_container, def_pos, separator_size.x);627split_container->clamp_split_offset();628MessageQueue::get_singleton()->flush();629CHECK(split_container->get_split_offset() == def_pos);630check_position(split_container, def_pos, separator_size.x);631632// Both children with minimum size.633child_a->set_custom_minimum_size(Size2(200, 0));634child_b->set_custom_minimum_size(Size2(288, 0));635MessageQueue::get_singleton()->flush();636def_pos = 200;637check_position(split_container, def_pos, separator_size.x);638split_container->clamp_split_offset();639MessageQueue::get_singleton()->flush();640CHECK(split_container->get_split_offset() == def_pos);641check_position(split_container, def_pos, separator_size.x);642}643644SUBCASE("[SplitContainer] Both children expanded") {645const int def_pos = (split_container->get_size().x - separator_size.x) / 2;646child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);647child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);648MessageQueue::get_singleton()->flush();649650check_position(split_container, def_pos, separator_size.x);651652split_container->clamp_split_offset();653MessageQueue::get_singleton()->flush();654CHECK(split_container->get_split_offset() == 0);655check_position(split_container, def_pos, separator_size.x);656657// Minimum sizes affect default position.658659// First child with minimum size.660child_a->set_custom_minimum_size(Size2(400, 0));661MessageQueue::get_singleton()->flush();662int pos = 400;663check_position(split_container, pos, separator_size.x);664split_container->clamp_split_offset();665MessageQueue::get_singleton()->flush();666CHECK(split_container->get_split_offset() == pos - def_pos);667check_position(split_container, pos, separator_size.x);668669// Second child with minimum size.670child_a->set_custom_minimum_size(Size2(0, 0));671child_b->set_custom_minimum_size(Size2(400, 0));672MessageQueue::get_singleton()->flush();673pos = split_container->get_size().x - 400 - separator_size.x;674check_position(split_container, pos, separator_size.x);675split_container->clamp_split_offset();676MessageQueue::get_singleton()->flush();677CHECK(split_container->get_split_offset() == pos - def_pos);678check_position(split_container, pos, separator_size.x);679680// Both children with minimum size.681child_a->set_custom_minimum_size(Size2(200, 0));682child_b->set_custom_minimum_size(Size2(288, 0));683MessageQueue::get_singleton()->flush();684pos = 200;685check_position(split_container, pos, separator_size.x);686split_container->clamp_split_offset();687MessageQueue::get_singleton()->flush();688CHECK(split_container->get_split_offset() == pos - def_pos);689check_position(split_container, pos, separator_size.x);690}691692SUBCASE("[SplitContainer] Unequal stretch ratios") {693const int def_pos = (split_container->get_size().x * 2 / 3) - separator_size.x / 2;694child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);695child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);696child_a->set_stretch_ratio(2.0);697MessageQueue::get_singleton()->flush();698699check_position(split_container, def_pos, separator_size.x);700701split_container->clamp_split_offset();702MessageQueue::get_singleton()->flush();703CHECK(split_container->get_split_offset() == 0);704check_position(split_container, def_pos, separator_size.x);705706// Minimum sizes affect default position.707708// First child with minimum size.709child_a->set_custom_minimum_size(Size2(400, 0));710MessageQueue::get_singleton()->flush();711int pos = 400;712check_position(split_container, pos, separator_size.x);713split_container->clamp_split_offset();714MessageQueue::get_singleton()->flush();715CHECK(split_container->get_split_offset() == pos - def_pos);716check_position(split_container, pos, separator_size.x);717718// Second child with minimum size.719child_a->set_custom_minimum_size(Size2(0, 0));720child_b->set_custom_minimum_size(Size2(400, 0));721MessageQueue::get_singleton()->flush();722pos = split_container->get_size().x - 400 - separator_size.x;723check_position(split_container, pos, separator_size.x);724split_container->clamp_split_offset();725MessageQueue::get_singleton()->flush();726CHECK(split_container->get_split_offset() == pos - def_pos);727check_position(split_container, pos, separator_size.x);728729// Both children with minimum size.730child_a->set_custom_minimum_size(Size2(200, 0));731child_b->set_custom_minimum_size(Size2(288, 0));732MessageQueue::get_singleton()->flush();733pos = 200;734check_position(split_container, pos, separator_size.x);735split_container->clamp_split_offset();736MessageQueue::get_singleton()->flush();737CHECK(split_container->get_split_offset() == pos - def_pos);738check_position(split_container, pos, separator_size.x);739}740}741742SUBCASE("[SplitContainer] Set split offset") {743SUBCASE("[SplitContainer] Right to left") {744split_container->set_layout_direction(Control::LAYOUT_DIRECTION_RTL);745split_container->set_position(Point2(0, 0));746int def_pos = 0;747// Positive.748split_container->set_split_offset(10);749MessageQueue::get_singleton()->flush();750CHECK(split_container->get_split_offset() == 10);751check_position_rtl(split_container, def_pos + 10, separator_size.x);752753// Negative.754split_container->set_split_offset(-10);755MessageQueue::get_singleton()->flush();756CHECK(split_container->get_split_offset() == -10);757check_position_rtl(split_container, def_pos, separator_size.x);758}759760SUBCASE("[SplitContainer] No expand flags") {761int def_pos = 0;762763// Positive.764split_container->set_split_offset(10);765MessageQueue::get_singleton()->flush();766CHECK(split_container->get_split_offset() == 10);767check_position(split_container, def_pos + 10, separator_size.x);768769// Negative.770split_container->set_split_offset(-10);771MessageQueue::get_singleton()->flush();772CHECK(split_container->get_split_offset() == -10);773check_position(split_container, def_pos, separator_size.x);774775// Clamped.776split_container->set_split_offset(1000);777MessageQueue::get_singleton()->flush();778CHECK(split_container->get_split_offset() == 1000);779check_position(split_container, split_container->get_size().x - separator_size.x, separator_size.x);780}781782SUBCASE("[SplitContainer] First child expanded") {783int def_pos = split_container->get_size().x - separator_size.x;784child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);785MessageQueue::get_singleton()->flush();786787// Positive.788split_container->set_split_offset(10);789MessageQueue::get_singleton()->flush();790CHECK(split_container->get_split_offset() == 10);791check_position(split_container, def_pos, separator_size.x);792793// Negative.794split_container->set_split_offset(-10);795MessageQueue::get_singleton()->flush();796CHECK(split_container->get_split_offset() == -10);797check_position(split_container, def_pos - 10, separator_size.x);798799// Clamped.800split_container->set_split_offset(-1000);801MessageQueue::get_singleton()->flush();802CHECK(split_container->get_split_offset() == -1000);803check_position(split_container, 0, separator_size.x);804}805806SUBCASE("[SplitContainer] Second child expanded") {807int def_pos = 0;808child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);809MessageQueue::get_singleton()->flush();810811// Positive.812split_container->set_split_offset(10);813MessageQueue::get_singleton()->flush();814CHECK(split_container->get_split_offset() == 10);815check_position(split_container, def_pos + 10, separator_size.x);816817// Negative.818split_container->set_split_offset(-10);819MessageQueue::get_singleton()->flush();820CHECK(split_container->get_split_offset() == -10);821check_position(split_container, def_pos, separator_size.x);822823// Clamped.824split_container->set_split_offset(1000);825MessageQueue::get_singleton()->flush();826CHECK(split_container->get_split_offset() == 1000);827check_position(split_container, split_container->get_size().x - separator_size.x, separator_size.x);828}829830SUBCASE("[SplitContainer] Both children expanded") {831int def_pos = (split_container->get_size().x - separator_size.x) / 2;832child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);833child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);834MessageQueue::get_singleton()->flush();835836// Positive.837split_container->set_split_offset(10);838MessageQueue::get_singleton()->flush();839CHECK(split_container->get_split_offset() == 10);840check_position(split_container, def_pos + 10, separator_size.x);841842// Negative.843split_container->set_split_offset(-10);844MessageQueue::get_singleton()->flush();845CHECK(split_container->get_split_offset() == -10);846check_position(split_container, def_pos - 10, separator_size.x);847848// Clamped positive.849split_container->set_split_offset(1000);850MessageQueue::get_singleton()->flush();851CHECK(split_container->get_split_offset() == 1000);852check_position(split_container, split_container->get_size().x - separator_size.x, separator_size.x);853854// Clamped negative.855split_container->set_split_offset(-1000);856MessageQueue::get_singleton()->flush();857CHECK(split_container->get_split_offset() == -1000);858check_position(split_container, 0, separator_size.x);859}860861SUBCASE("[SplitContainer] Unequal stretch ratios") {862int def_pos = (split_container->get_size().x * 2 / 3) - separator_size.x / 2;863child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);864child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);865child_a->set_stretch_ratio(2.0);866MessageQueue::get_singleton()->flush();867868// Positive.869split_container->set_split_offset(10);870MessageQueue::get_singleton()->flush();871CHECK(split_container->get_split_offset() == 10);872check_position(split_container, def_pos + 10, separator_size.x);873874// Negative.875split_container->set_split_offset(-10);876MessageQueue::get_singleton()->flush();877CHECK(split_container->get_split_offset() == -10);878check_position(split_container, def_pos - 10, separator_size.x);879880// Clamped positive.881split_container->set_split_offset(1000);882MessageQueue::get_singleton()->flush();883CHECK(split_container->get_split_offset() == 1000);884check_position(split_container, split_container->get_size().x - separator_size.x, separator_size.x);885886// Clamped negative.887split_container->set_split_offset(-1000);888MessageQueue::get_singleton()->flush();889CHECK(split_container->get_split_offset() == -1000);890check_position(split_container, 0, separator_size.x);891}892}893894SUBCASE("[SplitContainer] Keep split offset when changing minimum size") {895SUBCASE("[SplitContainer] No expand flags") {896int def_pos = 0;897898split_container->set_split_offset(100);899child_a->set_custom_minimum_size(Size2(10, 0));900MessageQueue::get_singleton()->flush();901CHECK(split_container->get_split_offset() == 100);902check_position(split_container, def_pos + 100, separator_size.x);903904child_a->set_custom_minimum_size(Size2(50, 0));905MessageQueue::get_singleton()->flush();906CHECK(split_container->get_split_offset() == 100);907check_position(split_container, def_pos + 100, separator_size.x);908}909910SUBCASE("[SplitContainer] First child expanded") {911int def_pos = split_container->get_size().x - separator_size.x;912child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);913MessageQueue::get_singleton()->flush();914915split_container->set_split_offset(-100);916child_b->set_custom_minimum_size(Size2(10, 0));917MessageQueue::get_singleton()->flush();918CHECK(split_container->get_split_offset() == -100);919check_position(split_container, def_pos - 100, separator_size.x);920921child_b->set_custom_minimum_size(Size2(50, 0));922MessageQueue::get_singleton()->flush();923CHECK(split_container->get_split_offset() == -100);924check_position(split_container, def_pos - 100, separator_size.x);925}926927SUBCASE("[SplitContainer] Second child expanded") {928int def_pos = 0;929child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);930MessageQueue::get_singleton()->flush();931932split_container->set_split_offset(100);933child_a->set_custom_minimum_size(Size2(10, 0));934MessageQueue::get_singleton()->flush();935CHECK(split_container->get_split_offset() == 100);936check_position(split_container, def_pos + 100, separator_size.x);937938child_a->set_custom_minimum_size(Size2(50, 0));939MessageQueue::get_singleton()->flush();940CHECK(split_container->get_split_offset() == 100);941check_position(split_container, def_pos + 100, separator_size.x);942}943944SUBCASE("[SplitContainer] Both children expanded") {945int def_pos = (split_container->get_size().x - separator_size.x) / 2;946child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);947child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);948MessageQueue::get_singleton()->flush();949950split_container->set_split_offset(20);951child_a->set_custom_minimum_size(Size2(10, 0));952child_b->set_custom_minimum_size(Size2(10, 0));953MessageQueue::get_singleton()->flush();954CHECK(split_container->get_split_offset() == 20);955check_position(split_container, def_pos + 20, separator_size.x);956957child_a->set_custom_minimum_size(Size2(50, 0));958child_b->set_custom_minimum_size(Size2(50, 0));959MessageQueue::get_singleton()->flush();960CHECK(split_container->get_split_offset() == 20);961check_position(split_container, def_pos + 20, separator_size.x);962}963}964965SUBCASE("[SplitContainer] Resize split container") {966SUBCASE("[SplitContainer] No expand flags") {967int def_pos = 0;968// Increase the size.969split_container->set_size(Size2(600, 500));970MessageQueue::get_singleton()->flush();971check_position(split_container, def_pos, separator_size.x);972973// Decrease the size.974split_container->set_size(Size2(400, 500));975MessageQueue::get_singleton()->flush();976check_position(split_container, def_pos, separator_size.x);977978// Change size with a split offset.979split_container->set_split_offset(100);980MessageQueue::get_singleton()->flush();981check_position(split_container, def_pos + 100, separator_size.x);982983split_container->set_size(Size2(500, 500));984MessageQueue::get_singleton()->flush();985check_position(split_container, def_pos + 100, separator_size.x);986CHECK(split_container->get_split_offset() == 100);987988// Change size so that the first child changes size.989split_container->set_size(Size2(80, 500));990MessageQueue::get_singleton()->flush();991check_position(split_container, 80 - separator_size.x, separator_size.x);992CHECK(split_container->get_split_offset() == 100);993994// Increase size again.995split_container->set_size(Size2(500, 500));996MessageQueue::get_singleton()->flush();997check_position(split_container, def_pos + 100, separator_size.x);998CHECK(split_container->get_split_offset() == 100);999}10001001SUBCASE("[SplitContainer] First child expanded") {1002int def_pos = split_container->get_size().x - separator_size.x;1003child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);1004MessageQueue::get_singleton()->flush();10051006// Increase the size.1007split_container->set_size(Size2(600, 500));1008def_pos = split_container->get_size().x - separator_size.x;1009MessageQueue::get_singleton()->flush();1010check_position(split_container, def_pos, separator_size.x);10111012// Decrease the size.1013split_container->set_size(Size2(400, 500));1014def_pos = split_container->get_size().x - separator_size.x;1015MessageQueue::get_singleton()->flush();1016check_position(split_container, def_pos, separator_size.x);10171018// Change size with a split offset.1019split_container->set_split_offset(-100);1020MessageQueue::get_singleton()->flush();1021check_position(split_container, def_pos - 100, separator_size.x);10221023split_container->set_size(Size2(500, 500));1024def_pos = split_container->get_size().x - separator_size.x;1025MessageQueue::get_singleton()->flush();1026check_position(split_container, def_pos - 100, separator_size.x);1027CHECK(split_container->get_split_offset() == -100);10281029// Change size so that the second child changes size.1030split_container->set_size(Size2(80, 500));1031MessageQueue::get_singleton()->flush();1032check_position(split_container, 0, separator_size.x);1033CHECK(split_container->get_split_offset() == -100);10341035// Increase size again.1036split_container->set_size(Size2(500, 500));1037MessageQueue::get_singleton()->flush();1038check_position(split_container, def_pos - 100, separator_size.x);1039CHECK(split_container->get_split_offset() == -100);1040}10411042SUBCASE("[SplitContainer] Second child expanded") {1043int def_pos = 0;1044child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);1045MessageQueue::get_singleton()->flush();10461047// Increase the size.1048split_container->set_size(Size2(600, 500));1049MessageQueue::get_singleton()->flush();1050check_position(split_container, def_pos, separator_size.x);10511052// Decrease the size.1053split_container->set_size(Size2(400, 500));1054MessageQueue::get_singleton()->flush();1055check_position(split_container, def_pos, separator_size.x);10561057// Change size with a split offset.1058split_container->set_split_offset(100);1059MessageQueue::get_singleton()->flush();1060check_position(split_container, def_pos + 100, separator_size.x);10611062split_container->set_size(Size2(500, 500));1063MessageQueue::get_singleton()->flush();1064check_position(split_container, def_pos + 100, separator_size.x);1065CHECK(split_container->get_split_offset() == 100);10661067// Change size so that the first child changes size.1068split_container->set_size(Size2(80, 500));1069MessageQueue::get_singleton()->flush();1070check_position(split_container, 80 - separator_size.x, separator_size.x);1071CHECK(split_container->get_split_offset() == 100);10721073// Increase size again.1074split_container->set_size(Size2(500, 500));1075MessageQueue::get_singleton()->flush();1076check_position(split_container, def_pos + 100, separator_size.x);1077CHECK(split_container->get_split_offset() == 100);1078}10791080SUBCASE("[SplitContainer] Both children expanded") {1081int def_pos = (split_container->get_size().x - separator_size.x) / 2;1082child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);1083child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);1084MessageQueue::get_singleton()->flush();10851086// Increase the size.1087split_container->set_size(Size2(600, 500));1088def_pos = (split_container->get_size().x - separator_size.x) / 2;1089MessageQueue::get_singleton()->flush();1090check_position(split_container, def_pos, separator_size.x);10911092// Decrease the size.1093split_container->set_size(Size2(400, 500));1094def_pos = (split_container->get_size().x - separator_size.x) / 2;1095MessageQueue::get_singleton()->flush();1096check_position(split_container, def_pos, separator_size.x);10971098// Change size with a split offset.1099split_container->set_split_offset(100);1100MessageQueue::get_singleton()->flush();1101check_position(split_container, def_pos + 100, separator_size.x);11021103split_container->set_size(Size2(500, 500));1104def_pos = (split_container->get_size().x - separator_size.x) / 2;1105MessageQueue::get_singleton()->flush();1106check_position(split_container, def_pos + 100, separator_size.x);1107CHECK(split_container->get_split_offset() == 100);11081109// Change size so that the second child is minimized.1110split_container->set_size(Size2(80, 500));1111MessageQueue::get_singleton()->flush();1112check_position(split_container, 80 - separator_size.x, separator_size.x);1113CHECK(split_container->get_split_offset() == 100);11141115// Increase size again.1116split_container->set_size(Size2(500, 500));1117def_pos = (split_container->get_size().x - separator_size.x) / 2;1118MessageQueue::get_singleton()->flush();1119check_position(split_container, def_pos + 100, separator_size.x);1120CHECK(split_container->get_split_offset() == 100);1121}11221123SUBCASE("[SplitContainer] Unequal stretch ratios") {1124int def_pos = (split_container->get_size().x * 2 / 3) - separator_size.x / 2;1125child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);1126child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);1127child_a->set_stretch_ratio(2.0);1128MessageQueue::get_singleton()->flush();11291130// Increase the size.1131split_container->set_size(Size2(600, 500));1132def_pos = (split_container->get_size().x * 2 / 3) - separator_size.x / 2;1133MessageQueue::get_singleton()->flush();1134check_position(split_container, def_pos, separator_size.x);11351136// Decrease the size.1137split_container->set_size(Size2(400, 500));1138def_pos = (split_container->get_size().x * 2 / 3) - separator_size.x / 2;1139MessageQueue::get_singleton()->flush();1140check_position(split_container, def_pos, separator_size.x);11411142// Change size with a split offset.1143split_container->set_split_offset(100);1144MessageQueue::get_singleton()->flush();1145check_position(split_container, def_pos + 100, separator_size.x);11461147split_container->set_size(Size2(500, 500));1148def_pos = (split_container->get_size().x * 2 / 3) - separator_size.x / 2;1149MessageQueue::get_singleton()->flush();1150check_position(split_container, def_pos + 100, separator_size.x);1151CHECK(split_container->get_split_offset() == 100);11521153// Change size so that the second child is minimized.1154split_container->set_size(Size2(80, 500));1155MessageQueue::get_singleton()->flush();1156check_position(split_container, 80 - separator_size.x, separator_size.x);1157CHECK(split_container->get_split_offset() == 100);11581159// Increase size again.1160split_container->set_size(Size2(500, 500));1161def_pos = (split_container->get_size().x * 2 / 3) - separator_size.x / 2;1162MessageQueue::get_singleton()->flush();1163check_position(split_container, def_pos + 100, separator_size.x);1164CHECK(split_container->get_split_offset() == 100);1165}1166}11671168SUBCASE("[SplitContainer] Drag") {1169SUBCASE("[SplitContainer] Vertical, no expand flags") {1170SIGNAL_WATCH(split_container, "dragged");1171Array signal_args = { { 0 } };11721173split_container->set_vertical(true);1174Point2 mouse_offset = Point2(1, 1);1175int dragger_pos = 0;1176int split_dragger_ofs = 0;11771178// Grab the dragger.1179SEND_GUI_MOUSE_BUTTON_EVENT(mouse_offset + Point2(0, dragger_pos), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);1180MessageQueue::get_singleton()->flush();1181check_position(split_container, dragger_pos, separator_size.y, false);1182CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1183SIGNAL_CHECK_FALSE("dragged");11841185// Move the dragger.1186dragger_pos = 10;1187SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(0, dragger_pos), MouseButtonMask::LEFT, Key::NONE);1188MessageQueue::get_singleton()->flush();1189check_position(split_container, dragger_pos, separator_size.y, false);1190CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1191// It is clamped.1192split_container->clamp_split_offset();1193CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1194((Array)signal_args[0])[0] = split_container->get_split_offset();1195SIGNAL_CHECK("dragged", signal_args);11961197// Move down.1198dragger_pos = 400;1199SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(0, dragger_pos), MouseButtonMask::LEFT, Key::NONE);1200MessageQueue::get_singleton()->flush();1201check_position(split_container, dragger_pos, separator_size.y, false);1202CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1203((Array)signal_args[0])[0] = split_container->get_split_offset();1204SIGNAL_CHECK("dragged", signal_args);12051206// Moves even when mouse is outside.1207dragger_pos = split_container->get_size().y - separator_size.y;1208SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(0, 1000), MouseButtonMask::LEFT, Key::NONE);1209MessageQueue::get_singleton()->flush();1210check_position(split_container, dragger_pos, separator_size.y, false);1211CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1212((Array)signal_args[0])[0] = split_container->get_split_offset();1213SIGNAL_CHECK("dragged", signal_args);12141215// Move up.1216dragger_pos = 100;1217SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(0, dragger_pos), MouseButtonMask::LEFT, Key::NONE);1218MessageQueue::get_singleton()->flush();1219check_position(split_container, dragger_pos, separator_size.y, false);1220CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1221((Array)signal_args[0])[0] = split_container->get_split_offset();1222SIGNAL_CHECK("dragged", signal_args);12231224// Release.1225SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(mouse_offset + Point2(0, dragger_pos), MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);1226MessageQueue::get_singleton()->flush();1227check_position(split_container, dragger_pos, separator_size.y, false);1228CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1229SIGNAL_CHECK_FALSE("dragged");12301231// No longer moves with the mouse.1232SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(0, 200), MouseButtonMask::NONE, Key::NONE);1233MessageQueue::get_singleton()->flush();1234check_position(split_container, dragger_pos, separator_size.y, false);1235CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1236SIGNAL_CHECK_FALSE("dragged");12371238SIGNAL_UNWATCH(split_container, "dragged");1239}12401241SUBCASE("[SplitContainer] No expand flags") {1242Point2 mouse_offset = Point2(1, 1);1243int dragger_pos = 0;1244int split_dragger_ofs = 0;12451246// Grab the dragger.1247SEND_GUI_MOUSE_BUTTON_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);1248MessageQueue::get_singleton()->flush();1249check_position(split_container, dragger_pos, separator_size.x);1250CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);12511252// Move the dragger.1253dragger_pos = 10;1254SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButtonMask::LEFT, Key::NONE);1255MessageQueue::get_singleton()->flush();1256check_position(split_container, dragger_pos, separator_size.x);1257CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1258// It is clamped.1259split_container->clamp_split_offset();1260CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);12611262// Continue moving.1263dragger_pos = 400;1264SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButtonMask::LEFT, Key::NONE);1265MessageQueue::get_singleton()->flush();1266check_position(split_container, dragger_pos, separator_size.x);1267CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);12681269// Moves even when mouse is outside.1270dragger_pos = split_container->get_size().x - separator_size.x;1271SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(1000, 0), MouseButtonMask::LEFT, Key::NONE);1272MessageQueue::get_singleton()->flush();1273check_position(split_container, dragger_pos, separator_size.x);1274CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);12751276// Move back in.1277dragger_pos = 100;1278SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButtonMask::LEFT, Key::NONE);1279MessageQueue::get_singleton()->flush();1280check_position(split_container, dragger_pos, separator_size.x);1281CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);12821283// Release.1284SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);1285MessageQueue::get_singleton()->flush();1286check_position(split_container, dragger_pos, separator_size.x);1287CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);12881289// No longer moves with the mouse.1290SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(200, 0), MouseButtonMask::NONE, Key::NONE);1291MessageQueue::get_singleton()->flush();1292check_position(split_container, dragger_pos, separator_size.x);1293CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1294}12951296SUBCASE("[SplitContainer] First child expanded") {1297child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);1298MessageQueue::get_singleton()->flush();1299Point2 mouse_offset = Point2(1, 1);1300int dragger_pos = split_container->get_size().x - separator_size.x;1301int split_dragger_ofs = -dragger_pos;13021303// Grab the dragger.1304SEND_GUI_MOUSE_BUTTON_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);1305MessageQueue::get_singleton()->flush();1306check_position(split_container, dragger_pos, separator_size.x);1307CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);13081309// Move the dragger.1310dragger_pos -= 10;1311SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButtonMask::LEFT, Key::NONE);1312MessageQueue::get_singleton()->flush();1313check_position(split_container, dragger_pos, separator_size.x);1314CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1315// It is clamped.1316split_container->clamp_split_offset();1317CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);13181319// Continue moving.1320dragger_pos = 400;1321SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButtonMask::LEFT, Key::NONE);1322MessageQueue::get_singleton()->flush();1323check_position(split_container, dragger_pos, separator_size.x);1324CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);13251326// Moves even when mouse is outside.1327dragger_pos = split_container->get_size().x - separator_size.x;1328SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(1000, 0), MouseButtonMask::LEFT, Key::NONE);1329MessageQueue::get_singleton()->flush();1330check_position(split_container, dragger_pos, separator_size.x);1331CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);13321333// Move back in.1334dragger_pos = 100;1335SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButtonMask::LEFT, Key::NONE);1336MessageQueue::get_singleton()->flush();1337check_position(split_container, dragger_pos, separator_size.x);1338CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);13391340// Release.1341SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);1342MessageQueue::get_singleton()->flush();1343check_position(split_container, dragger_pos, separator_size.x);1344CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);13451346// No longer moves with the mouse.1347SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(200, 0), MouseButtonMask::NONE, Key::NONE);1348MessageQueue::get_singleton()->flush();1349check_position(split_container, dragger_pos, separator_size.x);1350CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1351}13521353SUBCASE("[SplitContainer] Second child expanded") {1354child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);1355MessageQueue::get_singleton()->flush();1356Point2 mouse_offset = Point2(1, 1);1357int dragger_pos = 0;1358int split_dragger_ofs = 0;13591360// Grab the dragger.1361SEND_GUI_MOUSE_BUTTON_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);1362MessageQueue::get_singleton()->flush();1363check_position(split_container, dragger_pos, separator_size.x);1364CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);13651366// Move the dragger.1367dragger_pos = 10;1368SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButtonMask::LEFT, Key::NONE);1369MessageQueue::get_singleton()->flush();1370check_position(split_container, dragger_pos, separator_size.x);1371CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1372// It is clamped.1373split_container->clamp_split_offset();1374CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);13751376// Continue moving.1377dragger_pos = 400;1378SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButtonMask::LEFT, Key::NONE);1379MessageQueue::get_singleton()->flush();1380check_position(split_container, dragger_pos, separator_size.x);1381CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);13821383// Moves even when mouse is outside.1384dragger_pos = split_container->get_size().x - separator_size.x;1385SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(1000, 0), MouseButtonMask::LEFT, Key::NONE);1386MessageQueue::get_singleton()->flush();1387check_position(split_container, dragger_pos, separator_size.x);1388CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);13891390// Move back in.1391dragger_pos = 100;1392SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButtonMask::LEFT, Key::NONE);1393MessageQueue::get_singleton()->flush();1394check_position(split_container, dragger_pos, separator_size.x);1395CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);13961397// Release.1398SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);1399MessageQueue::get_singleton()->flush();1400check_position(split_container, dragger_pos, separator_size.x);1401CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);14021403// No longer moves with the mouse.1404SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(200, 0), MouseButtonMask::NONE, Key::NONE);1405MessageQueue::get_singleton()->flush();1406check_position(split_container, dragger_pos, separator_size.x);1407CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1408}14091410SUBCASE("[SplitContainer] Both children expanded") {1411child_a->set_h_size_flags(Control::SIZE_EXPAND_FILL);1412child_b->set_h_size_flags(Control::SIZE_EXPAND_FILL);1413MessageQueue::get_singleton()->flush();1414Point2 mouse_offset = Point2(1, 1);1415int dragger_pos = (split_container->get_size().x - separator_size.x) / 2;1416int split_dragger_ofs = -dragger_pos;14171418// Grab the dragger.1419SEND_GUI_MOUSE_BUTTON_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);1420MessageQueue::get_singleton()->flush();1421check_position(split_container, dragger_pos, separator_size.x);1422CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);14231424// Move the dragger.1425dragger_pos += 10;1426SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButtonMask::LEFT, Key::NONE);1427MessageQueue::get_singleton()->flush();1428check_position(split_container, dragger_pos, separator_size.x);1429CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1430// It is clamped.1431split_container->clamp_split_offset();1432CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);14331434// Continue moving.1435dragger_pos = 400;1436SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButtonMask::LEFT, Key::NONE);1437MessageQueue::get_singleton()->flush();1438check_position(split_container, dragger_pos, separator_size.x);1439CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);14401441// Moves even when mouse is outside.1442dragger_pos = split_container->get_size().x - separator_size.x;1443SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(1000, 0), MouseButtonMask::LEFT, Key::NONE);1444MessageQueue::get_singleton()->flush();1445check_position(split_container, dragger_pos, separator_size.x);1446CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);14471448// Move back in.1449dragger_pos = 100;1450SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButtonMask::LEFT, Key::NONE);1451MessageQueue::get_singleton()->flush();1452check_position(split_container, dragger_pos, separator_size.x);1453CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);14541455// Release.1456SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(mouse_offset + Point2(dragger_pos, 0), MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);1457MessageQueue::get_singleton()->flush();1458check_position(split_container, dragger_pos, separator_size.x);1459CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);14601461// No longer moves with the mouse.1462SEND_GUI_MOUSE_MOTION_EVENT(mouse_offset + Point2(200, 0), MouseButtonMask::NONE, Key::NONE);1463MessageQueue::get_singleton()->flush();1464check_position(split_container, dragger_pos, separator_size.x);1465CHECK(split_container->get_split_offset() == dragger_pos + split_dragger_ofs);1466}1467}14681469memdelete(child_b);1470memdelete(child_a);1471memdelete(split_container);1472}14731474} // namespace TestSplitContainer147514761477