Reusable tile selector built on top of Canvas. More...
#include <tile_selector_widget.h>

Classes | |
| struct | Config |
| struct | RenderResult |
Public Types | |
| enum class | JumpToTileResult { kSuccess = 0 , kInvalidFormat , kOutOfRange } |
Public Member Functions | |
| TileSelectorWidget (std::string widget_id) | |
| TileSelectorWidget (std::string widget_id, Config config) | |
| void | AttachCanvas (Canvas *canvas) |
| void | SetTileCount (int total_tiles) |
| void | SetDisplayScale (float display_scale) |
| Snaps down so each tile cell is a whole number of screen pixels. | |
| float | display_scale () const |
| float | TileCellSize () const |
| void | SetTilesPerRow (int tiles_per_row) |
| int | tiles_per_row () const |
| void | SetSelectedTile (int tile_id) |
| int | GetSelectedTileID () const |
| int | GetMaxTileId () const |
| ImVec2 | GetGridContentSize () const |
| float | GetPreferredViewportWidth () const |
| RenderResult | Render (gfx::Bitmap &atlas, bool atlas_ready) |
| CanvasMenuItem | CopyTileIdMenuItem () const |
| bool | DrawFilterBar () |
| JumpToTileResult | JumpToTileFromInput (std::string_view input) |
| void | ScrollToTile (int tile_id, bool use_imgui_scroll=true) |
| ImVec2 | TileOrigin (int tile_id) const |
| bool | has_active_range_filter () const |
| int | filter_range_min () const |
| int | filter_range_max () const |
| void | SetRangeFilter (int min_id, int max_id) |
| void | ClearRangeFilter () |
| void | SetDisplayOrder (std::vector< int > order) |
| void | ClearDisplayOrder () |
| bool | has_display_order () const |
| const std::vector< int > & | display_order () const |
| int | TileAtCell (int cell) const |
| Tile shown in a grid cell, or -1 past the last cell. | |
| int | CellOfTile (int tile_id) const |
| Grid cell showing a tile, or -1 when the display order hides it. | |
| void | SetHoverDetailProvider (std::function< std::string(int)> provider) |
| Extra hover tooltip line for a tile (empty string adds nothing). | |
Static Public Member Functions | |
| static float | PreferredViewportWidth (const Config &config, float scrollbar_size) |
| static float | CurrentScrollbarSize () |
| Current style scrollbar size, or ImGui's default without a context. | |
Private Member Functions | |
| bool | DrawFilterControls () |
| int | CellCount () const |
| RenderResult | HandleInteraction (float tile_display_size) |
| int | ResolveTileAtCursor (float tile_display_size) const |
| ImVec2 | GridScreenOrigin () const |
| std::pair< int, int > | VisibleRows (float tile_display_size) const |
| void | DrawOrderedTiles (gfx::Bitmap &atlas, float tile_display_size) const |
| void | DrawGridLines (float tile_display_size) const |
| void | DrawHighlight (float tile_display_size) const |
| void | DrawTileIdLabels (float tile_display_size) const |
| bool | IsValidTileId (int tile_id) const |
| bool | IsInFilterRange (int tile_id) const |
Private Attributes | |
| Canvas * | canvas_ = nullptr |
| Config | config_ {} |
| int | selected_tile_id_ = 0 |
| int | total_tiles_ = 0 |
| std::string | widget_id_ |
| int | pending_scroll_tile_id_ = -1 |
| bool | pending_scroll_use_imgui_ = true |
| char | filter_buf_ [8] = {} |
| bool | filter_range_active_ = false |
| int | filter_range_min_ = 0 |
| int | filter_range_max_ = 0 |
| char | filter_min_buf_ [8] = {} |
| char | filter_max_buf_ [8] = {} |
| bool | filter_range_error_ = false |
| bool | filter_out_of_range_ = false |
| JumpToTileResult | last_jump_result_ = JumpToTileResult::kSuccess |
| bool | display_order_active_ = false |
| std::vector< int > | display_order_ |
| std::vector< int > | cell_of_tile_ |
| std::function< std::string(int)> | hover_detail_ |
Reusable tile selector built on top of Canvas.
Minimal mutable state, designed for reuse across editors and automation.
Definition at line 22 of file tile_selector_widget.h.
|
strong |
| Enumerator | |
|---|---|
| kSuccess | |
| kInvalidFormat | |
| kOutOfRange | |
Definition at line 46 of file tile_selector_widget.h.
|
explicit |
Definition at line 69 of file tile_selector_widget.cc.
| yaze::gui::TileSelectorWidget::TileSelectorWidget | ( | std::string | widget_id, |
| Config | config ) |
Definition at line 74 of file tile_selector_widget.cc.
References yaze::gui::TileSelectorWidget::Config::display_scale, and SetDisplayScale().

