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; } } }