xmake.repo/packages/n/noesis/latest/Include/NsGui/TickBar.h

178 lines
5.0 KiB
C
Raw Normal View History

2024-12-22 19:15:02 +08:00
////////////////////////////////////////////////////////////////////////////////////////////////////
// NoesisGUI - http://www.noesisengine.com
// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __GUI_TICKBAR_H__
#define __GUI_TICKBAR_H__
#include <NsCore/Noesis.h>
#include <NsCore/Vector.h>
#include <NsGui/CoreApi.h>
#include <NsGui/FrameworkElement.h>
namespace Noesis
{
class Brush;
class StreamGeometry;
NS_WARNING_PUSH
NS_MSVC_WARNING_DISABLE(4251 4275)
////////////////////////////////////////////////////////////////////////////////////////////////////
/// Represents a control that draws a set of tick marks for a Slider control.
///
/// http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.tickbar.aspx
////////////////////////////////////////////////////////////////////////////////////////////////////
class NS_GUI_CORE_API TickBar: public FrameworkElement
{
public:
TickBar();
~TickBar();
/// Gets or sets the Brush that is used to draw the tick marks
//@{
Brush* GetFill() const;
void SetFill(Brush* fill);
//@}
/// Gets or sets the direction of increasing value of the tick marks
//@{
bool GetIsDirectionReversed() const;
void SetIsDirectionReversed(bool directionReversed);
//@}
/// Gets or sets whether the TickBar displays a selection range
//@{
bool GetIsSelectionRangeEnabled() const;
void SetIsSelectionRangeEnabled(bool selectionRangeEnabled);
//@}
/// Gets or sets the maximum value that is possible for a tick mark
//@{
float GetMaximum() const;
void SetMaximum(float maximum);
//@}
/// Gets or sets the minimum value that is possible for a tick mark
//@{
float GetMinimum() const;
void SetMinimum(float minimum);
//@}
/// Gets or sets where tick marks appear relative to a Track of a Slider control
//@{
TickBarPlacement GetPlacement() const;
void SetPlacement(TickBarPlacement placement);
//@}
/// Gets or sets a space buffer for the area that contains the tick marks that are specified
/// for a TickBar
//@{
float GetReservedSpace() const;
void SetReservedSpace(float reservedSpace);
//@}
/// Gets or sets the end point of a selection
//@{
float GetSelectionEnd() const;
void SetSelectionEnd(float selectionEnd);
//@}
/// Gets or sets the start point of a selection
//@{
float GetSelectionStart() const;
void SetSelectionStart(float selectionStart);
//@}
/// Gets or sets the interval between tick marks
//@{
float GetTickFrequency() const;
void SetTickFrequency(float tickFrequency);
//@}
/// Gets or sets the positions of the tick marks. For example, "0.5 1.0 43" or "0.5,1.0,43"
//@{
const char* GetTicks() const;
void SetTicks(const char* ticks);
//@}
public:
/// Dependency properties
//@{
static const DependencyProperty* FillProperty;
static const DependencyProperty* IsDirectionReversedProperty;
static const DependencyProperty* IsSelectionRangeEnabledProperty;
static const DependencyProperty* MaximumProperty;
static const DependencyProperty* MinimumProperty;
static const DependencyProperty* PlacementProperty;
static const DependencyProperty* ReservedSpaceProperty;
static const DependencyProperty* SelectionEndProperty;
static const DependencyProperty* SelectionStartProperty;
static const DependencyProperty* TickFrequencyProperty;
static const DependencyProperty* TicksProperty;
//@}
protected:
/// From DependencyObject
//@{
bool OnPropertyChanged(const DependencyPropertyChangedEventArgs& args) override;
//@}
/// From UIElement
//@{
void OnRender(DrawingContext* context) override;
//@}
/// From FrameworkElement
//@{
Size MeasureOverride(const Size& availableSize) override;
void OnTemplatedParentChanged(FrameworkElement* oldParent,
FrameworkElement* newParent) override;
//@}
private:
friend class TickBarTest;
void GetRenderInfo(float& range, float& offset, float& tickLength,
Vector2& origin, Vector2& tickDirection, Vector2& tickBarDirection);
bool UpdateFixedTicks();
bool UpdateTicks(float range, float offset);
bool UpdateSelection(float range, float offset);
void UpdateGeometry(float range, float offset, float tickLength, const Vector2& origin,
const Vector2& tickDirection, const Vector2& tickBarDirection);
void RegisterBindings();
void BindToTemplatedParent(const char* path, const DependencyProperty* dp);
void BindReservedSpace();
private:
int mUpdateFlags;
float mPreviousRange;
float mPreviousOffset;
typedef Vector<float> Ticks;
Ticks mFixedTicks;
Ticks mTicksInternal;
float mSelectionStartInternal;
float mSelectionEndInternal;
Ptr<StreamGeometry> mGeometry;
bool mReservedSpaceBinded;
NS_DECLARE_REFLECTION(TickBar, FrameworkElement)
};
NS_WARNING_POP
}
#endif