inline void TabMenuDisplay::PaintSubMenuBorder(Canvas &canvas, const MainMenuButton &main_button) const { PixelRect rc = GetSubMenuButtonSize(main_button.first_page_index); rc.bottom = GetSubMenuButtonSize(main_button.last_page_index).bottom; rc.Grow(GetTabLineHeight()); canvas.DrawFilledRectangle(rc, COLOR_BLACK); }
void TabMenuDisplay::SetCursor(unsigned i) { if (i == cursor) return; if (IsDefined()) { if (SupportsPartialRedraw() && GetPageMainIndex(cursor) == GetPageMainIndex(i)) { Invalidate(GetSubMenuButtonSize(cursor)); Invalidate(GetSubMenuButtonSize(i)); } else Invalidate(); } cursor = i; }
inline const PixelRect & TabMenuDisplay::GetButtonPosition(MenuTabIndex i) const { assert(!i.IsNone()); return i.IsMain() ? GetMainMenuButtonSize(i.main_index) : GetSubMenuButtonSize(GetPageNum(i)); }
TabMenuControl::MenuTabIndex TabMenuControl::IsPointOverButton(RasterPoint Pos, unsigned mainIndex) const { // scan main menu buttons for (unsigned i = 0; i < GetNumMainMenuItems(); i++) if (GetMainMenuButtonSize(i).IsInside(Pos)) return MenuTabIndex(i); // scan visible submenu if (mainIndex < GetNumMainMenuItems()) { const MainMenuButton &main_button = GetMainMenuButton(mainIndex); for (unsigned i = main_button.first_page_index; i <= main_button.last_page_index; ++i) { if (GetSubMenuButtonSize(i).IsInside(Pos)) return MenuTabIndex(mainIndex, i - main_button.first_page_index); } } return MenuTabIndex::None(); }
inline void TabMenuDisplay::PaintSubMenuItems(Canvas &canvas, const unsigned CaptionStyle) const { const MainMenuButton &main_button = GetMainMenuButton(GetPageMainIndex(cursor)); PaintSubMenuBorder(canvas, main_button); assert(main_button.first_page_index < buttons.size()); assert(main_button.last_page_index < buttons.size()); const bool is_focused = !HasCursorKeys() || HasFocus(); for (unsigned first_page_index = main_button.first_page_index, last_page_index = main_button.last_page_index, page_index = first_page_index; page_index <= last_page_index; ++page_index) { const unsigned sub_index = page_index - first_page_index; const bool is_pressed = sub_index == down_index.sub_index && !drag_off_button; const bool is_cursor = page_index == cursor; const bool is_selected = is_pressed || is_cursor; canvas.SetTextColor(look.list.GetTextColor(is_selected, is_focused, is_pressed)); canvas.SetBackgroundColor(look.list.GetBackgroundColor(is_selected, is_focused, is_pressed)); const PixelRect &rc = GetSubMenuButtonSize(page_index); TabDisplay::PaintButton(canvas, CaptionStyle, gettext(pages[page_index].menu_caption), rc, nullptr, is_cursor, false); } }