#pragma once #include #include "DiabloUI/ui_item.h" #include "engine/pcx_sprite.hpp" namespace devilution { extern std::optional ArtScrollBarBackground; extern std::optional ArtScrollBarThumb; extern std::optional ArtScrollBarArrow; const Uint16 SCROLLBAR_BG_WIDTH = 25; enum ScrollBarArrowFrame : uint8_t { ScrollBarArrowFrame_UP_ACTIVE, ScrollBarArrowFrame_UP, ScrollBarArrowFrame_DOWN_ACTIVE, ScrollBarArrowFrame_DOWN, }; const Uint16 SCROLLBAR_ARROW_WIDTH = 25; inline SDL_Rect UpArrowRect(const UiScrollbar *sb) { SDL_Rect Tmp; Tmp.x = sb->m_rect.x; Tmp.y = sb->m_rect.y; Tmp.w = SCROLLBAR_ARROW_WIDTH; Tmp.h = static_cast(sb->m_arrow.frameHeight()); return Tmp; } inline SDL_Rect DownArrowRect(const UiScrollbar *sb) { SDL_Rect Tmp; Tmp.x = sb->m_rect.x; Tmp.y = static_cast(sb->m_rect.y + sb->m_rect.h - sb->m_arrow.frameHeight()); Tmp.w = SCROLLBAR_ARROW_WIDTH, Tmp.h = static_cast(sb->m_arrow.frameHeight()); return Tmp; } inline Uint16 BarHeight(const UiScrollbar *sb) { return sb->m_rect.h - 2 * sb->m_arrow.frameHeight(); } inline SDL_Rect BarRect(const UiScrollbar *sb) { SDL_Rect Tmp; Tmp.x = sb->m_rect.x; Tmp.y = static_cast(sb->m_rect.y + sb->m_arrow.frameHeight()); Tmp.w = SCROLLBAR_ARROW_WIDTH, Tmp.h = BarHeight(sb); return Tmp; } inline SDL_Rect ThumbRect(const UiScrollbar *sb, std::size_t selected_index, std::size_t num_items) { const int THUMB_OFFSET_X = 3; const int thumb_max_y = BarHeight(sb) - sb->m_thumb.height(); const int thumb_y = static_cast(selected_index * thumb_max_y / (num_items - 1)); SDL_Rect Tmp; Tmp.x = static_cast(sb->m_rect.x + THUMB_OFFSET_X); Tmp.y = static_cast(sb->m_rect.y + sb->m_arrow.frameHeight() + thumb_y); Tmp.w = static_cast(sb->m_rect.w - THUMB_OFFSET_X); Tmp.h = static_cast(sb->m_thumb.height()); return Tmp; } void LoadScrollBar(); void UnloadScrollBar(); } // namespace devilution