/* ------------------------------------------------------------------ This file is part of the Open Ephys GUI Copyright (C) 2013 Open Ephys ------------------------------------------------------------------ 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 <http://www.gnu.org/licenses/>. */ #include "MainWindow.h" #include <stdio.h> //----------------------------------------------------------------------- MainWindow::MainWindow() : DocumentWindow(JUCEApplication::getInstance()->getApplicationName(), Colour(Colours::black), DocumentWindow::allButtons) { setResizable(true, // isResizable false); // useBottomCornerRisizer -- doesn't work very well // Constraining the window's size doesn't seem to work: // setResizeLimits(500, 400, 10000, 10000); // Create ProcessorGraph and AudioComponent, and connect them. // Callbacks will be set by the play button in the control panel processorGraph = new ProcessorGraph(); audioComponent = new AudioComponent(); audioComponent->connectToProcessorGraph(processorGraph); setContentOwned(new UIComponent(this, processorGraph, audioComponent), true); UIComponent* ui = (UIComponent*) getContentComponent(); commandManager.registerAllCommandsForTarget(ui); commandManager.registerAllCommandsForTarget(JUCEApplication::getInstance()); ui->setApplicationCommandManagerToWatch(&commandManager); addKeyListener(commandManager.getKeyMappings()); loadWindowBounds(); setUsingNativeTitleBar(true); Component::addToDesktop(getDesktopWindowStyleFlags()); // prevents the maximize // button from randomly disappearing setVisible(true); } MainWindow::~MainWindow() { if (audioComponent->callbacksAreActive()) { audioComponent->endCallbacks(); processorGraph->disableProcessors(); } saveWindowBounds(); audioComponent->disconnectProcessorGraph(); UIComponent* ui = (UIComponent*) getContentComponent(); ui->disableDataViewport(); setMenuBar(0); #if JUCE_MAC MenuBarModel::setMacMainMenu(0); #endif } void MainWindow::closeButtonPressed() { if (audioComponent->callbacksAreActive()) { audioComponent->endCallbacks(); processorGraph->disableProcessors(); } JUCEApplication::getInstance()->systemRequestedQuit(); } void MainWindow::saveWindowBounds() { std::cout << "Saving window bounds." << std::endl; File file = File::getCurrentWorkingDirectory().getChildFile("windowState.xml"); XmlElement* xml = new XmlElement("MAINWINDOW"); XmlElement* bounds = new XmlElement("BOUNDS"); bounds->setAttribute("x",getScreenX()); bounds->setAttribute("y",getScreenY()); bounds->setAttribute("w",getContentComponent()->getWidth()); bounds->setAttribute("h",getContentComponent()->getHeight()); bounds->setAttribute("fullscreen", isFullScreen()); xml->addChildElement(bounds); String error; if (! xml->writeToFile(file, String::empty)) error = "Couldn't write to file"; delete xml; } void MainWindow::loadWindowBounds() { std::cout << "Loading window bounds." << std::endl; File file = File::getCurrentWorkingDirectory().getChildFile("windowState.xml"); XmlDocument doc(file); XmlElement* xml = doc.getDocumentElement(); if (xml == 0 || ! xml->hasTagName("MAINWINDOW")) { std::cout << "File not found." << std::endl; delete xml; centreWithSize(800, 600); } else { String description; forEachXmlChildElement(*xml, e) { int x = e->getIntAttribute("x"); int y = e->getIntAttribute("y"); int w = e->getIntAttribute("w"); int h = e->getIntAttribute("h"); // bool fs = e->getBoolAttribute("fullscreen"); // without the correction, you get drift over time #ifdef WIN32 setTopLeftPosition(x,y); //Windows doesn't need correction #else setTopLeftPosition(x,y-27); #endif getContentComponent()->setBounds(0,0,w-10,h-33); //setFullScreen(fs); } delete xml; } // return "Everything went ok."; }