aboutsummaryrefslogtreecommitdiff
path: root/src/components/Scrollbar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/Scrollbar.cpp')
-rw-r--r--src/components/Scrollbar.cpp112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/components/Scrollbar.cpp b/src/components/Scrollbar.cpp
new file mode 100644
index 0000000..76c5c1a
--- /dev/null
+++ b/src/components/Scrollbar.cpp
@@ -0,0 +1,112 @@
+#include "Scrollbar.hpp"
+
+namespace cgeditor {
+Scrollbar::Scrollbar(Status *s, bool IsHorizontal) : Component(s) {
+ this->IsHorizontal = IsHorizontal;
+
+ bg.prop = Property::Rectangle | Property::Scrollbarbg;
+ bar.prop = Property::Rectangle | Property::Scrollbar;
+
+ if (IsHorizontal) {
+ bg.prop |= Property::Horizontal;
+ bar.x = 0;
+ } else {
+ bar.y = 0;
+ }
+
+ DragX = 0;
+ DragY = 0;
+ Trigger = false;
+}
+
+void Scrollbar::Refresh() {
+ if (IsHorizontal) {
+ bg.y = status->CanvasHeight - status->ScrollbarWidth;
+ bg.width = status->CanvasWidth - status->ScrollbarWidth;
+ bg.height = status->ScrollbarWidth;
+ bar.y = bg.y;
+ } else {
+ bg.x = status->CanvasWidth - status->ScrollbarWidth;
+ bg.width = status->CanvasWidth;
+ bg.height = status->CanvasHeight - status->ScrollbarWidth;
+ bar.x = bg.x;
+ }
+
+ bar.width = bg.width;
+ bar.height = bg.height;
+
+ // Compute move table canvas
+ double MTCanvasHeight = status->CanvasHeight - status->ScrollbarWidth;
+ double MTCanvasWidth = status->CanvasWidth - status->ScrollbarWidth;
+
+ bool shouldScroll = false;
+ if (!IsHorizontal && status->MoveTableMaxY > MTCanvasHeight) {
+ bar.height =
+ std::ceil(bg.height * (MTCanvasHeight / status->MoveTableMaxY));
+ shouldScroll = true;
+ }
+
+ if (IsHorizontal && status->MoveTableMaxX > MTCanvasWidth) {
+ bar.width = std::ceil(bg.width * (MTCanvasWidth / status->MoveTableMaxX));
+ shouldScroll = true;
+ }
+
+ if (shouldScroll) {
+ if (IsHorizontal && status->EventHScroll != 0) {
+ double percent = status->EventHScroll / status->MoveTableMaxX;
+ double maxScroll = bg.width - bar.width;
+ bar.x += maxScroll * percent;
+ bar.x = std::max(bg.x, bar.x);
+ bar.x = std::min(bg.x + maxScroll, bar.x);
+ double curScroll = bar.x - bg.x;
+ double scrollPercent = curScroll / maxScroll;
+ status->ScrollX =
+ -(status->MoveTableMaxX - MTCanvasWidth) * scrollPercent;
+ status->EventHScroll = 0;
+ } else if (status->EventVScroll != 0) {
+ double percent = status->EventVScroll / status->MoveTableMaxY;
+ double maxScroll = bg.height - bar.height;
+ bar.y += maxScroll * percent;
+ bar.y = std::max(bg.y, bar.y);
+ bar.y = std::min(bg.y + maxScroll, bar.y);
+ double curScroll = bar.y - bg.y;
+ double scrollPercent = curScroll / maxScroll;
+ status->ScrollY =
+ -(status->MoveTableMaxY - MTCanvasHeight) * scrollPercent;
+ status->EventVScroll = 0;
+ } else if (status->LeftClick &&
+ bar.IsOver(status->MouseX, status->MouseY)) {
+ DragX = bar.x;
+ DragY = bar.y;
+ Trigger = true;
+ } else if (Trigger && status->IsDrag) {
+ if (IsHorizontal) {
+ bar.x = DragX + (status->MouseX - status->LastMouseClicX);
+ bar.x = std::max(bg.x, bar.x);
+ double maxScroll = bg.width - bar.width;
+ bar.x = std::min(bg.x + maxScroll, bar.x);
+ double curScroll = bar.x - bg.x;
+ double scrollPercent = curScroll / maxScroll;
+ status->ScrollX =
+ -(status->MoveTableMaxX - MTCanvasWidth) * scrollPercent;
+ } else {
+ bar.y = DragY + (status->MouseY - status->LastMouseClicY);
+ bar.y = std::max(bg.y, bar.y);
+ double maxScroll = bg.height - bar.height;
+ bar.y = std::min(bg.y + maxScroll, bar.y);
+ double curScroll = bar.y - bg.y;
+ double scrollPercent = curScroll / maxScroll;
+ status->ScrollY =
+ -(status->MoveTableMaxY - MTCanvasHeight) * scrollPercent;
+ }
+ } else {
+ Trigger = false;
+ }
+ }
+
+ elements.clear();
+ elements.push_back(bg);
+ elements.push_back(bar);
+}
+
+} // namespace cgeditor \ No newline at end of file