mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2025-01-23 17:47:17 +01:00
Ported: Improve Select Frames dialog of SpriteFrames editor. - timothyqiu
32488b46a6
This commit is contained in:
parent
15b447d880
commit
79c193aabb
@ -30,24 +30,18 @@
|
||||
|
||||
#include "sprite_frames_editor_plugin.h"
|
||||
|
||||
#include "core/io/resource_loader.h"
|
||||
#include "core/os/input.h"
|
||||
#include "core/os/keyboard.h"
|
||||
#include "editor/editor_scale.h"
|
||||
#include "editor/editor_settings.h"
|
||||
#include "scene/3d/sprite_3d.h"
|
||||
#include "scene/gui/center_container.h"
|
||||
#include "scene/gui/margin_container.h"
|
||||
#include "scene/gui/panel_container.h"
|
||||
#include "core/class_db.h"
|
||||
#include "core/color.h"
|
||||
#include "core/dictionary.h"
|
||||
#include "core/error_macros.h"
|
||||
#include "core/io/resource_loader.h"
|
||||
#include "core/list.h"
|
||||
#include "core/math/math_defs.h"
|
||||
#include "core/math/math_funcs.h"
|
||||
#include "core/math/rect2.h"
|
||||
#include "core/os/input.h"
|
||||
#include "core/os/input_event.h"
|
||||
#include "core/os/keyboard.h"
|
||||
#include "core/os/memory.h"
|
||||
#include "core/pool_vector.h"
|
||||
#include "core/resource.h"
|
||||
@ -57,15 +51,21 @@
|
||||
#include "editor/editor_file_dialog.h"
|
||||
#include "editor/editor_file_system.h"
|
||||
#include "editor/editor_node.h"
|
||||
#include "editor/editor_scale.h"
|
||||
#include "editor/editor_settings.h"
|
||||
#include "scene/2d/animated_sprite.h"
|
||||
#include "scene/3d/sprite_3d.h"
|
||||
#include "scene/gui/box_container.h"
|
||||
#include "scene/gui/button.h"
|
||||
#include "scene/gui/center_container.h"
|
||||
#include "scene/gui/check_button.h"
|
||||
#include "scene/gui/control.h"
|
||||
#include "scene/gui/dialogs.h"
|
||||
#include "scene/gui/item_list.h"
|
||||
#include "scene/gui/label.h"
|
||||
#include "scene/gui/line_edit.h"
|
||||
#include "scene/gui/margin_container.h"
|
||||
#include "scene/gui/panel_container.h"
|
||||
#include "scene/gui/scroll_container.h"
|
||||
#include "scene/gui/separator.h"
|
||||
#include "scene/gui/spin_box.h"
|
||||
@ -75,6 +75,11 @@
|
||||
#include "scene/main/node.h"
|
||||
#include "scene/resources/texture.h"
|
||||
|
||||
static void _draw_shadowed_line(Control *p_control, const Point2 &p_from, const Size2 &p_size, const Size2 &p_shadow_offset, Color p_color, Color p_shadow_color) {
|
||||
p_control->draw_line(p_from, p_from + p_size, p_color);
|
||||
p_control->draw_line(p_from + p_shadow_offset, p_from + p_size + p_shadow_offset, p_shadow_color);
|
||||
}
|
||||
|
||||
void SpriteFramesEditor::_gui_input(Ref<InputEvent> p_event) {
|
||||
}
|
||||
|
||||
@ -90,46 +95,62 @@ void SpriteFramesEditor::_open_sprite_sheet() {
|
||||
}
|
||||
|
||||
int SpriteFramesEditor::_sheet_preview_position_to_frame_index(const Point2 &p_position) {
|
||||
if (p_position.x < 0 || p_position.y < 0) {
|
||||
return -1;
|
||||
const Size2i offset = _get_offset();
|
||||
const Size2i frame_size = _get_frame_size();
|
||||
const Size2i separation = _get_separation();
|
||||
const Size2i block_size = frame_size + separation;
|
||||
const Point2i position = p_position / sheet_zoom - offset;
|
||||
|
||||
if (position.x % block_size.x > frame_size.x || position.y % block_size.y > frame_size.y) {
|
||||
return -1; // Gap between frames.
|
||||
}
|
||||
|
||||
Size2i texture_size = split_sheet_preview->get_texture()->get_size();
|
||||
int h = split_sheet_h->get_value();
|
||||
int v = split_sheet_v->get_value();
|
||||
if (h > texture_size.width || v > texture_size.height) {
|
||||
return -1;
|
||||
const Point2i frame = position / block_size;
|
||||
const Size2i frame_count = _get_frame_count();
|
||||
if (frame.x < 0 || frame.y < 0 || frame.x >= frame_count.x || frame.y >= frame_count.y) {
|
||||
return -1; // Out of bound.
|
||||
}
|
||||
|
||||
int x = int(p_position.x / sheet_zoom) / (texture_size.width / h);
|
||||
int y = int(p_position.y / sheet_zoom) / (texture_size.height / v);
|
||||
if (x >= h || y >= v) {
|
||||
return -1;
|
||||
}
|
||||
return h * y + x;
|
||||
return frame_count.x * frame.y + frame.x;
|
||||
}
|
||||
|
||||
void SpriteFramesEditor::_sheet_preview_draw() {
|
||||
Size2i texture_size = split_sheet_preview->get_texture()->get_size();
|
||||
int h = split_sheet_h->get_value();
|
||||
int v = split_sheet_v->get_value();
|
||||
const Size2i frame_count = _get_frame_count();
|
||||
const Size2i separation = _get_separation();
|
||||
|
||||
real_t width = (texture_size.width / h) * sheet_zoom;
|
||||
real_t height = (texture_size.height / v) * sheet_zoom;
|
||||
const float a = 0.3;
|
||||
const Size2 draw_offset = Size2(_get_offset()) * sheet_zoom;
|
||||
const Size2 draw_sep = Size2(separation) * sheet_zoom;
|
||||
const Size2 draw_frame_size = Size2(_get_frame_size()) * sheet_zoom;
|
||||
const Size2 draw_size = draw_frame_size * frame_count + draw_sep * (frame_count - Size2i(1, 1));
|
||||
|
||||
real_t y_end = v * height;
|
||||
for (int i = 0; i <= h; i++) {
|
||||
real_t x = i * width;
|
||||
split_sheet_preview->draw_line(Point2(x, 0), Point2(x, y_end), Color(1, 1, 1, a));
|
||||
split_sheet_preview->draw_line(Point2(x + 1, 0), Point2(x + 1, y_end), Color(0, 0, 0, a));
|
||||
const Color line_color = Color(1, 1, 1, 0.3);
|
||||
const Color shadow_color = Color(0, 0, 0, 0.3);
|
||||
|
||||
// Vertical lines.
|
||||
_draw_shadowed_line(split_sheet_preview, draw_offset, Vector2(0, draw_size.y), Vector2(1, 0), line_color, shadow_color);
|
||||
for (int i = 0; i < frame_count.x - 1; i++) {
|
||||
const Point2 start = draw_offset + Vector2(i * draw_sep.x + (i + 1) * draw_frame_size.x, 0);
|
||||
if (separation.x == 0) {
|
||||
_draw_shadowed_line(split_sheet_preview, start, Vector2(0, draw_size.y), Vector2(1, 0), line_color, shadow_color);
|
||||
} else {
|
||||
const Size2 size = Size2(draw_sep.x, draw_size.y);
|
||||
split_sheet_preview->draw_rect(Rect2(start, size), line_color);
|
||||
}
|
||||
}
|
||||
real_t x_end = h * width;
|
||||
for (int i = 0; i <= v; i++) {
|
||||
real_t y = i * height;
|
||||
split_sheet_preview->draw_line(Point2(0, y), Point2(x_end, y), Color(1, 1, 1, a));
|
||||
split_sheet_preview->draw_line(Point2(0, y + 1), Point2(x_end, y + 1), Color(0, 0, 0, a));
|
||||
_draw_shadowed_line(split_sheet_preview, draw_offset + Vector2(draw_size.x, 0), Vector2(0, draw_size.y), Vector2(1, 0), line_color, shadow_color);
|
||||
|
||||
// Horizontal lines.
|
||||
_draw_shadowed_line(split_sheet_preview, draw_offset, Vector2(draw_size.x, 0), Vector2(0, 1), line_color, shadow_color);
|
||||
for (int i = 0; i < frame_count.y - 1; i++) {
|
||||
const Point2 start = draw_offset + Vector2(0, i * draw_sep.y + (i + 1) * draw_frame_size.y);
|
||||
if (separation.y == 0) {
|
||||
_draw_shadowed_line(split_sheet_preview, start, Vector2(draw_size.x, 0), Vector2(0, 1), line_color, shadow_color);
|
||||
} else {
|
||||
const Size2 size = Size2(draw_size.x, draw_sep.y);
|
||||
split_sheet_preview->draw_rect(Rect2(start, size), line_color);
|
||||
}
|
||||
}
|
||||
_draw_shadowed_line(split_sheet_preview, draw_offset + Vector2(0, draw_size.y), Vector2(draw_size.x, 0), Vector2(0, 1), line_color, shadow_color);
|
||||
|
||||
if (frames_selected.size() == 0) {
|
||||
split_sheet_dialog->get_ok()->set_disabled(true);
|
||||
@ -140,19 +161,17 @@ void SpriteFramesEditor::_sheet_preview_draw() {
|
||||
Color accent = get_color("accent_color", "Editor");
|
||||
|
||||
for (Set<int>::Element *E = frames_selected.front(); E; E = E->next()) {
|
||||
int idx = E->get();
|
||||
int xp = idx % h;
|
||||
int yp = idx / h;
|
||||
real_t x = xp * width;
|
||||
real_t y = yp * height;
|
||||
|
||||
split_sheet_preview->draw_rect(Rect2(x + 5, y + 5, width - 10, height - 10), Color(0, 0, 0, 0.35), true);
|
||||
split_sheet_preview->draw_rect(Rect2(x + 0, y + 0, width - 0, height - 0), Color(0, 0, 0, 1), false);
|
||||
split_sheet_preview->draw_rect(Rect2(x + 1, y + 1, width - 2, height - 2), Color(0, 0, 0, 1), false);
|
||||
split_sheet_preview->draw_rect(Rect2(x + 2, y + 2, width - 4, height - 4), accent, false);
|
||||
split_sheet_preview->draw_rect(Rect2(x + 3, y + 3, width - 6, height - 6), accent, false);
|
||||
split_sheet_preview->draw_rect(Rect2(x + 4, y + 4, width - 8, height - 8), Color(0, 0, 0, 1), false);
|
||||
split_sheet_preview->draw_rect(Rect2(x + 5, y + 5, width - 10, height - 10), Color(0, 0, 0, 1), false);
|
||||
const int idx = E->get();
|
||||
const int x = idx % frame_count.x;
|
||||
const int y = idx / frame_count.x;
|
||||
const Point2 pos = draw_offset + Point2(x, y) * (draw_frame_size + draw_sep);
|
||||
split_sheet_preview->draw_rect(Rect2(pos + Size2(5, 5), draw_frame_size - Size2(10, 10)), Color(0, 0, 0, 0.35), true);
|
||||
split_sheet_preview->draw_rect(Rect2(pos, draw_frame_size), Color(0, 0, 0, 1), false);
|
||||
split_sheet_preview->draw_rect(Rect2(pos + Size2(1, 1), draw_frame_size - Size2(2, 2)), Color(0, 0, 0, 1), false);
|
||||
split_sheet_preview->draw_rect(Rect2(pos + Size2(2, 2), draw_frame_size - Size2(4, 4)), accent, false);
|
||||
split_sheet_preview->draw_rect(Rect2(pos + Size2(3, 3), draw_frame_size - Size2(6, 6)), accent, false);
|
||||
split_sheet_preview->draw_rect(Rect2(pos + Size2(4, 4), draw_frame_size - Size2(8, 8)), Color(0, 0, 0, 1), false);
|
||||
split_sheet_preview->draw_rect(Rect2(pos + Size2(5, 5), draw_frame_size - Size2(10, 10)), Color(0, 0, 0, 1), false);
|
||||
}
|
||||
|
||||
split_sheet_dialog->get_ok()->set_disabled(false);
|
||||
@ -247,10 +266,10 @@ void SpriteFramesEditor::_sheet_scroll_input(const Ref<InputEvent> &p_event) {
|
||||
}
|
||||
|
||||
void SpriteFramesEditor::_sheet_add_frames() {
|
||||
Size2i texture_size = split_sheet_preview->get_texture()->get_size();
|
||||
int frame_count_x = split_sheet_h->get_value();
|
||||
int frame_count_y = split_sheet_v->get_value();
|
||||
Size2 frame_size(texture_size.width / frame_count_x, texture_size.height / frame_count_y);
|
||||
const Size2i frame_count = _get_frame_count();
|
||||
const Size2i frame_size = _get_frame_size();
|
||||
const Size2i offset = _get_offset();
|
||||
const Size2i separation = _get_separation();
|
||||
|
||||
undo_redo->create_action(TTR("Add Frame"));
|
||||
|
||||
@ -258,12 +277,12 @@ void SpriteFramesEditor::_sheet_add_frames() {
|
||||
|
||||
for (Set<int>::Element *E = frames_selected.front(); E; E = E->next()) {
|
||||
int idx = E->get();
|
||||
Point2 frame_coords(idx % frame_count_x, idx / frame_count_x);
|
||||
const Point2 frame_coords(idx % frame_count.x, idx / frame_count.x);
|
||||
|
||||
Ref<AtlasTexture> at;
|
||||
at.instance();
|
||||
at->set_atlas(split_sheet_preview->get_texture());
|
||||
at->set_region(Rect2(frame_coords * frame_size, frame_size));
|
||||
at->set_region(Rect2(offset + frame_coords * (frame_size + separation), frame_size));
|
||||
|
||||
undo_redo->add_do_method(frames, "add_frame", edited_anim, at, -1);
|
||||
undo_redo->add_undo_method(frames, "remove_frame", edited_anim, fc);
|
||||
@ -312,7 +331,57 @@ void SpriteFramesEditor::_sheet_select_clear_all_frames() {
|
||||
split_sheet_preview->update();
|
||||
}
|
||||
|
||||
void SpriteFramesEditor::_sheet_spin_changed(double) {
|
||||
void SpriteFramesEditor::_sheet_spin_changed(double p_value, int p_dominant_param) {
|
||||
if (updating_split_settings) {
|
||||
return;
|
||||
}
|
||||
updating_split_settings = true;
|
||||
|
||||
if (p_dominant_param != PARAM_USE_CURRENT) {
|
||||
dominant_param = p_dominant_param;
|
||||
}
|
||||
|
||||
const Size2i texture_size = split_sheet_preview->get_texture()->get_size();
|
||||
const Size2i size = texture_size - _get_offset();
|
||||
|
||||
switch (dominant_param) {
|
||||
case PARAM_SIZE: {
|
||||
const Size2i frame_size = _get_frame_size();
|
||||
|
||||
const Size2i offset_max = texture_size - frame_size;
|
||||
split_sheet_offset_x->set_max(offset_max.x);
|
||||
split_sheet_offset_y->set_max(offset_max.y);
|
||||
|
||||
const Size2i sep_max = size - frame_size * 2;
|
||||
split_sheet_sep_x->set_max(sep_max.x);
|
||||
split_sheet_sep_y->set_max(sep_max.y);
|
||||
|
||||
const Size2i separation = _get_separation();
|
||||
const Size2i count = (size + separation) / (frame_size + separation);
|
||||
split_sheet_h->set_value(count.x);
|
||||
split_sheet_v->set_value(count.y);
|
||||
} break;
|
||||
|
||||
case PARAM_FRAME_COUNT: {
|
||||
const Size2i count = _get_frame_count();
|
||||
|
||||
const Size2i offset_max = texture_size - count;
|
||||
split_sheet_offset_x->set_max(offset_max.x);
|
||||
split_sheet_offset_y->set_max(offset_max.y);
|
||||
|
||||
const Size2i gap_count = count - Size2i(1, 1);
|
||||
split_sheet_sep_x->set_max(gap_count.x == 0 ? size.x : (size.x - count.x) / gap_count.x);
|
||||
split_sheet_sep_y->set_max(gap_count.y == 0 ? size.y : (size.y - count.y) / gap_count.y);
|
||||
|
||||
const Size2i separation = _get_separation();
|
||||
const Size2i frame_size = (size - separation * gap_count) / count;
|
||||
split_sheet_size_x->set_value(frame_size.x);
|
||||
split_sheet_size_y->set_value(frame_size.y);
|
||||
} break;
|
||||
}
|
||||
|
||||
updating_split_settings = false;
|
||||
|
||||
frames_selected.clear();
|
||||
last_frame_selected = -1;
|
||||
split_sheet_preview->update();
|
||||
@ -329,13 +398,34 @@ void SpriteFramesEditor::_prepare_sprite_sheet(const String &p_file) {
|
||||
|
||||
bool new_texture = texture != split_sheet_preview->get_texture();
|
||||
split_sheet_preview->set_texture(texture);
|
||||
|
||||
if (new_texture) {
|
||||
//different texture, reset to 4x4
|
||||
// Reset spin max.
|
||||
const Size2i size = texture->get_size();
|
||||
split_sheet_size_x->set_max(size.x);
|
||||
split_sheet_size_y->set_max(size.y);
|
||||
split_sheet_sep_x->set_max(size.x);
|
||||
split_sheet_sep_y->set_max(size.y);
|
||||
split_sheet_offset_x->set_max(size.x);
|
||||
split_sheet_offset_y->set_max(size.y);
|
||||
|
||||
// Different texture, reset to 4x4.
|
||||
dominant_param = PARAM_FRAME_COUNT;
|
||||
updating_split_settings = true;
|
||||
split_sheet_h->set_value(4);
|
||||
split_sheet_v->set_value(4);
|
||||
//reset zoom
|
||||
split_sheet_size_x->set_value(size.x / 4);
|
||||
split_sheet_size_y->set_value(size.y / 4);
|
||||
split_sheet_sep_x->set_value(0);
|
||||
split_sheet_sep_y->set_value(0);
|
||||
split_sheet_offset_x->set_value(0);
|
||||
split_sheet_offset_y->set_value(0);
|
||||
updating_split_settings = false;
|
||||
|
||||
// Reset zoom.
|
||||
_sheet_zoom_reset();
|
||||
}
|
||||
|
||||
split_sheet_dialog->popup_centered_ratio(0.65);
|
||||
}
|
||||
|
||||
@ -412,6 +502,22 @@ void SpriteFramesEditor::_file_load_request(const PoolVector<String> &p_path, in
|
||||
undo_redo->commit_action();
|
||||
}
|
||||
|
||||
Size2i SpriteFramesEditor::_get_frame_count() const {
|
||||
return Size2i(split_sheet_h->get_value(), split_sheet_v->get_value());
|
||||
}
|
||||
|
||||
Size2i SpriteFramesEditor::_get_frame_size() const {
|
||||
return Size2i(split_sheet_size_x->get_value(), split_sheet_size_y->get_value());
|
||||
}
|
||||
|
||||
Size2i SpriteFramesEditor::_get_offset() const {
|
||||
return Size2i(split_sheet_offset_x->get_value(), split_sheet_offset_y->get_value());
|
||||
}
|
||||
|
||||
Size2i SpriteFramesEditor::_get_separation() const {
|
||||
return Size2i(split_sheet_sep_x->get_value(), split_sheet_sep_y->get_value());
|
||||
}
|
||||
|
||||
void SpriteFramesEditor::_load_pressed() {
|
||||
ERR_FAIL_COND(!frames->has_animation(edited_anim));
|
||||
loading_scene = false;
|
||||
@ -1244,27 +1350,71 @@ SpriteFramesEditor::SpriteFramesEditor() {
|
||||
VBoxContainer *split_sheet_vb = memnew(VBoxContainer);
|
||||
split_sheet_dialog->add_child(split_sheet_vb);
|
||||
split_sheet_dialog->set_title(TTR("Select Frames"));
|
||||
split_sheet_dialog->set_resizable(true);
|
||||
split_sheet_dialog->connect("confirmed", this, "_sheet_add_frames");
|
||||
|
||||
HBoxContainer *split_sheet_hb = memnew(HBoxContainer);
|
||||
|
||||
Label *ss_label = memnew(Label(TTR("Horizontal:")));
|
||||
split_sheet_hb->add_child(ss_label);
|
||||
split_sheet_hb->add_child(memnew(Label(TTR("Horizontal:"))));
|
||||
split_sheet_h = memnew(SpinBox);
|
||||
split_sheet_h->set_min(1);
|
||||
split_sheet_h->set_max(128);
|
||||
split_sheet_h->set_step(1);
|
||||
split_sheet_hb->add_child(split_sheet_h);
|
||||
split_sheet_h->connect("value_changed", this, "_sheet_spin_changed");
|
||||
split_sheet_h->connect("value_changed", this, "_sheet_spin_changed", varray(PARAM_FRAME_COUNT));
|
||||
|
||||
ss_label = memnew(Label(TTR("Vertical:")));
|
||||
split_sheet_hb->add_child(ss_label);
|
||||
split_sheet_hb->add_child(memnew(Label(TTR("Vertical:"))));
|
||||
split_sheet_v = memnew(SpinBox);
|
||||
split_sheet_v->set_min(1);
|
||||
split_sheet_v->set_max(128);
|
||||
split_sheet_v->set_step(1);
|
||||
split_sheet_hb->add_child(split_sheet_v);
|
||||
split_sheet_v->connect("value_changed", this, "_sheet_spin_changed");
|
||||
split_sheet_v->connect("value_changed", this, "_sheet_spin_changed", varray(PARAM_FRAME_COUNT));
|
||||
|
||||
split_sheet_hb->add_child(memnew(VSeparator));
|
||||
split_sheet_hb->add_child(memnew(Label(TTR("Size:"))));
|
||||
split_sheet_size_x = memnew(SpinBox);
|
||||
split_sheet_size_x->set_min(1);
|
||||
split_sheet_size_x->set_step(1);
|
||||
split_sheet_size_x->set_suffix("px");
|
||||
split_sheet_size_x->connect("value_changed", this, "_sheet_spin_changed", varray(PARAM_SIZE));
|
||||
split_sheet_hb->add_child(split_sheet_size_x);
|
||||
split_sheet_size_y = memnew(SpinBox);
|
||||
split_sheet_size_y->set_min(1);
|
||||
split_sheet_size_y->set_step(1);
|
||||
split_sheet_size_y->set_suffix("px");
|
||||
split_sheet_size_y->connect("value_changed", this, "_sheet_spin_changed", varray(PARAM_SIZE));
|
||||
split_sheet_hb->add_child(split_sheet_size_y);
|
||||
|
||||
split_sheet_hb->add_child(memnew(VSeparator));
|
||||
split_sheet_hb->add_child(memnew(Label(TTR("Separation:"))));
|
||||
split_sheet_sep_x = memnew(SpinBox);
|
||||
split_sheet_sep_x->set_min(0);
|
||||
split_sheet_sep_x->set_step(1);
|
||||
split_sheet_sep_x->set_suffix("px");
|
||||
split_sheet_sep_x->connect("value_changed", this, "_sheet_spin_changed", varray(PARAM_USE_CURRENT));
|
||||
split_sheet_hb->add_child(split_sheet_sep_x);
|
||||
split_sheet_sep_y = memnew(SpinBox);
|
||||
split_sheet_sep_y->set_min(0);
|
||||
split_sheet_sep_y->set_step(1);
|
||||
split_sheet_sep_y->set_suffix("px");
|
||||
split_sheet_sep_y->connect("value_changed", this, "_sheet_spin_changed", varray(PARAM_USE_CURRENT));
|
||||
split_sheet_hb->add_child(split_sheet_sep_y);
|
||||
|
||||
split_sheet_hb->add_child(memnew(VSeparator));
|
||||
split_sheet_hb->add_child(memnew(Label(TTR("Offset:"))));
|
||||
split_sheet_offset_x = memnew(SpinBox);
|
||||
split_sheet_offset_x->set_min(0);
|
||||
split_sheet_offset_x->set_step(1);
|
||||
split_sheet_offset_x->set_suffix("px");
|
||||
split_sheet_offset_x->connect("value_changed", this, "_sheet_spin_changed", varray(PARAM_USE_CURRENT));
|
||||
split_sheet_hb->add_child(split_sheet_offset_x);
|
||||
split_sheet_offset_y = memnew(SpinBox);
|
||||
split_sheet_offset_y->set_min(0);
|
||||
split_sheet_offset_y->set_step(1);
|
||||
split_sheet_offset_y->set_suffix("px");
|
||||
split_sheet_offset_y->connect("value_changed", this, "_sheet_spin_changed", varray(PARAM_USE_CURRENT));
|
||||
split_sheet_hb->add_child(split_sheet_offset_y);
|
||||
|
||||
split_sheet_hb->add_spacer();
|
||||
|
||||
@ -1340,6 +1490,8 @@ SpriteFramesEditor::SpriteFramesEditor() {
|
||||
sheet_zoom = MAX(1.0f, EDSCALE);
|
||||
max_sheet_zoom = 16.0f * MAX(1.0f, EDSCALE);
|
||||
min_sheet_zoom = 0.01f * MAX(1.0f, EDSCALE);
|
||||
updating_split_settings = false;
|
||||
|
||||
_zoom_reset();
|
||||
}
|
||||
|
||||
|
@ -30,11 +30,12 @@
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "scene/gui/split_container.h"
|
||||
#include "editor/editor_plugin.h"
|
||||
#include "scene/gui/split_container.h"
|
||||
|
||||
#include "core/math/vector2.h"
|
||||
#include "core/object.h"
|
||||
#include "core/pool_vector.h"
|
||||
#include "core/reference.h"
|
||||
#include "core/set.h"
|
||||
#include "core/string_name.h"
|
||||
@ -57,11 +58,17 @@ class TextureRect;
|
||||
class ToolButton;
|
||||
class Tree;
|
||||
class UndoRedo;
|
||||
template <class T> class PoolVector;
|
||||
|
||||
class SpriteFramesEditor : public HSplitContainer {
|
||||
GDCLASS(SpriteFramesEditor, HSplitContainer);
|
||||
|
||||
enum {
|
||||
PARAM_USE_CURRENT, // Used in callbacks to indicate `dominant_param` should be not updated.
|
||||
PARAM_FRAME_COUNT, // Keep "Horizontal" & "Vertial" values.
|
||||
PARAM_SIZE, // Keep "Size" values.
|
||||
};
|
||||
int dominant_param = PARAM_FRAME_COUNT;
|
||||
|
||||
ToolButton *load;
|
||||
ToolButton *load_sheet;
|
||||
ToolButton *_delete;
|
||||
@ -100,6 +107,12 @@ class SpriteFramesEditor : public HSplitContainer {
|
||||
TextureRect *split_sheet_preview;
|
||||
SpinBox *split_sheet_h;
|
||||
SpinBox *split_sheet_v;
|
||||
SpinBox *split_sheet_size_x;
|
||||
SpinBox *split_sheet_size_y;
|
||||
SpinBox *split_sheet_sep_x;
|
||||
SpinBox *split_sheet_sep_y;
|
||||
SpinBox *split_sheet_offset_x;
|
||||
SpinBox *split_sheet_offset_y;
|
||||
ToolButton *split_sheet_zoom_out;
|
||||
ToolButton *split_sheet_zoom_reset;
|
||||
ToolButton *split_sheet_zoom_in;
|
||||
@ -117,6 +130,11 @@ class SpriteFramesEditor : public HSplitContainer {
|
||||
float max_sheet_zoom;
|
||||
float min_sheet_zoom;
|
||||
|
||||
Size2i _get_frame_count() const;
|
||||
Size2i _get_frame_size() const;
|
||||
Size2i _get_offset() const;
|
||||
Size2i _get_separation() const;
|
||||
|
||||
void _load_pressed();
|
||||
void _file_load_request(const PoolVector<String> &p_path, int p_at_pos = -1);
|
||||
void _copy_pressed();
|
||||
@ -142,6 +160,7 @@ class SpriteFramesEditor : public HSplitContainer {
|
||||
void _zoom_reset();
|
||||
|
||||
bool updating;
|
||||
bool updating_split_settings; // Skip SpinBox/Range callback when setting value by code.
|
||||
|
||||
UndoRedo *undo_redo;
|
||||
|
||||
@ -153,7 +172,7 @@ class SpriteFramesEditor : public HSplitContainer {
|
||||
void _prepare_sprite_sheet(const String &p_file);
|
||||
int _sheet_preview_position_to_frame_index(const Vector2 &p_position);
|
||||
void _sheet_preview_draw();
|
||||
void _sheet_spin_changed(double);
|
||||
void _sheet_spin_changed(double p_value, int p_dominant_param);
|
||||
void _sheet_preview_input(const Ref<InputEvent> &p_event);
|
||||
void _sheet_scroll_input(const Ref<InputEvent> &p_event);
|
||||
void _sheet_add_frames();
|
||||
|
Loading…
Reference in New Issue
Block a user