void PixmapSlider::paintEvent(QPaintEvent *pe) { QPainter p(this); int grabber=(type==TYPE_VERTICAL)?skin.grabber.height():skin.grabber.width(); int slider_ofs=get_grabber_offset(); int fill_size=slider_ofs+margin_beg+grabber/2; if (type==TYPE_VERTICAL) { p.drawPixmap(0,height()-fill_size, skin.bottom_full , 0, height()-fill_size, width(), fill_size); p.drawPixmap(0,0, skin.bottom , 0, 0, width(), height()-fill_size); } else { p.drawPixmap(0,0, skin.bottom_full , 0, 0, fill_size, height()); p.drawPixmap(fill_size,0, skin.bottom , fill_size, 0, width()-fill_size,height()); } paint_grabber( p); }
void PixmapSlider::paint_grabber(QPainter&p) { int grabber=(type==TYPE_VERTICAL)?skin.grabber.height():skin.grabber.width(); int fill_size=get_grabber_offset()+margin_beg+grabber/2; if (type==TYPE_VERTICAL) { p.drawPixmap((width()-skin.grabber.width())/2,(height()-fill_size-grabber/2),skin.grabber); } else { p.drawPixmap((fill_size-grabber/2),(height()-skin.grabber.height())/2,skin.grabber); } }
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; } } }
void ScrollBar::_notification(int p_what) { if (p_what == NOTIFICATION_DRAW) { RID ci = get_canvas_item(); Ref<Texture> decr = highlight == HIGHLIGHT_DECR ? get_icon("decrement_highlight") : get_icon("decrement"); Ref<Texture> incr = highlight == HIGHLIGHT_INCR ? get_icon("increment_highlight") : get_icon("increment"); Ref<StyleBox> bg = has_focus() ? get_stylebox("scroll_focus") : get_stylebox("scroll"); Ref<StyleBox> grabber; if (drag.active) grabber = get_stylebox("grabber_pressed"); else if (highlight == HIGHLIGHT_RANGE) grabber = get_stylebox("grabber_highlight"); else grabber = get_stylebox("grabber"); Point2 ofs; VisualServer *vs = VisualServer::get_singleton(); vs->canvas_item_add_texture_rect(ci, Rect2(Point2(), decr->get_size()), decr->get_rid()); if (orientation == HORIZONTAL) ofs.x += decr->get_width(); else ofs.y += decr->get_height(); Size2 area = get_size(); if (orientation == HORIZONTAL) area.width -= incr->get_width() + decr->get_width(); else area.height -= incr->get_height() + decr->get_height(); bg->draw(ci, Rect2(ofs, area)); if (orientation == HORIZONTAL) ofs.width += area.width; else ofs.height += area.height; vs->canvas_item_add_texture_rect(ci, Rect2(ofs, decr->get_size()), incr->get_rid()); Rect2 grabber_rect; if (orientation == HORIZONTAL) { grabber_rect.size.width = get_grabber_size(); grabber_rect.size.height = get_size().height; grabber_rect.position.y = 0; grabber_rect.position.x = get_grabber_offset() + decr->get_width() + bg->get_margin(MARGIN_LEFT); } else { grabber_rect.size.width = get_size().width; grabber_rect.size.height = get_grabber_size(); grabber_rect.position.y = get_grabber_offset() + decr->get_height() + bg->get_margin(MARGIN_TOP); grabber_rect.position.x = 0; } grabber->draw(ci, grabber_rect); } if (p_what == NOTIFICATION_ENTER_TREE) { if (has_node(drag_slave_path)) { Node *n = get_node(drag_slave_path); drag_slave = n->cast_to<Control>(); } if (drag_slave) { drag_slave->connect("gui_input", this, "_drag_slave_input"); drag_slave->connect("tree_exited", this, "_drag_slave_exit", varray(), CONNECT_ONESHOT); } } if (p_what == NOTIFICATION_EXIT_TREE) { if (drag_slave) { drag_slave->disconnect("gui_input", this, "_drag_slave_input"); drag_slave->disconnect("tree_exited", this, "_drag_slave_exit"); } drag_slave = NULL; } if (p_what == NOTIFICATION_FIXED_PROCESS) { if (scrolling) { if (get_value() != target_scroll) { double target = target_scroll - get_value(); double dist = sqrt(target * target); double vel = ((target / dist) * 500) * get_fixed_process_delta_time(); if (vel >= dist) { set_value(target_scroll); } else { set_value(get_value() + vel); } } else { scrolling = false; set_fixed_process(false); } } else if (drag_slave_touching) { if (drag_slave_touching_deaccel) { Vector2 pos = Vector2(orientation == HORIZONTAL ? get_value() : 0, orientation == VERTICAL ? get_value() : 0); pos += drag_slave_speed * get_fixed_process_delta_time(); bool turnoff = false; if (orientation == HORIZONTAL) { if (pos.x < 0) { pos.x = 0; turnoff = true; } if (pos.x > (get_max() - get_page())) { pos.x = get_max() - get_page(); turnoff = true; } set_value(pos.x); float sgn_x = drag_slave_speed.x < 0 ? -1 : 1; float val_x = Math::abs(drag_slave_speed.x); val_x -= 1000 * get_fixed_process_delta_time(); if (val_x < 0) { turnoff = true; } drag_slave_speed.x = sgn_x * val_x; } else { if (pos.y < 0) { pos.y = 0; turnoff = true; } if (pos.y > (get_max() - get_page())) { pos.y = get_max() - get_page(); turnoff = true; } set_value(pos.y); float sgn_y = drag_slave_speed.y < 0 ? -1 : 1; float val_y = Math::abs(drag_slave_speed.y); val_y -= 1000 * get_fixed_process_delta_time(); if (val_y < 0) { turnoff = true; } drag_slave_speed.y = sgn_y * val_y; } if (turnoff) { set_fixed_process(false); drag_slave_touching = false; drag_slave_touching_deaccel = false; } } else { if (time_since_motion == 0 || time_since_motion > 0.1) { Vector2 diff = drag_slave_accum - last_drag_slave_accum; last_drag_slave_accum = drag_slave_accum; drag_slave_speed = diff / get_fixed_process_delta_time(); } time_since_motion += get_fixed_process_delta_time(); } } } if (p_what == NOTIFICATION_MOUSE_EXIT) { highlight = HIGHLIGHT_NONE; update(); } }
void ScrollBar::_input_event(InputEvent p_event) { switch(p_event.type) { case InputEvent::MOUSE_BUTTON: { const InputEventMouseButton &b=p_event.mouse_button; accept_event(); if (b.button_index==5 && b.pressed) { if (orientation==VERTICAL) set_val( get_val() + get_page() / 4.0 ); else set_val( get_val() + get_page() / 4.0 ); accept_event(); } if (b.button_index==4 && b.pressed) { if (orientation==HORIZONTAL) set_val( get_val() - get_page() / 4.0 ); else set_val( get_val() - get_page() / 4.0 ); accept_event(); } if (b.button_index!=1) return; if (b.pressed) { double ofs = orientation==VERTICAL ? b.y : b.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_val( get_val() - (custom_step>=0?custom_step:get_step()) ); break; } if (ofs > total-incr_size ) { set_val( get_val() + (custom_step>=0?custom_step:get_step()) ); break; } ofs-=decr_size; if ( ofs < grabber_ofs ) { set_val( get_val() - get_page() ); break; } ofs-=grabber_ofs; if (ofs < grabber_size ) { drag.active=true; drag.pos_at_click=grabber_ofs+ofs; drag.value_at_click=get_unit_value(); update(); } else { set_val( get_val() + get_page() ); } } else { drag.active=false; update(); } } break; case InputEvent::MOUSE_MOTION: { const InputEventMouseMotion &m=p_event.mouse_motion; accept_event(); if (drag.active) { double ofs = orientation==VERTICAL ? m.y : m.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_unit_value( drag.value_at_click + diff ); } else { double ofs = orientation==VERTICAL ? m.y : m.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; HiliteStatus new_hilite; if (ofs < decr_size ) { new_hilite=HILITE_DECR; } else if (ofs > total-incr_size ) { new_hilite=HILITE_INCR; } else { new_hilite=HILITE_RANGE; } if (new_hilite!=hilite) { hilite=new_hilite; update(); } } } break; case InputEvent::KEY: { const InputEventKey &k=p_event.key; if (!k.pressed) return; switch (k.scancode) { case KEY_LEFT: { if (orientation!=HORIZONTAL) return; set_val( get_val() - (custom_step>=0?custom_step:get_step()) ); } break; case KEY_RIGHT: { if (orientation!=HORIZONTAL) return; set_val( get_val() + (custom_step>=0?custom_step:get_step()) ); } break; case KEY_UP: { if (orientation!=VERTICAL) return; set_val( get_val() - (custom_step>=0?custom_step:get_step()) ); } break; case KEY_DOWN: { if (orientation!=VERTICAL) return; set_val( get_val() + (custom_step>=0?custom_step:get_step()) ); } break; case KEY_HOME: { set_val( get_min() ); } break; case KEY_END: { set_val( get_max() ); } break; } break; } } }