inline void TabMenuDisplay::PaintMainMenuBorder(Canvas &canvas) const { PixelRect rc = GetMainMenuButtonSize(0); rc.bottom = GetMainMenuButtonSize(GetNumMainMenuItems() - 1).bottom; rc.Grow(GetTabLineHeight()); canvas.DrawFilledRectangle(rc, COLOR_BLACK); }
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::UpdateLayout() { const unsigned window_width = GetWidth(); const unsigned window_height = GetHeight(); const unsigned border_width = GetTabLineHeight(); const unsigned menu_button_height = std::min(Layout::GetMaximumControlHeight(), window_height / 7u); const unsigned menu_button_width = (window_width - 2 * border_width) / 2; const unsigned offset = Layout::Scale(2); const unsigned item_height = menu_button_height + border_width; for (unsigned main_i = 0, main_y = border_width; main_i < main_menu_buttons.size(); ++main_i) { MainMenuButton &main = main_menu_buttons[main_i]; main.rc.left = 0; main.rc.right = menu_button_width; main.rc.top = main_y; main.rc.bottom = main.rc.top + menu_button_height; main_y = main.rc.bottom + border_width; main.renderer.InvalidateLayout(); const unsigned group_height = item_height * main.NumSubMenus() + border_width; unsigned page_y = main.rc.top + offset; if (page_y + group_height > window_height) page_y = window_height - group_height - offset; for (unsigned page_i = main.first_page_index; page_i <= main.last_page_index; ++page_i) { SubMenuButton &page = buttons[page_i]; page.rc.left = menu_button_width + border_width; page.rc.right = page.rc.left + menu_button_width; page.rc.top = page_y; page.rc.bottom = page.rc.top + menu_button_height; page_y = page.rc.bottom + border_width; page.renderer.InvalidateLayout(); } } }
const PixelRect& TabMenuControl::GetSubMenuButtonSize(unsigned page) const { assert(page < buttons.size()); if (buttons[page]->rc.left < buttons[page]->rc.right) return buttons[page]->rc; const PageItem &item = this->GetPageItem(page); const MainMenuButton &main_button = GetMainMenuButton(item.main_menu_index); const unsigned sub_index = page - main_button.first_page_index; PixelRect &rc = buttons[page]->rc; const UPixelScalar margin = Layout::Scale(1); const UPixelScalar finalmargin = Layout::Scale(1); const unsigned subMenuItemCount = main_button.NumSubMenus(); const UPixelScalar tabHeight = GetTabHeight(); const UPixelScalar butHeight = GetMenuButtonHeight(); const UPixelScalar itemHeight = butHeight + margin; const UPixelScalar SubMenuHeight = itemHeight * subMenuItemCount + finalmargin; const UPixelScalar topMainMenuItem = item.main_menu_index * itemHeight + finalmargin; const UPixelScalar offset = Layout::Scale(2); const UPixelScalar topMainMenuItemWOffset = topMainMenuItem + offset; const UPixelScalar subMenuTop = (topMainMenuItemWOffset + SubMenuHeight <= tabHeight) ? topMainMenuItemWOffset : tabHeight - SubMenuHeight - offset; rc.top = subMenuTop + sub_index * itemHeight; rc.bottom = rc.top + butHeight; rc.left = GetMenuButtonWidth() + GetTabLineHeight(); rc.right = rc.left + GetMenuButtonWidth(); return buttons[page]->rc; }
UPixelScalar TabMenuControl::GetMenuButtonWidth() const { return (tab_display->GetTabWidth() - GetTabLineHeight()) / 2; }
UPixelScalar TabMenuControl::GetTabHeight() const { return GetMenuButtonHeight() * TabMenuControl::MAX_MAIN_MENU_ITEMS + GetTabLineHeight() * 2; }