| void yaze::gui::TileSelectorWidget::AttachCanvas | ( | Canvas * | canvas | ) |
Definition at line 81 of file tile_selector_widget.cc.
References canvas_.
Referenced by yaze::editor::MenuTilemapEditorUI::DrawTilePicker(), and yaze::editor::Tile16Editor::Initialize().
| void yaze::gui::TileSelectorWidget::SetTileCount | ( | int | total_tiles | ) |
Definition at line 85 of file tile_selector_widget.cc.
References display_order_, display_order_active_, IsValidTileId(), kOutOfRange, kSuccess, last_jump_result_, selected_tile_id_, SetDisplayOrder(), and total_tiles_.
Referenced by yaze::editor::MenuTilemapEditorUI::DrawTilePicker(), and yaze::editor::Tile16Editor::Initialize().

| void yaze::gui::TileSelectorWidget::SetDisplayScale | ( | float | display_scale | ) |
Snaps down so each tile cell is a whole number of screen pixels.
Definition at line 100 of file tile_selector_widget.cc.
References config_, yaze::gui::TileSelectorWidget::Config::display_scale, display_scale(), and yaze::gui::TileSelectorWidget::Config::tile_size.
Referenced by yaze::editor::MenuTilemapEditorUI::DrawTilePicker(), and TileSelectorWidget().

|
inline |
Definition at line 59 of file tile_selector_widget.h.
References config_, and yaze::gui::TileSelectorWidget::Config::display_scale.
Referenced by SetDisplayScale().
| float yaze::gui::TileSelectorWidget::TileCellSize | ( | ) | const |
On-screen size of one tile; the atlas, grid, highlight and hit testing all use this value.
Definition at line 111 of file tile_selector_widget.cc.
References config_, yaze::gui::TileSelectorWidget::Config::display_scale, and yaze::gui::TileSelectorWidget::Config::tile_size.
Referenced by GetGridContentSize(), Render(), and TileOrigin().
| void yaze::gui::TileSelectorWidget::SetTilesPerRow | ( | int | tiles_per_row | ) |
Definition at line 115 of file tile_selector_widget.cc.
References config_, yaze::gui::TileSelectorWidget::Config::tiles_per_row, and tiles_per_row().
Referenced by yaze::editor::MenuTilemapEditorUI::DrawTilePicker().

|
inline |
Definition at line 64 of file tile_selector_widget.h.
References config_, and yaze::gui::TileSelectorWidget::Config::tiles_per_row.
Referenced by SetTilesPerRow().
| void yaze::gui::TileSelectorWidget::SetSelectedTile | ( | int | tile_id | ) |
Definition at line 121 of file tile_selector_widget.cc.
References IsValidTileId(), kSuccess, last_jump_result_, and selected_tile_id_.
Referenced by yaze::editor::Tile16Editor::DrawTile16EditorWorkbenchColumn(), yaze::editor::MenuTilemapEditorUI::DrawTilePicker(), yaze::editor::Tile16Editor::Initialize(), yaze::editor::Tile16Editor::LoadLayoutFromScratch(), and yaze::editor::Tile16Editor::UpdateBlockset().

