gravel_frontend_fltk/
scrollbar.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
use fltk::enums::{Color, FrameType};
use fltk::{frame::Frame, prelude::*};

/// Custom Scrollbar implementation.
///
/// For display only, it is not interactive.
pub struct Scrollbar {
	frame: Frame,
	slider: Frame,
	slider_position: f32,
	slider_size: f32,
	pos: (i32, i32),
	size: (i32, i32),
	padding: i32,
}

impl Scrollbar {
	/// Constructs a default instance.
	pub fn default() -> Self {
		let mut frame = Frame::default();
		frame.set_frame(FrameType::FlatBox);
		frame.set_color(Color::from_hex(0xffffff));

		let mut slider = Frame::default();
		slider.set_frame(FrameType::FlatBox);
		slider.set_color(Color::from_hex(0xd77b0f));

		Self {
			frame,
			slider,
			slider_position: 0.0,
			slider_size: 0.5,
			pos: (0, 0),
			size: (0, 0),
			padding: 2,
		}
	}

	pub fn with_pos(mut self, x: i32, y: i32) -> Self {
		self.pos = (x, y);
		self.apply();
		self
	}

	pub fn with_size(mut self, w: i32, h: i32) -> Self {
		self.size = (w, h);
		self.apply();
		self
	}

	pub fn with_padding(mut self, padding: i32) -> Self {
		self.padding = padding;
		self.apply();
		self
	}

	pub fn with_colors(mut self, frame: Color, slider: Color) -> Self {
		self.frame.set_color(frame);
		self.slider.set_color(slider);
		self
	}

	pub fn set_slider_position(&mut self, position: f32) {
		self.slider_position = position;
		self.apply();
	}

	pub fn set_slider_size(&mut self, size: f32) {
		self.slider_size = size;
		self.apply();
	}

	pub fn hide(&mut self) {
		self.frame.hide();
		self.slider.hide();
	}

	pub fn show(&mut self) {
		self.frame.show();
		self.slider.show();
	}

	fn apply(&mut self) {
		self.frame.set_pos(self.pos.0, self.pos.1);
		self.frame.set_size(self.size.0, self.size.1);

		let slider_x = self.pos.0 + self.padding;
		let slider_y = self.pos.1 + (self.size.1 as f32 * self.slider_position) as i32;
		let slider_w = self.size.0 - self.padding * 2;
		let slider_h = (self.size.1 as f32 * self.slider_size) as i32;
		self.slider.set_pos(slider_x, slider_y);
		self.slider.set_size(slider_w, slider_h);
	}
}