158 lines
3.9 KiB
C++
158 lines
3.9 KiB
C++
|
#include "window.h"
|
||
|
#include "cfg/configurator.h"
|
||
|
#include "util/logging.h"
|
||
|
#include "games/io.h"
|
||
|
#include "misc/eamuse.h"
|
||
|
|
||
|
|
||
|
overlay::Window::Window(SpiceOverlay *overlay) : overlay(overlay) {
|
||
|
}
|
||
|
|
||
|
overlay::Window::~Window() {
|
||
|
|
||
|
// kill children
|
||
|
for (auto &child : this->children) {
|
||
|
delete child;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void overlay::Window::update() {
|
||
|
|
||
|
// check if toggle is enabled
|
||
|
if (this->toggle_button != ~0u) {
|
||
|
|
||
|
// get state
|
||
|
auto overlay_buttons = games::get_buttons_overlay(eamuse_get_game());
|
||
|
bool toggle_button_new = overlay_buttons
|
||
|
&& this->overlay->hotkeys_triggered()
|
||
|
&& GameAPI::Buttons::getState(RI_MGR, overlay_buttons->at(this->toggle_button));
|
||
|
if (toggle_button_new && !this->toggle_button_state) {
|
||
|
|
||
|
// if the overlay is hidden just reactivate it
|
||
|
if (!this->overlay->get_active()) {
|
||
|
this->active = true;
|
||
|
this->overlay->set_active(true);
|
||
|
} else {
|
||
|
this->toggle_active();
|
||
|
}
|
||
|
}
|
||
|
this->toggle_button_state = toggle_button_new;
|
||
|
}
|
||
|
|
||
|
// update children
|
||
|
auto it = this->children.begin();
|
||
|
while (it != this->children.end()) {
|
||
|
(*it)->update();
|
||
|
if ((*it)->active) {
|
||
|
it++;
|
||
|
} else {
|
||
|
delete (*it);
|
||
|
this->children.erase(it);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void overlay::Window::build() {
|
||
|
|
||
|
// check if active
|
||
|
if (!this->active) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (this->draws_window) {
|
||
|
|
||
|
// automatic max window size
|
||
|
if (!cfg::CONFIGURATOR_STANDALONE && (size_max.x < 0 || size_max.y < 0)) {
|
||
|
auto &display_size = ImGui::GetIO().DisplaySize;
|
||
|
ImVec2 size_max_auto(display_size.x - 100, display_size.y - 100);
|
||
|
ImGui::SetNextWindowSizeConstraints(size_min, size_max_auto, resize_callback);
|
||
|
} else {
|
||
|
ImGui::SetNextWindowSizeConstraints(size_min, size_max, resize_callback);
|
||
|
}
|
||
|
|
||
|
// background alpha
|
||
|
if (this->bg_alpha != 1.f) {
|
||
|
ImGui::SetNextWindowBgAlpha(this->bg_alpha);
|
||
|
}
|
||
|
|
||
|
if (this->remove_window_padding) {
|
||
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0));
|
||
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
|
||
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
|
||
|
}
|
||
|
|
||
|
// create window
|
||
|
if (ImGui::Begin(
|
||
|
(this->title + "###" + to_string(this)).c_str(),
|
||
|
&this->active,
|
||
|
this->flags)) {
|
||
|
|
||
|
// window attributes
|
||
|
this->calculate_initial_window();
|
||
|
ImGui::SetWindowPos(this->init_pos, ImGuiCond_Once);
|
||
|
ImGui::SetWindowSize(this->init_size, ImGuiCond_Once);
|
||
|
|
||
|
// add content
|
||
|
this->build_content();
|
||
|
|
||
|
// build children
|
||
|
for (auto &child : this->children) {
|
||
|
child->build();
|
||
|
}
|
||
|
|
||
|
// end window
|
||
|
ImGui::End();
|
||
|
}
|
||
|
|
||
|
if (this->remove_window_padding) {
|
||
|
ImGui::PopStyleVar();
|
||
|
ImGui::PopStyleVar();
|
||
|
ImGui::PopStyleVar();
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
|
||
|
// add raw content
|
||
|
this->build_content();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void overlay::Window::toggle_active() {
|
||
|
|
||
|
// flip bool
|
||
|
this->active = !this->active;
|
||
|
|
||
|
// update children
|
||
|
for (auto &child : this->children) {
|
||
|
child->toggle_active();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void overlay::Window::set_active(bool active) {
|
||
|
|
||
|
// toggle if different
|
||
|
if (this->get_active() != active) {
|
||
|
|
||
|
// flip bool
|
||
|
this->active = !this->active;
|
||
|
|
||
|
// update children
|
||
|
for (auto &child : this->children) {
|
||
|
child->set_active(this->active);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool overlay::Window::get_active() {
|
||
|
|
||
|
// check for active children
|
||
|
for (auto &child : this->children) {
|
||
|
if (child->get_active()) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// now it depends on us
|
||
|
return this->active;
|
||
|
}
|