annotate main/main.cpp @ 45:6b6bca31ad53

* When setting a new model on a layer, don't delete the old one until after the new one has been set (a layer's setModel may want to compare against the old one, as WaveformLayer does)
author Chris Cannam
date Thu, 05 Oct 2006 11:00:59 +0000
parents 0dbd08e365ce
children 47bff9f88882
rev   line source
Chris@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@0 4 Sonic Visualiser
Chris@0 5 An audio file viewer and annotation editor.
Chris@0 6 Centre for Digital Music, Queen Mary, University of London.
Chris@0 7 This file copyright 2006 Chris Cannam.
Chris@0 8
Chris@0 9 This program is free software; you can redistribute it and/or
Chris@0 10 modify it under the terms of the GNU General Public License as
Chris@0 11 published by the Free Software Foundation; either version 2 of the
Chris@0 12 License, or (at your option) any later version. See the file
Chris@0 13 COPYING included with this distribution for more information.
Chris@0 14 */
Chris@0 15
Chris@0 16 #include "MainWindow.h"
Chris@0 17
Chris@1 18 #include "system/System.h"
Chris@1 19 #include "system/Init.h"
Chris@0 20 #include "base/TempDirectory.h"
Chris@0 21 #include "base/PropertyContainer.h"
Chris@0 22 #include "base/Preferences.h"
Chris@0 23
Chris@0 24 #include <QMetaType>
Chris@0 25 #include <QApplication>
Chris@0 26 #include <QDesktopWidget>
Chris@0 27 #include <QMessageBox>
Chris@0 28 #include <QTranslator>
Chris@0 29 #include <QLocale>
Chris@5 30 #include <QSettings>
Chris@7 31 #include <QIcon>
Chris@11 32 #include <QSessionManager>
Chris@0 33
Chris@0 34 #include <iostream>
Chris@0 35 #include <signal.h>
Chris@0 36
Chris@0 37 //!!! catch trappable signals, cleanup temporary directory etc
Chris@0 38 //!!! check for crap left over from previous run
Chris@0 39
Chris@0 40 static QMutex cleanupMutex;
Chris@0 41
Chris@0 42 static void
Chris@0 43 signalHandler(int /* signal */)
Chris@0 44 {
Chris@0 45 // Avoid this happening more than once across threads
Chris@0 46
Chris@0 47 cleanupMutex.lock();
Chris@0 48 std::cerr << "signalHandler: cleaning up and exiting" << std::endl;
Chris@0 49 TempDirectory::getInstance()->cleanup();
Chris@0 50 exit(0); // without releasing mutex
Chris@0 51 }
Chris@0 52
Chris@11 53 class SVApplication : public QApplication
Chris@11 54 {
Chris@11 55 public:
Chris@11 56 SVApplication(int argc, char **argv) :
Chris@11 57 QApplication(argc, argv),
Chris@11 58 m_mainWindow(0) { }
Chris@11 59 virtual ~SVApplication() { }
Chris@11 60
Chris@11 61 void setMainWindow(MainWindow *mw) { m_mainWindow = mw; }
Chris@11 62 void releaseMainWindow() { m_mainWindow = 0; }
Chris@11 63
Chris@11 64 virtual void commitData(QSessionManager &manager) {
Chris@11 65 if (!m_mainWindow) return;
Chris@11 66 bool mayAskUser = manager.allowsInteraction();
Chris@11 67 bool success = m_mainWindow->commitData(mayAskUser);
Chris@11 68 manager.release();
Chris@11 69 if (!success) manager.cancel();
Chris@11 70 }
Chris@11 71
Chris@11 72 protected:
Chris@11 73 MainWindow *m_mainWindow;
Chris@11 74 };
Chris@11 75
Chris@0 76 int
Chris@0 77 main(int argc, char **argv)
Chris@0 78 {
Chris@11 79 SVApplication application(argc, argv);
Chris@0 80
Chris@0 81 signal(SIGINT, signalHandler);
Chris@0 82 signal(SIGTERM, signalHandler);
Chris@0 83
Chris@0 84 #ifndef Q_WS_WIN32
Chris@0 85 signal(SIGHUP, signalHandler);
Chris@0 86 signal(SIGQUIT, signalHandler);
Chris@0 87 #endif
Chris@0 88
Chris@0 89 svSystemSpecificInitialisation();
Chris@0 90
Chris@6 91 QApplication::setOrganizationName("sonic-visualiser");
Chris@5 92 QApplication::setOrganizationDomain("sonicvisualiser.org");
Chris@6 93 QApplication::setApplicationName("sonic-visualiser");
Chris@5 94
Chris@7 95 QApplication::setWindowIcon(QIcon(":icons/waveform.png"));
Chris@7 96
Chris@0 97 QString language = QLocale::system().name();
Chris@0 98
Chris@0 99 QTranslator qtTranslator;
Chris@0 100 QString qtTrName = QString("qt_%1").arg(language);
Chris@0 101 std::cerr << "Loading " << qtTrName.toStdString() << "..." << std::endl;
Chris@0 102 qtTranslator.load(qtTrName);
Chris@0 103 application.installTranslator(&qtTranslator);
Chris@0 104
Chris@0 105 QTranslator svTranslator;
Chris@0 106 QString svTrName = QString("sonic-visualiser_%1").arg(language);
Chris@0 107 std::cerr << "Loading " << svTrName.toStdString() << "..." << std::endl;
Chris@0 108 svTranslator.load(svTrName, ":i18n");
Chris@0 109 application.installTranslator(&svTranslator);
Chris@0 110
Chris@0 111 // Permit size_t and PropertyName to be used as args in queued signal calls
Chris@0 112 qRegisterMetaType<size_t>("size_t");
Chris@0 113 qRegisterMetaType<PropertyContainer::PropertyName>("PropertyContainer::PropertyName");
Chris@0 114
Chris@0 115 MainWindow gui;
Chris@11 116 application.setMainWindow(&gui);
Chris@0 117
Chris@0 118 QDesktopWidget *desktop = QApplication::desktop();
Chris@0 119 QRect available = desktop->availableGeometry();
Chris@0 120
Chris@0 121 int width = available.width() * 2 / 3;
Chris@0 122 int height = available.height() / 2;
Chris@0 123 if (height < 450) height = available.height() * 2 / 3;
Chris@0 124 if (width > height * 2) width = height * 2;
Chris@0 125
Chris@5 126 QSettings settings;
Chris@5 127 settings.beginGroup("MainWindow");
Chris@5 128 QSize size = settings.value("size", QSize(width, height)).toSize();
Chris@5 129 gui.resize(size);
Chris@5 130 if (settings.contains("position")) {
Chris@5 131 gui.move(settings.value("position").toPoint());
Chris@5 132 }
Chris@5 133 settings.endGroup();
Chris@5 134
Chris@0 135 gui.show();
Chris@0 136
Chris@0 137 if (argc > 1) {
Chris@0 138 QString path = argv[1];
Chris@0 139 bool success = false;
Chris@0 140 if (path.endsWith(".sv")) {
Chris@0 141 success = gui.openSessionFile(path);
Chris@0 142 }
Chris@0 143 if (!success) {
Chris@0 144 success = gui.openSomeFile(path);
Chris@0 145 }
Chris@0 146 if (!success) {
Chris@0 147 QMessageBox::critical(&gui, QMessageBox::tr("Failed to open file"),
Chris@0 148 QMessageBox::tr("File \"%1\" could not be opened").arg(path));
Chris@0 149 }
Chris@0 150 }
Chris@0 151
Chris@0 152 int rv = application.exec();
Chris@0 153 std::cerr << "application.exec() returned " << rv << std::endl;
Chris@0 154
Chris@0 155 cleanupMutex.lock();
Chris@0 156 TempDirectory::getInstance()->cleanup();
Chris@11 157 application.releaseMainWindow();
Chris@5 158
Chris@0 159 return rv;
Chris@0 160 }