Merge pull request #61702 from fire-forge/tilemap-layers
This commit is contained in:
commit
f9f3db443e
2 changed files with 35 additions and 109 deletions
|
@ -2028,7 +2028,6 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() {
|
|||
|
||||
// --- Toolbar ---
|
||||
toolbar = memnew(HBoxContainer);
|
||||
toolbar->set_h_size_flags(Control::SIZE_EXPAND_FILL);
|
||||
|
||||
HBoxContainer *tilemap_tiles_tools_buttons = memnew(HBoxContainer);
|
||||
|
||||
|
@ -3423,7 +3422,7 @@ void TileMapEditor::_notification(int p_what) {
|
|||
advanced_menu_button->set_icon(get_theme_icon(SNAME("Tools"), SNAME("EditorIcons")));
|
||||
toggle_grid_button->set_icon(get_theme_icon(SNAME("Grid"), SNAME("EditorIcons")));
|
||||
toggle_grid_button->set_pressed(EditorSettings::get_singleton()->get("editors/tiles_editor/display_grid"));
|
||||
toogle_highlight_selected_layer_button->set_icon(get_theme_icon(SNAME("TileMapHighlightSelected"), SNAME("EditorIcons")));
|
||||
toggle_highlight_selected_layer_button->set_icon(get_theme_icon(SNAME("TileMapHighlightSelected"), SNAME("EditorIcons")));
|
||||
} break;
|
||||
|
||||
case NOTIFICATION_INTERNAL_PROCESS: {
|
||||
|
@ -3458,64 +3457,13 @@ void TileMapEditor::_on_grid_toggled(bool p_pressed) {
|
|||
CanvasItemEditor::get_singleton()->update_viewport();
|
||||
}
|
||||
|
||||
void TileMapEditor::_layers_selection_button_draw() {
|
||||
if (!has_theme_icon(SNAME("arrow"), SNAME("OptionButton"))) {
|
||||
void TileMapEditor::_layers_selection_item_selected(int p_index) {
|
||||
TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id));
|
||||
if (!tile_map || tile_map->get_layers_count() <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
RID ci = layers_selection_button->get_canvas_item();
|
||||
Ref<Texture2D> arrow = Control::get_theme_icon(SNAME("arrow"), SNAME("OptionButton"));
|
||||
|
||||
Color clr = Color(1, 1, 1);
|
||||
if (get_theme_constant(SNAME("modulate_arrow"))) {
|
||||
switch (layers_selection_button->get_draw_mode()) {
|
||||
case BaseButton::DRAW_PRESSED:
|
||||
clr = get_theme_color(SNAME("font_pressed_color"));
|
||||
break;
|
||||
case BaseButton::DRAW_HOVER:
|
||||
clr = get_theme_color(SNAME("font_hover_color"));
|
||||
break;
|
||||
case BaseButton::DRAW_DISABLED:
|
||||
clr = get_theme_color(SNAME("font_disabled_color"));
|
||||
break;
|
||||
default:
|
||||
if (layers_selection_button->has_focus()) {
|
||||
clr = get_theme_color(SNAME("font_focus_color"));
|
||||
} else {
|
||||
clr = get_theme_color(SNAME("font_color"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Size2 size = layers_selection_button->get_size();
|
||||
|
||||
Point2 ofs;
|
||||
if (is_layout_rtl()) {
|
||||
ofs = Point2(get_theme_constant(SNAME("arrow_margin"), SNAME("OptionButton")), int(Math::abs((size.height - arrow->get_height()) / 2)));
|
||||
} else {
|
||||
ofs = Point2(size.width - arrow->get_width() - get_theme_constant(SNAME("arrow_margin"), SNAME("OptionButton")), int(Math::abs((size.height - arrow->get_height()) / 2)));
|
||||
}
|
||||
Rect2 dst_rect = Rect2(ofs, arrow->get_size());
|
||||
if (!layers_selection_button->is_pressed()) {
|
||||
dst_rect.size = -dst_rect.size;
|
||||
}
|
||||
arrow->draw_rect(ci, dst_rect, false, clr);
|
||||
}
|
||||
|
||||
void TileMapEditor::_layers_selection_button_pressed() {
|
||||
if (!layers_selection_popup->is_visible()) {
|
||||
Size2 size = layers_selection_popup->get_contents_minimum_size();
|
||||
size.x = MAX(size.x, layers_selection_button->get_size().x);
|
||||
layers_selection_popup->set_position(layers_selection_button->get_screen_position() - Size2(0, size.y * get_global_transform().get_scale().y));
|
||||
layers_selection_popup->set_size(size);
|
||||
layers_selection_popup->popup();
|
||||
} else {
|
||||
layers_selection_popup->hide();
|
||||
}
|
||||
}
|
||||
|
||||
void TileMapEditor::_layers_selection_id_pressed(int p_id) {
|
||||
tile_map_layer = p_id;
|
||||
tile_map_layer = p_index;
|
||||
_update_layers_selection();
|
||||
}
|
||||
|
||||
|
@ -3698,8 +3646,6 @@ void TileMapEditor::_layers_select_next_or_previous(bool p_next) {
|
|||
}
|
||||
|
||||
void TileMapEditor::_update_layers_selection() {
|
||||
layers_selection_popup->clear();
|
||||
|
||||
TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id));
|
||||
if (!tile_map) {
|
||||
return;
|
||||
|
@ -3726,33 +3672,24 @@ void TileMapEditor::_update_layers_selection() {
|
|||
} else {
|
||||
tile_map_layer = -1;
|
||||
}
|
||||
tile_map->set_selected_layer(toogle_highlight_selected_layer_button->is_pressed() ? tile_map_layer : -1);
|
||||
tile_map->set_selected_layer(toggle_highlight_selected_layer_button->is_pressed() ? tile_map_layer : -1);
|
||||
|
||||
layers_selection_button->clear();
|
||||
if (tile_map->get_layers_count() > 0) {
|
||||
// Build the list of layers.
|
||||
for (int i = 0; i < tile_map->get_layers_count(); i++) {
|
||||
String name = tile_map->get_layer_name(i);
|
||||
layers_selection_popup->add_item(name.is_empty() ? vformat(TTR("Layer #%d"), i) : name, i);
|
||||
layers_selection_popup->set_item_as_radio_checkable(i, true);
|
||||
layers_selection_popup->set_item_disabled(i, !tile_map->is_layer_enabled(i));
|
||||
layers_selection_popup->set_item_checked(i, i == tile_map_layer);
|
||||
layers_selection_button->add_item(name.is_empty() ? vformat(TTR("Layer %d"), i) : name, i);
|
||||
layers_selection_button->set_item_disabled(i, !tile_map->is_layer_enabled(i));
|
||||
}
|
||||
|
||||
// Update the button label.
|
||||
if (tile_map_layer >= 0) {
|
||||
layers_selection_button->set_text(layers_selection_popup->get_item_text(tile_map_layer));
|
||||
layers_selection_button->set_disabled(false);
|
||||
layers_selection_button->select(tile_map_layer);
|
||||
} else {
|
||||
layers_selection_button->set_text(TTR("Select a layer"));
|
||||
layers_selection_button->set_disabled(true);
|
||||
layers_selection_button->set_text(TTR("No Layers"));
|
||||
}
|
||||
|
||||
// Set button minimum width.
|
||||
Size2 min_button_size = Size2(layers_selection_popup->get_contents_minimum_size().x, 0);
|
||||
if (has_theme_icon(SNAME("arrow"), SNAME("OptionButton"))) {
|
||||
Ref<Texture2D> arrow = Control::get_theme_icon(SNAME("arrow"), SNAME("OptionButton"));
|
||||
min_button_size.x += arrow->get_size().x;
|
||||
}
|
||||
layers_selection_button->set_custom_minimum_size(min_button_size);
|
||||
layers_selection_button->update();
|
||||
|
||||
tabs_plugins[tabs_bar->get_current_tab()]->edit(tile_map_id, tile_map_layer);
|
||||
}
|
||||
|
||||
|
@ -4028,7 +3965,6 @@ TileMapEditor::TileMapEditor() {
|
|||
|
||||
// TabBar.
|
||||
tabs_bar = memnew(TabBar);
|
||||
tabs_bar->set_tab_alignment(TabBar::ALIGNMENT_CENTER);
|
||||
tabs_bar->set_clip_tabs(false);
|
||||
for (int plugin_index = 0; plugin_index < tile_map_editor_plugins.size(); plugin_index++) {
|
||||
Vector<TileMapEditorPlugin::TabData> tabs_vector = tile_map_editor_plugins[plugin_index]->get_tabs();
|
||||
|
@ -4057,31 +3993,23 @@ TileMapEditor::TileMapEditor() {
|
|||
}
|
||||
|
||||
// Wide empty separation control.
|
||||
Control *h_empty_space = memnew(Control);
|
||||
h_empty_space->set_h_size_flags(SIZE_EXPAND_FILL);
|
||||
tile_map_toolbar->add_child(h_empty_space);
|
||||
tile_map_toolbar->add_spacer();
|
||||
|
||||
// Layer selector.
|
||||
layers_selection_popup = memnew(PopupMenu);
|
||||
layers_selection_popup->connect("id_pressed", callable_mp(this, &TileMapEditor::_layers_selection_id_pressed));
|
||||
layers_selection_popup->set_flag(Window::FLAG_POPUP, false);
|
||||
|
||||
layers_selection_button = memnew(Button);
|
||||
layers_selection_button->set_toggle_mode(true);
|
||||
layers_selection_button->connect("draw", callable_mp(this, &TileMapEditor::_layers_selection_button_draw));
|
||||
layers_selection_button->connect("pressed", callable_mp(this, &TileMapEditor::_layers_selection_button_pressed));
|
||||
layers_selection_button->connect("hidden", callable_mp((Window *)layers_selection_popup, &Popup::hide));
|
||||
layers_selection_button->set_tooltip(TTR("Tile Map Layer"));
|
||||
layers_selection_button->add_child(layers_selection_popup);
|
||||
layers_selection_button = memnew(OptionButton);
|
||||
layers_selection_button->set_custom_minimum_size(Size2(200, 0));
|
||||
layers_selection_button->set_text_overrun_behavior(TextParagraph::OVERRUN_TRIM_ELLIPSIS);
|
||||
layers_selection_button->set_tooltip(TTR("TileMap Layers"));
|
||||
layers_selection_button->connect("item_selected", callable_mp(this, &TileMapEditor::_layers_selection_item_selected));
|
||||
tile_map_toolbar->add_child(layers_selection_button);
|
||||
|
||||
toogle_highlight_selected_layer_button = memnew(Button);
|
||||
toogle_highlight_selected_layer_button->set_flat(true);
|
||||
toogle_highlight_selected_layer_button->set_toggle_mode(true);
|
||||
toogle_highlight_selected_layer_button->set_pressed(true);
|
||||
toogle_highlight_selected_layer_button->connect("pressed", callable_mp(this, &TileMapEditor::_update_layers_selection));
|
||||
toogle_highlight_selected_layer_button->set_tooltip(TTR("Highlight Selected TileMap Layer"));
|
||||
tile_map_toolbar->add_child(toogle_highlight_selected_layer_button);
|
||||
toggle_highlight_selected_layer_button = memnew(Button);
|
||||
toggle_highlight_selected_layer_button->set_flat(true);
|
||||
toggle_highlight_selected_layer_button->set_toggle_mode(true);
|
||||
toggle_highlight_selected_layer_button->set_pressed(true);
|
||||
toggle_highlight_selected_layer_button->connect("pressed", callable_mp(this, &TileMapEditor::_update_layers_selection));
|
||||
toggle_highlight_selected_layer_button->set_tooltip(TTR("Highlight Selected TileMap Layer"));
|
||||
tile_map_toolbar->add_child(toggle_highlight_selected_layer_button);
|
||||
|
||||
tile_map_toolbar->add_child(memnew(VSeparator));
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include "scene/gui/check_box.h"
|
||||
#include "scene/gui/item_list.h"
|
||||
#include "scene/gui/menu_button.h"
|
||||
#include "scene/gui/option_button.h"
|
||||
#include "scene/gui/separator.h"
|
||||
#include "scene/gui/spin_box.h"
|
||||
#include "scene/gui/split_container.h"
|
||||
|
@ -327,12 +328,9 @@ private:
|
|||
// Toolbar.
|
||||
HBoxContainer *tile_map_toolbar = nullptr;
|
||||
|
||||
PopupMenu *layers_selection_popup = nullptr;
|
||||
Button *layers_selection_button = nullptr;
|
||||
Button *toogle_highlight_selected_layer_button = nullptr;
|
||||
void _layers_selection_button_draw();
|
||||
void _layers_selection_button_pressed();
|
||||
void _layers_selection_id_pressed(int p_id);
|
||||
OptionButton *layers_selection_button = nullptr;
|
||||
Button *toggle_highlight_selected_layer_button = nullptr;
|
||||
void _layers_selection_item_selected(int p_index);
|
||||
|
||||
Button *toggle_grid_button = nullptr;
|
||||
void _on_grid_toggled(bool p_pressed);
|
||||
|
|
Loading…
Reference in a new issue