|
inline |
Definition at line 66 of file tile_selector_widget.h.
References selected_tile_id_.
Referenced by yaze::editor::Tile16Editor::DrawTile16EditorWorkbenchColumn(), yaze::editor::MenuTilemapEditorUI::DrawTilePicker(), yaze::editor::Tile16Editor::selected_tile16_for_testing(), and yaze::editor::Tile16Editor::UpdateBlockset().
|
inline |
Definition at line 67 of file tile_selector_widget.h.
References total_tiles_.
Referenced by DrawFilterControls().
| ImVec2 yaze::gui::TileSelectorWidget::GetGridContentSize | ( | ) | const |
Definition at line 176 of file tile_selector_widget.cc.
References CellCount(), config_, yaze::gui::TileSelectorWidget::Config::draw_offset, TileCellSize(), and yaze::gui::TileSelectorWidget::Config::tiles_per_row.
Referenced by Render().

| float yaze::gui::TileSelectorWidget::GetPreferredViewportWidth | ( | ) | const |
Grid width plus the current style's vertical scrollbar. This is the width of the scrolling grid child, not of any surrounding panel.
Definition at line 197 of file tile_selector_widget.cc.
References config_, CurrentScrollbarSize(), and PreferredViewportWidth().

|
static |
Same as GetPreferredViewportWidth() for a config that has no widget yet (panels report their preferred dock width before the widget exists).
Definition at line 190 of file tile_selector_widget.cc.
Referenced by GetPreferredViewportWidth(), and yaze::editor::Tile16SelectorView::GetPreferredWidth().
|
static |
Current style scrollbar size, or ImGui's default without a context.
Definition at line 183 of file tile_selector_widget.cc.
Referenced by yaze::editor::MenuTilemapEditorUI::DrawTilePicker(), GetPreferredViewportWidth(), and yaze::editor::Tile16SelectorView::GetPreferredWidth().
| TileSelectorWidget::RenderResult yaze::gui::TileSelectorWidget::Render | ( | gfx::Bitmap & | atlas, |
| bool | atlas_ready ) |
Definition at line 201 of file tile_selector_widget.cc.
References canvas_, CellOfTile(), config_, display_order_active_, yaze::gui::TileSelectorWidget::Config::display_scale, yaze::gui::TileSelectorWidget::Config::draw_offset, yaze::gui::Canvas::DrawBackground(), yaze::gui::Canvas::DrawBitmap(), yaze::gui::Canvas::DrawContextMenu(), DrawGridLines(), DrawHighlight(), DrawOrderedTiles(), yaze::gui::Canvas::DrawOverlay(), DrawTileIdLabels(), GetGridContentSize(), HandleInteraction(), yaze::gfx::Bitmap::height(), hover_detail_, yaze::gfx::Bitmap::is_active(), IsValidTileId(), pending_scroll_tile_id_, pending_scroll_use_imgui_, ResolveTileAtCursor(), yaze::gui::TileSelectorWidget::Config::show_hover_tooltip, yaze::gui::TileSelectorWidget::Config::show_tile_ids, yaze::gfx::Bitmap::texture(), yaze::gui::TileSelectorWidget::Config::tile_size, TileCellSize(), TileOrigin(), yaze::gui::TileSelectorWidget::Config::tiles_per_row, and yaze::gfx::Bitmap::width().
Referenced by yaze::editor::Tile16Editor::DrawTile16EditorWorkbenchColumn(), yaze::editor::MenuTilemapEditorUI::DrawTilePicker(), and yaze::editor::Tile16Editor::UpdateBlockset().
| CanvasMenuItem yaze::gui::TileSelectorWidget::CopyTileIdMenuItem | ( | ) | const |
"Copy Tile ID" item for the attached canvas's editor menu. Right-click selects the tile under the cursor, so the item copies the selected tile ID ("0x01A") at click time. Callers add it next to their own items, after ClearContextMenuItems(), so nothing accumulates across frames.
Definition at line 303 of file tile_selector_widget.cc.
References yaze::gui::CanvasMenuItem::enabled_condition, ICON_MD_CONTENT_COPY, IsValidTileId(), and selected_tile_id_.

| bool yaze::gui::TileSelectorWidget::DrawFilterBar | ( | ) |
Draw a lookup/filter popup button beside the grid controls. Returns true if the user jumped to a tile (selection + scroll triggered).
Definition at line 535 of file tile_selector_widget.cc.
References DrawFilterControls(), filter_range_active_, ICON_MD_FILTER_ALT, ICON_MD_SEARCH, yaze::gui::WidgetIdRegistry::Instance(), yaze::gui::WidgetIdRegistry::RegisterWidget(), and widget_id_.
Referenced by yaze::editor::Tile16Editor::UpdateBlockset().

