/**************************************************************************** * Copyright (C) 2015 Dimok * * 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 "Application.h" #include "utils/logger.h" #include "utils/StringTools.h" #include "resources/Resources.h" #include "content/MainContent.h" #include #include #include "utils/AsyncExecutor.h" MainWindow::MainWindow(int32_t w, int32_t h) : width(w) , height(h) , currentTvFrame(NULL) , currentDrcFrame(NULL) { for(int32_t 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(int32_t 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) { int32_t 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(int32_t 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(int32_t i = 0; i < 4; i++) { if(pointerValid[i]) { pointerImg[i]->draw(video); pointerValid[i] = false; } } } void MainWindow::SetupMainView() { currentTvFrame = new MainContent(width, height, 0); currentTvFrame->setEffect(EFFECT_FADE, 10, 255); currentTvFrame->setState(GuiElement::STATE_DISABLED); currentTvFrame->effectFinished.connect(this, &MainWindow::OnOpenEffectFinish); appendTv(currentTvFrame); currentDrcFrame = currentTvFrame; if(currentTvFrame != currentDrcFrame) { currentDrcFrame->setEffect(EFFECT_FADE, 10, 255); currentDrcFrame->setState(GuiElement::STATE_DISABLED); currentDrcFrame->effectFinished.connect(this, &MainWindow::OnOpenEffectFinish); } appendDrc(currentDrcFrame); } 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); AsyncExecutor::pushForDelete(element); }