cgv
Loading...
Searching...
No Matches
control.h
1#pragma once
2
3#include "view.h"
4
5#include <cgv/signal/signal.h>
6
7#include "lib_begin.h"
8
9namespace cgv {
10 namespace gui {
11
13class CGV_API abst_control : public abst_view
14{
15protected:
17 static bool access_on_release(const void* value_ptr, char access_mode);
18public:
20 static bool on_release(const void* value_ptr);
22 abst_control(const std::string& name);
24 bool shows(const void* ptr) const;
26 virtual bool controls(const void* ptr) const = 0;
28 virtual void attach_to_value_change(cgv::signal::functor_base* func) = 0;
30 virtual void attach_to_check_value(cgv::signal::functor_base* bool_func) = 0;
31};
32
35
36#if _MSC_VER >= 1400
37CGV_TEMPLATE template class CGV_API data::ref_ptr<abst_control>;
38#endif
39
42{
44
46 virtual bool controls(const void* ptr, void* user_data) const = 0;
47};
48
55template <typename T>
57{
59 virtual void set_value(const T& value, void* user_data) = 0;
61 virtual const T get_value(void* user_data) const = 0;
63 virtual bool controls(const void* ptr, void* user_data) const { return false; }
64};
65
85template <typename T>
86class control : public abst_control
87{
88private:
89 T* value_ptr;
91 T new_value;
92protected:
93 // protected function for the setter
94 void set_value(const T& v) {
95 if (cp)
96 cp->set_value(v, value_ptr);
97 else {
98 *value_ptr = v;
99 update_views();
100 }
101 }
102 // return pointer to value or 0 if not available
103 const T* get_value_ptr() const { return cp ? 0 : value_ptr; }
104public:
106 typedef cgv::signal::bool_signal<control<T>&> value_check_signal_type;
108 typedef cgv::signal::signal<control<T>&> value_change_signal_type;
110 control(const std::string& _name, T& _value) : abst_control(_name), value_ptr(&_value), new_value(_value), cp(0) {
111 attach_to_reference(value_ptr);
112 }
114 control(const std::string& _name, T* _value) : abst_control(_name) {
115 value_ptr = _value;
116 new_value = *_value;
117 cp = 0;
118 attach_to_reference(value_ptr);
119 }
123 control(const std::string& _name, abst_control_provider* _cp, void* user_data) : abst_control(_name), cp(0) {
124 if (_cp) {
125 cp = static_cast<control_provider<T>*>(_cp);
126 (void*&)value_ptr = user_data;
127 new_value = cp->get_value(user_data);
128 }
129 else {
130 value_ptr = (T*)user_data;
131 new_value = *value_ptr;
132 attach_to_reference(value_ptr);
133 }
134 }
136
138 cgv::signal::bool_signal<control<T>&> check_value;
140
141 cgv::signal::signal<control<T>&> value_change;
143 const T get_value() const { return cp ? cp->get_value(value_ptr) : *value_ptr; }
145 const T& get_new_value() const { return new_value; }
147 void set_new_value(const T& nv) { new_value = nv; }
149 const T& get_old_value() const { return new_value; }
151 bool check_and_set_value(const T& nv) {
152 set_new_value(nv);
153 if (check_value(*this)) {
154 T tmp_value = get_value();
155 set_value(this->get_new_value());
156 set_new_value(tmp_value);
157 value_change(*this);
158 return true;
159 }
160 return false;
161 }
163 bool controls(const void* ptr) const { return cp ? cp->controls(ptr,value_ptr) : (value_ptr == ptr); }
165 void attach_to_value_change(cgv::signal::functor_base* func) {
166 value_change.connect_abst(func);
167 }
169 void attach_to_check_value(cgv::signal::functor_base* bool_func) {
170 check_value.connect_abst(bool_func);
171 }
172};
173
174 }
175}
176
177#include <cgv/config/lib_end.h>
reference counted pointer, which can work together with types that are derived from ref_counted,...
Definition ref_ptr.h:160
gui and type independent base class of all controls
Definition control.h:14
virtual bool controls(const void *ptr) const =0
return whether the control controls the value pointed to by ptr
virtual void attach_to_value_change(cgv::signal::functor_base *func)=0
attach a functor to the value change signal
virtual void attach_to_check_value(cgv::signal::functor_base *bool_func)=0
attach a functor to the value change signal
type independent &base class of all views
Definition view.h:13
control(const std::string &_name, T *_value)
construct abstract element from control_provider
Definition control.h:114
cgv::signal::bool_signal< control< T > & > value_check_signal_type
type of the value check signal
Definition control.h:106
bool check_and_set_value(const T &nv)
set new value only if check_value signal succeeds and send value_change signal. Return true if value ...
Definition control.h:151
const T & get_new_value() const
return the new value to the callbacks attached to the check_value signal
Definition control.h:145
void set_new_value(const T &nv)
set a different new value from the callbacks attached to the check_value signal
Definition control.h:147
cgv::signal::signal< control< T > & > value_change
this signal is sent after the user triggered a change of value and the check_value succeeded.
Definition control.h:141
const T get_value() const
return a reference to the current value
Definition control.h:143
control(const std::string &_name, T &_value)
construct abstract element from reference to value
Definition control.h:110
const T & get_old_value() const
return the old value to the callbacks attached to the change_value signal
Definition control.h:149
cgv::signal::bool_signal< control< T > & > check_value
this signal is sent when the user triggered a change of value in order to check whether the new value...
Definition control.h:138
void attach_to_value_change(cgv::signal::functor_base *func)
attach a functor to the value change signal
Definition control.h:165
void attach_to_check_value(cgv::signal::functor_base *bool_func)
attach a functor to the value change signal
Definition control.h:169
bool controls(const void *ptr) const
check whether the value represented by this element is pointing to the passed pointer
Definition control.h:163
control(const std::string &_name, abst_control_provider *_cp, void *user_data)
this constructor allows contruction from control_provider with user data or if the pointer to the con...
Definition control.h:123
cgv::signal::signal< control< T > & > value_change_signal_type
type of the value change signal
Definition control.h:108
data::ref_ptr< abst_control > control_ptr
ref counted pointer to abst control
Definition control.h:34
the cgv namespace
Definition print.h:11
type independent base class of control provider interface
Definition control.h:42
virtual bool controls(const void *ptr, void *user_data) const =0
overload to check if ptr points to the controlled value
virtual void set_value(const T &value, void *user_data)=0
overload to set the value
virtual bool controls(const void *ptr, void *user_data) const
the default implementation compares ptr to &get_value().
Definition control.h:63
virtual const T get_value(void *user_data) const =0
overload to get the value