| TileSelectorWidget::JumpToTileResult yaze::gui::TileSelectorWidget::JumpToTileFromInput | ( | std::string_view | input | ) |
Parse a tile ID string and jump selection to that tile. Accepted forms:
Definition at line 516 of file tile_selector_widget.cc.
References IsValidTileId(), kInvalidFormat, kOutOfRange, kSuccess, last_jump_result_, ScrollToTile(), and selected_tile_id_.
Referenced by DrawFilterControls().

| void yaze::gui::TileSelectorWidget::ScrollToTile | ( | int | tile_id, |
| bool | use_imgui_scroll = true ) |
Definition at line 493 of file tile_selector_widget.cc.
References canvas_, IsValidTileId(), pending_scroll_tile_id_, and pending_scroll_use_imgui_.
Referenced by DrawFilterControls(), and JumpToTileFromInput().

| ImVec2 yaze::gui::TileSelectorWidget::TileOrigin | ( | int | tile_id | ) | const |
Definition at line 504 of file tile_selector_widget.cc.
References CellOfTile(), config_, yaze::gui::TileSelectorWidget::Config::draw_offset, TileCellSize(), and yaze::gui::TileSelectorWidget::Config::tiles_per_row.
Referenced by Render().

|
inline |
Definition at line 102 of file tile_selector_widget.h.
References filter_range_active_.
|
inline |
Definition at line 103 of file tile_selector_widget.h.
References filter_range_min_.
|
inline |
Definition at line 104 of file tile_selector_widget.h.
References filter_range_max_.
| void yaze::gui::TileSelectorWidget::SetRangeFilter | ( | int | min_id, |
| int | max_id ) |
Definition at line 732 of file tile_selector_widget.cc.
References filter_range_active_, filter_range_error_, filter_range_max_, filter_range_min_, and total_tiles_.
Referenced by DrawFilterControls().
| void yaze::gui::TileSelectorWidget::ClearRangeFilter | ( | ) |
Definition at line 746 of file tile_selector_widget.cc.
References filter_out_of_range_, filter_range_active_, filter_range_error_, filter_range_max_, and filter_range_min_.
Referenced by DrawFilterControls().
| void yaze::gui::TileSelectorWidget::SetDisplayOrder | ( | std::vector< int > | order | ) |
Grid cell i shows tile order[i]; tiles not listed are hidden. Invalid and duplicate IDs are dropped. Without an order, cells follow tile ID order.
Definition at line 138 of file tile_selector_widget.cc.
References cell_of_tile_, display_order_, display_order_active_, IsValidTileId(), and total_tiles_.
Referenced by SetTileCount().

| void yaze::gui::TileSelectorWidget::ClearDisplayOrder | ( | ) |
Definition at line 151 of file tile_selector_widget.cc.
References cell_of_tile_, display_order_, and display_order_active_.
|
inline |
Definition at line 112 of file tile_selector_widget.h.
References display_order_active_.
|
inline |
Definition at line 113 of file tile_selector_widget.h.
References display_order_.
| int yaze::gui::TileSelectorWidget::TileAtCell | ( | int | cell | ) | const |
Tile shown in a grid cell, or -1 past the last cell.
Definition at line 162 of file tile_selector_widget.cc.
References CellCount(), display_order_, and display_order_active_.
Referenced by ResolveTileAtCursor().

| int yaze::gui::TileSelectorWidget::CellOfTile | ( | int | tile_id | ) | const |
Grid cell showing a tile, or -1 when the display order hides it.
Definition at line 169 of file tile_selector_widget.cc.
References cell_of_tile_, display_order_active_, and IsValidTileId().
Referenced by DrawHighlight(), Render(), and TileOrigin().

