Enable Vertical orientation for TileMap Dock

This commit is contained in:
Logan Detrick 2025-11-25 19:49:44 -08:00
parent 9dd6c4dbac
commit ad094b93be
3 changed files with 218 additions and 128 deletions

View file

@ -42,6 +42,7 @@
#include "editor/themes/editor_scale.h" #include "editor/themes/editor_scale.h"
#include "scene/2d/tile_map.h" #include "scene/2d/tile_map.h"
#include "scene/2d/tile_map_layer.h" #include "scene/2d/tile_map_layer.h"
#include "scene/gui/grid_container.h"
#include "scene/gui/split_container.h" #include "scene/gui/split_container.h"
#include "core/input/input.h" #include "core/input/input.h"
@ -49,6 +50,20 @@
#include "core/math/random_pcg.h" #include "core/math/random_pcg.h"
#include "core/os/keyboard.h" #include "core/os/keyboard.h"
void SwitchSeparator::set_vertical(bool p_vertical) {
h_separator->set_visible(p_vertical);
v_separator->set_visible(!p_vertical);
}
SwitchSeparator::SwitchSeparator() {
h_separator = memnew(HSeparator);
h_separator->hide();
add_child(h_separator);
v_separator = memnew(VSeparator);
add_child(v_separator);
}
TileMapLayer *TileMapLayerSubEditorPlugin::_get_edited_layer() const { TileMapLayer *TileMapLayerSubEditorPlugin::_get_edited_layer() const {
return ObjectDB::get_instance<TileMapLayer>(edited_tile_map_layer_id); return ObjectDB::get_instance<TileMapLayer>(edited_tile_map_layer_id);
} }
@ -95,32 +110,14 @@ void TileMapLayerEditorTilesPlugin::_update_toolbar() {
// Stop dragging if needed. // Stop dragging if needed.
_stop_dragging(); _stop_dragging();
// Hide all settings.
for (int i = 0; i < tools_settings->get_child_count(); i++) {
Object::cast_to<CanvasItem>(tools_settings->get_child(i))->hide();
}
// Show only the correct settings. // Show only the correct settings.
if (tool_buttons_group->get_pressed_button() == select_tool_button) { bool using_select = (tool_buttons_group->get_pressed_button() == select_tool_button);
transform_toolbar->show(); tools_settings_vsep->set_visible(!using_select);
} else if (tool_buttons_group->get_pressed_button() != bucket_tool_button) { picker_button->set_visible(!using_select);
tools_settings_vsep->show(); erase_button->set_visible(!using_select);
picker_button->show(); random_tile_toggle->set_visible(!using_select);
erase_button->show(); bucket_contiguous_checkbox->set_visible(!using_select && tool_buttons_group->get_pressed_button() == bucket_tool_button);
transform_toolbar->show(); scatter_controls_container->set_visible(!using_select && random_tile_toggle->is_pressed());
tools_settings_vsep_2->show();
random_tile_toggle->show();
scatter_controls_container->set_visible(random_tile_toggle->is_pressed());
} else {
tools_settings_vsep->show();
picker_button->show();
erase_button->show();
transform_toolbar->show();
tools_settings_vsep_2->show();
bucket_contiguous_checkbox->show();
random_tile_toggle->show();
scatter_controls_container->set_visible(random_tile_toggle->is_pressed());
}
CanvasItemEditor::get_singleton()->set_current_tool(CanvasItemEditor::TOOL_SELECT); CanvasItemEditor::get_singleton()->set_current_tool(CanvasItemEditor::TOOL_SELECT);
} }
@ -156,8 +153,12 @@ void TileMapLayerEditorTilesPlugin::_set_transform_buttons_state(const Vector<Bu
Vector<TileMapLayerSubEditorPlugin::TabData> TileMapLayerEditorTilesPlugin::get_tabs() const { Vector<TileMapLayerSubEditorPlugin::TabData> TileMapLayerEditorTilesPlugin::get_tabs() const {
Vector<TileMapLayerSubEditorPlugin::TabData> tabs; Vector<TileMapLayerSubEditorPlugin::TabData> tabs;
tabs.push_back({ toolbar, tiles_bottom_panel }); Vector<Control *> toolbar_controls;
tabs.push_back({ toolbar, patterns_bottom_panel }); toolbar_controls.push_back(tilemap_tiles_tools_buttons);
toolbar_controls.push_back(tools_settings);
toolbar_controls.push_back(tools_settings_vsep);
tabs.push_back({ toolbar_controls, wide_toolbar, tiles_bottom_panel });
tabs.push_back({ toolbar_controls, wide_toolbar, patterns_bottom_panel });
return tabs; return tabs;
} }
@ -2141,6 +2142,19 @@ void TileMapLayerEditorTilesPlugin::edit(ObjectID p_tile_map_layer_id) {
edited_tile_map_layer_id = p_tile_map_layer_id; edited_tile_map_layer_id = p_tile_map_layer_id;
} }
void TileMapLayerEditorTilesPlugin::update_layout(EditorDock::DockLayout p_layout) {
bool is_vertical = (p_layout == EditorDock::DockLayout::DOCK_LAYOUT_VERTICAL);
atlas_sources_split_container->set_vertical(is_vertical);
atlas_sources_split_container->move_child(split_container_left_side, is_vertical ? -1 : 0);
split_container_left_side->set_vertical(!is_vertical);
tilemap_tiles_tools_buttons->set_vertical(is_vertical);
transform_toolbar->set_vertical(is_vertical);
tools_settings->set_vertical(is_vertical);
tools_settings_vsep->set_vertical(is_vertical);
transform_separator->set_vertical(is_vertical);
}
TileMapLayerEditorTilesPlugin::TileMapLayerEditorTilesPlugin() { TileMapLayerEditorTilesPlugin::TileMapLayerEditorTilesPlugin() {
CanvasItemEditor::get_singleton() CanvasItemEditor::get_singleton()
->get_viewport_control() ->get_viewport_control()
@ -2154,9 +2168,9 @@ TileMapLayerEditorTilesPlugin::TileMapLayerEditorTilesPlugin() {
erase_pattern->set_cell(Vector2i(0, 0), TileSet::INVALID_SOURCE, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE); erase_pattern->set_cell(Vector2i(0, 0), TileSet::INVALID_SOURCE, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE);
// --- Toolbar --- // --- Toolbar ---
toolbar = memnew(HBoxContainer); wide_toolbar = memnew(HBoxContainer);
HBoxContainer *tilemap_tiles_tools_buttons = memnew(HBoxContainer); tilemap_tiles_tools_buttons = memnew(BoxContainer);
tool_buttons_group.instantiate(); tool_buttons_group.instantiate();
@ -2210,15 +2224,12 @@ TileMapLayerEditorTilesPlugin::TileMapLayerEditorTilesPlugin() {
bucket_tool_button->connect(SceneStringName(pressed), callable_mp(this, &TileMapLayerEditorTilesPlugin::_update_toolbar)); bucket_tool_button->connect(SceneStringName(pressed), callable_mp(this, &TileMapLayerEditorTilesPlugin::_update_toolbar));
bucket_tool_button->set_accessibility_name(TTRC("Bucket Tool")); bucket_tool_button->set_accessibility_name(TTRC("Bucket Tool"));
tilemap_tiles_tools_buttons->add_child(bucket_tool_button); tilemap_tiles_tools_buttons->add_child(bucket_tool_button);
toolbar->add_child(tilemap_tiles_tools_buttons);
viewport_shortcut_buttons.push_back(bucket_tool_button); viewport_shortcut_buttons.push_back(bucket_tool_button);
// -- TileMap tool settings -- // -- TileMap tool settings --
tools_settings = memnew(HBoxContainer); tools_settings = memnew(BoxContainer);
toolbar->add_child(tools_settings); tools_settings_vsep = memnew(SwitchSeparator);
tools_settings_vsep->set_vertical(false);
tools_settings_vsep = memnew(VSeparator);
tools_settings->add_child(tools_settings_vsep);
// Picker // Picker
picker_button = memnew(Button); picker_button = memnew(Button);
@ -2244,9 +2255,11 @@ TileMapLayerEditorTilesPlugin::TileMapLayerEditorTilesPlugin() {
viewport_shortcut_buttons.push_back(erase_button); viewport_shortcut_buttons.push_back(erase_button);
// Transform toolbar. // Transform toolbar.
transform_toolbar = memnew(HBoxContainer); transform_toolbar = memnew(BoxContainer);
tools_settings->add_child(transform_toolbar); tools_settings->add_child(transform_toolbar);
transform_toolbar->add_child(memnew(VSeparator)); transform_separator = memnew(SwitchSeparator);
transform_separator->set_vertical(false);
transform_toolbar->add_child(transform_separator);
transform_button_rotate_left = memnew(Button); transform_button_rotate_left = memnew(Button);
transform_button_rotate_left->set_theme_type_variation(SceneStringName(FlatButton)); transform_button_rotate_left->set_theme_type_variation(SceneStringName(FlatButton));
@ -2280,16 +2293,13 @@ TileMapLayerEditorTilesPlugin::TileMapLayerEditorTilesPlugin() {
transform_button_flip_v->set_accessibility_name(TTRC("Flip Tile Vertically")); transform_button_flip_v->set_accessibility_name(TTRC("Flip Tile Vertically"));
viewport_shortcut_buttons.push_back(transform_button_flip_v); viewport_shortcut_buttons.push_back(transform_button_flip_v);
// Separator 2.
tools_settings_vsep_2 = memnew(VSeparator);
tools_settings->add_child(tools_settings_vsep_2);
// Continuous checkbox. // Continuous checkbox.
bucket_contiguous_checkbox = memnew(CheckBox); bucket_contiguous_checkbox = memnew(CheckBox);
bucket_contiguous_checkbox->set_flat(true); bucket_contiguous_checkbox->set_flat(true);
bucket_contiguous_checkbox->set_text(TTR("Contiguous")); bucket_contiguous_checkbox->set_text(TTR("Contiguous"));
bucket_contiguous_checkbox->set_pressed(true); bucket_contiguous_checkbox->set_pressed(true);
tools_settings->add_child(bucket_contiguous_checkbox); bucket_contiguous_checkbox->hide();
wide_toolbar->add_child(bucket_contiguous_checkbox);
// Random tile checkbox. // Random tile checkbox.
random_tile_toggle = memnew(Button); random_tile_toggle = memnew(Button);
@ -2300,7 +2310,8 @@ TileMapLayerEditorTilesPlugin::TileMapLayerEditorTilesPlugin() {
tools_settings->add_child(random_tile_toggle); tools_settings->add_child(random_tile_toggle);
// Random tile scattering. // Random tile scattering.
scatter_controls_container = memnew(HBoxContainer); scatter_controls_container = memnew(BoxContainer);
scatter_controls_container->set_vertical(false);
scatter_label = memnew(Label); scatter_label = memnew(Label);
scatter_label->set_tooltip_text(TTR("Modifies the chance of painting nothing instead of a randomly selected tile.")); scatter_label->set_tooltip_text(TTR("Modifies the chance of painting nothing instead of a randomly selected tile."));
@ -2316,7 +2327,7 @@ TileMapLayerEditorTilesPlugin::TileMapLayerEditorTilesPlugin() {
scatter_spinbox->connect(SceneStringName(value_changed), callable_mp(this, &TileMapLayerEditorTilesPlugin::_on_scattering_spinbox_changed)); scatter_spinbox->connect(SceneStringName(value_changed), callable_mp(this, &TileMapLayerEditorTilesPlugin::_on_scattering_spinbox_changed));
scatter_spinbox->set_accessibility_name(TTRC("Scattering:")); scatter_spinbox->set_accessibility_name(TTRC("Scattering:"));
scatter_controls_container->add_child(scatter_spinbox); scatter_controls_container->add_child(scatter_spinbox);
tools_settings->add_child(scatter_controls_container); wide_toolbar->add_child(scatter_controls_container);
_on_random_tile_checkbox_toggled(false); _on_random_tile_checkbox_toggled(false);
@ -2345,25 +2356,26 @@ TileMapLayerEditorTilesPlugin::TileMapLayerEditorTilesPlugin() {
missing_source_label->hide(); missing_source_label->hide();
tiles_bottom_panel->add_child(missing_source_label); tiles_bottom_panel->add_child(missing_source_label);
atlas_sources_split_container = memnew(HSplitContainer); atlas_sources_split_container = memnew(SplitContainer);
atlas_sources_split_container->set_vertical(false);
atlas_sources_split_container->set_h_size_flags(Control::SIZE_EXPAND_FILL); atlas_sources_split_container->set_h_size_flags(Control::SIZE_EXPAND_FILL);
atlas_sources_split_container->set_v_size_flags(Control::SIZE_EXPAND_FILL); atlas_sources_split_container->set_v_size_flags(Control::SIZE_EXPAND_FILL);
tiles_bottom_panel->add_child(atlas_sources_split_container); tiles_bottom_panel->add_child(atlas_sources_split_container);
VBoxContainer *split_container_left_side = memnew(VBoxContainer); split_container_left_side = memnew(BoxContainer);
split_container_left_side->set_vertical(true);
split_container_left_side->set_h_size_flags(Control::SIZE_EXPAND_FILL); split_container_left_side->set_h_size_flags(Control::SIZE_EXPAND_FILL);
split_container_left_side->set_v_size_flags(Control::SIZE_EXPAND_FILL); split_container_left_side->set_v_size_flags(Control::SIZE_EXPAND_FILL);
split_container_left_side->set_stretch_ratio(0.25); split_container_left_side->set_stretch_ratio(0.25);
split_container_left_side->set_custom_minimum_size(Size2(70, 0) * EDSCALE); split_container_left_side->set_custom_minimum_size(Size2(70, 0) * EDSCALE);
atlas_sources_split_container->add_child(split_container_left_side); atlas_sources_split_container->add_child(split_container_left_side);
HBoxContainer *sources_bottom_actions = memnew(HBoxContainer);
sources_bottom_actions->set_alignment(HBoxContainer::ALIGNMENT_END);
source_sort_button = memnew(MenuButton); source_sort_button = memnew(MenuButton);
source_sort_button->set_flat(false); source_sort_button->set_flat(false);
source_sort_button->set_theme_type_variation("FlatMenuButton"); source_sort_button->set_theme_type_variation("FlatMenuButton");
source_sort_button->set_tooltip_text(TTR("Sort sources")); source_sort_button->set_tooltip_text(TTR("Sort sources"));
source_sort_button->set_h_size_flags(Control::SIZE_SHRINK_END);
source_sort_button->set_v_size_flags(Control::SIZE_SHRINK_END);
PopupMenu *p = source_sort_button->get_popup(); PopupMenu *p = source_sort_button->get_popup();
p->connect(SceneStringName(id_pressed), callable_mp(this, &TileMapLayerEditorTilesPlugin::_set_source_sort)); p->connect(SceneStringName(id_pressed), callable_mp(this, &TileMapLayerEditorTilesPlugin::_set_source_sort));
@ -2372,7 +2384,6 @@ TileMapLayerEditorTilesPlugin::TileMapLayerEditorTilesPlugin() {
p->add_radio_check_item(TTR("Sort by Name (Ascending)"), TilesEditorUtils::SOURCE_SORT_NAME); p->add_radio_check_item(TTR("Sort by Name (Ascending)"), TilesEditorUtils::SOURCE_SORT_NAME);
p->add_radio_check_item(TTR("Sort by Name (Descending)"), TilesEditorUtils::SOURCE_SORT_NAME_REVERSE); p->add_radio_check_item(TTR("Sort by Name (Descending)"), TilesEditorUtils::SOURCE_SORT_NAME_REVERSE);
p->set_item_checked(TilesEditorUtils::SOURCE_SORT_ID, true); p->set_item_checked(TilesEditorUtils::SOURCE_SORT_ID, true);
sources_bottom_actions->add_child(source_sort_button);
sources_list = memnew(TileSetSourceItemList); sources_list = memnew(TileSetSourceItemList);
sources_list->connect(SceneStringName(item_selected), callable_mp(this, &TileMapLayerEditorTilesPlugin::_update_source_display).unbind(1)); sources_list->connect(SceneStringName(item_selected), callable_mp(this, &TileMapLayerEditorTilesPlugin::_update_source_display).unbind(1));
@ -2381,7 +2392,7 @@ TileMapLayerEditorTilesPlugin::TileMapLayerEditorTilesPlugin() {
sources_list->connect(SceneStringName(visibility_changed), callable_mp(TilesEditorUtils::get_singleton(), &TilesEditorUtils::synchronize_sources_list).bind(sources_list, source_sort_button)); sources_list->connect(SceneStringName(visibility_changed), callable_mp(TilesEditorUtils::get_singleton(), &TilesEditorUtils::synchronize_sources_list).bind(sources_list, source_sort_button));
sources_list->connect("sort_request", callable_mp(this, &TileMapLayerEditorTilesPlugin::_update_tile_set_sources_list)); sources_list->connect("sort_request", callable_mp(this, &TileMapLayerEditorTilesPlugin::_update_tile_set_sources_list));
split_container_left_side->add_child(sources_list); split_container_left_side->add_child(sources_list);
split_container_left_side->add_child(sources_bottom_actions); split_container_left_side->add_child(source_sort_button);
// Tile atlas source. // Tile atlas source.
tile_atlas_view = memnew(TileAtlasView); tile_atlas_view = memnew(TileAtlasView);
@ -2465,28 +2476,15 @@ void TileMapLayerEditorTerrainsPlugin::tile_set_changed() {
} }
void TileMapLayerEditorTerrainsPlugin::_update_toolbar() { void TileMapLayerEditorTerrainsPlugin::_update_toolbar() {
// Hide all settings. bucket_contiguous_checkbox->set_visible(tool_buttons_group->get_pressed_button() == bucket_tool_button);
for (int i = 0; i < tools_settings->get_child_count(); i++) {
Object::cast_to<CanvasItem>(tools_settings->get_child(i))->hide();
}
// Show only the correct settings.
if (tool_buttons_group->get_pressed_button() != bucket_tool_button) {
tools_settings_vsep->show();
picker_button->show();
erase_button->show();
} else {
tools_settings_vsep->show();
picker_button->show();
erase_button->show();
tools_settings_vsep_2->show();
bucket_contiguous_checkbox->show();
}
} }
Vector<TileMapLayerSubEditorPlugin::TabData> TileMapLayerEditorTerrainsPlugin::get_tabs() const { Vector<TileMapLayerSubEditorPlugin::TabData> TileMapLayerEditorTerrainsPlugin::get_tabs() const {
Vector<TileMapLayerSubEditorPlugin::TabData> tabs; Vector<TileMapLayerSubEditorPlugin::TabData> tabs;
tabs.push_back({ toolbar, main_vbox_container }); Vector<Control *> toolbar_controls;
toolbar_controls.push_back(tilemap_tiles_tools_buttons);
toolbar_controls.push_back(tools_settings);
tabs.push_back({ toolbar_controls, wide_toolbar, main_box_container });
return tabs; return tabs;
} }
@ -2964,7 +2962,7 @@ void TileMapLayerEditorTerrainsPlugin::_update_selection() {
} }
bool TileMapLayerEditorTerrainsPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p_event) { bool TileMapLayerEditorTerrainsPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p_event) {
if (!main_vbox_container->is_visible_in_tree()) { if (!main_box_container->is_visible_in_tree()) {
// If the bottom editor is not visible, we ignore inputs. // If the bottom editor is not visible, we ignore inputs.
return false; return false;
} }
@ -3119,7 +3117,7 @@ void TileMapLayerEditorTerrainsPlugin::forward_canvas_draw_over_viewport(Control
bool drawing_rect = false; bool drawing_rect = false;
// Handle the preview of the tiles to be placed. // Handle the preview of the tiles to be placed.
if (main_vbox_container->is_visible_in_tree() && has_mouse) { // Only if the tilemap editor is opened and the viewport is hovered. if (main_box_container->is_visible_in_tree() && has_mouse) { // Only if the tilemap editor is opened and the viewport is hovered.
RBSet<Vector2i> preview; RBSet<Vector2i> preview;
Rect2i drawn_grid_rect; Rect2i drawn_grid_rect;
@ -3315,13 +3313,13 @@ void TileMapLayerEditorTerrainsPlugin::_update_terrains_tree() {
TreeItem *terrain_set_tree_item = terrains_tree->create_item(); TreeItem *terrain_set_tree_item = terrains_tree->create_item();
String matches; String matches;
if (tile_set->get_terrain_set_mode(terrain_set_index) == TileSet::TERRAIN_MODE_MATCH_CORNERS_AND_SIDES) { if (tile_set->get_terrain_set_mode(terrain_set_index) == TileSet::TERRAIN_MODE_MATCH_CORNERS_AND_SIDES) {
terrain_set_tree_item->set_icon(0, main_vbox_container->get_editor_theme_icon(SNAME("TerrainMatchCornersAndSides"))); terrain_set_tree_item->set_icon(0, main_box_container->get_editor_theme_icon(SNAME("TerrainMatchCornersAndSides")));
matches = String(TTR("Matches Corners and Sides")); matches = String(TTR("Matches Corners and Sides"));
} else if (tile_set->get_terrain_set_mode(terrain_set_index) == TileSet::TERRAIN_MODE_MATCH_CORNERS) { } else if (tile_set->get_terrain_set_mode(terrain_set_index) == TileSet::TERRAIN_MODE_MATCH_CORNERS) {
terrain_set_tree_item->set_icon(0, main_vbox_container->get_editor_theme_icon(SNAME("TerrainMatchCorners"))); terrain_set_tree_item->set_icon(0, main_box_container->get_editor_theme_icon(SNAME("TerrainMatchCorners")));
matches = String(TTR("Matches Corners Only")); matches = String(TTR("Matches Corners Only"));
} else { } else {
terrain_set_tree_item->set_icon(0, main_vbox_container->get_editor_theme_icon(SNAME("TerrainMatchSides"))); terrain_set_tree_item->set_icon(0, main_box_container->get_editor_theme_icon(SNAME("TerrainMatchSides")));
matches = String(TTR("Matches Sides Only")); matches = String(TTR("Matches Sides Only"));
} }
terrain_set_tree_item->set_text(0, vformat(TTR("Terrain Set %d (%s)"), terrain_set_index, matches)); terrain_set_tree_item->set_text(0, vformat(TTR("Terrain Set %d (%s)"), terrain_set_index, matches));
@ -3364,13 +3362,13 @@ void TileMapLayerEditorTerrainsPlugin::_update_tiles_list() {
ERR_FAIL_INDEX(sel_terrain_id, tile_set->get_terrains_count(sel_terrain_set)); ERR_FAIL_INDEX(sel_terrain_id, tile_set->get_terrains_count(sel_terrain_set));
// Add the two first generic modes // Add the two first generic modes
int item_index = terrains_tile_list->add_icon_item(main_vbox_container->get_editor_theme_icon(SNAME("TerrainConnect"))); int item_index = terrains_tile_list->add_icon_item(main_box_container->get_editor_theme_icon(SNAME("TerrainConnect")));
terrains_tile_list->set_item_tooltip(item_index, TTR("Connect mode: paints a terrain, then connects it with the surrounding tiles with the same terrain.")); terrains_tile_list->set_item_tooltip(item_index, TTR("Connect mode: paints a terrain, then connects it with the surrounding tiles with the same terrain."));
Dictionary list_metadata_dict; Dictionary list_metadata_dict;
list_metadata_dict["type"] = SELECTED_TYPE_CONNECT; list_metadata_dict["type"] = SELECTED_TYPE_CONNECT;
terrains_tile_list->set_item_metadata(item_index, list_metadata_dict); terrains_tile_list->set_item_metadata(item_index, list_metadata_dict);
item_index = terrains_tile_list->add_icon_item(main_vbox_container->get_editor_theme_icon(SNAME("TerrainPath"))); item_index = terrains_tile_list->add_icon_item(main_box_container->get_editor_theme_icon(SNAME("TerrainPath")));
terrains_tile_list->set_item_tooltip(item_index, TTR("Path mode: paints a terrain, then connects it to the previous tile painted within the same stroke.")); terrains_tile_list->set_item_tooltip(item_index, TTR("Path mode: paints a terrain, then connects it to the previous tile painted within the same stroke."));
list_metadata_dict = Dictionary(); list_metadata_dict = Dictionary();
list_metadata_dict["type"] = SELECTED_TYPE_PATH; list_metadata_dict["type"] = SELECTED_TYPE_PATH;
@ -3441,13 +3439,13 @@ void TileMapLayerEditorTerrainsPlugin::_update_tiles_list() {
} }
void TileMapLayerEditorTerrainsPlugin::_update_theme() { void TileMapLayerEditorTerrainsPlugin::_update_theme() {
paint_tool_button->set_button_icon(main_vbox_container->get_editor_theme_icon(SNAME("Edit"))); paint_tool_button->set_button_icon(main_box_container->get_editor_theme_icon(SNAME("Edit")));
line_tool_button->set_button_icon(main_vbox_container->get_editor_theme_icon(SNAME("Line"))); line_tool_button->set_button_icon(main_box_container->get_editor_theme_icon(SNAME("Line")));
rect_tool_button->set_button_icon(main_vbox_container->get_editor_theme_icon(SNAME("Rectangle"))); rect_tool_button->set_button_icon(main_box_container->get_editor_theme_icon(SNAME("Rectangle")));
bucket_tool_button->set_button_icon(main_vbox_container->get_editor_theme_icon(SNAME("Bucket"))); bucket_tool_button->set_button_icon(main_box_container->get_editor_theme_icon(SNAME("Bucket")));
picker_button->set_button_icon(main_vbox_container->get_editor_theme_icon(SNAME("ColorPick"))); picker_button->set_button_icon(main_box_container->get_editor_theme_icon(SNAME("ColorPick")));
erase_button->set_button_icon(main_vbox_container->get_editor_theme_icon(SNAME("Eraser"))); erase_button->set_button_icon(main_box_container->get_editor_theme_icon(SNAME("Eraser")));
_update_tiles_list(); _update_tiles_list();
} }
@ -3465,21 +3463,38 @@ void TileMapLayerEditorTerrainsPlugin::edit(ObjectID p_edited_tile_map_layer_id)
} }
} }
void TileMapLayerEditorTerrainsPlugin::update_layout(EditorDock::DockLayout p_layout) {
bool is_vertical = (p_layout == EditorDock::DockLayout::DOCK_LAYOUT_VERTICAL);
// Main Panel.
main_box_container->set_vertical(is_vertical);
tilemap_tab_terrains->move_child(terrains_tree, is_vertical ? 1 : 0);
tilemap_tab_terrains->set_vertical(is_vertical);
// Toolbar.
tilemap_tiles_tools_buttons->set_vertical(is_vertical);
tools_settings->set_vertical(is_vertical);
tools_settings_vsep->set_vertical(is_vertical);
}
TileMapLayerEditorTerrainsPlugin::TileMapLayerEditorTerrainsPlugin() { TileMapLayerEditorTerrainsPlugin::TileMapLayerEditorTerrainsPlugin() {
main_vbox_container = memnew(VBoxContainer); wide_toolbar = memnew(HBoxContainer);
main_box_container = memnew(BoxContainer);
main_box_container->set_vertical(true);
// FIXME: This can trigger theme updates when the nodes that we want to update are not yet available. // FIXME: This can trigger theme updates when the nodes that we want to update are not yet available.
// The toolbar should be extracted to a dedicated control and theme updates should be handled through // The toolbar should be extracted to a dedicated control and theme updates should be handled through
// the notification. // the notification.
main_vbox_container->connect(SceneStringName(theme_changed), callable_mp(this, &TileMapLayerEditorTerrainsPlugin::_update_theme)); main_box_container->connect(SceneStringName(theme_changed), callable_mp(this, &TileMapLayerEditorTerrainsPlugin::_update_theme));
main_vbox_container->set_name(TTR("Terrains")); main_box_container->set_name(TTRC("Terrains"));
HSplitContainer *tilemap_tab_terrains = memnew(HSplitContainer); tilemap_tab_terrains = memnew(SplitContainer);
tilemap_tab_terrains->set_vertical(false);
tilemap_tab_terrains->set_h_size_flags(Control::SIZE_EXPAND_FILL); tilemap_tab_terrains->set_h_size_flags(Control::SIZE_EXPAND_FILL);
tilemap_tab_terrains->set_v_size_flags(Control::SIZE_EXPAND_FILL); tilemap_tab_terrains->set_v_size_flags(Control::SIZE_EXPAND_FILL);
main_vbox_container->add_child(tilemap_tab_terrains); main_box_container->add_child(tilemap_tab_terrains);
terrains_tree = memnew(Tree); terrains_tree = memnew(Tree);
terrains_tree->set_h_size_flags(Control::SIZE_EXPAND_FILL); terrains_tree->set_h_size_flags(Control::SIZE_EXPAND_FILL);
terrains_tree->set_v_size_flags(Control::SIZE_EXPAND_FILL);
terrains_tree->set_stretch_ratio(0.25); terrains_tree->set_stretch_ratio(0.25);
terrains_tree->set_custom_minimum_size(Size2(70, 0) * EDSCALE); terrains_tree->set_custom_minimum_size(Size2(70, 0) * EDSCALE);
terrains_tree->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST); terrains_tree->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST);
@ -3491,6 +3506,7 @@ TileMapLayerEditorTerrainsPlugin::TileMapLayerEditorTerrainsPlugin() {
terrains_tile_list = memnew(ItemList); terrains_tile_list = memnew(ItemList);
terrains_tile_list->set_auto_translate_mode(Node::AUTO_TRANSLATE_MODE_DISABLED); terrains_tile_list->set_auto_translate_mode(Node::AUTO_TRANSLATE_MODE_DISABLED);
terrains_tile_list->set_h_size_flags(Control::SIZE_EXPAND_FILL); terrains_tile_list->set_h_size_flags(Control::SIZE_EXPAND_FILL);
terrains_tile_list->set_v_size_flags(Control::SIZE_EXPAND_FILL);
terrains_tile_list->set_max_columns(0); terrains_tile_list->set_max_columns(0);
terrains_tile_list->set_same_column_width(true); terrains_tile_list->set_same_column_width(true);
terrains_tile_list->set_fixed_icon_size(Size2(32, 32) * EDSCALE); terrains_tile_list->set_fixed_icon_size(Size2(32, 32) * EDSCALE);
@ -3498,10 +3514,7 @@ TileMapLayerEditorTerrainsPlugin::TileMapLayerEditorTerrainsPlugin() {
tilemap_tab_terrains->add_child(terrains_tile_list); tilemap_tab_terrains->add_child(terrains_tile_list);
// --- Toolbar --- // --- Toolbar ---
toolbar = memnew(HBoxContainer); tilemap_tiles_tools_buttons = memnew(BoxContainer);
HBoxContainer *tilemap_tiles_tools_buttons = memnew(HBoxContainer);
tool_buttons_group.instantiate(); tool_buttons_group.instantiate();
paint_tool_button = memnew(Button); paint_tool_button = memnew(Button);
@ -3545,13 +3558,11 @@ TileMapLayerEditorTerrainsPlugin::TileMapLayerEditorTerrainsPlugin() {
tilemap_tiles_tools_buttons->add_child(bucket_tool_button); tilemap_tiles_tools_buttons->add_child(bucket_tool_button);
viewport_shortcut_buttons.push_back(bucket_tool_button); viewport_shortcut_buttons.push_back(bucket_tool_button);
toolbar->add_child(tilemap_tiles_tools_buttons);
// -- TileMap tool settings -- // -- TileMap tool settings --
tools_settings = memnew(HBoxContainer); tools_settings = memnew(BoxContainer);
toolbar->add_child(tools_settings);
tools_settings_vsep = memnew(VSeparator); tools_settings_vsep = memnew(SwitchSeparator);
tools_settings_vsep->set_vertical(false);
tools_settings->add_child(tools_settings_vsep); tools_settings->add_child(tools_settings_vsep);
// Picker // Picker
@ -3574,16 +3585,13 @@ TileMapLayerEditorTerrainsPlugin::TileMapLayerEditorTerrainsPlugin() {
tools_settings->add_child(erase_button); tools_settings->add_child(erase_button);
viewport_shortcut_buttons.push_back(erase_button); viewport_shortcut_buttons.push_back(erase_button);
// Separator 2.
tools_settings_vsep_2 = memnew(VSeparator);
tools_settings->add_child(tools_settings_vsep_2);
// Continuous checkbox. // Continuous checkbox.
bucket_contiguous_checkbox = memnew(CheckBox); bucket_contiguous_checkbox = memnew(CheckBox);
bucket_contiguous_checkbox->set_flat(true); bucket_contiguous_checkbox->set_flat(true);
bucket_contiguous_checkbox->set_text(TTR("Contiguous")); bucket_contiguous_checkbox->set_text(TTR("Contiguous"));
bucket_contiguous_checkbox->set_pressed(true); bucket_contiguous_checkbox->set_pressed(true);
tools_settings->add_child(bucket_contiguous_checkbox); bucket_contiguous_checkbox->hide();
wide_toolbar->add_child(bucket_contiguous_checkbox);
} }
TileMapLayer *TileMapLayerEditor::_get_edited_layer() const { TileMapLayer *TileMapLayerEditor::_get_edited_layer() const {
@ -4062,9 +4070,16 @@ void TileMapLayerEditor::_tab_changed(int p_tab_id) {
// Update toolbar. // Update toolbar.
for (TileMapLayerSubEditorPlugin::TabData &tab_data : tabs_data) { for (TileMapLayerSubEditorPlugin::TabData &tab_data : tabs_data) {
tab_data.toolbar->hide(); for (Control *toolbar_control : tab_data.toolbar) {
toolbar_control->hide();
}
tab_data.wide_toolbar->hide();
} }
tabs_data[p_tab_id].toolbar->show();
for (Control *toolbar_control : tabs_data[p_tab_id].toolbar) {
toolbar_control->show();
}
tabs_data[p_tab_id].wide_toolbar->show();
// Update visible panel. // Update visible panel.
for (TileMapLayerSubEditorPlugin::TabData &tab_data : tabs_data) { for (TileMapLayerSubEditorPlugin::TabData &tab_data : tabs_data) {
@ -4396,17 +4411,51 @@ void TileMapLayerEditor::set_show_layer_selector(bool p_show_layer_selector) {
_update_layers_selector(); _update_layers_selector();
} }
void TileMapLayerEditor::update_layout(DockLayout p_layout) {
bool is_vertical = (p_layout == EditorDock::DockLayout::DOCK_LAYOUT_VERTICAL);
tabs_bar->get_parent()->remove_child(tabs_bar);
tile_map_toolbar->set_vertical(is_vertical);
layer_selector_separator->set_vertical(is_vertical);
layer_selection_hbox->set_vertical(is_vertical);
tile_map_toolbar->set_h_size_flags(is_vertical ? SIZE_SHRINK_BEGIN : SIZE_EXPAND_FILL);
tile_map_toolbar->set_v_size_flags(is_vertical ? SIZE_EXPAND_FILL : SIZE_SHRINK_BEGIN);
main_box_container->move_child(padding_control, is_vertical ? 0 : 3);
if (is_vertical) {
tile_map_wide_toolbar->add_child(tabs_bar);
} else {
tile_map_toolbar->add_child(tabs_bar);
tile_map_toolbar->move_child(tabs_bar, 0);
}
for (TileMapLayerSubEditorPlugin::TabData &tab_data : tabs_data) {
tab_data.wide_toolbar->get_parent()->remove_child(tab_data.wide_toolbar);
if (is_vertical) {
tile_map_wide_toolbar->add_child(tab_data.wide_toolbar);
} else {
tile_map_toolbar->add_child(tab_data.wide_toolbar);
}
}
// Propagate layout change to sub plugins
for (TileMapLayerSubEditorPlugin *tab_plugin : tabs_plugins) {
tab_plugin->update_layout(p_layout);
}
}
TileMapLayerEditor::TileMapLayerEditor() { TileMapLayerEditor::TileMapLayerEditor() {
set_process_internal(true); set_process_internal(true);
set_name(TTRC("TileMap")); set_name(TTRC("TileMap"));
set_icon_name("TileMapDock"); set_icon_name("TileMapDock");
set_dock_shortcut(ED_SHORTCUT_AND_COMMAND("bottom_panels/toggle_tile_map_bottom_panel", TTRC("Open TileMap Dock"))); set_dock_shortcut(ED_SHORTCUT_AND_COMMAND("bottom_panels/toggle_tile_map_bottom_panel", TTRC("Open TileMap Dock")));
set_default_slot(DockConstants::DOCK_SLOT_BOTTOM); set_default_slot(DockConstants::DOCK_SLOT_BOTTOM);
set_available_layouts(EditorDock::DOCK_LAYOUT_HORIZONTAL | EditorDock::DOCK_LAYOUT_FLOATING); set_available_layouts(EditorDock::DOCK_LAYOUT_ALL);
set_global(false); set_global(false);
set_transient(true); set_transient(true);
VBoxContainer *main_box_container = memnew(VBoxContainer); main_box_container = memnew(GridContainer);
main_box_container->set_columns(2);
add_child(main_box_container); add_child(main_box_container);
// Shortcuts. // Shortcuts.
@ -4431,18 +4480,31 @@ TileMapLayerEditor::TileMapLayerEditor() {
tabs_bar->connect("tab_changed", callable_mp(this, &TileMapLayerEditor::_tab_changed)); tabs_bar->connect("tab_changed", callable_mp(this, &TileMapLayerEditor::_tab_changed));
// --- TileMap toolbar --- // --- TileMap toolbar ---
tile_map_toolbar = memnew(HFlowContainer); tile_map_wide_toolbar = memnew(VBoxContainer);
main_box_container->add_child(tile_map_wide_toolbar);
tile_map_toolbar = memnew(FlowContainer);
tile_map_toolbar->set_h_size_flags(SIZE_EXPAND_FILL); tile_map_toolbar->set_h_size_flags(SIZE_EXPAND_FILL);
main_box_container->add_child(tile_map_toolbar); main_box_container->add_child(tile_map_toolbar);
padding_control = memnew(Control);
main_box_container->add_child(padding_control);
// Tabs. // Tabs.
tile_map_toolbar->add_child(tabs_bar); tile_map_toolbar->add_child(tabs_bar);
// Tabs toolbars. // Tabs toolbars.
for (TileMapLayerSubEditorPlugin::TabData &tab_data : tabs_data) { for (TileMapLayerSubEditorPlugin::TabData &tab_data : tabs_data) {
tab_data.toolbar->hide(); for (Control *toolbar_control : tab_data.toolbar) {
if (!tab_data.toolbar->get_parent()) { toolbar_control->hide();
tile_map_toolbar->add_child(tab_data.toolbar); if (!toolbar_control->get_parent()) {
tile_map_toolbar->add_child(toolbar_control);
}
}
tab_data.wide_toolbar->hide();
if (!tab_data.wide_toolbar->get_parent()) {
tile_map_toolbar->add_child(tab_data.wide_toolbar);
} }
} }
@ -4453,7 +4515,7 @@ TileMapLayerEditor::TileMapLayerEditor() {
tile_map_toolbar->add_child(c); tile_map_toolbar->add_child(c);
// Layer selector. // Layer selector.
layer_selection_hbox = memnew(HBoxContainer); layer_selection_hbox = memnew(BoxContainer);
tile_map_toolbar->add_child(layer_selection_hbox); tile_map_toolbar->add_child(layer_selection_hbox);
layers_selection_button = memnew(OptionButton); layers_selection_button = memnew(OptionButton);
@ -4477,7 +4539,6 @@ TileMapLayerEditor::TileMapLayerEditor() {
select_all_layers = memnew(Button); select_all_layers = memnew(Button);
select_all_layers->set_theme_type_variation(SceneStringName(FlatButton)); select_all_layers->set_theme_type_variation(SceneStringName(FlatButton));
select_all_layers->set_text(TTR("Select all layers"));
select_all_layers->connect(SceneStringName(pressed), callable_mp(this, &TileMapLayerEditor::_select_all_layers_pressed)); select_all_layers->connect(SceneStringName(pressed), callable_mp(this, &TileMapLayerEditor::_select_all_layers_pressed));
select_all_layers->set_tooltip_text(TTR("Select all TileMapLayers in scene")); select_all_layers->set_tooltip_text(TTR("Select all TileMapLayers in scene"));
layer_selection_hbox->add_child(select_all_layers); layer_selection_hbox->add_child(select_all_layers);
@ -4490,7 +4551,9 @@ TileMapLayerEditor::TileMapLayerEditor() {
toggle_highlight_selected_layer_button->set_tooltip_text(TTR("Highlight Selected TileMap Layer")); toggle_highlight_selected_layer_button->set_tooltip_text(TTR("Highlight Selected TileMap Layer"));
tile_map_toolbar->add_child(toggle_highlight_selected_layer_button); tile_map_toolbar->add_child(toggle_highlight_selected_layer_button);
tile_map_toolbar->add_child(memnew(VSeparator)); layer_selector_separator = memnew(SwitchSeparator);
layer_selector_separator->set_vertical(false);
tile_map_toolbar->add_child(layer_selector_separator);
// Grid toggle. // Grid toggle.
toggle_grid_button = memnew(Button); toggle_grid_button = memnew(Button);

View file

@ -30,6 +30,7 @@
#pragma once #pragma once
#include "scene/gui/margin_container.h"
#include "tile_atlas_view.h" #include "tile_atlas_view.h"
#include "core/os/thread.h" #include "core/os/thread.h"
@ -49,6 +50,19 @@
class TileMapLayer; class TileMapLayer;
class TileMapLayerEditor; class TileMapLayerEditor;
class TileSetSourceItemList; class TileSetSourceItemList;
class GridContainer;
class SwitchSeparator : public MarginContainer {
GDCLASS(SwitchSeparator, MarginContainer);
HSeparator *h_separator = nullptr;
VSeparator *v_separator = nullptr;
public:
void set_vertical(bool p_vertical);
SwitchSeparator();
};
class TileMapLayerSubEditorPlugin : public Object { class TileMapLayerSubEditorPlugin : public Object {
GDSOFTCLASS(TileMapLayerSubEditorPlugin, Object); GDSOFTCLASS(TileMapLayerSubEditorPlugin, Object);
@ -60,7 +74,8 @@ protected:
public: public:
struct TabData { struct TabData {
Control *toolbar = nullptr; Vector<Control *> toolbar;
Control *wide_toolbar;
Control *panel = nullptr; Control *panel = nullptr;
}; };
@ -73,6 +88,7 @@ public:
virtual void tile_set_changed() {} virtual void tile_set_changed() {}
virtual void edit(ObjectID p_tile_map_layer_id) {} virtual void edit(ObjectID p_tile_map_layer_id) {}
virtual void draw_tile_coords_over_viewport(Control *p_overlay, const TileMapLayer *p_edited_layer, Ref<TileSet> p_tile_set, bool p_show_rectangle_size, const Vector2i &p_rectangle_origin); virtual void draw_tile_coords_over_viewport(Control *p_overlay, const TileMapLayer *p_edited_layer, Ref<TileSet> p_tile_set, bool p_show_rectangle_size, const Vector2i &p_rectangle_origin);
virtual void update_layout(EditorDock::DockLayout p_layout) {}
}; };
class TileMapLayerEditorTilesPlugin : public TileMapLayerSubEditorPlugin { class TileMapLayerEditorTilesPlugin : public TileMapLayerSubEditorPlugin {
@ -88,8 +104,9 @@ public:
private: private:
///// Toolbar ///// ///// Toolbar /////
HBoxContainer *toolbar = nullptr; HBoxContainer *wide_toolbar = nullptr;
BoxContainer *tilemap_tiles_tools_buttons = nullptr;
Ref<ButtonGroup> tool_buttons_group; Ref<ButtonGroup> tool_buttons_group;
Button *select_tool_button = nullptr; Button *select_tool_button = nullptr;
Button *paint_tool_button = nullptr; Button *paint_tool_button = nullptr;
@ -97,23 +114,23 @@ private:
Button *rect_tool_button = nullptr; Button *rect_tool_button = nullptr;
Button *bucket_tool_button = nullptr; Button *bucket_tool_button = nullptr;
HBoxContainer *tools_settings = nullptr; BoxContainer *tools_settings = nullptr;
VSeparator *tools_settings_vsep = nullptr; SwitchSeparator *tools_settings_vsep = nullptr;
Button *picker_button = nullptr; Button *picker_button = nullptr;
Button *erase_button = nullptr; Button *erase_button = nullptr;
HBoxContainer *transform_toolbar = nullptr; BoxContainer *transform_toolbar = nullptr;
Button *transform_button_rotate_left = nullptr; Button *transform_button_rotate_left = nullptr;
Button *transform_button_rotate_right = nullptr; Button *transform_button_rotate_right = nullptr;
Button *transform_button_flip_h = nullptr; Button *transform_button_flip_h = nullptr;
Button *transform_button_flip_v = nullptr; Button *transform_button_flip_v = nullptr;
SwitchSeparator *transform_separator = nullptr;
VSeparator *tools_settings_vsep_2 = nullptr;
CheckBox *bucket_contiguous_checkbox = nullptr; CheckBox *bucket_contiguous_checkbox = nullptr;
Button *random_tile_toggle = nullptr; Button *random_tile_toggle = nullptr;
HBoxContainer *scatter_controls_container = nullptr; BoxContainer *scatter_controls_container = nullptr;
float scattering = 0.0; float scattering = 0.0;
Label *scatter_label = nullptr; Label *scatter_label = nullptr;
SpinBox *scatter_spinbox = nullptr; SpinBox *scatter_spinbox = nullptr;
@ -174,6 +191,8 @@ private:
void patterns_item_list_empty_clicked(const Vector2 &p_pos, MouseButton p_mouse_button_index); void patterns_item_list_empty_clicked(const Vector2 &p_pos, MouseButton p_mouse_button_index);
///// Bottom panel common //// ///// Bottom panel common ////
BoxContainer *split_container_left_side = nullptr;
void _tab_changed(); void _tab_changed();
///// Bottom panel tiles //// ///// Bottom panel tiles ////
@ -192,7 +211,7 @@ private:
// Atlas sources. // Atlas sources.
TileMapCell hovered_tile; TileMapCell hovered_tile;
TileAtlasView *tile_atlas_view = nullptr; TileAtlasView *tile_atlas_view = nullptr;
HSplitContainer *atlas_sources_split_container = nullptr; SplitContainer *atlas_sources_split_container = nullptr;
bool tile_set_dragging_selection = false; bool tile_set_dragging_selection = false;
Vector2i tile_set_drag_start_mouse_pos; Vector2i tile_set_drag_start_mouse_pos;
@ -241,6 +260,7 @@ public:
virtual Vector<TabData> get_tabs() const override; virtual Vector<TabData> get_tabs() const override;
virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) override; virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) override;
virtual void forward_canvas_draw_over_viewport(Control *p_overlay) override; virtual void forward_canvas_draw_over_viewport(Control *p_overlay) override;
virtual void update_layout(EditorDock::DockLayout p_layout) override;
virtual void edit(ObjectID p_tile_map_layer_id) override; virtual void edit(ObjectID p_tile_map_layer_id) override;
@ -252,26 +272,27 @@ class TileMapLayerEditorTerrainsPlugin : public TileMapLayerSubEditorPlugin {
private: private:
// Toolbar. // Toolbar.
HBoxContainer *toolbar = nullptr; HBoxContainer *wide_toolbar = nullptr;
BoxContainer *tilemap_tiles_tools_buttons = nullptr;
Ref<ButtonGroup> tool_buttons_group; Ref<ButtonGroup> tool_buttons_group;
Button *paint_tool_button = nullptr; Button *paint_tool_button = nullptr;
Button *line_tool_button = nullptr; Button *line_tool_button = nullptr;
Button *rect_tool_button = nullptr; Button *rect_tool_button = nullptr;
Button *bucket_tool_button = nullptr; Button *bucket_tool_button = nullptr;
HBoxContainer *tools_settings = nullptr; BoxContainer *tools_settings = nullptr;
VSeparator *tools_settings_vsep = nullptr; SwitchSeparator *tools_settings_vsep = nullptr;
Button *picker_button = nullptr; Button *picker_button = nullptr;
Button *erase_button = nullptr; Button *erase_button = nullptr;
VSeparator *tools_settings_vsep_2 = nullptr;
CheckBox *bucket_contiguous_checkbox = nullptr; CheckBox *bucket_contiguous_checkbox = nullptr;
void _update_toolbar(); void _update_toolbar();
// Main vbox. // Main vbox.
VBoxContainer *main_vbox_container = nullptr; BoxContainer *main_box_container = nullptr;
SplitContainer *tilemap_tab_terrains = nullptr;
// TileMap editing. // TileMap editing.
bool has_mouse = false; bool has_mouse = false;
@ -332,6 +353,7 @@ public:
virtual Vector<TabData> get_tabs() const override; virtual Vector<TabData> get_tabs() const override;
virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) override; virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) override;
virtual void forward_canvas_draw_over_viewport(Control *p_overlay) override; virtual void forward_canvas_draw_over_viewport(Control *p_overlay) override;
virtual void update_layout(EditorDock::DockLayout p_layout) override;
virtual void edit(ObjectID p_tile_map_layer_id) override; virtual void edit(ObjectID p_tile_map_layer_id) override;
@ -360,11 +382,15 @@ private:
Vector<TileMapLayerSubEditorPlugin *> tile_map_editor_plugins; Vector<TileMapLayerSubEditorPlugin *> tile_map_editor_plugins;
// Toolbar. // Toolbar.
HFlowContainer *tile_map_toolbar = nullptr; GridContainer *main_box_container = nullptr;
VBoxContainer *tile_map_wide_toolbar = nullptr;
FlowContainer *tile_map_toolbar = nullptr;
Control *padding_control = nullptr;
SwitchSeparator *layer_selector_separator = nullptr;
bool show_layers_selector = false; bool show_layers_selector = false;
HBoxContainer *layer_selection_hbox = nullptr; BoxContainer *layer_selection_hbox = nullptr;
Button *select_previous_layer = nullptr; Button *select_previous_layer = nullptr;
void _select_previous_layer_pressed(); void _select_previous_layer_pressed();
Button *select_next_layer = nullptr; Button *select_next_layer = nullptr;
@ -414,6 +440,7 @@ private:
protected: protected:
void _notification(int p_what); void _notification(int p_what);
void _draw_shape(Control *p_control, Rect2 p_region, TileSet::TileShape p_shape, TileSet::TileOffsetAxis p_offset_axis, Color p_color); void _draw_shape(Control *p_control, Rect2 p_region, TileSet::TileShape p_shape, TileSet::TileOffsetAxis p_offset_axis, Color p_color);
virtual void update_layout(DockLayout p_layout) override;
public: public:
bool forward_canvas_gui_input(const Ref<InputEvent> &p_event); bool forward_canvas_gui_input(const Ref<InputEvent> &p_event);

View file

@ -37,7 +37,6 @@
#include "editor/editor_interface.h" #include "editor/editor_interface.h"
#include "editor/editor_node.h" #include "editor/editor_node.h"
#include "editor/editor_string_names.h" #include "editor/editor_string_names.h"
#include "editor/gui/editor_bottom_panel.h"
#include "editor/inspector/multi_node_edit.h" #include "editor/inspector/multi_node_edit.h"
#include "editor/scene/canvas_item_editor_plugin.h" #include "editor/scene/canvas_item_editor_plugin.h"
#include "editor/settings/editor_command_palette.h" #include "editor/settings/editor_command_palette.h"
@ -483,6 +482,7 @@ void TileMapEditorPlugin::make_visible(bool p_visible) {
editor->open(); editor->open();
} else { } else {
editor->close(); editor->close();
TileSetEditor::get_singleton()->close();
} }
} }