| 636 | #pragma region Scroll bars |
| 637 | |
| 638 | static void InputScrollBegin(WindowBase& w, WidgetIndex widgetIndex, const ScreenCoordsXY& screenCoords) |
| 639 | { |
| 640 | const auto& widget = w.widgets[widgetIndex]; |
| 641 | |
| 642 | _inputState = InputState::scrollLeft; |
| 643 | gPressedWidget.windowClassification = w.classification; |
| 644 | gPressedWidget.windowNumber = w.number; |
| 645 | gPressedWidget.widgetIndex = widgetIndex; |
| 646 | gTooltipCursor = screenCoords; |
| 647 | |
| 648 | int32_t scroll_area, scroll_id; |
| 649 | ScreenCoordsXY scrollCoords; |
| 650 | scroll_id = 0; // safety |
| 651 | widgetScrollGetPart(w, &widget, screenCoords, scrollCoords, &scroll_area, &scroll_id); |
| 652 | |
| 653 | _currentScrollArea = scroll_area; |
| 654 | _currentScrollIndex = scroll_id; |
| 655 | w.onScrollSelect(scroll_id, scroll_area); |
| 656 | if (scroll_area == SCROLL_PART_VIEW) |
| 657 | { |
| 658 | w.onScrollMouseDown(scroll_id, scrollCoords); |
| 659 | return; |
| 660 | } |
| 661 | |
| 662 | const auto& widg = w.widgets[widgetIndex]; |
| 663 | auto& scroll = w.scrolls[scroll_id]; |
| 664 | |
| 665 | int32_t widget_width = widg.width() - 2; |
| 666 | if (scroll.flags & VSCROLLBAR_VISIBLE) |
| 667 | widget_width -= kScrollBarWidth + 1; |
| 668 | int32_t widget_content_width = std::max(scroll.contentWidth - widget_width, 0); |
| 669 | |
| 670 | int32_t widget_height = widg.bottom - widg.top - 1; |
| 671 | if (scroll.flags & HSCROLLBAR_VISIBLE) |
| 672 | widget_height -= kScrollBarWidth + 1; |
| 673 | int32_t widget_content_height = std::max(scroll.contentHeight - widget_height, 0); |
| 674 | |
| 675 | switch (scroll_area) |
| 676 | { |
| 677 | case SCROLL_PART_HSCROLLBAR_LEFT: |
| 678 | scroll.contentOffsetX = std::max(scroll.contentOffsetX - 3, 0); |
| 679 | break; |
| 680 | case SCROLL_PART_HSCROLLBAR_RIGHT: |
| 681 | scroll.contentOffsetX = std::min(scroll.contentOffsetX + 3, widget_content_width); |
| 682 | break; |
| 683 | case SCROLL_PART_HSCROLLBAR_LEFT_TROUGH: |
| 684 | scroll.contentOffsetX = std::max(scroll.contentOffsetX - widget_width, 0); |
| 685 | break; |
| 686 | case SCROLL_PART_HSCROLLBAR_RIGHT_TROUGH: |
| 687 | scroll.contentOffsetX = std::min(scroll.contentOffsetX + widget_width, widget_content_width); |
| 688 | break; |
| 689 | case SCROLL_PART_VSCROLLBAR_TOP: |
| 690 | scroll.contentOffsetY = std::max(scroll.contentOffsetY - 3, 0); |
| 691 | break; |
| 692 | case SCROLL_PART_VSCROLLBAR_BOTTOM: |
| 693 | scroll.contentOffsetY = std::min(scroll.contentOffsetY + 3, widget_content_height); |
| 694 | break; |
| 695 | case SCROLL_PART_VSCROLLBAR_TOP_TROUGH: |
no test coverage detected