/media/hdb5/canorusNightlyBuildSystem/trunk/src/canorus.cpp

Go to the documentation of this file.
00001 
00008 // Python.h needs to be loaded first!
00009 #include "scripting/swigpython.h"
00010 #include "canorus.h"
00011 
00012 #include <QFileInfo>
00013 #include <QDir>
00014 #include <QCoreApplication>
00015 #include <QTranslator>
00016 #include <QLocale>
00017 
00018 #include "interface/rtmididevice.h"
00019 #include "ui/settingsdialog.h"
00020 #include "scripting/swigruby.h"
00021 #include "core/sheet.h"
00022 #include "core/settings.h"
00023 #include "core/undo.h"
00024 
00025 // define private static members
00026 QApplication *CACanorus::_mainApp;
00027 QList<CAMainWin*> CACanorus::_mainWinList;
00028 CASettings *CACanorus::_settings;
00029 QString CACanorus::_settingsPath;
00030 CAAutoRecovery *CACanorus::_autoRecovery;
00031 CAMidiDevice *CACanorus::_midiDevice;
00032 CAUndo *CACanorus::_undo;
00033 QList<QString> CACanorus::_recentDocumentList;
00034 
00046 QList<QString> CACanorus::locateResource(const QString fileName) {
00047         QList<QString> paths;
00050         QString curPath;
00051         
00052         // Try absolute path
00053         curPath = fileName;
00054         if (QFileInfo(curPath).exists())
00055                 paths << QFileInfo(curPath).absoluteFilePath();
00056         
00057         // Try current working directory
00058         curPath = QDir::currentPath() + "/" + fileName;
00059         if (QFileInfo(curPath).exists())
00060                 paths << QFileInfo(curPath).absoluteFilePath();
00061         
00062         // Try application exe directory
00063         curPath = QCoreApplication::applicationDirPath() + "/" + fileName;
00064         if (QFileInfo(curPath).exists())
00065                 paths << QFileInfo(curPath).absoluteFilePath();
00066         
00067 #ifdef DEFAULT_DATA_DIR
00068         // Try compiler defined DEFAULT_DATA_DIR constant (useful on Unix OSes)
00069         curPath = QString(DEFAULT_DATA_DIR) + "/" + fileName;
00070         if (QFileInfo(curPath).exists())
00071                 paths << QFileInfo(curPath).absoluteFilePath();
00072         
00073 #endif
00074         
00075         // Try the source ui/ directory (images etc.)
00076         curPath = QCoreApplication::applicationDirPath() + "/ui/" + fileName;
00077         if (QFileInfo(curPath).exists())
00078                         paths << QFileInfo(curPath).absoluteFilePath();
00079         
00080         // Remove duplicates. Is there a faster way to do this?
00081         return paths.toSet().toList();
00082 }
00083 
00089 QList<QString> CACanorus::locateResourceDir(const QString fileName) {
00090         QList<QString> paths = CACanorus::locateResource(fileName);
00091         for (int i=0; i<paths.size(); i++)
00092                 paths[i] = paths[i].left(paths[i].lastIndexOf("/"));
00093         
00094         // Remove duplicates. Is there a faster way to do this?
00095         return paths.toSet().toList();
00096 }
00097 
00101 void CACanorus::initMain( int argc, char *argv[] ) {
00102         _autoRecovery = 0;
00103         
00104         // Init main application properties
00105         QCoreApplication::setOrganizationName("Canorus");
00106         QCoreApplication::setOrganizationDomain("canorus.org");
00107         QCoreApplication::setApplicationName("Canorus");
00108 }
00109 
00110 void CACanorus::initCommonGUI() {
00111         // Initialize main window's load/save/import/export dialogs
00112         CAMainWin::uiSaveDialog = new QFileDialog(0, QObject::tr("Choose a file to save"), settings()->documentsDirectory().absolutePath());
00113         CAMainWin::uiSaveDialog->setFileMode(QFileDialog::AnyFile);
00114         CAMainWin::uiSaveDialog->setAcceptMode( QFileDialog::AcceptSave );
00115         CAMainWin::uiSaveDialog->setFilters( QStringList() << CAFileFormats::CANORUSML_FILTER );
00116         CAMainWin::uiSaveDialog->setFilters( CAMainWin::uiSaveDialog->filters() << CAFileFormats::CAN_FILTER );
00117         CAMainWin::uiSaveDialog->selectFilter( CAFileFormats::getFilter( settings()->defaultSaveFormat() ) );
00118         
00119         CAMainWin::uiOpenDialog = new QFileDialog(0, QObject::tr("Choose a file to open"), settings()->documentsDirectory().absolutePath());
00120         CAMainWin::uiOpenDialog->setFileMode( QFileDialog::ExistingFile );
00121         CAMainWin::uiOpenDialog->setAcceptMode( QFileDialog::AcceptOpen );
00122         CAMainWin::uiOpenDialog->setFilters( QStringList() << CAFileFormats::CANORUSML_FILTER ); // clear the * filter
00123         CAMainWin::uiOpenDialog->setFilters( CAMainWin::uiOpenDialog->filters() << CAFileFormats::CAN_FILTER );
00124         QString allFilters; // generate list of all files
00125         for (int i=0; i<CAMainWin::uiOpenDialog->filters().size(); i++) {
00126                 QString curFilter = CAMainWin::uiOpenDialog->filters()[i];
00127                 int left = curFilter.indexOf('(')+1;
00128                 allFilters += curFilter.mid( left, curFilter.size()-left-1 ) + " ";
00129         }
00130         allFilters.chop(1);
00131         CAMainWin::uiOpenDialog->setFilters( QStringList() << QString(QObject::tr("All supported formats (%1)").arg(allFilters)) << CAMainWin::uiOpenDialog->filters() );
00132         
00133         CAMainWin::uiExportDialog = new QFileDialog(0, QObject::tr("Choose a file to export"), settings()->documentsDirectory().absolutePath());
00134         CAMainWin::uiExportDialog->setFileMode(QFileDialog::AnyFile);
00135         CAMainWin::uiExportDialog->setAcceptMode( QFileDialog::AcceptSave );
00136         CAMainWin::uiExportDialog->setFilters( QStringList() << CAFileFormats::LILYPOND_FILTER );
00137         CAMainWin::uiExportDialog->setFilters( CAMainWin::uiExportDialog->filters() << CAFileFormats::MIDI_FILTER );
00138         
00139         CAMainWin::uiImportDialog = new QFileDialog(0, QObject::tr("Choose a file to import"), settings()->documentsDirectory().absolutePath());
00140         CAMainWin::uiImportDialog->setFileMode( QFileDialog::ExistingFile );
00141         CAMainWin::uiImportDialog->setAcceptMode( QFileDialog::AcceptOpen );
00142 }
00143 
00147 void CACanorus::initPlayback() {
00148         qRegisterMetaType< QVector< unsigned char > >( "QVector< unsigned char >" );
00149         setMidiDevice( new CARtMidiDevice() );
00150 }
00151 
00159 CASettingsDialog::CASettingsPage CACanorus::initSettings() {
00160 #ifdef Q_WS_WIN // M$ is of course an exception
00161         _settingsPath = QDir::homePath()+"/Application Data/Canorus";
00162 #else   // POSIX systems use the same config file path
00163         _settingsPath = QDir::homePath()+"/.config/Canorus";
00164 #endif
00165         
00166         _settings = new CASettings( settingsPath()+"/canorus.ini", QSettings::IniFormat );
00167         
00168         return _settings->readSettings();
00169 }
00170 
00174 void CACanorus::initScripting() {
00175 #ifdef USE_RUBY 
00176         CASwigRuby::init();
00177 #endif
00178 #ifdef USE_PYTHON
00179         CASwigPython::init();
00180 #endif
00181 }
00182 
00186 void CACanorus::initAutoRecovery() {
00187         _autoRecovery = new CAAutoRecovery();
00188 }
00189 
00190 void CACanorus::initUndo() {
00191         _undo = new CAUndo();
00192 }
00193 
00194 void CACanorus::insertRecentDocument( QString filename ) {
00195         if ( recentDocumentList().contains(filename) )
00196                 removeRecentDocument(filename);
00197         
00198         recentDocumentList().prepend(filename);
00199         
00200         if ( recentDocumentList().size() > settings()->maxRecentDocuments() )
00201                 recentDocumentList().removeLast();
00202 }
00203 
00204 void CACanorus::addRecentDocument( QString filename ) {
00205         recentDocumentList() << filename;
00206 }
00207 
00208 void CACanorus::removeRecentDocument( QString filename ) {
00209         recentDocumentList().removeAll(filename);
00210 }
00211 
00215 void CACanorus::cleanUp()
00216 {
00217         delete _settings;
00218         delete CAMainWin::uiSaveDialog;
00219         delete CAMainWin::uiOpenDialog;
00220         delete CAMainWin::uiExportDialog;
00221         delete CAMainWin::uiImportDialog;
00222         delete _midiDevice;
00223         autoRecovery()->cleanupRecovery();
00224         delete _autoRecovery;
00225         delete _undo;
00226 }
00227 
00237 bool CACanorus::parseSettingsArguments(int argc, char *argv[]) {
00238         for (int i=1; i<argc; i++) {
00239                 if ( QString(argv[i])=="--version" ) {
00240                         std::cout << "Canorus - The next generation music score editor" << std::endl
00241                                   << "Version " << CANORUS_VERSION << std::endl;
00242                         
00243                         return false;
00244                 }
00245         }
00246         
00247         return true;
00248 }
00249 
00254 void CACanorus::parseOpenFileArguments(int argc, char *argv[]) {
00255         for (int i=1; i<argc; i++) {
00256                 if (argv[i][0]!='-') { // automatically treat any argument which doesn't start with '-' to be a file name - \todo
00257                         // passed is not the switch but a file name
00258                         if (!CACanorus::locateResource(argv[i]).size())
00259                                 continue;
00260                         QString fileName = CACanorus::locateResource(argv[i]).at(0);
00261                         
00262                         CAMainWin *mainWin = new CAMainWin();
00263                         mainWin->openDocument(fileName);
00264                         mainWin->show();
00265                 }
00266         }
00267 }
00268 
00278 int CACanorus::mainWinCount(CADocument *doc) {
00279         int count=0;
00280         for (int i=0; i<_mainWinList.size(); i++)
00281                 if (_mainWinList[i]->document()==doc)
00282                         count++;
00283         
00284         return count;
00285 }
00286 
00293 void CACanorus::rebuildUI( CADocument *document, CASheet *sheet ) {
00294         for (int i=0; i<mainWinCount(); i++)
00295                 if ( mainWinAt(i)->document()==document )
00296                         mainWinAt(i)->rebuildUI(sheet);
00297 }
00298 
00305 void CACanorus::rebuildUI( CADocument *document ) {
00306         for (int i=0; i<mainWinCount(); i++) {
00307                 if ( document && mainWinAt(i)->document()==document ) {
00308                         mainWinAt(i)->rebuildUI();
00309                 } else if ( !document )
00310                         mainWinAt(i)->rebuildUI();
00311         }
00312 }
00313 
00317 QList<CAMainWin*> CACanorus::findMainWin(CADocument *document) {
00318         QList<CAMainWin*> mainWinList;
00319         for (int i=0; i<mainWinCount(); i++)
00320                 if (mainWinAt(i)->document()==document)
00321                         mainWinList << mainWinAt(i);
00322         
00323         return mainWinList;
00324 }
00325 

Generated on Sat Feb 9 13:06:25 2008 for Canorus by  doxygen 1.5.3