#region CPL License /* Nuclex Framework Copyright (C) 2002-2010 Nuclex Development Labs This library is free software; you can redistribute it and/or modify it under the terms of the IBM Common Public License as published by the IBM Corporation; either version 1.0 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the IBM Common Public License for more details. You should have received a copy of the IBM Common Public License along with this library */ #endregion using System; using System.Collections.Generic; using Nuclex.Input; using Nuclex.UserInterface.Input; namespace Nuclex.UserInterface.Controls.Desktop { /// Base class for a slider that can be moved using the mouse /// /// Implements the common functionality for a slider moving either the direction /// of the X or the Y axis (but not both). Derive any scroll bar-like controls /// from this class to simplify their implementation. /// public abstract class SliderControl : Control { /// Triggered when the slider has been moved public event EventHandler Moved; /// Initializes a new slider control public SliderControl() { this.ThumbPosition = 0.0f; this.ThumbSize = 1.0f; } /// whether the mouse is currently hovering over the thumb public bool MouseOverThumb { get { return this.mouseOverThumb; } } /// Whether the pressable control is in the depressed state public virtual bool ThumbDepressed { get { return this.pressedDown && this.mouseOverThumb; } } /// Called when a mouse button has been pressed down /// Index of the button that has been pressed protected override void OnMousePressed(MouseButtons button) { if(button == MouseButtons.Left) { RectangleF thumbRegion = GetThumbRegion(); if(thumbRegion.Contains(this.pickupX, this.pickupY)) { this.pressedDown = true; this.pickupX -= thumbRegion.X; this.pickupY -= thumbRegion.Y; } } } /// Called when a mouse button has been released again /// Index of the button that has been released protected override void OnMouseReleased(MouseButtons button) { if(button == MouseButtons.Left) { this.pressedDown = false; } } /// Called when the mouse position is updated /// X coordinate of the mouse cursor on the control /// Y coordinate of the mouse cursor on the control protected override void OnMouseMoved(float x, float y) { if(this.pressedDown) { //RectangleF bounds = GetAbsoluteBounds(); MoveThumb(x - this.pickupX, y - this.pickupY); } else { this.pickupX = x; this.pickupY = y; } this.mouseOverThumb = GetThumbRegion().Contains(x, y); } /// /// Called when the mouse has left the control and is no longer hovering over it /// protected override void OnMouseLeft() { this.mouseOverThumb = false; } /// Fires the slider's Moved event protected virtual void OnMoved() { if(Moved != null) { Moved(this, EventArgs.Empty); } } /// Moves the thumb to the specified location /// Location the thumb will be moved to protected abstract void MoveThumb(float x, float y); /// Obtains the region covered by the slider's thumb /// The region covered by the slider's thumb protected abstract RectangleF GetThumbRegion(); /// Can be set by renderers to allow the control to locate its thumb public IThumbLocator ThumbLocator; /// Fraction of the slider filled by the thumb (0.0 .. 1.0) public float ThumbSize; /// Position of the thumb within the slider (0.0 .. 1.0) public float ThumbPosition; /// Whether the mouse cursor is hovering over the thumb private bool mouseOverThumb; /// Whether the slider's thumb is currently in the depressed state private bool pressedDown; /// X coordinate at which the thumb was picked up private float pickupX; /// Y coordinate at which the thumb was picked up private float pickupY; } } // namespace Nuclex.UserInterface.Controls.Desktop