Pixel-Composer/scripts/scrollPane/scrollPane.gml

138 lines
3.9 KiB
Text
Raw Normal View History

2023-01-17 08:11:55 +01:00
function scrollPane(_w, _h, ondraw) : widget() constructor {
2022-01-13 05:24:03 +01:00
scroll_y = 0;
scroll_y_raw = 0;
scroll_y_to = 0;
2023-02-15 10:43:24 +01:00
x = 0;
y = 0;
2022-01-13 05:24:03 +01:00
w = _w;
h = _h;
2022-12-16 09:18:09 +01:00
surface_w = _w - ui(12);
2022-01-13 05:24:03 +01:00
surface_h = _h;
2022-11-03 11:44:49 +01:00
surface = surface_create_valid(surface_w, surface_h);
2022-01-13 05:24:03 +01:00
drawFunc = ondraw;
content_h = 0;
2022-12-16 09:18:09 +01:00
is_scroll = true;
2023-09-14 16:29:39 +02:00
always_scroll = false;
show_scroll = true;
2022-01-13 05:24:03 +01:00
scroll_step = 64;
2023-10-04 09:49:31 +02:00
scroll_lock = false;
2022-01-13 05:24:03 +01:00
2022-09-27 06:37:28 +02:00
is_scrolling = false;
2022-12-19 13:35:30 +01:00
scroll_ms = 0;
2022-01-13 05:24:03 +01:00
2022-01-24 02:21:25 +01:00
static resize = function(_w, _h) {
2022-01-13 05:24:03 +01:00
w = _w;
h = _h;
2023-09-14 16:29:39 +02:00
surface_w = _w - (always_scroll || is_scroll) * ui(12);
2022-01-13 05:24:03 +01:00
surface_h = _h;
}
2023-10-15 15:04:42 +02:00
static setScroll = function(_scroll_y) { #region
gml_pragma("forceinline");
scroll_y_to = clamp(_scroll_y, -content_h, 0);
} #endregion
2022-01-24 02:21:25 +01:00
static draw = function(x, y, _mx = mouse_mx - x, _my = mouse_my - y) {
2023-02-15 10:43:24 +01:00
self.x = x;
self.y = y;
2022-01-13 05:24:03 +01:00
var mx = _mx, my = _my;
2023-09-07 20:59:14 +02:00
hover &= point_in_rectangle(mx, my, 0, 0, surface_w, surface_h);
surface = surface_verify(surface, surface_w, surface_h);
2022-01-13 05:24:03 +01:00
surface_set_target(surface);
2022-11-18 03:20:31 +01:00
draw_clear(COLORS.panel_bg_clear);
2022-12-16 09:18:09 +01:00
var hh = drawFunc(scroll_y, [mx, my], [x, y]);
content_h = max(0, hh - surface_h);
2022-01-13 05:24:03 +01:00
surface_reset_target();
2022-12-16 09:18:09 +01:00
var sc = is_scroll;
is_scroll = hh > surface_h;
if(sc != is_scroll)
resize(w, h);
2023-01-17 08:11:55 +01:00
scroll_y_to = clamp(scroll_y_to, -content_h, 0);
scroll_y_raw = lerp_float(scroll_y_raw, scroll_y_to, 4);
scroll_y = round(scroll_y_raw);
2022-01-13 05:24:03 +01:00
draw_surface_safe(surface, x, y);
2023-10-04 09:49:31 +02:00
if(hover && !scroll_lock && !key_mod_press(SHIFT)) {
2023-04-07 21:25:27 +02:00
if(mouse_wheel_down()) scroll_y_to -= scroll_step * SCROLL_SPEED;
if(mouse_wheel_up()) scroll_y_to += scroll_step * SCROLL_SPEED;
2022-01-13 05:24:03 +01:00
}
2023-10-04 09:49:31 +02:00
scroll_lock = false;
if(show_scroll && (abs(content_h) > 0 || always_scroll)) {
2023-03-25 12:27:04 +01:00
var scr_w = sprite_get_width(THEME.ui_scrollbar);
draw_scroll(x + w - scr_w, y + ui(6), true, surface_h - ui(12), -scroll_y / content_h, surface_h / (surface_h + content_h),
2022-12-19 13:35:30 +01:00
COLORS.scrollbar_bg, COLORS.scrollbar_idle, COLORS.scrollbar_hover, x + _mx, y + _my);
2022-01-13 05:24:03 +01:00
}
}
2022-12-19 13:35:30 +01:00
static draw_scroll = function(scr_x, scr_y, is_vert, scr_s, scr_prog, scr_ratio, bg_col, bar_col, bar_hcol, mx, my) {
var scr_scale_s = scr_s * scr_ratio;
2022-01-13 05:24:03 +01:00
var scr_prog_s = scr_prog * (scr_s - scr_scale_s);
var scr_w, scr_h, bar_w, bar_h, bar_x, bar_y;
if(is_vert) {
2022-11-21 06:38:44 +01:00
scr_w = ui(sprite_get_width(THEME.ui_scrollbar));
2022-01-13 05:24:03 +01:00
scr_h = scr_s;
2022-12-19 13:35:30 +01:00
2022-11-21 06:38:44 +01:00
bar_w = ui(sprite_get_width(THEME.ui_scrollbar));
2022-01-13 05:24:03 +01:00
bar_h = scr_scale_s;
2022-12-19 13:35:30 +01:00
2022-01-13 05:24:03 +01:00
bar_x = scr_x;
bar_y = scr_y + scr_prog_s;
} else {
scr_w = scr_s;
2022-11-21 06:38:44 +01:00
scr_h = ui(sprite_get_width(THEME.ui_scrollbar));
2022-12-19 13:35:30 +01:00
2022-01-13 05:24:03 +01:00
bar_w = scr_scale_s;
2022-11-21 06:38:44 +01:00
bar_h = ui(sprite_get_width(THEME.ui_scrollbar));
2022-12-19 13:35:30 +01:00
2022-01-13 05:24:03 +01:00
bar_x = scr_x + scr_prog_s;
bar_y = scr_y;
}
2022-12-23 04:45:52 +01:00
2022-12-19 13:35:30 +01:00
if(is_scrolling) {
var delta = (is_vert? my : mx) - scroll_ms;
scroll_ms = is_vert? my : mx;
scroll_y_to -= (delta / scr_scale_s) * scr_s;
scroll_y_to = clamp(scroll_y_to, -content_h, 0);
if(mouse_release(mb_left))
is_scrolling = false;
}
2023-02-14 05:32:32 +01:00
var bx0 = clamp(bar_x, scr_x, scr_x + scr_w);
var bx1 = clamp(bar_x + bar_w, scr_x, scr_x + scr_w);
var ww = bx1 - bx0;
var by0 = clamp(bar_y, scr_y, scr_y + scr_h);
var by1 = clamp(bar_y + bar_h, scr_y, scr_y + scr_h);
var hh = by1 - by0;
draw_sprite_stretched_ext(THEME.ui_scrollbar, 0, scr_x, scr_y, scr_w, scr_h, bg_col, 1);
draw_sprite_stretched_ext(THEME.ui_scrollbar, 0, bx0, by0, ww, hh, bar_col, 1);
//draw_set_color(c_white);
//draw_rectangle(scr_x - 2, scr_y - 2, scr_x + scr_w + 2, scr_y + scr_h + 2, 0);
//draw_set_color(c_red);
//draw_circle(mx, my, 2, false);
2022-12-10 05:06:01 +01:00
if(active && point_in_rectangle(mx, my, scr_x - 2, scr_y - 2, scr_x + scr_w + 2, scr_y + scr_h + 2) || is_scrolling) {
2022-11-18 03:20:31 +01:00
draw_sprite_stretched_ext(THEME.ui_scrollbar, 0, bar_x, bar_y, bar_w, bar_h, bar_hcol, 1);
2022-12-23 04:45:52 +01:00
if(mouse_press(mb_left, active)) {
2022-01-13 05:24:03 +01:00
is_scrolling = true;
2022-12-19 13:35:30 +01:00
scroll_ms = is_vert? my : mx;
}
}
2022-01-13 05:24:03 +01:00
}
}