void wxRibbonBar::OnMouseLeftDown(wxMouseEvent& evt) { wxRibbonPageTabInfo *tab = HitTestTabs(evt.GetPosition()); if(tab && tab != &m_pages.Item(m_current_page)) { wxRibbonBarEvent query(wxEVT_COMMAND_RIBBONBAR_PAGE_CHANGING, GetId(), tab->page); query.SetEventObject(this); ProcessWindowEvent(query); if(query.IsAllowed()) { SetActivePage(query.GetPage()); wxRibbonBarEvent notification(wxEVT_COMMAND_RIBBONBAR_PAGE_CHANGED, GetId(), m_pages.Item(m_current_page).page); notification.SetEventObject(this); ProcessWindowEvent(notification); } } else if(tab == NULL) { if(m_tab_scroll_left_button_rect.Contains(evt.GetPosition())) { m_tab_scroll_left_button_state |= wxRIBBON_SCROLL_BTN_ACTIVE | wxRIBBON_SCROLL_BTN_HOVERED; RefreshTabBar(); } else if(m_tab_scroll_right_button_rect.Contains(evt.GetPosition())) { m_tab_scroll_right_button_state |= wxRIBBON_SCROLL_BTN_ACTIVE | wxRIBBON_SCROLL_BTN_HOVERED; RefreshTabBar(); } } }
void wxRibbonBar::OnMouseLeave(wxMouseEvent& WXUNUSED(evt)) { // The ribbon bar is (usually) at the top of a window, and at least on MSW, the mouse // can leave the window quickly and leave a tab in the hovered state. bool refresh_tabs = false; if(m_current_hovered_page != -1) { m_pages.Item((int)m_current_hovered_page).hovered = false; m_current_hovered_page = -1; refresh_tabs = true; } if(m_tab_scroll_left_button_state & wxRIBBON_SCROLL_BTN_HOVERED) { m_tab_scroll_left_button_state &= ~wxRIBBON_SCROLL_BTN_HOVERED; refresh_tabs = true; } if(m_tab_scroll_right_button_state & wxRIBBON_SCROLL_BTN_HOVERED) { m_tab_scroll_right_button_state &= ~wxRIBBON_SCROLL_BTN_HOVERED; refresh_tabs = true; } if(refresh_tabs) { RefreshTabBar(); } }
void wxRibbonBar::ScrollTabBar(int amount) { bool show_left = true; bool show_right = true; if(m_tab_scroll_amount + amount <= 0) { amount = -m_tab_scroll_amount; show_left = false; } else if(m_tab_scroll_amount + amount + (GetClientSize().GetWidth() - m_tab_margin_left - m_tab_margin_right) >= m_tabs_total_width_minimum) { amount = m_tabs_total_width_minimum - m_tab_scroll_amount - (GetClientSize().GetWidth() - m_tab_margin_left - m_tab_margin_right); show_right = false; } if(amount == 0) { return; } m_tab_scroll_amount += amount; size_t numtabs = m_pages.GetCount(); size_t i; for(i = 0; i < numtabs; ++i) { wxRibbonPageTabInfo& info = m_pages.Item(i); info.rect.SetX(info.rect.GetX() - amount); } if(show_right != (m_tab_scroll_right_button_rect.GetWidth() != 0) || show_left != (m_tab_scroll_left_button_rect.GetWidth() != 0)) { wxClientDC temp_dc(this); if(show_left) { m_tab_scroll_left_button_rect.SetWidth(m_art->GetScrollButtonMinimumSize(temp_dc, this, wxRIBBON_SCROLL_BTN_LEFT | wxRIBBON_SCROLL_BTN_NORMAL | wxRIBBON_SCROLL_BTN_FOR_TABS).GetWidth()); } else { m_tab_scroll_left_button_rect.SetWidth(0); } if(show_right) { if(m_tab_scroll_right_button_rect.GetWidth() == 0) { m_tab_scroll_right_button_rect.SetWidth(m_art->GetScrollButtonMinimumSize(temp_dc, this, wxRIBBON_SCROLL_BTN_RIGHT | wxRIBBON_SCROLL_BTN_NORMAL | wxRIBBON_SCROLL_BTN_FOR_TABS).GetWidth()); m_tab_scroll_right_button_rect.SetX(m_tab_scroll_right_button_rect.GetX() - m_tab_scroll_right_button_rect.GetWidth()); } } else { if(m_tab_scroll_right_button_rect.GetWidth() != 0) { m_tab_scroll_right_button_rect.SetX(m_tab_scroll_right_button_rect.GetX() + m_tab_scroll_right_button_rect.GetWidth()); m_tab_scroll_right_button_rect.SetWidth(0); } } } RefreshTabBar(); }
void wxRibbonBar::OnSize(wxSizeEvent& evt) { RecalculateTabSizes(); if(m_current_page != -1) { RepositionPage(m_pages.Item(m_current_page).page); } RefreshTabBar(); evt.Skip(); }
void wxRibbonBar::OnMouseMove(wxMouseEvent& evt) { int x = evt.GetX(); int y = evt.GetY(); int hovered_page = -1; bool refresh_tabs = false; if(y < m_tab_height) { // It is quite likely that the mouse moved a small amount and is still over the same tab if(m_current_hovered_page != -1 && m_pages.Item((size_t)m_current_hovered_page).rect.Contains(x, y)) { hovered_page = m_current_hovered_page; // But be careful, if tabs can be scrolled, then parts of the tab rect may not be valid if(m_tab_scroll_buttons_shown) { if(x >= m_tab_scroll_right_button_rect.GetX() || x < m_tab_scroll_left_button_rect.GetRight()) { hovered_page = -1; } } } else { HitTestTabs(evt.GetPosition(), &hovered_page); } } if(hovered_page != m_current_hovered_page) { if(m_current_hovered_page != -1) { m_pages.Item((int)m_current_hovered_page).hovered = false; } m_current_hovered_page = hovered_page; if(m_current_hovered_page != -1) { m_pages.Item((int)m_current_hovered_page).hovered = true; } refresh_tabs = true; } if(m_tab_scroll_buttons_shown) { #define SET_FLAG(variable, flag) \ { if(((variable) & (flag)) != (flag)) { variable |= (flag); refresh_tabs = true; }} #define UNSET_FLAG(variable, flag) \ { if((variable) & (flag)) { variable &= ~(flag); refresh_tabs = true; }} if(m_tab_scroll_left_button_rect.Contains(x, y)) SET_FLAG(m_tab_scroll_left_button_state, wxRIBBON_SCROLL_BTN_HOVERED) else UNSET_FLAG(m_tab_scroll_left_button_state, wxRIBBON_SCROLL_BTN_HOVERED) if(m_tab_scroll_right_button_rect.Contains(x, y)) SET_FLAG(m_tab_scroll_right_button_state, wxRIBBON_SCROLL_BTN_HOVERED) else UNSET_FLAG(m_tab_scroll_right_button_state, wxRIBBON_SCROLL_BTN_HOVERED) #undef SET_FLAG #undef UNSET_FLAG } if(refresh_tabs) { RefreshTabBar(); } }
void wxRibbonBar::OnMouseLeftDown(wxMouseEvent& evt) { wxRibbonPageTabInfo *tab = HitTestTabs(evt.GetPosition()); SetFocus(); if ( tab ) { if ( m_ribbon_state == wxRIBBON_BAR_MINIMIZED ) { ShowPanels(); m_ribbon_state = wxRIBBON_BAR_EXPANDED; } else if ( (tab == &m_pages.Item(m_current_page)) && (m_ribbon_state == wxRIBBON_BAR_EXPANDED) ) { HidePanels(); m_ribbon_state = wxRIBBON_BAR_MINIMIZED; } } else { if ( m_ribbon_state == wxRIBBON_BAR_EXPANDED ) { HidePanels(); m_ribbon_state = wxRIBBON_BAR_MINIMIZED; } } if(tab && tab != &m_pages.Item(m_current_page)) { wxRibbonBarEvent query(wxEVT_RIBBONBAR_PAGE_CHANGING, GetId(), tab->page); query.SetEventObject(this); ProcessWindowEvent(query); if(query.IsAllowed()) { SetActivePage(query.GetPage()); wxRibbonBarEvent notification(wxEVT_RIBBONBAR_PAGE_CHANGED, GetId(), m_pages.Item(m_current_page).page); notification.SetEventObject(this); ProcessWindowEvent(notification); } } else if(tab == NULL) { if(m_tab_scroll_left_button_rect.Contains(evt.GetPosition())) { m_tab_scroll_left_button_state |= wxRIBBON_SCROLL_BTN_ACTIVE | wxRIBBON_SCROLL_BTN_HOVERED; RefreshTabBar(); } else if(m_tab_scroll_right_button_rect.Contains(evt.GetPosition())) { m_tab_scroll_right_button_state |= wxRIBBON_SCROLL_BTN_ACTIVE | wxRIBBON_SCROLL_BTN_HOVERED; RefreshTabBar(); } } wxPoint position = evt.GetPosition(); if(position.x >= 0 && position.y >= 0) { wxSize size = GetSize(); if(position.x < size.GetWidth() && position.y < size.GetHeight()) { if(m_toggle_button_rect.Contains(position)) { bool pshown = ArePanelsShown(); ShowPanels(!pshown); if ( pshown ) m_ribbon_state = wxRIBBON_BAR_MINIMIZED; else m_ribbon_state = wxRIBBON_BAR_PINNED; wxRibbonBarEvent event(wxEVT_RIBBONBAR_TOGGLED, GetId()); event.SetEventObject(this); ProcessWindowEvent(event); } if ( m_help_button_rect.Contains(position) ) { wxRibbonBarEvent event(wxEVT_RIBBONBAR_HELP_CLICK, GetId()); event.SetEventObject(this); ProcessWindowEvent(event); } } } }