nana/include/nana/gui/widgets/slider.hpp
cnjinhao 42788db077 Breaking changes for expr_color
expr_color is a temporary class name for new color type experiment.
2014-12-17 11:20:47 +08:00

143 lines
3.9 KiB
C++

/*
* A Slider Implementation
* Nana C++ Library(http://www.nanapro.org)
* Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com)
*
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*
* @file: nana/gui/widgets/slider.hpp
*/
#ifndef NANA_GUI_WIDGETS_SLIDER_HPP
#define NANA_GUI_WIDGETS_SLIDER_HPP
#include "widget.hpp"
#include <nana/pat/cloneable.hpp>
namespace nana
{
class slider;
struct arg_slider
{
slider & widget;
};
namespace drawerbase
{
namespace slider
{
struct slider_events
: public general_events
{
basic_event<arg_slider> value_changed;
};
enum class seekdir
{
bilateral, forward, backward
};
class provider
{
public:
virtual ~provider() = default;
virtual nana::string adorn_trace(unsigned vmax, unsigned vadorn) const = 0;
};
class renderer
{
public:
typedef ::nana::paint::graphics & graph_reference;
struct bar_t
{
bool horizontal;
nana::rectangle r; //the rectangle of bar.
unsigned border_size; //border_size of bar.
};
struct slider_t
{
bool horizontal;
int pos;
unsigned border;
unsigned scale;
};
struct adorn_t
{
bool horizontal;
nana::point bound;
int fixedpos;
unsigned block;
unsigned vcur_scale; //pixels of vcur scale.
};
virtual ~renderer() = default;
virtual void background(window, graph_reference, bool isglass) = 0;
virtual void adorn(window, graph_reference, const adorn_t&) = 0;
virtual void adorn_textbox(window, graph_reference, const nana::string&, const nana::rectangle&) = 0;
virtual void bar(window, graph_reference, const bar_t&) = 0;
virtual void slider(window, graph_reference, const slider_t&) = 0;
};
class controller;
class trigger
: public drawer_trigger
{
public:
typedef controller controller_t;
trigger();
~trigger();
controller_t* ctrl() const;
private:
void attached(widget_reference, graph_reference) override;
void detached() override;
void refresh(graph_reference) override;
void mouse_down(graph_reference, const arg_mouse&) override;
void mouse_up(graph_reference, const arg_mouse&) override;
void mouse_move(graph_reference, const arg_mouse&) override;
void mouse_leave(graph_reference, const arg_mouse&) override;
void resized(graph_reference, const arg_resized&) override;
private:
controller_t * impl_;
};
}//end namespace slider
}//end namespace drawerbase
/// A slider widget wich the user can drag for tracking
class slider
: public widget_object<category::widget_tag, drawerbase::slider::trigger, drawerbase::slider::slider_events>
{
public:
typedef drawerbase::slider::renderer renderer; ///< The interface for user-defined renderer.
typedef drawerbase::slider::provider provider; ///< The interface for user-defined provider.
typedef drawerbase::slider::seekdir seekdir; ///< Defines the slider seek direction.
slider();
slider(window, bool visible);
slider(window, const rectangle& = rectangle(), bool visible = true);
void seek(seekdir); ///< Define the direction that user can seek by using mouse.
void vertical(bool);
bool vertical() const;
void vmax(unsigned);
unsigned vmax() const;
void value(unsigned);
unsigned value() const;
unsigned move_step(bool forward); ///< Increase or decrease the value of slider.
unsigned adorn() const;
pat::cloneable<renderer>& ext_renderer(); ///< Refers to the current renderer that slider is using.
void ext_renderer(const pat::cloneable<renderer>&); ///< Set the current renderer.
void ext_provider(const pat::cloneable<provider>&);
void transparent(bool);
bool transparent() const;
};
}//end namespace nana
#endif