Use a mutex to lock access to internal ist

This commit is contained in:
Maschell 2020-08-13 13:27:32 +02:00
parent 5b387ffec1
commit e8ee63068b
2 changed files with 29 additions and 1 deletions

View File

@ -18,6 +18,7 @@
#define GUI_FRAME_H_
#include <vector>
#include <mutex>
#include <gui/GuiElement.h>
#include <gui/sigslot.h>
@ -119,6 +120,7 @@ protected:
bool dim; //! Enable/disable dim of a window only
GuiFrame *parent; //!< Parent Window
std::vector<GuiElement *> elements; //!< Contains all elements within the GuiFrame
std::recursive_mutex mutex;
};
#endif

View File

@ -52,8 +52,10 @@ void GuiFrame::append(GuiElement *e) {
}
remove(e);
mutex.lock();
elements.push_back(e);
e->setParent(this);
mutex.unlock();
}
void GuiFrame::insert(GuiElement *e, uint32_t index) {
@ -62,8 +64,10 @@ void GuiFrame::insert(GuiElement *e, uint32_t index) {
}
remove(e);
mutex.lock();
elements.insert(elements.begin() + index, e);
e->setParent(this);
mutex.unlock();
}
void GuiFrame::remove(GuiElement *e) {
@ -71,16 +75,20 @@ void GuiFrame::remove(GuiElement *e) {
return;
}
mutex.lock();
for (uint32_t i = 0; i < elements.size(); ++i) {
if (e == elements[i]) {
elements.erase(elements.begin() + i);
break;
}
}
mutex.unlock();
}
void GuiFrame::removeAll() {
mutex.lock();
elements.clear();
mutex.unlock();
}
void GuiFrame::close() {
@ -95,6 +103,7 @@ GuiElement *GuiFrame::getGuiElementAt(uint32_t index) const {
if (index >= elements.size()) {
return NULL;
}
return elements[index];
}
@ -105,44 +114,53 @@ uint32_t GuiFrame::getSize() {
void GuiFrame::resetState() {
GuiElement::resetState();
mutex.lock();
for (uint32_t i = 0; i < elements.size(); ++i) {
elements[i]->resetState();
}
mutex.unlock();
}
void GuiFrame::setState(int32_t s, int32_t c) {
GuiElement::setState(s, c);
mutex.lock();
for (uint32_t i = 0; i < elements.size(); ++i) {
elements[i]->setState(s, c);
}
mutex.unlock();
}
void GuiFrame::clearState(int32_t s, int32_t c) {
GuiElement::clearState(s, c);
mutex.lock();
for (uint32_t i = 0; i < elements.size(); ++i) {
elements[i]->clearState(s, c);
}
mutex.unlock();
}
void GuiFrame::setVisible(bool v) {
visible = v;
mutex.lock();
for (uint32_t i = 0; i < elements.size(); ++i) {
elements[i]->setVisible(v);
}
mutex.unlock();
}
int32_t GuiFrame::getSelected() {
// find selected element
int32_t found = -1;
mutex.lock();
for (uint32_t i = 0; i < elements.size(); ++i) {
if (elements[i]->isStateSet(STATE_SELECTED | STATE_OVER)) {
found = i;
break;
}
}
mutex.unlock();
return found;
}
@ -156,12 +174,14 @@ void GuiFrame::draw(CVideo *v) {
//Menu_DrawRectangle(0, 0, GetZPosition(), screenwidth,screenheight, &dimColor, false, true);
}
mutex.lock();
//! render appended items next frame but allow stop of render if size is reached
uint32_t size = elements.size();
for (uint32_t i = 0; i < size && i < elements.size(); ++i) {
elements[i]->draw(v);
}
mutex.unlock();
}
void GuiFrame::updateEffects() {
@ -171,12 +191,14 @@ void GuiFrame::updateEffects() {
GuiElement::updateEffects();
mutex.lock();
//! render appended items next frame but allow stop of render if size is reached
uint32_t size = elements.size();
for (uint32_t i = 0; i < size && i < elements.size(); ++i) {
elements[i]->updateEffects();
}
mutex.unlock();
}
void GuiFrame::process() {
@ -186,12 +208,14 @@ void GuiFrame::process() {
GuiElement::process();
mutex.lock();
//! render appended items next frame but allow stop of render if size is reached
uint32_t size = elements.size();
for (uint32_t i = 0; i < size && i < elements.size(); ++i) {
elements[i]->process();
}
mutex.unlock();
}
void GuiFrame::update(GuiController *c) {
@ -199,10 +223,12 @@ void GuiFrame::update(GuiController *c) {
return;
}
mutex.lock();
//! update appended items next frame
uint32_t size = elements.size();
for (uint32_t i = 0; i < size && i < elements.size(); ++i) {
elements[i]->update(c);
}
mutex.unlock();
}