/**************************************************************************** * 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 "dynamic_libs/os_functions.h" #include "dynamic_libs/socket_functions.h" #include "Application.h" #include "utils/StringTools.h" #include "utils/logger.h" MainWindow::MainWindow(int w, int h) : width(w) , height(h) { for(int i = 0; i < 4; i++) { std::string filename = 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 u32 tvSize = tvElements.size(); u32 drcSize = drcElements.size(); for(u32 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(u32 i = 0; (i < tvSize) && (i < tvElements.size()); ++i) { u32 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 u32 tvSize = tvElements.size(); u32 drcSize = drcElements.size(); for(u32 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(u32 i = 0; (i < tvSize) && (i < tvElements.size()); ++i) { u32 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 //u32 tvSize = tvElements.size(); if(controller->chan & GuiTrigger::CHANNEL_1) { u32 drcSize = drcElements.size(); for(u32 i = 0; (i < drcSize) && (i < drcElements.size()); ++i) { drcElements[i]->update(controller); } } else { u32 tvSize = tvElements.size(); for(u32 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(u32 i = 0; (i < tvSize) && (i < tvElements.size()); ++i) // { // u32 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; f32 posX = controller->data.x; f32 posY = controller->data.y; pointerImg[wpadIdx]->setPosition(posX, posY); pointerImg[wpadIdx]->setAngle(controller->data.pointerAngle); pointerValid[wpadIdx] = true; } } void MainWindow::drawDrc(CVideo *video) { for(u32 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(u32 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); }