Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 151 additions & 25 deletions data/images/tiles.strf

Large diffs are not rendered by default.

17 changes: 11 additions & 6 deletions src/editor/editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#endif

#include <fmt/format.h>
#include <SDL.h>

#include "zip_manager.hpp"

Expand Down Expand Up @@ -409,10 +410,14 @@ Editor::open_level_directory()
void
Editor::scroll(const Vector& velocity)
{
if (!m_levelloaded) return;

m_sector->get_camera().move(velocity / m_sector->get_camera().get_current_scale());
keep_camera_in_bounds();
const Uint16 mod_state = SDL_GetModState();
const bool shiftPressed = (mod_state & KMOD_SHIFT) != 0;
if (!shiftPressed)
{
if (!m_levelloaded) return;
m_sector->get_camera().move(velocity / m_sector->get_camera().get_current_scale());
keep_camera_in_bounds();
}
}

void
Expand Down Expand Up @@ -973,9 +978,9 @@ Editor::sort_layers()
}

void
Editor::select_tilegroup(int id)
Editor::select_tilegroup(int id, bool subgroup)
{
m_toolbox_widget->select_tilegroup(id);
m_toolbox_widget->select_tilegroup(id, subgroup);
}

const std::vector<Tilegroup>&
Expand Down
2 changes: 1 addition & 1 deletion src/editor/editor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ class Editor final : public Screen,
void delete_markers();
void sort_layers();

void select_tilegroup(int id);
void select_tilegroup(int id, bool subgroup);
const std::vector<Tilegroup>& get_tilegroups() const;
void change_tileset();

Expand Down
25 changes: 20 additions & 5 deletions src/editor/overlay_widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1500,14 +1500,29 @@ EditorOverlayWidget::draw(DrawingContext& context)

m_object_tip->draw(context, m_mouse_pos);

// Draw zoom indicator.
// Draw zoom indicator and current mode (tiles/objects)
// The placing on the top-right is temporary, will be moved with the implementation of an editor toolbar.
const float scale = m_editor.get_sector()->get_camera().get_current_scale();
const int scale_percentage = static_cast<int>(roundf(scale * 100.f));
if (scale_percentage != 100)
context.color().draw_text(Resources::big_font, std::to_string(scale_percentage) + '%',
Vector(context.get_width() - 140.f, 15.f),
ALIGN_RIGHT, LAYER_OBJECTS + 1, Color::WHITE);
std::string mode_text;
switch (m_editor.get_tileselect_input_type())
{
case EditorTilebox::InputType::TILE:
mode_text = "TILE MODE (Click S to open tiles subgroups)";
break;
case EditorTilebox::InputType::OBJECT:
mode_text = "OBJECT MODE";
break;
default:
mode_text = "NONE";
break;
}
std::string zoom_text = (scale_percentage != 100)
? std::to_string(scale_percentage) + "% " + mode_text
: mode_text;
context.color().draw_text(Resources::normal_font, zoom_text,
Vector(144, 55),
ALIGN_LEFT, LAYER_OBJECTS + 1, EditorOverlayWidget::text_autotile_available_color);

context.push_transform();
context.set_translation(m_editor.get_sector()->get_camera().get_translation());
Expand Down
126 changes: 113 additions & 13 deletions src/editor/tilebox.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@
#include "util/log.hpp"
#include "video/drawing_context.hpp"

int current_selected_tilegroup_index = 0;
int previous_tilegroup_index = 0;
int current_selected_objectgroup_index = 0;
int previous_objectgroup_index = 0;
bool tilegroup_selected = false;
bool subgroup_selected = false;

EditorTilebox::EditorTilebox(Editor& editor, const Rectf& rect) :
m_editor(editor),
m_rect(rect),
Expand All @@ -53,6 +60,22 @@ EditorTilebox::EditorTilebox(Editor& editor, const Rectf& rect) :
m_scrollbar.reset(new ControlScrollbar(1.f, 1.f, m_scroll_progress, 35.f));
}


int
EditorTilebox::get_parentgroup_size() const
{
int parent_group_size = 0;
std::string parent_group_name = m_active_tilegroup->parent_group;
for (auto& tilegroup :m_editor.get_tileset()->get_tilegroups())
{
if (tilegroup.parent_group == parent_group_name) {
parent_group_size += tilegroup.tiles.size();
}

}
return parent_group_size;
}