|
inline |
Extra hover tooltip line for a tile (empty string adds nothing).
Definition at line 119 of file tile_selector_widget.h.
References hover_detail_.
Referenced by yaze::editor::Tile16Editor::SetHoverDetailProvider().
|
private |
Definition at line 564 of file tile_selector_widget.cc.
References ClearRangeFilter(), filter_buf_, filter_max_buf_, filter_min_buf_, filter_out_of_range_, filter_range_active_, filter_range_error_, filter_range_max_, filter_range_min_, GetMaxTileId(), yaze::gui::WidgetIdRegistry::Instance(), JumpToTileFromInput(), kInvalidFormat, kOutOfRange, kSuccess, last_jump_result_, yaze::gui::WidgetIdRegistry::RegisterWidget(), ScrollToTile(), SetRangeFilter(), and widget_id_.
Referenced by DrawFilterBar().
|
private |
Definition at line 157 of file tile_selector_widget.cc.
References display_order_, display_order_active_, and total_tiles_.
Referenced by DrawGridLines(), DrawOrderedTiles(), GetGridContentSize(), TileAtCell(), and VisibleRows().
|
private |
Definition at line 316 of file tile_selector_widget.cc.
References yaze::gui::BeginTileDragSource(), config_, yaze::gui::TileSelectorWidget::Config::drag_source_map_id, yaze::gui::TileSelectorWidget::Config::enable_drag, IsInFilterRange(), IsValidTileId(), ResolveTileAtCursor(), yaze::gui::TileSelectorWidget::RenderResult::selected_tile, selected_tile_id_, yaze::gui::TileSelectorWidget::RenderResult::selection_changed, yaze::gui::TileSelectorWidget::RenderResult::tile_clicked, yaze::gui::TileSelectorWidget::RenderResult::tile_double_clicked, yaze::gui::TileSelectorWidget::RenderResult::tile_dragging, and yaze::gui::TileSelectorWidget::RenderResult::tile_right_clicked.
Referenced by Render().

|
private |
Definition at line 352 of file tile_selector_widget.cc.
References canvas_, config_, yaze::gui::TileSelectorWidget::Config::draw_offset, yaze::gui::Canvas::scrolling(), TileAtCell(), yaze::gui::TileSelectorWidget::Config::tiles_per_row, and yaze::gui::Canvas::zero_point().
Referenced by HandleInteraction(), and Render().

|
private |
Definition at line 379 of file tile_selector_widget.cc.
References canvas_, config_, yaze::gui::TileSelectorWidget::Config::draw_offset, yaze::gui::Canvas::scrolling(), and yaze::gui::Canvas::zero_point().
Referenced by DrawGridLines(), DrawHighlight(), DrawOrderedTiles(), and VisibleRows().

|
private |
Definition at line 386 of file tile_selector_widget.cc.
References canvas_, CellCount(), config_, yaze::gui::Canvas::draw_list(), GridScreenOrigin(), and yaze::gui::TileSelectorWidget::Config::tiles_per_row.
Referenced by DrawGridLines(), and DrawOrderedTiles().

|
private |
Definition at line 406 of file tile_selector_widget.cc.
References canvas_, CellCount(), config_, display_order_, yaze::gui::Canvas::draw_list(), GridScreenOrigin(), yaze::gfx::Bitmap::height(), yaze::gfx::Bitmap::texture(), yaze::gui::TileSelectorWidget::Config::tile_size, yaze::gui::TileSelectorWidget::Config::tiles_per_row, VisibleRows(), and yaze::gfx::Bitmap::width().
Referenced by Render().
|
private |
Definition at line 437 of file tile_selector_widget.cc.
References canvas_, CellCount(), config_, yaze::gui::Canvas::draw_list(), yaze::gui::CanvasConfig::enable_grid, yaze::gui::Canvas::GetConfig(), GridScreenOrigin(), yaze::gui::TileSelectorWidget::Config::tiles_per_row, and VisibleRows().
Referenced by Render().
|
private |
Definition at line 470 of file tile_selector_widget.cc.
References canvas_, CellOfTile(), config_, yaze::gui::Canvas::draw_list(), GridScreenOrigin(), yaze::gui::TileSelectorWidget::Config::highlight_color, selected_tile_id_, and yaze::gui::TileSelectorWidget::Config::tiles_per_row.
Referenced by Render().

