CGII/framework/include/cgv/gui/view.h
2018-05-17 15:50:03 +02:00

62 lines
1.9 KiB
C++

#pragma once
#include <cgv/base/node.h>
#include <cgv/signal/bool_signal.h>
#include "lib_begin.h"
namespace cgv {
namespace gui {
/// type independent &base class of all views
class CGV_API abst_view : public cgv::base::node
{
protected:
abst_view* next_in_list;
abst_view* prev_in_list;
const void* ptr;
public:
/// pass name on to node, careful the implementation of this is in the source file control.cxx to avoid name clashes with view.cxx
abst_view(const std::string& name);
/// ensures detachment of view
~abst_view();
/// return whether the view edits the value pointed to by ptr
virtual bool shows(const void* ptr) const = 0;
/// links all views to a reference into a doubly linked list in order to allow controls of the reference to update all attached views
void attach_to_reference(const void* ptr);
/// detach view again
void detach_from_reference();
/// calls the update method of all other attached views
void update_views();
};
extern CGV_API void update_views(void* member_ptr);
/// ref counted pointer to abst view
typedef data::ref_ptr<abst_view> view_ptr;
#if _MSC_VER >= 1400
CGV_TEMPLATE template class CGV_API data::ref_ptr<abst_view>;
#endif
/// class for %gui elements that %view values of the %type specified in the template argument
template <typename T>
class view : public abst_view
{
protected:
const T* value_ptr;
public:
/// construct abstract element from reference to value
view(const std::string& _name, const T& _value) : abst_view(_name), value_ptr(&_value) {
attach_to_reference(value_ptr);
}
/// return the current value
const T& get_value() const { return *value_ptr; }
/// check whether the value viewed by this element is pointing to the given pointer
bool shows(const void* ptr) const { return value_ptr == ptr; }
};
}
}
#include <cgv/config/lib_end.h>