xmake.repo/packages/n/noesis/latest/Include/NsGui/ScrollBar.h
2024-12-22 19:15:02 +08:00

228 lines
8.9 KiB
C++

////////////////////////////////////////////////////////////////////////////////////////////////////
// NoesisGUI - http://www.noesisengine.com
// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __GUI_SCROLLBAR_H__
#define __GUI_SCROLLBAR_H__
#include <NsCore/Noesis.h>
#include <NsGui/CoreApi.h>
#include <NsGui/RangeBase.h>
namespace Noesis
{
class Track;
class ScrollViewer;
class RoutedCommand;
struct DragStartedEventArgs;
struct DragDeltaEventArgs;
struct DragCompletedEventArgs;
struct CanExecuteRoutedEventArgs;
struct ExecutedRoutedEventArgs;
////////////////////////////////////////////////////////////////////////////////////////////////////
enum ScrollEventType
{
/// The Thumb was dragged to a new position and is now no longer being dragged by the user.
ScrollEventType_EndScroll,
/// The Thumb moved to the Minimum position of the ScrollBar. For a vertical ScrollBar, this
/// movement occurs when the CTRL+HOME keys are pressed. This movement corresponds to a
/// ScrollToTopCommand in a vertical ScrollBar and a ScrollToLeftEndCommand in a horizontal
/// ScrollBar.
ScrollEventType_First,
/// The Thumb moved a specified distance, as determined by the value of LargeChange, to the
/// left for a horizontal ScrollBar or upward for a vertical ScrollBar. For a vertical
/// ScrollBar, this movement occurs when the page button that is above the Thumb is pressed,
/// or when the PAGE UP key is pressed, and corresponds to a PageUpCommand. For a horizontal
/// ScrollBar, this movement occurs when the page button to the left of the Thumb is pressed,
/// and corresponds to a PageLeftCommand.
ScrollEventType_LargeDecrement,
/// The Thumb moved a specified distance, as determined by the value of LargeChange, to the
/// right for a horizontal ScrollBar or downward for a vertical ScrollBar. For a vertical
/// ScrollBar, this movement occurs when the page button that is below the Thumb is pressed,
/// or when the PAGE DOWN key is pressed, and corresponds to a PageDownCommand. For a
/// horizontal ScrollBar, this movement occurs when the page button to the right of the Thumb
/// is pressed, and corresponds to a PageRightCommand.
ScrollEventType_LargeIncrement,
/// The Thumb moved to the Maximum position of the ScrollBar. For a vertical ScrollBar, this
/// movement occurs when the CTRL+END keys are pressed. This movement corresponds to a
/// ScrollToEndCommand in a vertical ScrollBar and a ScrollToRightEndCommand in a horizontal
/// ScrollBar.
ScrollEventType_Last,
/// The Thumb moved a small distance, as determined by the value of SmallChange, to the left
/// for a horizontal ScrollBar or upward for a vertical ScrollBar. For a vertical ScrollBar,
/// this movement occurs when the upper RepeatButton is pressed or when the UP ARROW key is
/// pressed, and corresponds to a LineUpCommand. For a horizontal ScrollBar, this movement
/// occurs when the left RepeatButton is pressed, and corresponds to a LineLeftCommand.
ScrollEventType_SmallDecrement,
/// The Thumb moved a small distance, as determined by the value of SmallChange, to the right
/// for a horizontal ScrollBar or downward for a vertical ScrollBar. For a vertical ScrollBar,
/// this movement occurs when the lower RepeatButton is pressed or when the DOWN ARROW key is
/// pressed, and corresponds to a LineDownCommand. For a horizontal ScrollBar, this movement
/// occurs when the right RepeatButton is pressed, and corresponds to a LineRightCommand.
ScrollEventType_SmallIncrement,
/// The Thumb moved to a new position because the user selected Scroll Here in the shortcut
/// menu of the ScrollBar. This movement corresponds to the ScrollHereCommand. To view the
/// shortcut menu, right-click the mouse when the pointer is over the ScrollBar.
ScrollEventType_ThumbPosition,
/// The Thumb was dragged and caused a MouseMove event. A Scroll event of this ScrollEventType
/// may occur more than one time when the Thumb is dragged in the ScrollBar.
ScrollEventType_ThumbTrack
};
////////////////////////////////////////////////////////////////////////////////////////////////////
/// Provides data for a scroll event that occurs when the Thumb of a ScrollBar moves.
////////////////////////////////////////////////////////////////////////////////////////////////////
struct ScrollEventArgs: public RoutedEventArgs
{
/// Gets a value that represents the new location of the Thumb in the ScrollBar
float newValue;
/// Gets the ScrollEventType enumeration value that describes the change in the Thumb position
/// that caused this event
ScrollEventType scrollEventType;
ScrollEventArgs(BaseComponent* source, float value, ScrollEventType type);
};
typedef Delegate<void (BaseComponent*, const ScrollEventArgs&)> ScrollEventHandler;
NS_WARNING_PUSH
NS_MSVC_WARNING_DISABLE(4251 4275)
////////////////////////////////////////////////////////////////////////////////////////////////////
/// Represents a control that provides a scroll bar that has a sliding Thumb whose position
/// corresponds to a value.
///
/// http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.scrollbar.aspx
////////////////////////////////////////////////////////////////////////////////////////////////////
class NS_GUI_CORE_API ScrollBar: public RangeBase
{
public:
ScrollBar();
~ScrollBar();
/// Gets or sets whether the ScrollBar is displayed horizontally or vertically
//@{
Orientation GetOrientation() const;
void SetOrientation(Orientation orientation);
//@}
/// Gets or sets the amount of the scrollable content that is currently visible
//@{
float GetViewportSize() const;
void SetViewportSize(float size);
//@}
/// Gets the Track for a ScrollBar control
Track* GetTrack() const;
/// Occurs one or more times as content scrolls in a ScrollBar when the user moves the Thumb by
/// using the mouse
UIElement::RoutedEvent_<ScrollEventHandler> Scroll();
public:
/// Dependency Properties
//@{
static const DependencyProperty* OrientationProperty;
static const DependencyProperty* ViewportSizeProperty;
//@}
/// Routed Events
//@{
static const RoutedEvent* ScrollEvent;
//@}
/// Routed Commands
//@{
static const RoutedCommand* DeferScrollToHorizontalOffsetCommand;
static const RoutedCommand* DeferScrollToVerticalOffsetCommand;
static const RoutedCommand* LineDownCommand;
static const RoutedCommand* LineLeftCommand;
static const RoutedCommand* LineRightCommand;
static const RoutedCommand* LineUpCommand;
static const RoutedCommand* PageDownCommand;
static const RoutedCommand* PageLeftCommand;
static const RoutedCommand* PageRightCommand;
static const RoutedCommand* PageUpCommand;
static const RoutedCommand* ScrollHereCommand;
static const RoutedCommand* ScrollToBottomCommand;
static const RoutedCommand* ScrollToEndCommand;
static const RoutedCommand* ScrollToHomeCommand;
static const RoutedCommand* ScrollToHorizontalOffsetCommand;
static const RoutedCommand* ScrollToLeftEndCommand;
static const RoutedCommand* ScrollToRightEndCommand;
static const RoutedCommand* ScrollToTopCommand;
static const RoutedCommand* ScrollToVerticalOffsetCommand;
//@}
protected:
/// From Control
//@{
void OnTemplateChanged(FrameworkTemplate* oldTemplate, FrameworkElement* oldRoot,
FrameworkTemplate* newTemplate, FrameworkElement* newRoot) override;
//@}
/// From FrameworkElement
//@{
void OnTemplatedParentChanged(FrameworkElement* oldParent,
FrameworkElement* newParent) override;
//@}
/// From UIElement
//@{
bool IsEnabledCore() const override;
void OnPreviewMouseLeftButtonDown(const MouseButtonEventArgs& e) override;
//@}
private:
void OnThumbDragStarted(BaseComponent* sender, const DragStartedEventArgs& e);
void OnThumbDragDelta(BaseComponent* sender, const DragDeltaEventArgs& e);
void OnThumbDragCompleted(BaseComponent* sender, const DragCompletedEventArgs& e);
void RegisterDelegates();
void FreeDelegates();
void LineLeft();
void LineRight();
void LineDown();
void LineUp();
void SmallDecrement();
void SmallIncrement();
void PageLeft();
void PageRight();
void PageDown();
void PageUp();
void LargeDecrement();
void LargeIncrement();
void ScrollToLeftEnd();
void ScrollToRightEnd();
void ScrollToBottom();
void ScrollToTop();
void ToMinimum();
void ToMaximum();
bool IsStandalone() const;
private:
Ptr<Track> mTrack;
ScrollViewer* mScrollViewerOwner;
bool mHasScrolled;
NS_DECLARE_REFLECTION(ScrollBar, RangeBase)
};
NS_WARNING_POP
}
#include <NsGui/ScrollBar.inl>
#endif