Totally refactored UILabel
This commit is contained in:
@ -1,98 +1,98 @@
|
||||
// Copyright (c) 2023 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#pragma once
|
||||
#include "StateInterfaces.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
template<class V>
|
||||
class StateProperty : public IStateProperty {
|
||||
private:
|
||||
/**
|
||||
* Method that is invoked every time that the value of this state property
|
||||
* is updated.
|
||||
*
|
||||
* @param val Value that is to be used for this property.
|
||||
*/
|
||||
void setInternal(V val) {
|
||||
if(val == this->_realValue) return;// TODO: can I omit this? kinda bad tbh.
|
||||
|
||||
// Run the teardowns
|
||||
auto itTeardown = this->_effectTeardowns.begin();
|
||||
while(itTeardown != this->_effectTeardowns.end()) {
|
||||
(*itTeardown)();
|
||||
++itTeardown;
|
||||
}
|
||||
this->_effectTeardowns.clear();
|
||||
|
||||
// Update the values
|
||||
this->previous = this->_realValue;
|
||||
this->_realValue = val;
|
||||
|
||||
// Notify the effect listeners
|
||||
auto itEffect = this->_effectListners.begin();
|
||||
while(itEffect != this->_effectListners.end()) {
|
||||
(*itEffect)();
|
||||
++itEffect;
|
||||
}
|
||||
|
||||
// Notify the teardown effect listeners
|
||||
auto itWithTeardown = this->_effectListnersWithTeardown.begin();
|
||||
while(itWithTeardown != this->_effectListnersWithTeardown.end()) {
|
||||
auto teardown = (*itWithTeardown)();
|
||||
this->_effectTeardowns.push_back(teardown);
|
||||
++itWithTeardown;
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
V _realValue;
|
||||
V previous;
|
||||
|
||||
/**
|
||||
* Creates a new state property and listens for its change.
|
||||
*/
|
||||
StateProperty() {}
|
||||
|
||||
/**
|
||||
* Creates a new state property and listens for its change.
|
||||
* @param initial The initial value of this state.
|
||||
*/
|
||||
StateProperty(V initial) : _realValue(initial), previous(initial) {}
|
||||
|
||||
const StateProperty& operator += (const V &value) {
|
||||
this->setInternal(this->_realValue + value);
|
||||
return *this;
|
||||
}
|
||||
|
||||
const bool_t operator != (const V &value) {
|
||||
return value != this->_realValue;
|
||||
}
|
||||
|
||||
const bool_t operator == (const V &value) {
|
||||
return value == this->_realValue;
|
||||
}
|
||||
|
||||
const StateProperty& operator = (const V &val) {
|
||||
this->setInternal(val);
|
||||
return *this;
|
||||
}
|
||||
|
||||
const V operator->() const {
|
||||
return this->_realValue;
|
||||
}
|
||||
|
||||
operator V() const {
|
||||
return this->_realValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Destructor for StateProperty.
|
||||
*/
|
||||
~StateProperty() {}
|
||||
|
||||
friend class StateOwner;
|
||||
};
|
||||
// Copyright (c) 2023 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#pragma once
|
||||
#include "StateInterfaces.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
template<class V>
|
||||
class StateProperty : public IStateProperty {
|
||||
private:
|
||||
/**
|
||||
* Method that is invoked every time that the value of this state property
|
||||
* is updated.
|
||||
*
|
||||
* @param val Value that is to be used for this property.
|
||||
*/
|
||||
void setInternal(V val) {
|
||||
if(val == this->_realValue) return;// TODO: can I omit this? kinda bad tbh.
|
||||
|
||||
// Run the teardowns
|
||||
auto itTeardown = this->_effectTeardowns.begin();
|
||||
while(itTeardown != this->_effectTeardowns.end()) {
|
||||
(*itTeardown)();
|
||||
++itTeardown;
|
||||
}
|
||||
this->_effectTeardowns.clear();
|
||||
|
||||
// Update the values
|
||||
this->previous = this->_realValue;
|
||||
this->_realValue = val;
|
||||
|
||||
// Notify the effect listeners
|
||||
auto itEffect = this->_effectListners.begin();
|
||||
while(itEffect != this->_effectListners.end()) {
|
||||
(*itEffect)();
|
||||
++itEffect;
|
||||
}
|
||||
|
||||
// Notify the teardown effect listeners
|
||||
auto itWithTeardown = this->_effectListnersWithTeardown.begin();
|
||||
while(itWithTeardown != this->_effectListnersWithTeardown.end()) {
|
||||
auto teardown = (*itWithTeardown)();
|
||||
this->_effectTeardowns.push_back(teardown);
|
||||
++itWithTeardown;
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
V _realValue;
|
||||
V previous;
|
||||
|
||||
/**
|
||||
* Creates a new state property and listens for its change.
|
||||
*/
|
||||
StateProperty() {}
|
||||
|
||||
/**
|
||||
* Creates a new state property and listens for its change.
|
||||
* @param initial The initial value of this state.
|
||||
*/
|
||||
StateProperty(V initial) : _realValue(initial), previous(initial) {}
|
||||
|
||||
const StateProperty& operator += (const V &value) {
|
||||
this->setInternal(this->_realValue + value);
|
||||
return *this;
|
||||
}
|
||||
|
||||
const bool_t operator != (const V &value) {
|
||||
return value != this->_realValue;
|
||||
}
|
||||
|
||||
const bool_t operator == (const V &value) {
|
||||
return value == this->_realValue;
|
||||
}
|
||||
|
||||
const StateProperty& operator = (const V &val) {
|
||||
this->setInternal(val);
|
||||
return *this;
|
||||
}
|
||||
|
||||
const V operator->() const {
|
||||
return this->_realValue;
|
||||
}
|
||||
|
||||
operator V() const {
|
||||
return this->_realValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Destructor for StateProperty.
|
||||
*/
|
||||
~StateProperty() {}
|
||||
|
||||
friend class StateOwner;
|
||||
};
|
||||
}
|
Reference in New Issue
Block a user