yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
tile_selector_widget.h
Go to the documentation of this file.
1#ifndef YAZE_APP_GUI_WIDGETS_TILE_SELECTOR_WIDGET_H
2#define YAZE_APP_GUI_WIDGETS_TILE_SELECTOR_WIDGET_H
3
4#include <functional>
5#include <string>
6#include <string_view>
7#include <utility>
8#include <vector>
9
10#include "app/gfx/core/bitmap.h"
13#include "imgui/imgui.h"
14
15namespace yaze::gui {
16
23 public:
24 struct Config {
25 int tile_size = 16;
26 float display_scale = 2.0f;
28 int total_tiles = 512;
29 ImVec2 draw_offset = {2.0f, 0.0f};
30 bool show_tile_ids = false;
31 bool enable_drag = false;
32 bool show_hover_tooltip = false;
34 ImVec4 highlight_color = {1.0f, 0.85f, 0.35f, 1.0f};
35 };
36
37 struct RenderResult {
38 bool tile_clicked = false;
39 bool tile_double_clicked = false;
40 bool tile_right_clicked = false;
41 bool selection_changed = false;
42 bool tile_dragging = false;
43 int selected_tile = -1;
44 };
45
46 enum class JumpToTileResult {
47 kSuccess = 0,
50 };
51
52 explicit TileSelectorWidget(std::string widget_id);
53 TileSelectorWidget(std::string widget_id, Config config);
54
55 void AttachCanvas(Canvas* canvas);
56 void SetTileCount(int total_tiles);
59 float display_scale() const { return config_.display_scale; }
62 float TileCellSize() const;
64 int tiles_per_row() const { return config_.tiles_per_row; }
65 void SetSelectedTile(int tile_id);
66 int GetSelectedTileID() const { return selected_tile_id_; }
67 int GetMaxTileId() const { return total_tiles_ > 0 ? total_tiles_ - 1 : 0; }
68 ImVec2 GetGridContentSize() const;
71 float GetPreferredViewportWidth() const;
74 static float PreferredViewportWidth(const Config& config,
75 float scrollbar_size);
77 static float CurrentScrollbarSize();
78
79 RenderResult Render(gfx::Bitmap& atlas, bool atlas_ready);
80
86
89 bool DrawFilterBar();
90
96 JumpToTileResult JumpToTileFromInput(std::string_view input);
97
98 void ScrollToTile(int tile_id, bool use_imgui_scroll = true);
99 ImVec2 TileOrigin(int tile_id) const;
100
101 // Range filter accessors (for tests and automation)
103 int filter_range_min() const { return filter_range_min_; }
104 int filter_range_max() const { return filter_range_max_; }
105 void SetRangeFilter(int min_id, int max_id);
106 void ClearRangeFilter();
107
110 void SetDisplayOrder(std::vector<int> order);
111 void ClearDisplayOrder();
113 const std::vector<int>& display_order() const { return display_order_; }
115 int TileAtCell(int cell) const;
117 int CellOfTile(int tile_id) const;
119 void SetHoverDetailProvider(std::function<std::string(int)> provider) {
120 hover_detail_ = std::move(provider);
121 }
122
123 private:
124 bool DrawFilterControls();
125 int CellCount() const;
126 RenderResult HandleInteraction(float tile_display_size);
127 int ResolveTileAtCursor(float tile_display_size) const;
128 ImVec2 GridScreenOrigin() const;
129 // Visible grid rows [first, last) inside the current clip rect.
130 std::pair<int, int> VisibleRows(float tile_display_size) const;
131 void DrawOrderedTiles(gfx::Bitmap& atlas, float tile_display_size) const;
132 void DrawGridLines(float tile_display_size) const;
133 void DrawHighlight(float tile_display_size) const;
134 void DrawTileIdLabels(float tile_display_size) const;
135 bool IsValidTileId(int tile_id) const;
136 bool IsInFilterRange(int tile_id) const;
137
138 Canvas* canvas_ = nullptr;
142 std::string widget_id_;
143
144 // Deferred scroll state (for when ScrollToTile is called outside render
145 // context)
146 mutable int pending_scroll_tile_id_ = -1;
147 mutable bool pending_scroll_use_imgui_ = true;
148
149 // Filter bar state
150 char filter_buf_[8] = {};
151
152 // Range filter state
156 char filter_min_buf_[8] = {};
157 char filter_max_buf_[8] = {};
158 // Set when the last range input was invalid (min > max).
160 // Set when both parsed values exceed total_tiles_ so SetRangeFilter returned
161 // without activating (empty interval after clamping).
163 // Status from the most recent jump-to-ID entry attempt.
165
167 std::vector<int> display_order_;
168 // Inverse of display_order_, sized total_tiles_; -1 marks hidden tiles.
169 std::vector<int> cell_of_tile_;
170 std::function<std::string(int)> hover_detail_;
171};
172
173} // namespace yaze::gui
174
175#endif // YAZE_APP_GUI_WIDGETS_TILE_SELECTOR_WIDGET_H
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:70
Modern, robust canvas for drawing and manipulating graphics.
Definition canvas.h:64
Reusable tile selector built on top of Canvas.
static float PreferredViewportWidth(const Config &config, float scrollbar_size)
JumpToTileResult JumpToTileFromInput(std::string_view input)
int CellOfTile(int tile_id) const
Grid cell showing a tile, or -1 when the display order hides it.
void SetDisplayScale(float display_scale)
Snaps down so each tile cell is a whole number of screen pixels.
RenderResult Render(gfx::Bitmap &atlas, bool atlas_ready)
std::function< std::string(int)> hover_detail_
void DrawGridLines(float tile_display_size) const
int ResolveTileAtCursor(float tile_display_size) const
static float CurrentScrollbarSize()
Current style scrollbar size, or ImGui's default without a context.
bool IsValidTileId(int tile_id) const
void SetRangeFilter(int min_id, int max_id)
ImVec2 TileOrigin(int tile_id) const
const std::vector< int > & display_order() const
void DrawTileIdLabels(float tile_display_size) const
void SetHoverDetailProvider(std::function< std::string(int)> provider)
Extra hover tooltip line for a tile (empty string adds nothing).
RenderResult HandleInteraction(float tile_display_size)
void SetDisplayOrder(std::vector< int > order)
void ScrollToTile(int tile_id, bool use_imgui_scroll=true)
CanvasMenuItem CopyTileIdMenuItem() const
void DrawHighlight(float tile_display_size) const
bool IsInFilterRange(int tile_id) const
void DrawOrderedTiles(gfx::Bitmap &atlas, float tile_display_size) const
int TileAtCell(int cell) const
Tile shown in a grid cell, or -1 past the last cell.
void SetTilesPerRow(int tiles_per_row)
TileSelectorWidget(std::string widget_id)
std::pair< int, int > VisibleRows(float tile_display_size) const
Graphical User Interface (GUI) components for the application.
Declarative menu item definition.
Definition canvas_menu.h:64