void Tab_Impl::on_resized() { Rect header_rect = tab->get_geometry().get_size(); header_rect.bottom = tab_header->get_css_height(); tab_header->set_geometry(header_rect); std::vector<TabPage*>::iterator it; for (it = pages.begin(); it!=pages.end(); ++it) { Rect cr = get_client_rect(); (*it)->set_geometry(cr); } }
void TabHeader_Impl::update_handle_rects() { Canvas canvas = component->get_canvas(); int last_tab_end_x = first_tab_x_offset; std::vector<Handle>::size_type i; for (i = 0; i < tabs.size(); ++i) { int tab_width = tabs[i].part.get_css_width(); // Apply padding-left, padding-right css values: Rect render_rect = tabs[i].part.get_border_box(tabs[i].part.get_render_text_size(canvas, tabs[i].label)); if (render_rect.get_width() > tab_width) { tab_width = render_rect.get_width(); } tabs[i].rect = Rect( last_tab_end_x, 0, last_tab_end_x + tab_width, tabs[i].part.get_css_height()); last_tab_end_x += tab_width; } }
Rect Tab_Impl::get_client_rect() { Rect hr = tab_header->get_geometry(); Rect g = tab->get_geometry().get_size(); g.top = hr.bottom; Rect content = tab->get_content_box(); return content; }
void TabHeader_Impl::on_render(Canvas &canvas, const Rect &update_rect) { Rect rect = component->get_geometry(); std::vector<Handle>::size_type i; for (i = 0; i < tabs.size(); i++) { Handle &handle = tabs[i]; handle.part.render_box(canvas, handle.rect); Rect rect_handle_content = handle.part.get_content_box(handle.rect); Size text_size = handle.part.render_text(canvas, handle.label, rect_handle_content).get_size(); if (component->has_focus() && i == selected_page) { Rect focus_rect = handle.rect; focus_rect.shrink(2,2,2,2); part_focus.render_box(canvas, focus_rect); } } }
void TabHeader_Impl::on_process_message(std::shared_ptr<GUIMessage> &msg) { if(component->is_enabled()) { std::shared_ptr<GUIMessage_Input> input_msg = std::dynamic_pointer_cast<GUIMessage_Input>(msg); if (input_msg) { const InputEvent &e = input_msg->input_event; Point pos = e.mouse_pos; if (e.type == InputEvent::pressed && e.id == mouse_left) { std::vector<Handle>::iterator it; for (it = tabs.begin(); it != tabs.end(); ++it) { bool inside = (*it).rect.contains(pos); if (inside) { unselect_all(); (*it).part.set_pseudo_class(CssStr::selected, true); (*it).part.set_pseudo_class(CssStr::normal, false); component->request_repaint(); if (!func_page_selected.is_null()) func_page_selected.invoke((*it).tab_page); } } msg->consumed = true; } else if (e.type == InputEvent::pointer_moved) { std::vector<Handle>::iterator it; for (it = tabs.begin(); it != tabs.end(); ++it) { bool inside = (*it).rect.contains(pos); if (inside) { if ((*it).part.get_pseudo_class(CssStr::selected)) return; (*it).part.set_pseudo_class(CssStr::hover, true); (*it).part.set_pseudo_class(CssStr::normal, false); component->request_repaint(); msg->consumed = true; } else if ((*it).part.get_pseudo_class(CssStr::hover)) { (*it).part.set_pseudo_class(CssStr::hover, false); (*it).part.set_pseudo_class(CssStr::normal, true); component->request_repaint(); msg->consumed = true; } } } else if (e.type == InputEvent::pressed && e.id == keycode_left) { int next_page = selected_page - 1; if (next_page < 0) next_page = tabs.size()-1; unselect_all(); select_page(next_page); if (!func_page_selected.is_null()) func_page_selected.invoke(tabs[next_page].tab_page); component->select_page(next_page); msg->consumed = true; } else if (e.type == InputEvent::pressed && e.id == keycode_right) { int next_page = selected_page + 1; if (next_page >= tabs.size()) next_page = 0; unselect_all(); select_page(next_page); if (!func_page_selected.is_null()) func_page_selected.invoke(tabs[next_page].tab_page); component->request_repaint(); msg->consumed = true; } else if (e.type == InputEvent::pressed && (e.id == keycode_up || e.id == keycode_down)) { // block focus switching with up/down when in tab header. msg->consumed = true; } } std::shared_ptr<GUIMessage_Pointer> pointer = std::dynamic_pointer_cast<GUIMessage_Pointer>(msg); if (pointer) { if (pointer->pointer_type == GUIMessage_Pointer::pointer_leave) { std::vector<Handle>::iterator it; for (it = tabs.begin(); it != tabs.end(); ++it) { (*it).part.set_pseudo_class(CssStr::hover, false); (*it).part.set_pseudo_class(CssStr::normal, true); } component->request_repaint(); } } std::shared_ptr<GUIMessage_FocusChange> focus_change_msg = std::dynamic_pointer_cast<GUIMessage_FocusChange>(msg); if (focus_change_msg) { if (focus_change_msg->focus_type == GUIMessage_FocusChange::gained_focus) { component->set_pseudo_class(CssStr::focused, true); component->request_repaint(); } else { component->set_pseudo_class(CssStr::focused, false); component->request_repaint(); } msg->consumed = true; } } }