mirror of
https://github.com/spice2x/spice2x.github.io.git
synced 2026-08-02 06:40:42 -07:00
Initial commit for GitHub migration based on spice2x-25-03-03
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user