void RadioButton_Impl::on_enablemode_changed() { radio->set_pseudo_class(CssStr::disabled, !radio->is_enabled()); radio->set_pseudo_class(CssStr::normal, radio->is_enabled()); part_checker.set_pseudo_class(CssStr::disabled, !radio->is_enabled()); part_checker.set_pseudo_class(CssStr::normal, radio->is_enabled()); radio->request_repaint(); }
void RadioButton_Impl::create_parts() { part_checker = GUIThemePart(radio, CssStr::RadioButton::part_checker); part_checker.set_pseudo_class(CssStr::hover, false); part_checker.set_pseudo_class(CssStr::normal, true); part_checker.set_pseudo_class(CssStr::pressed, false); part_checker.set_pseudo_class(CssStr::checked, false); part_checker.set_pseudo_class(CssStr::indeterminated, false); part_checker.set_pseudo_class(CssStr::unchecked, true); part_checker.set_pseudo_class(CssStr::disabled, false); part_focus = GUIThemePart(radio, CssStr::RadioButton::part_focus); }
void Window_Impl::on_process_message(std::shared_ptr<GUIMessage> &msg) { if (!window->is_enabled()) return; if (!has_frame) // Performed by the OS on system wm return; check_move_window(msg); Rect part_buttonclose_rect = get_part_buttonclose_rect(); std::shared_ptr<GUIMessage_Input> input_msg = std::dynamic_pointer_cast<GUIMessage_Input>(msg); if (input_msg) { InputEvent &e = input_msg->input_event; if (e.type == InputEvent::pressed && e.id == mouse_left) { if(part_buttonclose_rect.contains(e.mouse_pos)) if(part_buttonclose.set_pseudo_class(CssStr::pressed, true)) window->request_repaint(); } else if (e.type == InputEvent::released && e.id == mouse_left) { if(part_buttonclose.set_pseudo_class(CssStr::pressed, false)) { window->request_repaint(); if (window->func_close() && window->func_close()()) msg->consumed = true; } } else if (e.type == InputEvent::pointer_moved) { bool inside = part_buttonclose_rect.contains(e.mouse_pos); if (part_buttonclose.get_pseudo_class(CssStr::hover) != inside) { part_buttonclose.set_pseudo_class(CssStr::hover, inside); window->request_repaint(); } } } }
void Window_Impl::create_parts() { if (has_frame) { part_caption = GUIThemePart(window, CssStr::Window::part_caption); part_frameleft = GUIThemePart(window, CssStr::Window::part_frameleft); part_frameright = GUIThemePart(window, CssStr::Window::part_frameright); part_framebottom = GUIThemePart(window, CssStr::Window::part_framebottom); part_buttonclose = GUIThemePart(window, CssStr::Window::part_buttonclose); part_buttonclose.set_pseudo_class(CssStr::normal, true); } }
void ToolBar_Impl::create_parts() { toolbar->set_pseudo_class(CssStr::horizontal, true); part_item_normal = GUIThemePart(toolbar, CssStr::ToolBar::part_item); part_item_normal.set_pseudo_class(CssStr::normal, true); part_item_disabled = GUIThemePart(toolbar, CssStr::ToolBar::part_item); part_item_disabled.set_pseudo_class(CssStr::disabled, true); part_item_pressed = GUIThemePart(toolbar, CssStr::ToolBar::part_item); part_item_pressed.set_pseudo_class(CssStr::pressed, true); part_item_hot = GUIThemePart(toolbar, CssStr::ToolBar::part_item); part_item_hot.set_pseudo_class(CssStr::hover, true); part_item_on = GUIThemePart(toolbar, CssStr::ToolBar::part_item); part_item_on.set_pseudo_class(CssStr::on, true); size_icon.width = part_item_normal.get_property_int(CssStr::icon_width, "0"); size_icon.height = part_item_normal.get_property_int(CssStr::icon_height, "0"); std::string str_alignment = toolbar->get_property(CssStr::layout, "left"); if (str_alignment == "center") layout = layout_center; else layout = layout_left; need_layout_update = true; }
void RadioButton_Impl::on_process_message(std::shared_ptr<GUIMessage> &msg) { if (!radio->is_enabled()) return; std::shared_ptr<GUIMessage_Input> input_msg = std::dynamic_pointer_cast<GUIMessage_Input>(msg); if (input_msg) { const InputEvent &e = input_msg->input_event; if (e.type == InputEvent::pressed && e.id == mouse_left) { part_checker.set_pseudo_class(CssStr::pressed, true); radio->request_repaint(); msg->consumed = true; } else if (e.type == InputEvent::released && e.id == mouse_left) { if ((part_checker.get_pseudo_class(CssStr::checked) == false)) { Callback_v1<RadioButton*> cb = uncheck_radio_buttons(radio->get_parent_component()); part_checker.set_pseudo_class(CssStr::pressed, false); radio->set_selected(true); if (!cb.is_null()) cb.invoke(radio); if (!func_selected.is_null()) func_selected.invoke(); } else { part_checker.set_pseudo_class(CssStr::pressed, false); radio->request_repaint(); } radio->set_focus(true); msg->consumed = true; } else if (e.type == InputEvent::pressed && (e.id == keycode_left || e.id == keycode_up)) { std::vector<GUIComponent*> group = radio->get_parent_component()->get_child_component_group(radio->get_component_group_name()); // find previous visible & enabled radiobutton in the same group: GUIComponent *comp = radio->get_previous_sibling(); if (comp == 0) comp = group.back(); while (comp != radio) { if (comp->is_visible() && comp->is_enabled() && comp->get_component_group_name() == radio->get_component_group_name()) { RadioButton *focus_comp = dynamic_cast<RadioButton*>(comp); if (focus_comp) { Callback_v1<RadioButton*> cb = uncheck_radio_buttons(radio->get_parent_component()); focus_comp->set_selected(true); if (!cb.is_null()) cb.invoke(focus_comp); if (!focus_comp->func_selected().is_null()) focus_comp->func_selected().invoke(); focus_comp->set_focus(); break; } } if (!comp->get_previous_sibling() || comp->get_previous_sibling()->get_component_group_name() != radio->get_component_group_name()) { // reach first item in group, loop around from the last: comp = group.back(); } else comp = comp->get_previous_sibling(); } msg->consumed = true; } else if (e.type == InputEvent::pressed && (e.id == keycode_right || e.id == keycode_down)) { std::vector<GUIComponent*> group = radio->get_parent_component()->get_child_component_group(radio->get_component_group_name()); // find next visible & enabled radiobutton in the same group: GUIComponent *comp = radio->get_next_sibling(); if (comp == 0 || comp->get_component_group_name() != radio->get_component_group_name()) comp = group.front(); while (comp != radio) { if (comp->is_visible() && comp->is_enabled() && comp->get_component_group_name() == radio->get_component_group_name()) { RadioButton *focus_comp = dynamic_cast<RadioButton*>(comp); if (focus_comp) { Callback_v1<RadioButton*> cb = uncheck_radio_buttons(radio->get_parent_component()); focus_comp->set_selected(true); if (!cb.is_null()) cb.invoke(focus_comp); if (!focus_comp->func_selected().is_null()) focus_comp->func_selected().invoke(); focus_comp->set_focus(); break; } } if (!comp->get_previous_sibling() || comp->get_previous_sibling()->get_component_group_name() != radio->get_component_group_name()) { // reach first item in group, loop around from the last: comp = group.back(); } else comp = comp->get_next_sibling(); } 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_enter) { part_checker.set_pseudo_class(CssStr::hover, true); radio->request_repaint(); } else { part_checker.set_pseudo_class(CssStr::hover, false); radio->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) { radio->set_pseudo_class(CssStr::focused, true); if (!radio->is_selected()) { Callback_v1<RadioButton*> cb = uncheck_radio_buttons(radio->get_parent_component()); radio->set_selected(true); if (!cb.is_null()) cb.invoke(radio); if (!func_selected.is_null()) func_selected.invoke(); } radio->request_repaint(); } else { radio->set_pseudo_class(CssStr::focused, false); radio->request_repaint(); } msg->consumed = true; } }