mirror of
https://github.com/wiiu-env/libgui.git
synced 2025-04-07 17:56:57 +02:00
Use a mutex to lock access to internal ist
This commit is contained in:
parent
5b387ffec1
commit
e8ee63068b
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user