/**************************************************************************** * Copyright (C) 2015 Dimok * Modified by Maschell, 2016 for GX2_GUI_Template * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . ****************************************************************************/ #include "MainWindow.h" #include "MainWindowTV.h" #include "Application.h" #include "utils/StringTools.h" #include "utils/logger.h" #include "resources/Resources.h" #include "system/AsyncDeleter.h" MainWindow::MainWindow(int w, int h) : width(w), height(h) { for (int i = 0; i < 4; i++) { std::string filename = StringTools::strfmt("player%i_point.png", i + 1); pointerImgData[i] = Resources::GetImageData(filename.c_str()); pointerImg[i] = new GuiImage(pointerImgData[i]); pointerImg[i]->setScale(1.5f); pointerValid[i] = false; } SetupMainView(); } MainWindow::~MainWindow() { while (!tvElements.empty()) { delete tvElements[0]; remove(tvElements[0]); } while (!drcElements.empty()) { delete drcElements[0]; remove(drcElements[0]); } for (int i = 0; i < 4; i++) { delete pointerImg[i]; Resources::RemoveImageData(pointerImgData[i]); } } void MainWindow::updateEffects() { //! dont read behind the initial elements in case one was added uint32_t tvSize = tvElements.size(); uint32_t drcSize = drcElements.size(); for (uint32_t i = 0; (i < drcSize) && (i < drcElements.size()); ++i) { drcElements[i]->updateEffects(); } //! only update TV elements that are not updated yet because they are on DRC for (uint32_t i = 0; (i < tvSize) && (i < tvElements.size()); ++i) { uint32_t n; for (n = 0; (n < drcSize) && (n < drcElements.size()); n++) { if (tvElements[i] == drcElements[n]) break; } if (n == drcElements.size()) { tvElements[i]->updateEffects(); } } } void MainWindow::process() { //! dont read behind the initial elements in case one was added uint32_t tvSize = tvElements.size(); uint32_t drcSize = drcElements.size(); for (uint32_t i = 0; (i < drcSize) && (i < drcElements.size()); ++i) { drcElements[i]->process(); } //! only update TV elements that are not updated yet because they are on DRC for (uint32_t i = 0; (i < tvSize) && (i < tvElements.size()); ++i) { uint32_t n; for (n = 0; (n < drcSize) && (n < drcElements.size()); n++) { if (tvElements[i] == drcElements[n]) break; } if (n == drcElements.size()) { tvElements[i]->process(); } } } void MainWindow::update(GuiController *controller) { //! dont read behind the initial elements in case one was added //uint32_t tvSize = tvElements.size(); if (controller->chan & GuiTrigger::CHANNEL_1) { uint32_t drcSize = drcElements.size(); for (uint32_t i = 0; (i < drcSize) && (i < drcElements.size()); ++i) { drcElements[i]->update(controller); } } else { uint32_t tvSize = tvElements.size(); for (uint32_t i = 0; (i < tvSize) && (i < tvElements.size()); ++i) { tvElements[i]->update(controller); } } // //! only update TV elements that are not updated yet because they are on DRC // for(uint32_t i = 0; (i < tvSize) && (i < tvElements.size()); ++i) // { // uint32_t n; // for(n = 0; (n < drcSize) && (n < drcElements.size()); n++) // { // if(tvElements[i] == drcElements[n]) // break; // } // if(n == drcElements.size()) // { // tvElements[i]->update(controller); // } // } if (controller->chanIdx >= 1 && controller->chanIdx <= 4 && controller->data.validPointer) { int wpadIdx = controller->chanIdx - 1; float posX = controller->data.x; float posY = controller->data.y; pointerImg[wpadIdx]->setPosition(posX, posY); pointerImg[wpadIdx]->setAngle(controller->data.pointerAngle); pointerValid[wpadIdx] = true; } } void MainWindow::drawDrc(CVideo *video) { for (uint32_t i = 0; i < drcElements.size(); ++i) { drcElements[i]->draw(video); } for (int i = 0; i < 4; i++) { if (pointerValid[i]) { pointerImg[i]->setAlpha(0.5f); pointerImg[i]->draw(video); pointerImg[i]->setAlpha(1.0f); } } } void MainWindow::drawTv(CVideo *video) { for (uint32_t i = 0; i < tvElements.size(); ++i) { tvElements[i]->draw(video); } for (int i = 0; i < 4; i++) { if (pointerValid[i]) { pointerImg[i]->draw(video); pointerValid[i] = false; } } } void MainWindow::SetupMainView() { //DrcFrame = new MainWindowDRC(width,height); TvFrame = new MainWindowTV(width, height); DrcFrame = TvFrame; appendTv(TvFrame); appendDrc(DrcFrame); } void MainWindow::OnOpenEffectFinish(GuiElement *element) { //! once the menu is open reset its state and allow it to be "clicked/hold" element->effectFinished.disconnect(this); element->clearState(GuiElement::STATE_DISABLED); } void MainWindow::OnCloseEffectFinish(GuiElement *element) { //! remove element from draw list and push to delete queue remove(element); AsyncDeleter::pushForDelete(element); }