Skip to content
Snippets Groups Projects
MainWindow.cpp 5.05 KiB
Newer Older
  • Learn to ignore specific revisions
  •     ------------------------------------------------------------------
    
        This file is part of the Open Ephys GUI
    
    jsiegle's avatar
    jsiegle committed
        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
    
    jsiegle's avatar
    jsiegle committed
    
    
        // Constraining the window's size doesn't seem to work:
    
    jsiegle's avatar
    jsiegle committed
        // 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);
    
    jsiegle's avatar
    jsiegle committed
    
    
        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;
    
    
    unknown's avatar
    unknown committed
    #ifdef WIN32
    
        File file = File::getCurrentWorkingDirectory().getChildFile("windowState.xml");
    
    unknown's avatar
    unknown committed
    #else
    
        File file = File("./windowState.xml");
    
    unknown's avatar
    unknown committed
    #endif
    
        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());
    
    jsiegle's avatar
    jsiegle committed
        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;
    
    unknown's avatar
    unknown committed
    #ifdef WIN32
    
        File file = File::getCurrentWorkingDirectory().getChildFile("windowState.xml");
    
    unknown's avatar
    unknown committed
    #else
    
        File file = File("./windowState.xml");
    
    unknown's avatar
    unknown committed
    #endif
    
        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);
    
            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
    
    aacuevas's avatar
    aacuevas committed
    #ifdef WIN32
    
                setTopLeftPosition(x,y); //Windows doesn't need correction
    
    aacuevas's avatar
    aacuevas committed
    #else
    
                setTopLeftPosition(x,y-27);
    
    aacuevas's avatar
    aacuevas committed
    #endif
    
    jsiegle's avatar
    jsiegle committed
                getContentComponent()->setBounds(0,0,w-10,h-33);
    
        // return "Everything went ok.";