void
EditorTilebox::draw(DrawingContext& context)
{
Expand Down Expand Up @@ -100,20 +123,57 @@ void
EditorTilebox::draw_tilegroup(DrawingContext& context)
{
int pos = -1;
for (auto& tile_ID : m_active_tilegroup->tiles)

if (!subgroup_selected)
{
pos++;
if (pos / 4 < static_cast<int>(m_scroll_progress / 32.f))
continue;
int id = 0;
// Skip the previous index groups
while (m_editor.get_tileset()->get_tilegroups()[id].parent_group != m_active_tilegroup->parent_group
&& m_active_tilegroup->parent_group != "")
{
id ++;
}

// Treat all same group subgroups
while ((id < m_editor.get_tileset()->get_tilegroups().size()
&& m_editor.get_tileset()->get_tilegroups()[id].parent_group == m_active_tilegroup->parent_group)
&& m_active_tilegroup->parent_group != "") {
for (auto& tile_ID :m_editor.get_tileset()->get_tilegroups()[id].tiles)
{
pos++;
if (pos / 4 < static_cast<int>(m_scroll_progress / 32.f))
continue;

auto position = get_tile_coords(pos, false);
m_editor.get_tileset()->get(tile_ID).draw(context.color(), position, LAYER_GUI - 9);

if (g_config->developer_mode && (m_active_tilegroup->developers_group || g_debug.show_toolbox_tile_ids) && tile_ID != 0)
{
// Display tile ID on top of tile:
context.color().draw_text(Resources::console_font, std::to_string(tile_ID),
position + Vector(16, 16), ALIGN_CENTER, LAYER_GUI - 9, Color::WHITE);
}
}
id ++;
}
}
else
{
for (auto& tile_ID :m_active_tilegroup->tiles)
{
pos++;
if (pos / 4 < static_cast<int>(m_scroll_progress / 32.f))
continue;

auto position = get_tile_coords(pos, false);
m_editor.get_tileset()->get(tile_ID).draw(context.color(), position, LAYER_GUI - 9);
auto position = get_tile_coords(pos, false);
m_editor.get_tileset()->get(tile_ID).draw(context.color(), position, LAYER_GUI - 9);

if (g_config->developer_mode && (m_active_tilegroup->developers_group || g_debug.show_toolbox_tile_ids) && tile_ID != 0)
{
// Display tile ID on top of tile:
context.color().draw_text(Resources::console_font, std::to_string(tile_ID),
position + Vector(16, 16), ALIGN_CENTER, LAYER_GUI - 9, Color::WHITE);
if (g_config->developer_mode && (m_active_tilegroup->developers_group || g_debug.show_toolbox_tile_ids) && tile_ID != 0)
{
// Display tile ID on top of tile:
context.color().draw_text(Resources::console_font, std::to_string(tile_ID),
position + Vector(16, 16), ALIGN_CENTER, LAYER_GUI - 9, Color::WHITE);
}
}
}
}
Expand Down Expand Up @@ -370,16 +430,32 @@ EditorTilebox::on_select(const std::function<void(EditorTilebox&)>& callback)
}

void
EditorTilebox::select_tilegroup(int id)
EditorTilebox::select_tilegroup(int id, bool subgroup)
{
if (tilegroup_selected) {
previous_tilegroup_index = current_selected_tilegroup_index;
}
current_selected_tilegroup_index = id;
tilegroup_selected = true;
m_active_tilegroup.reset(new Tilegroup(m_editor.get_tileset()->get_tilegroups()[id]));
m_input_type = InputType::TILE;
reset_scrollbar();
if (subgroup) {
subgroup_selected = true;
}
else {
subgroup_selected = false;
}
}

void
EditorTilebox::select_objectgroup(int id)
{
if (!tilegroup_selected) {
previous_objectgroup_index = current_selected_objectgroup_index;
}
current_selected_objectgroup_index = id;
tilegroup_selected = false;
m_active_objectgroup = &m_object_info->m_groups[id];
m_input_type = InputType::OBJECT;
reset_scrollbar();
Expand Down Expand Up @@ -412,7 +488,7 @@ EditorTilebox::get_tiles_height() const
switch (m_input_type)
{
case InputType::TILE:
return ceilf(static_cast<float>(m_active_tilegroup->tiles.size()) / 4.f) * 32.f;
return ceilf(static_cast<float>(get_parentgroup_size()) / 4.f) * 32.f;

case InputType::OBJECT:
return ceilf(static_cast<float>(m_active_objectgroup->get_icons().size()) / 4.f) * 32.f;
Expand All @@ -422,6 +498,30 @@ EditorTilebox::get_tiles_height() const
}
}

int
EditorTilebox::get_current_tilegroup_index() const
{
return current_selected_tilegroup_index;
}

int
EditorTilebox::get_previous_tilegroup_index() const
{
return previous_tilegroup_index;
}

int
EditorTilebox::get_current_objectgroup_index() const
{
return current_selected_objectgroup_index;
}

int
EditorTilebox::get_previous_objectgroup_index() const
{
return previous_objectgroup_index;
}

void
EditorTilebox::reset_scrollbar()
{
Expand Down
8 changes: 7 additions & 1 deletion src/editor/tilebox.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ class EditorTilebox final : public Widget
public:
EditorTilebox(Editor& editor, const Rectf& rect);

int get_parentgroup_size() const;

virtual void draw(DrawingContext& context) override;

virtual bool on_mouse_button_up(const SDL_MouseButtonEvent& button) override;
Expand All @@ -74,7 +76,7 @@ class EditorTilebox final : public Widget

void on_select(const std::function<void(EditorTilebox&)>& callback);

void select_tilegroup(int id);
void select_tilegroup(int id, bool subgroup);
inline void set_tilegroup(std::unique_ptr<Tilegroup> tilegroup) { m_active_tilegroup = std::move(tilegroup); }
void select_objectgroup(int id);
bool select_layers_objectgroup();
Expand All @@ -88,6 +90,10 @@ class EditorTilebox final : public Widget
inline void set_object(const std::string& object) { m_object = object; }

float get_tiles_height() const;
int get_current_tilegroup_index() const;
int get_previous_tilegroup_index() const;
int get_current_objectgroup_index() const;
int get_previous_objectgroup_index() const;

inline bool has_active_object_tip() const { return m_object_tip->get_visible(); }

Expand Down
Loading
Loading