示例#1
0
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);
}
示例#2
0
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);
}
示例#3
0
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();
    }
  }
}
示例#4
0
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;
}
示例#5
0
UPixelScalar
TabMenuControl::GetMenuButtonWidth() const
{
  return (tab_display->GetTabWidth() - GetTabLineHeight()) / 2;
}
示例#6
0
UPixelScalar
TabMenuControl::GetTabHeight() const
{
  return GetMenuButtonHeight() * TabMenuControl::MAX_MAIN_MENU_ITEMS
      + GetTabLineHeight() * 2;
}