|
private |
Definition at line 489 of file tile_selector_widget.cc.
Referenced by Render().
|
private |
Definition at line 754 of file tile_selector_widget.cc.
References total_tiles_.
Referenced by CellOfTile(), CopyTileIdMenuItem(), HandleInteraction(), JumpToTileFromInput(), Render(), ScrollToTile(), SetDisplayOrder(), SetSelectedTile(), and SetTileCount().
|
private |
Definition at line 758 of file tile_selector_widget.cc.
References filter_range_active_, filter_range_max_, and filter_range_min_.
Referenced by HandleInteraction().
|
private |
Definition at line 138 of file tile_selector_widget.h.
Referenced by AttachCanvas(), DrawGridLines(), DrawHighlight(), DrawOrderedTiles(), GridScreenOrigin(), Render(), ResolveTileAtCursor(), ScrollToTile(), and VisibleRows().
|
private |
Definition at line 139 of file tile_selector_widget.h.
Referenced by display_scale(), DrawGridLines(), DrawHighlight(), DrawOrderedTiles(), GetGridContentSize(), GetPreferredViewportWidth(), GridScreenOrigin(), HandleInteraction(), Render(), ResolveTileAtCursor(), SetDisplayScale(), SetTilesPerRow(), TileCellSize(), TileOrigin(), tiles_per_row(), and VisibleRows().
|
private |
Definition at line 140 of file tile_selector_widget.h.
Referenced by CopyTileIdMenuItem(), DrawHighlight(), GetSelectedTileID(), HandleInteraction(), JumpToTileFromInput(), SetSelectedTile(), and SetTileCount().
|
private |
Definition at line 141 of file tile_selector_widget.h.
Referenced by CellCount(), GetMaxTileId(), IsValidTileId(), SetDisplayOrder(), SetRangeFilter(), and SetTileCount().
|
private |
Definition at line 142 of file tile_selector_widget.h.
Referenced by DrawFilterBar(), and DrawFilterControls().
|
mutableprivate |
Definition at line 146 of file tile_selector_widget.h.
Referenced by Render(), and ScrollToTile().
|
mutableprivate |
Definition at line 147 of file tile_selector_widget.h.
Referenced by Render(), and ScrollToTile().
|
private |
Definition at line 150 of file tile_selector_widget.h.
Referenced by DrawFilterControls().
|
private |
Definition at line 153 of file tile_selector_widget.h.
Referenced by ClearRangeFilter(), DrawFilterBar(), DrawFilterControls(), has_active_range_filter(), IsInFilterRange(), and SetRangeFilter().
|
private |
Definition at line 154 of file tile_selector_widget.h.
Referenced by ClearRangeFilter(), DrawFilterControls(), filter_range_min(), IsInFilterRange(), and SetRangeFilter().
|
private |
Definition at line 155 of file tile_selector_widget.h.
Referenced by ClearRangeFilter(), DrawFilterControls(), filter_range_max(), IsInFilterRange(), and SetRangeFilter().
|
private |
Definition at line 156 of file tile_selector_widget.h.
Referenced by DrawFilterControls().
|
private |
Definition at line 157 of file tile_selector_widget.h.
Referenced by DrawFilterControls().
|
private |
Definition at line 159 of file tile_selector_widget.h.
Referenced by ClearRangeFilter(), DrawFilterControls(), and SetRangeFilter().
|
private |
Definition at line 162 of file tile_selector_widget.h.
Referenced by ClearRangeFilter(), and DrawFilterControls().
|
private |
Definition at line 164 of file tile_selector_widget.h.
Referenced by DrawFilterControls(), JumpToTileFromInput(), SetSelectedTile(), and SetTileCount().
|
private |
Definition at line 166 of file tile_selector_widget.h.
Referenced by CellCount(), CellOfTile(), ClearDisplayOrder(), has_display_order(), Render(), SetDisplayOrder(), SetTileCount(), and TileAtCell().
|
private |
Definition at line 167 of file tile_selector_widget.h.
Referenced by CellCount(), ClearDisplayOrder(), display_order(), DrawOrderedTiles(), SetDisplayOrder(), SetTileCount(), and TileAtCell().
|
private |
Definition at line 169 of file tile_selector_widget.h.
Referenced by CellOfTile(), ClearDisplayOrder(), and SetDisplayOrder().
|
private |
Definition at line 170 of file tile_selector_widget.h.
Referenced by Render(), and SetHoverDetailProvider().