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);
		
	}
	
}
Example #3
0
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;
		}
	}
}
Example #4
0
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();
	}
}
Example #5
0
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;
    }
    }
}