yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
yaze::gui::TileSelectorWidget Class Reference

Reusable tile selector built on top of Canvas. More...

#include <tile_selector_widget.h>

Collaboration diagram for yaze::gui::TileSelectorWidget:

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_
 

Detailed Description

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.

Member Enumeration Documentation

◆ JumpToTileResult

Enumerator
kSuccess 
kInvalidFormat 
kOutOfRange 

Definition at line 46 of file tile_selector_widget.h.

Constructor & Destructor Documentation

◆ TileSelectorWidget() [1/2]

yaze::gui::TileSelectorWidget::TileSelectorWidget ( std::string widget_id)
explicit

Definition at line 69 of file tile_selector_widget.cc.

◆ TileSelectorWidget() [2/2]

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().

Here is the call graph for this function:

Member Function Documentation

◆ AttachCanvas()

void yaze::gui::TileSelectorWidget::AttachCanvas ( Canvas * canvas)

◆ SetTileCount()

void yaze::gui::TileSelectorWidget::SetTileCount ( int total_tiles)

◆ SetDisplayScale()

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().

Here is the call graph for this function:

◆ display_scale()

float yaze::gui::TileSelectorWidget::display_scale ( ) const
inline

◆ TileCellSize()

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().

◆ SetTilesPerRow()

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().

Here is the call graph for this function:

◆ tiles_per_row()

int yaze::gui::TileSelectorWidget::tiles_per_row ( ) const
inline

Definition at line 64 of file tile_selector_widget.h.

References config_, and yaze::gui::TileSelectorWidget::Config::tiles_per_row.

Referenced by SetTilesPerRow().

◆ SetSelectedTile()

◆ GetSelectedTileID()

◆ GetMaxTileId()

int yaze::gui::TileSelectorWidget::GetMaxTileId ( ) const
inline

Definition at line 67 of file tile_selector_widget.h.

References total_tiles_.

Referenced by DrawFilterControls().

◆ GetGridContentSize()

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().

Here is the call graph for this function:

◆ GetPreferredViewportWidth()

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().

Here is the call graph for this function:

◆ PreferredViewportWidth()

float yaze::gui::TileSelectorWidget::PreferredViewportWidth ( const Config & config,
float scrollbar_size )
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().

◆ CurrentScrollbarSize()

float yaze::gui::TileSelectorWidget::CurrentScrollbarSize ( )
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().

◆ Render()

◆ CopyTileIdMenuItem()

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_.

Here is the call graph for this function:

◆ DrawFilterBar()

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().

Here is the call graph for this function:

◆ JumpToTileFromInput()

TileSelectorWidget::JumpToTileResult yaze::gui::TileSelectorWidget::JumpToTileFromInput ( std::string_view input)

Parse a tile ID string and jump selection to that tile. Accepted forms:

  • Hex (default): "1A", "0x1A"
  • Decimal (explicit): "d:26" Returns a parse/result status for UI and automation.

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().

Here is the call graph for this function:

◆ ScrollToTile()

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().

Here is the call graph for this function:

◆ TileOrigin()

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().

Here is the call graph for this function:

◆ has_active_range_filter()

bool yaze::gui::TileSelectorWidget::has_active_range_filter ( ) const
inline

Definition at line 102 of file tile_selector_widget.h.

References filter_range_active_.

◆ filter_range_min()

int yaze::gui::TileSelectorWidget::filter_range_min ( ) const
inline

Definition at line 103 of file tile_selector_widget.h.

References filter_range_min_.

◆ filter_range_max()

int yaze::gui::TileSelectorWidget::filter_range_max ( ) const
inline

Definition at line 104 of file tile_selector_widget.h.

References filter_range_max_.

◆ SetRangeFilter()

void yaze::gui::TileSelectorWidget::SetRangeFilter ( int min_id,
int max_id )

◆ ClearRangeFilter()

void yaze::gui::TileSelectorWidget::ClearRangeFilter ( )

◆ SetDisplayOrder()

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().

Here is the call graph for this function:

◆ ClearDisplayOrder()

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_.

◆ has_display_order()

bool yaze::gui::TileSelectorWidget::has_display_order ( ) const
inline

Definition at line 112 of file tile_selector_widget.h.

References display_order_active_.

◆ display_order()

const std::vector< int > & yaze::gui::TileSelectorWidget::display_order ( ) const
inline

Definition at line 113 of file tile_selector_widget.h.

References display_order_.

◆ TileAtCell()

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().

Here is the call graph for this function:

◆ CellOfTile()

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().

Here is the call graph for this function:

◆ SetHoverDetailProvider()

void yaze::gui::TileSelectorWidget::SetHoverDetailProvider ( std::function< std::string(int)> provider)
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().

◆ DrawFilterControls()

