1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
#pragma once
#include "iselectable.h"
#include "iselection.h"
namespace selection
{
/**
* \brief
* Implementation of the Selectable interface which invokes a user-specified
* callback function when the selection state is changed.
*/
class ObservedSelectable :
public ISelectable
{
// Callback to invoke on selection changed
SelectionChangedSlot _onchanged;
// Current selection state
bool _selected;
public:
/**
* \brief
* Construct an ObservedSelectable with the given callback function.
*/
ObservedSelectable(const SelectionChangedSlot& onchanged) :
_onchanged(onchanged),
_selected(false)
{ }
/**
* \brief
* Copy constructor.
*/
ObservedSelectable(const ObservedSelectable& other) :
ISelectable(other),
_onchanged(other._onchanged),
_selected(false)
{
setSelected(other.isSelected());
}
ObservedSelectable& operator=(const ObservedSelectable& other)
{
setSelected(other.isSelected());
return *this;
}
virtual ~ObservedSelectable()
{
setSelected(false);
}
/**
* \brief
* Set the selection state.
*/
virtual void setSelected(bool select) override
{
// Change state and invoke callback only if the new state is different
// from the current state
if (select ^ _selected)
{
_selected = select;
if (_onchanged)
{
_onchanged(*this);
}
}
}
virtual bool isSelected() const override
{
return _selected;
}
};
} // namespace
|