00001
00008
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
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
00053 curPath = fileName;
00054 if (QFileInfo(curPath).exists())
00055 paths << QFileInfo(curPath).absoluteFilePath();
00056
00057
00058 curPath = QDir::currentPath() + "/" + fileName;
00059 if (QFileInfo(curPath).exists())
00060 paths << QFileInfo(curPath).absoluteFilePath();
00061
00062
00063 curPath = QCoreApplication::applicationDirPath() + "/" + fileName;
00064 if (QFileInfo(curPath).exists())
00065 paths << QFileInfo(curPath).absoluteFilePath();
00066
00067 #ifdef DEFAULT_DATA_DIR
00068
00069 curPath = QString(DEFAULT_DATA_DIR) + "/" + fileName;
00070 if (QFileInfo(curPath).exists())
00071 paths << QFileInfo(curPath).absoluteFilePath();
00072
00073 #endif
00074
00075
00076 curPath = QCoreApplication::applicationDirPath() + "/ui/" + fileName;
00077 if (QFileInfo(curPath).exists())
00078 paths << QFileInfo(curPath).absoluteFilePath();
00079
00080
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
00095 return paths.toSet().toList();
00096 }
00097
00101 void CACanorus::initMain( int argc, char *argv[] ) {
00102 _autoRecovery = 0;
00103
00104
00105 QCoreApplication::setOrganizationName("Canorus");
00106 QCoreApplication::setOrganizationDomain("canorus.org");
00107 QCoreApplication::setApplicationName("Canorus");
00108 }
00109
00110 void CACanorus::initCommonGUI() {
00111
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 );
00123 CAMainWin::uiOpenDialog->setFilters( CAMainWin::uiOpenDialog->filters() << CAFileFormats::CAN_FILTER );
00124 QString allFilters;
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]!='-') {
00257
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