◆ CellCount()

int yaze::gui::TileSelectorWidget::CellCount ( ) const
private

◆ HandleInteraction()

◆ ResolveTileAtCursor()

int yaze::gui::TileSelectorWidget::ResolveTileAtCursor ( float tile_display_size) const
private

◆ GridScreenOrigin()

ImVec2 yaze::gui::TileSelectorWidget::GridScreenOrigin ( ) const
private

◆ VisibleRows()

std::pair< int, int > yaze::gui::TileSelectorWidget::VisibleRows ( float tile_display_size) const
private

◆ DrawOrderedTiles()

◆ DrawGridLines()

void yaze::gui::TileSelectorWidget::DrawGridLines ( float tile_display_size) const
private

◆ DrawHighlight()

void yaze::gui::TileSelectorWidget::DrawHighlight ( float tile_display_size) const
private

◆ DrawTileIdLabels()

void yaze::gui::TileSelectorWidget::DrawTileIdLabels ( float tile_display_size) const
private

Definition at line 489 of file tile_selector_widget.cc.

Referenced by Render().

◆ IsValidTileId()

bool yaze::gui::TileSelectorWidget::IsValidTileId ( int tile_id) const
private

◆ IsInFilterRange()

bool yaze::gui::TileSelectorWidget::IsInFilterRange ( int tile_id) const
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().

Member Data Documentation

◆ canvas_

Canvas* yaze::gui::TileSelectorWidget::canvas_ = nullptr
private

◆ config_

◆ selected_tile_id_

int yaze::gui::TileSelectorWidget::selected_tile_id_ = 0
private

◆ total_tiles_

int yaze::gui::TileSelectorWidget::total_tiles_ = 0
private

◆ widget_id_

std::string yaze::gui::TileSelectorWidget::widget_id_
private

Definition at line 142 of file tile_selector_widget.h.

Referenced by DrawFilterBar(), and DrawFilterControls().

◆ pending_scroll_tile_id_

int yaze::gui::TileSelectorWidget::pending_scroll_tile_id_ = -1
mutableprivate

Definition at line 146 of file tile_selector_widget.h.

Referenced by Render(), and ScrollToTile().

◆ pending_scroll_use_imgui_

bool yaze::gui::TileSelectorWidget::pending_scroll_use_imgui_ = true
mutableprivate

Definition at line 147 of file tile_selector_widget.h.

Referenced by Render(), and ScrollToTile().

◆ filter_buf_

char yaze::gui::TileSelectorWidget::filter_buf_[8] = {}
private

Definition at line 150 of file tile_selector_widget.h.

Referenced by DrawFilterControls().

◆ filter_range_active_

bool yaze::gui::TileSelectorWidget::filter_range_active_ = false
private

◆ filter_range_min_

int yaze::gui::TileSelectorWidget::filter_range_min_ = 0
private

◆ filter_range_max_

int yaze::gui::TileSelectorWidget::filter_range_max_ = 0
private

◆ filter_min_buf_

char yaze::gui::TileSelectorWidget::filter_min_buf_[8] = {}
private

Definition at line 156 of file tile_selector_widget.h.

Referenced by DrawFilterControls().

◆ filter_max_buf_

char yaze::gui::TileSelectorWidget::filter_max_buf_[8] = {}
private

Definition at line 157 of file tile_selector_widget.h.

Referenced by DrawFilterControls().

◆ filter_range_error_

bool yaze::gui::TileSelectorWidget::filter_range_error_ = false
private

Definition at line 159 of file tile_selector_widget.h.

Referenced by ClearRangeFilter(), DrawFilterControls(), and SetRangeFilter().

◆ filter_out_of_range_

bool yaze::gui::TileSelectorWidget::filter_out_of_range_ = false
private

Definition at line 162 of file tile_selector_widget.h.

Referenced by ClearRangeFilter(), and DrawFilterControls().

◆ last_jump_result_

JumpToTileResult yaze::gui::TileSelectorWidget::last_jump_result_ = JumpToTileResult::kSuccess
private

◆ display_order_active_

bool yaze::gui::TileSelectorWidget::display_order_active_ = false
private

◆ display_order_

std::vector<int> yaze::gui::TileSelectorWidget::display_order_
private

◆ cell_of_tile_

std::vector<int> yaze::gui::TileSelectorWidget::cell_of_tile_
private

Definition at line 169 of file tile_selector_widget.h.

Referenced by CellOfTile(), ClearDisplayOrder(), and SetDisplayOrder().

◆ hover_detail_

std::function<std::string(int)> yaze::gui::TileSelectorWidget::hover_detail_
private

Definition at line 170 of file tile_selector_widget.h.

Referenced by Render(), and SetHoverDetailProvider().


The documentation for this class was generated from the following files: