void EditorSpinSlider::_grabber_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) { if (mb->is_pressed()) { grabbing_grabber = true; grabbing_ratio = get_as_ratio(); grabbing_from = grabber->get_transform().xform(mb->get_position()).x; } else { grabbing_grabber = false; } } Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid() && grabbing_grabber) { float grabbing_ofs = (grabber->get_transform().xform(mm->get_position()).x - grabbing_from) / float(grabber_range); set_as_ratio(grabbing_ratio + grabbing_ofs); update(); } }
void Slider::_gui_input(Ref<InputEvent> p_event) { if (!editable) { return; } Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { if (mb->get_button_index() == BUTTON_LEFT) { if (mb->is_pressed()) { Ref<Texture> grabber = get_icon(mouse_inside || has_focus() ? "grabber_highlight" : "grabber"); grab.pos = orientation == VERTICAL ? mb->get_position().y : mb->get_position().x; double grab_width = (double)grabber->get_size().width; double grab_height = (double)grabber->get_size().height; double max = orientation == VERTICAL ? get_size().height - grab_height : get_size().width - grab_width; if (orientation == VERTICAL) set_as_ratio(1 - (((double)grab.pos - (grab_height / 2.0)) / max)); else set_as_ratio(((double)grab.pos - (grab_width / 2.0)) / max); grab.active = true; grab.uvalue = get_as_ratio(); } else { grab.active = false; } } else if (mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_UP) { set_value(get_value() + get_step()); } else if (mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_DOWN) { set_value(get_value() - get_step()); } } Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid()) { if (grab.active) { Size2i size = get_size(); Ref<Texture> grabber = get_icon("grabber"); float motion = (orientation == VERTICAL ? mm->get_position().y : mm->get_position().x) - grab.pos; if (orientation == VERTICAL) motion = -motion; float areasize = orientation == VERTICAL ? size.height - grabber->get_size().height : size.width - grabber->get_size().width; if (areasize <= 0) return; float umotion = motion / float(areasize); set_as_ratio(grab.uvalue + umotion); } } if (!mm.is_valid() && !mb.is_valid()) { if (p_event->is_action("ui_left") && p_event->is_pressed()) { if (orientation != HORIZONTAL) return; set_value(get_value() - (custom_step >= 0 ? custom_step : get_step())); accept_event(); } else if (p_event->is_action("ui_right") && p_event->is_pressed()) { if (orientation != HORIZONTAL) return; set_value(get_value() + (custom_step >= 0 ? custom_step : get_step())); accept_event(); } else if (p_event->is_action("ui_up") && p_event->is_pressed()) { if (orientation != VERTICAL) return; set_value(get_value() + (custom_step >= 0 ? custom_step : get_step())); accept_event(); } else if (p_event->is_action("ui_down") && p_event->is_pressed()) { if (orientation != VERTICAL) return; set_value(get_value() - (custom_step >= 0 ? custom_step : get_step())); accept_event(); } else { Ref<InputEventKey> k = p_event; if (!k.is_valid() || !k->is_pressed()) return; switch (k->get_scancode()) { case KEY_HOME: { set_value(get_min()); accept_event(); } break; case KEY_END: { set_value(get_max()); accept_event(); } break; } } } }
void ScrollBar::_gui_input(Ref<InputEvent> p_event) { Ref<InputEventMouseButton> b = p_event; if (b.is_valid()) { accept_event(); if (b->get_button_index() == 5 && b->is_pressed()) { /* if (orientation==VERTICAL) set_val( get_val() + get_page() / 4.0 ); else */ set_value(get_value() + get_page() / 4.0); accept_event(); } if (b->get_button_index() == 4 && b->is_pressed()) { /* if (orientation==HORIZONTAL) set_val( get_val() - get_page() / 4.0 ); else */ set_value(get_value() - get_page() / 4.0); accept_event(); } if (b->get_button_index() != 1) return; if (b->is_pressed()) { double ofs = orientation == VERTICAL ? b->get_position().y : b->get_position().x; Ref<Texture> decr = get_icon("decrement"); Ref<Texture> incr = get_icon("increment"); double decr_size = orientation == VERTICAL ? decr->get_height() : decr->get_width(); double incr_size = orientation == VERTICAL ? incr->get_height() : incr->get_width(); double grabber_ofs = get_grabber_offset(); double grabber_size = get_grabber_size(); double total = orientation == VERTICAL ? get_size().height : get_size().width; if (ofs < decr_size) { set_value(get_value() - (custom_step >= 0 ? custom_step : get_step())); return; } if (ofs > total - incr_size) { set_value(get_value() + (custom_step >= 0 ? custom_step : get_step())); return; } ofs -= decr_size; if (ofs < grabber_ofs) { if (scrolling) { target_scroll = target_scroll - get_page(); } else { target_scroll = get_value() - get_page(); } if (smooth_scroll_enabled) { scrolling = true; set_fixed_process(true); } else { set_value(target_scroll); } return; } ofs -= grabber_ofs; if (ofs < grabber_size) { drag.active = true; drag.pos_at_click = grabber_ofs + ofs; drag.value_at_click = get_as_ratio(); update(); } else { if (scrolling) { target_scroll = target_scroll + get_page(); } else { target_scroll = get_value() + get_page(); } if (smooth_scroll_enabled) { scrolling = true; set_fixed_process(true); } else { set_value(target_scroll); } } } else { drag.active = false; update(); } } Ref<InputEventMouseMotion> m = p_event; if (m.is_valid()) { accept_event(); if (drag.active) { double ofs = orientation == VERTICAL ? m->get_position().y : m->get_position().x; Ref<Texture> decr = get_icon("decrement"); double decr_size = orientation == VERTICAL ? decr->get_height() : decr->get_width(); ofs -= decr_size; double diff = (ofs - drag.pos_at_click) / get_area_size(); set_as_ratio(drag.value_at_click + diff); } else { double ofs = orientation == VERTICAL ? m->get_position().y : m->get_position().x; Ref<Texture> decr = get_icon("decrement"); Ref<Texture> incr = get_icon("increment"); double decr_size = orientation == VERTICAL ? decr->get_height() : decr->get_width(); double incr_size = orientation == VERTICAL ? incr->get_height() : incr->get_width(); double total = orientation == VERTICAL ? get_size().height : get_size().width; HighlightStatus new_hilite; if (ofs < decr_size) { new_hilite = HIGHLIGHT_DECR; } else if (ofs > total - incr_size) { new_hilite = HIGHLIGHT_INCR; } else { new_hilite = HIGHLIGHT_RANGE; } if (new_hilite != highlight) { highlight = new_hilite; update(); } } } Ref<InputEventKey> k = p_event; if (k.is_valid()) { if (!k->is_pressed()) return; switch (k->get_scancode()) { case KEY_LEFT: { if (orientation != HORIZONTAL) return; set_value(get_value() - (custom_step >= 0 ? custom_step : get_step())); } break; case KEY_RIGHT: { if (orientation != HORIZONTAL) return; set_value(get_value() + (custom_step >= 0 ? custom_step : get_step())); } break; case KEY_UP: { if (orientation != VERTICAL) return; set_value(get_value() - (custom_step >= 0 ? custom_step : get_step())); } break; case KEY_DOWN: { if (orientation != VERTICAL) return; set_value(get_value() + (custom_step >= 0 ? custom_step : get_step())); } break; case KEY_HOME: { set_value(get_min()); } break; case KEY_END: { set_value(get_max()); } break; } } }