ivand_qmul@121: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ ivand_qmul@121: ivand_qmul@121: /* ivand_qmul@121: Sonic Visualiser ivand_qmul@121: An audio file viewer and annotation editor. ivand_qmul@121: Centre for Digital Music, Queen Mary, University of London. ivand_qmul@121: This file copyright 2006 Chris Cannam and QMUL. ivand_qmul@121: ivand_qmul@121: This program is free software; you can redistribute it and/or ivand_qmul@121: modify it under the terms of the GNU General Public License as ivand_qmul@121: published by the Free Software Foundation; either version 2 of the ivand_qmul@121: License, or (at your option) any later version. See the file ivand_qmul@121: COPYING included with this distribution for more information. ivand_qmul@121: */ ivand_qmul@121: ivand_qmul@121: #include "version.h" ivand_qmul@121: ivand_qmul@121: #include "MainWindow.h" ivand_qmul@121: #include "document/Document.h" ivand_qmul@121: #include "PreferencesDialog.h" ivand_qmul@121: ivand_qmul@121: #include "view/Pane.h" ivand_qmul@121: #include "view/PaneStack.h" ivand_qmul@121: #include "data/model/WaveFileModel.h" ivand_qmul@121: #include "data/model/SparseOneDimensionalModel.h" ivand_qmul@121: #include "view/ViewManager.h" ivand_qmul@121: #include "base/Preferences.h" ivand_qmul@121: #include "layer/WaveformLayer.h" ivand_qmul@121: #include "layer/TimeRulerLayer.h" ivand_qmul@121: #include "layer/TimeInstantLayer.h" ivand_qmul@121: #include "layer/TimeValueLayer.h" ivand_qmul@121: #include "layer/Colour3DPlotLayer.h" ivand_qmul@121: #include "layer/SliceLayer.h" ivand_qmul@121: #include "layer/SliceableLayer.h" ivand_qmul@121: #include "widgets/Fader.h" ivand_qmul@121: #include "view/Overview.h" ivand_qmul@121: #include "widgets/PropertyBox.h" ivand_qmul@121: #include "widgets/PropertyStack.h" ivand_qmul@121: #include "widgets/AudioDial.h" ivand_qmul@121: #include "widgets/LayerTree.h" ivand_qmul@121: #include "widgets/ListInputDialog.h" ivand_qmul@121: #include "widgets/SubdividingMenu.h" ivand_qmul@121: #include "widgets/NotifyingPushButton.h" lbajardsilogic@2: #include "widgets/InfoWidget.h" lbajardsilogic@2: #include "widgets/SearchWidget.h" ivand_qmul@121: #include "widgets/QueryResultsWidget.h" lbajardsilogic@143: #include "widgets/RelatedMediaWidget.h" ivand_qmul@121: #include "widgets/ExpandWidget.h" ivand_qmul@121: #include "widgets/AdvancedToolBox.h" ivand_qmul@121: #include "widgets/ConnectionStatus.h" ivand_qmul@121: #include "widgets/LayerViewerWidget.h" ivand_qmul@121: ivand_qmul@121: #include "audioio/AudioCallbackPlaySource.h" ivand_qmul@121: #include "audioio/AudioCallbackPlayTarget.h" ivand_qmul@121: #include "audioio/AudioTargetFactory.h" ivand_qmul@121: #include "audioio/PlaySpeedRangeMapper.h" ivand_qmul@121: #include "data/fileio/AudioFileReaderFactory.h" ivand_qmul@121: #include "data/fileio/DataFileReaderFactory.h" ivand_qmul@121: #include "data/fileio/WavFileWriter.h" ivand_qmul@121: #include "data/fileio/CSVFileWriter.h" ivand_qmul@121: #include "data/fileio/BZipFileDevice.h" ivand_qmul@121: #include "data/fileio/RemoteFile.h" ivand_qmul@121: #include "data/fft/FFTDataServer.h" ivand_qmul@121: #include "base/RecentFiles.h" ivand_qmul@121: #include "transform/TransformFactory.h" ivand_qmul@121: #include "base/PlayParameterRepository.h" ivand_qmul@121: #include "base/XmlExportable.h" ivand_qmul@121: #include "base/CommandHistory.h" ivand_qmul@121: #include "base/Profiler.h" ivand_qmul@121: #include "base/Clipboard.h" ivand_qmul@121: #include "base/TempDirectory.h" ivand_qmul@121: #include "osc/OSCQueue.h" lbajardsilogic@21: #include "main/EasaierSessionManager.h" ivand_qmul@121: #include "widgets/RealTimeFilterPropertyStack.h" ivand_qmul@121: #include "filter/FilterStack.h" ivand_qmul@121: #include "filter/RealTimeFilterFactory.h" ivand_qmul@121: benoitrigolleau@263: #include "widgets/SpeechRecognitionUI.h" benoitrigolleau@263: ivand_qmul@121: // For version information ivand_qmul@121: #include "vamp/vamp.h" ivand_qmul@121: #include "vamp-sdk/PluginBase.h" ivand_qmul@121: #include "plugin/api/ladspa.h" ivand_qmul@121: #include "plugin/api/dssi.h" ivand_qmul@121: ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: #include ivand_qmul@121: benoitrigolleau@280: /*HOT FIXE*/ benoitrigolleau@280: #include "TimeStretchFilter.h" benoitrigolleau@280: /**********/ benoitrigolleau@280: ivand_qmul@121: using std::cerr; ivand_qmul@121: using std::endl; ivand_qmul@121: ivand_qmul@121: using std::vector; ivand_qmul@121: using std::map; ivand_qmul@121: using std::set; ivand_qmul@121: ivand_qmul@129: extern long long countFreq; ivand_qmul@129: lbajardsilogic@2: MainWindow * MainWindow::m_instance = 0; lbajardsilogic@2: lbajardsilogic@2: MainWindow * MainWindow::instance() lbajardsilogic@2: { lbajardsilogic@2: return m_instance; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: MainWindow::MainWindow(bool withAudioOutput, bool withOSCSupport) : ivand_qmul@121: m_document(0), ivand_qmul@121: m_paneStack(0), ivand_qmul@121: m_viewManager(0), ivand_qmul@121: m_overview(0), ivand_qmul@121: m_timeRulerLayer(0), ivand_qmul@121: m_audioOutput(withAudioOutput), ivand_qmul@121: m_playSource(0), ivand_qmul@121: m_playTarget(0), ivand_qmul@121: m_oscQueue(withOSCSupport ? new OSCQueue() : 0), ivand_qmul@121: m_recentFiles("RecentFiles", 20), ivand_qmul@121: m_recentTransforms("RecentTransforms", 20), ivand_qmul@121: m_mainMenusCreated(false), ivand_qmul@121: m_paneMenu(0), ivand_qmul@121: m_layerMenu(0), ivand_qmul@121: m_transformsMenu(0), ivand_qmul@121: m_existingLayersMenu(0), ivand_qmul@121: m_sliceMenu(0), ivand_qmul@121: m_recentFilesMenu(0), ivand_qmul@121: m_recentTransformsMenu(0), ivand_qmul@121: m_rightButtonMenu(0), ivand_qmul@121: m_rightButtonLayerMenu(0), ivand_qmul@121: m_rightButtonTransformsMenu(0), ivand_qmul@121: m_documentModified(false), ivand_qmul@121: m_openingAudioFile(false), ivand_qmul@121: m_abandoning(false), lbajardsilogic@135: m_preferencesDialog(0), lbajardsilogic@214: m_playSpeedVal(1), benoitrigolleau@217: m_curSender(0), benoitrigolleau@217: m_nbLock(0) ivand_qmul@121: { benoitrigolleau@130: benoitrigolleau@130: m_videoWidget = 0; ivand_qmul@121: m_instance = this; ivand_qmul@121: ivand_qmul@121: setWindowTitle(tr("Sound Access")); ivand_qmul@121: ivand_qmul@121: UnitDatabase::getInstance()->registerUnit("Hz"); ivand_qmul@121: UnitDatabase::getInstance()->registerUnit("dB"); ivand_qmul@121: ivand_qmul@121: connect(CommandHistory::getInstance(), SIGNAL(commandExecuted()), ivand_qmul@121: this, SLOT(documentModified())); ivand_qmul@121: connect(CommandHistory::getInstance(), SIGNAL(documentRestored()), ivand_qmul@121: this, SLOT(documentRestored())); ivand_qmul@121: ivand_qmul@121: QFrame *frame = new QFrame; ivand_qmul@121: setCentralWidget(frame); ivand_qmul@121: ivand_qmul@121: QGridLayout *layout = new QGridLayout; ivand_qmul@121: ivand_qmul@121: m_viewManager = new ViewManager(); ivand_qmul@121: connect(m_viewManager, SIGNAL(selectionChanged()), ivand_qmul@121: this, SLOT(updateMenuStates())); ivand_qmul@121: connect(m_viewManager, SIGNAL(inProgressSelectionChanged()), ivand_qmul@121: this, SLOT(inProgressSelectionChanged())); ivand_qmul@121: ivand_qmul@121: m_descriptionLabel = new QLabel; ivand_qmul@121: ivand_qmul@121: m_paneStack = new PaneStack(frame, m_viewManager); ivand_qmul@121: connect(m_paneStack, SIGNAL(currentPaneChanged(Pane *)), ivand_qmul@121: this, SLOT(currentPaneChanged(Pane *))); ivand_qmul@121: connect(m_paneStack, SIGNAL(currentLayerChanged(Pane *, Layer *)), ivand_qmul@121: this, SLOT(currentLayerChanged(Pane *, Layer *))); ivand_qmul@121: connect(m_paneStack, SIGNAL(rightButtonMenuRequested(Pane *, QPoint)), ivand_qmul@121: this, SLOT(rightButtonMenuRequested(Pane *, QPoint))); ivand_qmul@121: connect(m_paneStack, SIGNAL(propertyStacksResized()), ivand_qmul@121: this, SLOT(propertyStacksResized())); ivand_qmul@121: connect(m_paneStack, SIGNAL(contextHelpChanged(const QString &)), ivand_qmul@121: this, SLOT(contextHelpChanged(const QString &))); ivand_qmul@121: ivand_qmul@121: m_overview = new Overview(frame); ivand_qmul@121: m_overview->setViewManager(m_viewManager); ivand_qmul@121: m_overview->setFixedHeight(40); ivand_qmul@121: m_overview->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); ivand_qmul@121: connect(m_overview, SIGNAL(contextHelpChanged(const QString &)), ivand_qmul@121: this, SLOT(contextHelpChanged(const QString &))); ivand_qmul@121: ivand_qmul@121: m_panLayer = new WaveformLayer; ivand_qmul@121: m_panLayer->setChannelMode(WaveformLayer::MergeChannels); ivand_qmul@121: // m_panLayer->setScale(WaveformLayer::MeterScale); ivand_qmul@121: // m_panLayer->setAutoNormalize(true); ivand_qmul@121: m_panLayer->setBaseColour(Qt::darkGreen); ivand_qmul@121: m_panLayer->setAggressiveCacheing(true); ivand_qmul@121: m_overview->addLayer(m_panLayer); ivand_qmul@121: ivand_qmul@121: m_playSource = new AudioCallbackPlaySource(m_viewManager); ivand_qmul@121: ivand_qmul@121: connect(m_playSource, SIGNAL(sampleRateMismatch(size_t, size_t, bool)), ivand_qmul@121: this, SLOT(sampleRateMismatch(size_t, size_t, bool))); ivand_qmul@121: connect(m_playSource, SIGNAL(audioOverloadPluginDisabled()), ivand_qmul@121: this, SLOT(audioOverloadPluginDisabled())); ivand_qmul@121: ivand_qmul@121: m_fader = new Fader(frame, false); ivand_qmul@121: connect(m_fader, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); ivand_qmul@121: connect(m_fader, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); ivand_qmul@121: lbajardsilogic@127: /* m_playSpeed = new AudioDial(frame); ivand_qmul@121: m_playSpeed->setMinimum(0); ivand_qmul@121: m_playSpeed->setMaximum(200); ivand_qmul@121: m_playSpeed->setValue(100); ivand_qmul@121: m_playSpeed->setFixedWidth(24); ivand_qmul@121: m_playSpeed->setFixedHeight(24); ivand_qmul@121: m_playSpeed->setNotchesVisible(true); ivand_qmul@121: m_playSpeed->setPageStep(10); ivand_qmul@121: m_playSpeed->setObjectName(tr("Playback Speedup")); ivand_qmul@121: m_playSpeed->setDefaultValue(100); ivand_qmul@121: m_playSpeed->setRangeMapper(new PlaySpeedRangeMapper(0, 200)); ivand_qmul@121: m_playSpeed->setShowToolTip(true); ivand_qmul@121: connect(m_playSpeed, SIGNAL(valueChanged(int)), ivand_qmul@121: this, SLOT(playSpeedChanged(int))); ivand_qmul@121: connect(m_playSpeed, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); ivand_qmul@121: connect(m_playSpeed, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); ivand_qmul@121: ivand_qmul@121: m_playSharpen = new NotifyingPushButton(frame); ivand_qmul@121: m_playSharpen->setToolTip(tr("Sharpen percussive transients")); ivand_qmul@121: m_playSharpen->setFixedSize(20, 20); ivand_qmul@121: // m_playSharpen->setFlat(true); ivand_qmul@121: m_playSharpen->setEnabled(false); ivand_qmul@121: m_playSharpen->setCheckable(true); ivand_qmul@121: m_playSharpen->setChecked(false); ivand_qmul@121: m_playSharpen->setIcon(QIcon(":icons/sharpen.png")); ivand_qmul@121: connect(m_playSharpen, SIGNAL(clicked()), this, SLOT(playSharpenToggled())); ivand_qmul@121: connect(m_playSharpen, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); ivand_qmul@121: connect(m_playSharpen, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); ivand_qmul@121: ivand_qmul@121: m_playMono = new NotifyingPushButton(frame); ivand_qmul@121: m_playMono->setToolTip(tr("Run time stretcher in mono only")); ivand_qmul@121: m_playMono->setFixedSize(20, 20); ivand_qmul@121: // m_playMono->setFlat(true); ivand_qmul@121: m_playMono->setEnabled(false); ivand_qmul@121: m_playMono->setCheckable(true); ivand_qmul@121: m_playMono->setChecked(false); ivand_qmul@121: m_playMono->setIcon(QIcon(":icons/mono.png")); ivand_qmul@121: connect(m_playMono, SIGNAL(clicked()), this, SLOT(playMonoToggled())); ivand_qmul@121: connect(m_playMono, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); ivand_qmul@121: connect(m_playMono, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); lbajardsilogic@127: */ lbajardsilogic@127: lbajardsilogic@127: /*QSettings settings; ivand_qmul@121: settings.beginGroup("MainWindow"); ivand_qmul@121: m_playSharpen->setChecked(settings.value("playsharpen", true).toBool()); ivand_qmul@121: m_playMono->setChecked(settings.value("playmono", false).toBool()); lbajardsilogic@127: settings.endGroup();*/ ivand_qmul@121: lbajardsilogic@154: m_relMediaWidget = new RelatedMediaWidget(); lbajardsilogic@154: m_infoWidget = new InfoWidget(m_relMediaWidget); lbajardsilogic@2: m_searchWidget = new SearchWidget(); ivand_qmul@121: m_resultsWidget = new QueryResultsWidget(); lbajardsilogic@154: lbajardsilogic@2: m_qtabwidget = new QTabWidget(); lbajardsilogic@2: m_qtabwidget->addTab(m_searchWidget, tr("Search")); lbajardsilogic@2: m_qtabwidget->addTab(m_resultsWidget, tr("Result")); lbajardsilogic@2: m_qtabwidget->addTab(m_infoWidget, tr("Info")); lbajardsilogic@154: //m_qtabwidget->addTab(m_relMediaWidget, tr("Related media")); ivand_qmul@121: lbajardsilogic@2: QGridLayout *auxlayout = new QGridLayout; benoitrigolleau@130: auxlayout->addWidget(m_paneStack, 0, 0, 1, 2); ivand_qmul@121: auxlayout->addWidget(m_overview, 1, 0); ivand_qmul@121: auxlayout->addWidget(m_fader, 1, 1); lbajardsilogic@127: //auxlayout->addWidget(m_playSpeed, 1, 2); lbajardsilogic@127: //auxlayout->addWidget(m_playSharpen, 1, 3); lbajardsilogic@127: //auxlayout->addWidget(m_playMono, 1, 4); lbajardsilogic@2: QWidget *auxwidget = new QWidget; lbajardsilogic@2: auxwidget->setLayout(auxlayout); lbajardsilogic@2: lbajardsilogic@101: m_leftExpandWidget = new ExpandWidget(); lbajardsilogic@101: m_leftExpandWidget->setWidgetLocation(ExpandWidget::Location_Bottom); lbajardsilogic@101: m_leftExpandWidget->setPanes(auxwidget, m_qtabwidget); lbajardsilogic@269: m_leftExpandWidget->setPercentage( 1, 2); lbajardsilogic@2: lbajardsilogic@2: m_toolBox = new AdvancedToolBox(); lbajardsilogic@2: m_toolBox->addItem("Layers", new QWidget); benoitrigolleau@74: lbajardsilogic@79: m_filterPropertyStack = new RealTimeFilterPropertyStack(); benoitrigolleau@276: m_toolBox->addItem("Real-time Audio Tools",m_filterPropertyStack); lbajardsilogic@98: lbajardsilogic@206: connect(m_filterPropertyStack, SIGNAL(contextHelpChanged(const QString &)), lbajardsilogic@206: this, SLOT(contextHelpChanged(const QString &))); lbajardsilogic@206: benoitrigolleau@58: /******** only for logo ****/ benoitrigolleau@58: QLabel *logo = new QLabel; benoitrigolleau@58: logo->setPixmap(QPixmap(":icons/easaier.png")); benoitrigolleau@58: logo->setMinimumSize(0,0); benoitrigolleau@58: logo->setAlignment(Qt::AlignRight); benoitrigolleau@58: benoitrigolleau@58: QVBoxLayout *logoLayout= new QVBoxLayout; benoitrigolleau@58: logoLayout->setMargin(0); benoitrigolleau@58: logoLayout->setSpacing(0); benoitrigolleau@58: logoLayout->addWidget(m_toolBox); benoitrigolleau@58: logoLayout->addStretch(); benoitrigolleau@58: logoLayout->addWidget(logo); lbajardsilogic@98: benoitrigolleau@58: QWidget *widgetAuxForLogo = new QWidget; benoitrigolleau@58: widgetAuxForLogo->setLayout(logoLayout); benoitrigolleau@58: /****************************/ benoitrigolleau@58: benoitrigolleau@130: /************video***********/ benoitrigolleau@145: m_sdlWidget = new SDLWidget(); benoitrigolleau@130: QHBoxLayout *videoHLayout= new QHBoxLayout; benoitrigolleau@144: benoitrigolleau@130: videoHLayout->addStretch(); benoitrigolleau@145: videoHLayout->addWidget(m_sdlWidget); benoitrigolleau@130: videoHLayout->addStretch(); benoitrigolleau@130: QVBoxLayout *videoVLayout= new QVBoxLayout; benoitrigolleau@130: videoVLayout->addStretch(); benoitrigolleau@130: videoVLayout->addLayout(videoHLayout); benoitrigolleau@130: videoVLayout->addStretch(); benoitrigolleau@130: benoitrigolleau@130: QWidget *ttaux = new QWidget; benoitrigolleau@130: ttaux->setLayout(videoVLayout); benoitrigolleau@139: benoitrigolleau@139: QScrollArea *sa = new QScrollArea(); benoitrigolleau@139: sa->setWidgetResizable( true ); benoitrigolleau@139: sa->setWidget( ttaux ); benoitrigolleau@139: benoitrigolleau@139: m_qtabwidget->addTab(sa, tr("Video")); benoitrigolleau@130: benoitrigolleau@130: /****************************/ benoitrigolleau@130: lbajardsilogic@101: m_rightExpandWidget = new ExpandWidget(); lbajardsilogic@101: m_rightExpandWidget->setWidgetLocation(ExpandWidget::Location_Right); lbajardsilogic@101: m_rightExpandWidget->setPanes(m_leftExpandWidget, widgetAuxForLogo); lbajardsilogic@101: m_rightExpandWidget->setPercentage( 3, 1); lbajardsilogic@2: ivand_qmul@121: layout->addWidget(m_rightExpandWidget, 0, 0); ivand_qmul@121: ivand_qmul@121: m_paneStack->setPropertyStackMinWidth lbajardsilogic@127: (m_fader->width() /*+ m_playSpeed->width() + m_playSharpen->width() + lbajardsilogic@127: m_playMono->width()*/ + layout->spacing() * 4); ivand_qmul@121: ivand_qmul@121: layout->setColumnStretch(0, 10); ivand_qmul@121: ivand_qmul@121: frame->setLayout(layout); ivand_qmul@121: ivand_qmul@121: connect(m_viewManager, SIGNAL(outputLevelsChanged(float, float)), ivand_qmul@121: this, SLOT(outputLevelsChanged(float, float))); ivand_qmul@121: ivand_qmul@121: connect(m_viewManager, SIGNAL(playbackFrameChanged(unsigned long)), ivand_qmul@121: this, SLOT(playbackFrameChanged(unsigned long))); ivand_qmul@121: ivand_qmul@121: connect(m_viewManager, SIGNAL(globalCentreFrameChanged(unsigned long)), ivand_qmul@121: this, SLOT(globalCentreFrameChanged(unsigned long))); ivand_qmul@121: ivand_qmul@121: connect(m_viewManager, SIGNAL(viewCentreFrameChanged(View *, unsigned long)), ivand_qmul@121: this, SLOT(viewCentreFrameChanged(View *, unsigned long))); ivand_qmul@121: ivand_qmul@121: connect(m_viewManager, SIGNAL(viewZoomLevelChanged(View *, unsigned long, bool)), ivand_qmul@121: this, SLOT(viewZoomLevelChanged(View *, unsigned long, bool))); ivand_qmul@121: lbajardsilogic@204: /*connect(Preferences::getInstance(), ivand_qmul@121: SIGNAL(propertyChanged(PropertyContainer::PropertyName)), ivand_qmul@121: this, lbajardsilogic@204: SLOT(preferenceChanged(PropertyContainer::PropertyName)));*/ ivand_qmul@121: ivand_qmul@121: if (m_oscQueue && m_oscQueue->isOK()) { ivand_qmul@121: connect(m_oscQueue, SIGNAL(messagesAvailable()), this, SLOT(pollOSC())); ivand_qmul@121: QTimer *oscTimer = new QTimer(this); ivand_qmul@121: connect(oscTimer, SIGNAL(timeout()), this, SLOT(pollOSC())); ivand_qmul@121: oscTimer->start(1000); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_httpClient = new HttpClient(TempDirectory::getInstance()->getConfigPath()); lbajardsilogic@21: m_EasaierManager = new EasaierSessionManager(m_httpClient); lbajardsilogic@21: lbajardsilogic@21: connect(m_EasaierManager, SIGNAL(queryModelLoaded(QueryModel*)), ivand_qmul@121: this, SLOT(queryModelLoaded(QueryModel*))); ivand_qmul@121: benoitrigolleau@217: lbajardsilogic@214: connect(m_EasaierManager, SIGNAL(audioFileLoaded()), lbajardsilogic@214: this, SLOT(audioFileLoaded())); lbajardsilogic@214: benoitrigolleau@217: connect(m_EasaierManager, SIGNAL(audioFileLoaded()), benoitrigolleau@217: this, SLOT(unlockWindow())); benoitrigolleau@217: ivand_qmul@121: setupMenus(); ivand_qmul@121: setupToolbars(); ivand_qmul@121: ivand_qmul@121: statusBar(); ivand_qmul@121: lbajardsilogic@202: newEasaierSession(); ivand_qmul@121: ivand_qmul@121: } benoitrigolleau@217: benoitrigolleau@217: void MainWindow::lockWindow(){ benoitrigolleau@217: //lock the menu benoitrigolleau@217: QWidget *menu = this->menuWidget(); benoitrigolleau@217: if(menu){ benoitrigolleau@217: menu->setEnabled(false); benoitrigolleau@217: } benoitrigolleau@217: benoitrigolleau@217: // lock the toolbar benoitrigolleau@217: for(int i=0; i< m_toolBarVector.count();i++){ benoitrigolleau@217: m_toolBarVectorValues.append(m_toolBarVector[i]->isEnabled()); benoitrigolleau@217: m_toolBarVector[i]->setEnabled(false); benoitrigolleau@217: } benoitrigolleau@217: benoitrigolleau@217: //lock the central widget benoitrigolleau@217: benoitrigolleau@217: QWidget *centralWidget = this->centralWidget(); benoitrigolleau@217: if(centralWidget){ benoitrigolleau@217: QLayout *centralLayout = centralWidget->layout(); benoitrigolleau@217: if(centralLayout){ benoitrigolleau@217: m_waitwidget = new WaitingWidget; benoitrigolleau@217: m_waitwidget->setAnimation(true); benoitrigolleau@217: ((QGridLayout*) centralLayout)->addWidget(m_waitwidget , 0,0); benoitrigolleau@217: m_waitwidget->setGeometry(-20,-20,100,100); benoitrigolleau@217: } benoitrigolleau@217: } benoitrigolleau@217: m_nbLock++; benoitrigolleau@217: } benoitrigolleau@217: benoitrigolleau@217: void MainWindow::unlockWindow(){ benoitrigolleau@217: m_nbLock--; benoitrigolleau@217: if(m_nbLock<=0){ benoitrigolleau@219: m_nbLock = 0; benoitrigolleau@217: //unlock the menu benoitrigolleau@217: QWidget *menu = this->menuWidget(); benoitrigolleau@217: if(menu){ benoitrigolleau@217: menu->setEnabled(true); benoitrigolleau@217: } benoitrigolleau@217: benoitrigolleau@217: // unlock the toolbar benoitrigolleau@217: for(int i=0; i< m_toolBarVector.count();i++){ benoitrigolleau@217: m_toolBarVector[i]->setEnabled(m_toolBarVectorValues[i]); benoitrigolleau@217: } benoitrigolleau@217: m_toolBarVectorValues.clear(); benoitrigolleau@217: benoitrigolleau@217: // unlock the central widget benoitrigolleau@217: QWidget *centralWidget = this->centralWidget(); benoitrigolleau@217: if(centralWidget){ benoitrigolleau@217: QLayout *centralLayout = centralWidget->layout(); benoitrigolleau@217: if(centralLayout){ benoitrigolleau@217: centralLayout->removeWidget(m_waitwidget); benoitrigolleau@217: delete m_waitwidget; benoitrigolleau@217: benoitrigolleau@217: } benoitrigolleau@217: } benoitrigolleau@217: } benoitrigolleau@217: } benoitrigolleau@217: ivand_qmul@121: ivand_qmul@121: MainWindow::~MainWindow() ivand_qmul@121: { ivand_qmul@121: // std::cerr << "MainWindow::~MainWindow()" << std::endl; ivand_qmul@121: ivand_qmul@121: if (!m_abandoning) { ivand_qmul@121: closeSession(); ivand_qmul@121: } lbajardsilogic@21: delete m_EasaierManager; ivand_qmul@121: delete m_httpClient; ivand_qmul@121: delete m_playTarget; ivand_qmul@121: delete m_playSource; ivand_qmul@121: delete m_viewManager; ivand_qmul@121: delete m_oscQueue; ivand_qmul@121: Profiles::getInstance()->dump(); ivand_qmul@121: ivand_qmul@121: m_instance = 0; ivand_qmul@121: } ivand_qmul@121: benoitrigolleau@130: QWidget* MainWindow::getVideoWidget(){ benoitrigolleau@130: return m_videoWidget; benoitrigolleau@130: } benoitrigolleau@130: ivand_qmul@121: QString ivand_qmul@121: MainWindow::getOpenFileName(FileFinder::FileType type) ivand_qmul@121: { ivand_qmul@121: FileFinder *ff = FileFinder::getInstance(); ivand_qmul@121: switch (type) { ivand_qmul@121: case FileFinder::SessionFile: ivand_qmul@121: return ff->getOpenFileName(type, m_sessionFile); ivand_qmul@121: case FileFinder::AudioFile: ivand_qmul@121: return ff->getOpenFileName(type, m_audioFile); ivand_qmul@121: // Ivan Damnjanovic 09-10/2007 added video file import ivand_qmul@121: case FileFinder::VideoFile: ivand_qmul@121: return ff->getOpenFileName(type, m_videoFile); ivand_qmul@121: // ivand_qmul@121: case FileFinder::LayerFile: ivand_qmul@121: return ff->getOpenFileName(type, m_sessionFile); ivand_qmul@121: case FileFinder::SessionOrAudioFile: ivand_qmul@121: return ff->getOpenFileName(type, m_sessionFile); ivand_qmul@121: case FileFinder::ImageFile: ivand_qmul@121: return ff->getOpenFileName(type, m_sessionFile); ivand_qmul@121: case FileFinder::AnyFile: ivand_qmul@121: if (getMainModel() != 0 && ivand_qmul@121: m_paneStack != 0 && ivand_qmul@121: m_paneStack->getCurrentPane() != 0) { // can import a layer ivand_qmul@121: return ff->getOpenFileName(FileFinder::AnyFile, m_sessionFile); ivand_qmul@121: } else { ivand_qmul@121: return ff->getOpenFileName(FileFinder::SessionOrAudioFile, ivand_qmul@121: m_sessionFile); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: return ""; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QString ivand_qmul@121: MainWindow::getSaveFileName(FileFinder::FileType type) ivand_qmul@121: { ivand_qmul@121: FileFinder *ff = FileFinder::getInstance(); ivand_qmul@121: switch (type) { ivand_qmul@121: case FileFinder::SessionFile: ivand_qmul@121: return ff->getSaveFileName(type, m_sessionFile); ivand_qmul@121: case FileFinder::AudioFile: ivand_qmul@121: return ff->getSaveFileName(type, m_audioFile); ivand_qmul@121: case FileFinder::LayerFile: ivand_qmul@121: return ff->getSaveFileName(type, m_sessionFile); ivand_qmul@121: case FileFinder::SessionOrAudioFile: ivand_qmul@121: return ff->getSaveFileName(type, m_sessionFile); ivand_qmul@121: case FileFinder::ImageFile: ivand_qmul@121: return ff->getSaveFileName(type, m_sessionFile); ivand_qmul@121: case FileFinder::AnyFile: ivand_qmul@121: return ff->getSaveFileName(type, m_sessionFile); ivand_qmul@121: } ivand_qmul@121: return ""; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::registerLastOpenedFilePath(FileFinder::FileType type, QString path) ivand_qmul@121: { ivand_qmul@121: FileFinder *ff = FileFinder::getInstance(); ivand_qmul@121: ff->registerLastOpenedFilePath(type, path); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::setupMenus() ivand_qmul@121: { ivand_qmul@121: if (!m_mainMenusCreated) { ivand_qmul@121: m_rightButtonMenu = new QMenu(); ivand_qmul@121: ivand_qmul@121: // No -- we don't want tear-off enabled on the right-button ivand_qmul@121: // menu. If it is enabled, then simply right-clicking and ivand_qmul@121: // releasing will pop up the menu, activate the tear-off, and ivand_qmul@121: // leave the torn-off menu window in front of the main window. ivand_qmul@121: // That isn't desirable. I'm not sure it ever would be, in a ivand_qmul@121: // context menu -- perhaps technically a Qt bug? ivand_qmul@121: // m_rightButtonMenu->setTearOffEnabled(true); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (m_rightButtonLayerMenu) { ivand_qmul@121: m_rightButtonLayerMenu->clear(); ivand_qmul@121: } else { ivand_qmul@121: m_rightButtonLayerMenu = m_rightButtonMenu->addMenu(tr("&Layer")); ivand_qmul@121: m_rightButtonLayerMenu->setTearOffEnabled(true); ivand_qmul@121: m_rightButtonMenu->addSeparator(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (m_rightButtonTransformsMenu) { ivand_qmul@121: m_rightButtonTransformsMenu->clear(); ivand_qmul@121: } else { ivand_qmul@121: m_rightButtonTransformsMenu = m_rightButtonMenu->addMenu(tr("&Transform")); ivand_qmul@121: m_rightButtonTransformsMenu->setTearOffEnabled(true); ivand_qmul@121: m_rightButtonMenu->addSeparator(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (!m_mainMenusCreated) { ivand_qmul@121: CommandHistory::getInstance()->registerMenu(m_rightButtonMenu); ivand_qmul@121: m_rightButtonMenu->addSeparator(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: setupFileMenu(); ivand_qmul@121: setupEasaierMenu(); ivand_qmul@121: setupEditMenu(); ivand_qmul@121: setupViewMenu(); ivand_qmul@121: setupPaneAndLayerMenus(); ivand_qmul@121: setupTransformsMenu(); ivand_qmul@121: setupSettingMenu(); ivand_qmul@121: setupHelpMenu(); ivand_qmul@121: ivand_qmul@121: m_mainMenusCreated = true; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::setupFileMenu() ivand_qmul@121: { ivand_qmul@121: if (m_mainMenusCreated) return; ivand_qmul@121: ivand_qmul@121: QMenu *menu = menuBar()->addMenu(tr("&File")); ivand_qmul@121: menu->setTearOffEnabled(true); ivand_qmul@121: //QToolBar *toolbar = addToolBar(tr("File Toolbar")); ivand_qmul@121: ivand_qmul@121: QIcon icon(":icons/filenew.png"); ivand_qmul@121: icon.addFile(":icons/filenew-22.png"); ivand_qmul@121: QAction *action = new QAction(icon, tr("&New Session"), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+N")); ivand_qmul@121: action->setStatusTip(tr("Abandon the current Sonic Visualiser session and start a new one")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(newSession())); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: //toolbar->addAction(action); ivand_qmul@121: ivand_qmul@121: icon = QIcon(":icons/fileopensession.png"); ivand_qmul@121: action = new QAction(icon, tr("&Open Session..."), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+O")); ivand_qmul@121: action->setStatusTip(tr("Open a previously saved Sonic Visualiser session file")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(openSession())); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: icon = QIcon(":icons/fileopen.png"); ivand_qmul@121: icon.addFile(":icons/fileopen-22.png"); ivand_qmul@121: ivand_qmul@121: action = new QAction(icon, tr("&Open..."), this); ivand_qmul@121: action->setStatusTip(tr("Open a session file, audio file, or layer")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(openSomething())); ivand_qmul@121: //toolbar->addAction(action); ivand_qmul@121: ivand_qmul@121: icon = QIcon(":icons/filesave.png"); ivand_qmul@121: icon.addFile(":icons/filesave-22.png"); ivand_qmul@121: action = new QAction(icon, tr("&Save Session"), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+S")); ivand_qmul@121: action->setStatusTip(tr("Save the current session into a Sonic Visualiser session file")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(saveSession())); ivand_qmul@121: connect(this, SIGNAL(canSave(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: //toolbar->addAction(action); ivand_qmul@121: ivand_qmul@121: icon = QIcon(":icons/filesaveas.png"); ivand_qmul@121: icon.addFile(":icons/filesaveas-22.png"); ivand_qmul@121: action = new QAction(icon, tr("Save Session &As..."), this); ivand_qmul@121: action->setStatusTip(tr("Save the current session into a new Sonic Visualiser session file")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(saveSessionAs())); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: //toolbar->addAction(action); ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: icon = QIcon(":icons/fileopenaudio.png"); ivand_qmul@121: action = new QAction(icon, tr("&Import Audio File..."), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+I")); ivand_qmul@121: action->setStatusTip(tr("Import an existing audio file")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(importAudio())); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Import Secondary Audio File..."), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+Shift+I")); ivand_qmul@121: action->setStatusTip(tr("Import an extra audio file as a separate layer")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(importMoreAudio())); ivand_qmul@121: connect(this, SIGNAL(canImportMoreAudio(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("&Export Audio File..."), this); ivand_qmul@121: action->setStatusTip(tr("Export selection as an audio file")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(exportAudio())); ivand_qmul@121: connect(this, SIGNAL(canExportAudio(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: // Ivan Damnjanovic 09-10/2007 added video file import ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: action = new QAction(tr("&Import Video File..."), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+Alt+I")); ivand_qmul@121: action->setStatusTip(tr("Import an existing video file")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(importVideo())); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: // ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Import Annotation &Layer..."), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+L")); ivand_qmul@121: action->setStatusTip(tr("Import layer data from an existing file")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(importLayer())); ivand_qmul@121: connect(this, SIGNAL(canImportLayer(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Export Annotation Layer..."), this); ivand_qmul@121: action->setStatusTip(tr("Export layer data to a file")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(exportLayer())); ivand_qmul@121: connect(this, SIGNAL(canExportLayer(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Export Image File..."), this); ivand_qmul@121: action->setStatusTip(tr("Export a single pane to an image file")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(exportImage())); ivand_qmul@121: connect(this, SIGNAL(canExportImage(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Open Lo&cation..."), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+Shift+O")); ivand_qmul@121: action->setStatusTip(tr("Open or import a file from a remote URL")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(openLocation())); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: m_recentFilesMenu = menu->addMenu(tr("&Recent Files")); ivand_qmul@121: m_recentFilesMenu->setTearOffEnabled(true); ivand_qmul@121: setupRecentFilesMenu(); ivand_qmul@121: connect(&m_recentFiles, SIGNAL(recentChanged()), ivand_qmul@121: this, SLOT(setupRecentFilesMenu())); ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: action = new QAction(tr("&Preferences..."), this); ivand_qmul@121: action->setStatusTip(tr("Adjust the application preferences")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(preferences())); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: /*!!! ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Play / Pause"), this); ivand_qmul@121: action->setShortcut(tr("Space")); ivand_qmul@121: action->setStatusTip(tr("Start or stop playback from the current position")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(play())); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: */ ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: action = new QAction(QIcon(":/icons/exit.png"), ivand_qmul@121: tr("&Quit"), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+Q")); ivand_qmul@121: action->setStatusTip(tr("Exit Sonic Visualiser")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(exit())); ivand_qmul@121: menu->addAction(action); benoitrigolleau@263: ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::setupEasaierMenu() ivand_qmul@121: { lbajardsilogic@21: if (m_mainMenusCreated) return; lbajardsilogic@21: lbajardsilogic@21: QMenu* menu = menuBar()->addMenu(tr("&Easaier")); lbajardsilogic@21: QToolBar *toolbar = addToolBar(tr("Easaier session Toolbar")); benoitrigolleau@217: m_toolBarVector.append(toolbar); lbajardsilogic@21: lbajardsilogic@21: QIcon icon(":icons/filenew.png"); lbajardsilogic@21: QAction *action = new QAction(icon, tr("&New Session"), this); lbajardsilogic@21: action->setShortcut(tr("Ctrl+N")); lbajardsilogic@21: action->setStatusTip(tr("Clear the current Easaier session and start a new one")); lbajardsilogic@21: connect(action, SIGNAL(triggered()), this, SLOT(newEasaierSession())); lbajardsilogic@21: menu->addAction(action); lbajardsilogic@21: toolbar->addAction(action); lbajardsilogic@21: lbajardsilogic@21: icon = QIcon(":icons/fileopen.png"); lbajardsilogic@21: action = new QAction(icon, tr("&Open Session..."), this); lbajardsilogic@21: action->setShortcut(tr("Ctrl+O")); lbajardsilogic@21: action->setStatusTip(tr("Open a previously saved Easaier session file")); lbajardsilogic@21: connect(action, SIGNAL(triggered()), this, SLOT(openEasaierSession())); lbajardsilogic@21: menu->addAction(action); lbajardsilogic@21: toolbar->addAction(action); lbajardsilogic@21: lbajardsilogic@21: icon = QIcon(":icons/filesave.png"); lbajardsilogic@21: action = new QAction(icon, tr("&Save Session"), this); lbajardsilogic@21: action->setShortcut(tr("Ctrl+S")); lbajardsilogic@21: action->setStatusTip(tr("Save the current session into a Easaier session file")); lbajardsilogic@21: connect(action, SIGNAL(triggered()), this, SLOT(saveEasaierSession())); lbajardsilogic@21: //connect(this, SIGNAL(canSave(bool)), action, SLOT(setEnabled(bool))); lbajardsilogic@21: menu->addAction(action); lbajardsilogic@21: toolbar->addAction(action); lbajardsilogic@21: lbajardsilogic@21: icon = QIcon(":icons/filesaveas.png"); lbajardsilogic@21: action = new QAction(icon, tr("Save Session &As..."), this); lbajardsilogic@21: action->setStatusTip(tr("Save the current session into a new Easaier session file")); lbajardsilogic@21: connect(action, SIGNAL(triggered()), this, SLOT(saveEasaierSessionAs())); lbajardsilogic@21: menu->addAction(action); lbajardsilogic@21: toolbar->addAction(action); lbajardsilogic@21: lbajardsilogic@21: menu->addSeparator(); lbajardsilogic@21: lbajardsilogic@21: action = new QAction(QIcon(":/icons/exit.png"), lbajardsilogic@21: tr("&Quit"), this); lbajardsilogic@21: action->setShortcut(tr("Ctrl+Q")); lbajardsilogic@21: connect(action, SIGNAL(triggered()), this, SLOT(exit())); lbajardsilogic@21: menu->addAction(action); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::setupEditMenu() ivand_qmul@121: { ivand_qmul@121: if (m_mainMenusCreated) return; ivand_qmul@121: ivand_qmul@121: QMenu *menu = menuBar()->addMenu(tr("&Edit")); ivand_qmul@121: menu->setTearOffEnabled(true); ivand_qmul@121: CommandHistory::getInstance()->registerMenu(menu); ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: QAction *action = new QAction(QIcon(":/icons/editcut.png"), ivand_qmul@121: tr("Cu&t"), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+X")); ivand_qmul@121: action->setStatusTip(tr("Cut the selection from the current layer to the clipboard")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(cut())); ivand_qmul@121: connect(this, SIGNAL(canEditSelection(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: m_rightButtonMenu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(QIcon(":/icons/editcopy.png"), ivand_qmul@121: tr("&Copy"), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+C")); ivand_qmul@121: action->setStatusTip(tr("Copy the selection from the current layer to the clipboard")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(copy())); ivand_qmul@121: connect(this, SIGNAL(canEditSelection(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: m_rightButtonMenu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(QIcon(":/icons/editpaste.png"), ivand_qmul@121: tr("&Paste"), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+V")); ivand_qmul@121: action->setStatusTip(tr("Paste from the clipboard to the current layer")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(paste())); ivand_qmul@121: connect(this, SIGNAL(canPaste(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: m_rightButtonMenu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("&Delete Selected Items"), this); ivand_qmul@121: action->setShortcut(tr("Del")); ivand_qmul@121: action->setStatusTip(tr("Delete the selection from the current layer")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(deleteSelected())); ivand_qmul@121: connect(this, SIGNAL(canEditSelection(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: m_rightButtonMenu->addAction(action); ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: m_rightButtonMenu->addSeparator(); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Select &All"), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+A")); ivand_qmul@121: action->setStatusTip(tr("Select the whole duration of the current session")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(selectAll())); ivand_qmul@121: connect(this, SIGNAL(canSelect(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: m_rightButtonMenu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Select &Visible Range"), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+Shift+A")); ivand_qmul@121: action->setStatusTip(tr("Select the time range corresponding to the current window width")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(selectVisible())); ivand_qmul@121: connect(this, SIGNAL(canSelect(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Select to &Start"), this); ivand_qmul@121: action->setShortcut(tr("Shift+Left")); ivand_qmul@121: action->setStatusTip(tr("Select from the start of the session to the current playback position")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(selectToStart())); ivand_qmul@121: connect(this, SIGNAL(canSelect(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Select to &End"), this); ivand_qmul@121: action->setShortcut(tr("Shift+Right")); ivand_qmul@121: action->setStatusTip(tr("Select from the current playback position to the end of the session")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(selectToEnd())); ivand_qmul@121: connect(this, SIGNAL(canSelect(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("C&lear Selection"), this); ivand_qmul@121: action->setShortcut(tr("Esc")); ivand_qmul@121: action->setStatusTip(tr("Clear the selection")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(clearSelection())); ivand_qmul@121: connect(this, SIGNAL(canClearSelection(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: m_rightButtonMenu->addAction(action); ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("&Insert Instant at Playback Position"), this); ivand_qmul@121: action->setShortcut(tr("Enter")); ivand_qmul@121: action->setStatusTip(tr("Insert a new time instant at the current playback position, in a new layer if necessary")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(insertInstant())); ivand_qmul@121: connect(this, SIGNAL(canInsertInstant(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Insert Instants at Selection &Boundaries"), this); ivand_qmul@121: action->setShortcut(tr("Shift+Enter")); ivand_qmul@121: action->setStatusTip(tr("Insert new time instants at the start and end of the current selection, in a new layer if necessary")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(insertInstantsAtBoundaries())); ivand_qmul@121: connect(this, SIGNAL(canInsertInstantsAtBoundaries(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: // Laptop shortcut (no keypad Enter key) ivand_qmul@121: connect(new QShortcut(tr(";"), this), SIGNAL(activated()), ivand_qmul@121: this, SLOT(insertInstant())); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::setupSettingMenu() ivand_qmul@121: { ivand_qmul@121: if (m_mainMenusCreated) return; ivand_qmul@121: ivand_qmul@121: QAction *action = 0; ivand_qmul@121: QMenu *menu = 0; ivand_qmul@121: ivand_qmul@121: menu = menuBar()->addMenu(tr("&Settings")); ivand_qmul@121: menu->setTearOffEnabled(true); lbajardsilogic@2: lbajardsilogic@10: action = new QAction(tr("&Connection settings"), this); lbajardsilogic@10: connect(action, SIGNAL(triggered()), this, SLOT(connectionSettings())); lbajardsilogic@10: menu->addAction(action); lbajardsilogic@2: lbajardsilogic@2: action = new QAction(tr("&Style setting"), this); lbajardsilogic@2: connect(action, SIGNAL(triggered()), this, SLOT(styleSetting())); ivand_qmul@121: menu->addAction(action); benoitrigolleau@263: ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::setupViewMenu() ivand_qmul@121: { ivand_qmul@121: if (m_mainMenusCreated) return; ivand_qmul@121: ivand_qmul@121: QAction *action = 0; ivand_qmul@121: ivand_qmul@121: QMenu *menu = menuBar()->addMenu(tr("&View")); ivand_qmul@121: menu->setTearOffEnabled(true); ivand_qmul@121: action = new QAction(tr("Scroll &Left"), this); ivand_qmul@121: action->setShortcut(tr("Left")); ivand_qmul@121: action->setStatusTip(tr("Scroll the current pane to the left")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(scrollLeft())); ivand_qmul@121: connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Scroll &Right"), this); ivand_qmul@121: action->setShortcut(tr("Right")); ivand_qmul@121: action->setStatusTip(tr("Scroll the current pane to the right")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(scrollRight())); ivand_qmul@121: connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("&Jump Left"), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+Left")); ivand_qmul@121: action->setStatusTip(tr("Scroll the current pane a big step to the left")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(jumpLeft())); ivand_qmul@121: connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("J&ump Right"), this); ivand_qmul@121: action->setShortcut(tr("Ctrl+Right")); ivand_qmul@121: action->setStatusTip(tr("Scroll the current pane a big step to the right")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(jumpRight())); ivand_qmul@121: connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: action = new QAction(QIcon(":/icons/zoom-in.png"), ivand_qmul@121: tr("Zoom &In"), this); ivand_qmul@121: action->setShortcut(tr("Up")); ivand_qmul@121: action->setStatusTip(tr("Increase the zoom level")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(zoomIn())); ivand_qmul@121: connect(this, SIGNAL(canZoom(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(QIcon(":/icons/zoom-out.png"), ivand_qmul@121: tr("Zoom &Out"), this); ivand_qmul@121: action->setShortcut(tr("Down")); ivand_qmul@121: action->setStatusTip(tr("Decrease the zoom level")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(zoomOut())); ivand_qmul@121: connect(this, SIGNAL(canZoom(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Restore &Default Zoom"), this); ivand_qmul@121: action->setStatusTip(tr("Restore the zoom level to the default")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(zoomDefault())); ivand_qmul@121: connect(this, SIGNAL(canZoom(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(QIcon(":/icons/zoom-fit.png"), ivand_qmul@121: tr("Zoom to &Fit"), this); ivand_qmul@121: action->setStatusTip(tr("Zoom to show the whole file")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(zoomToFit())); ivand_qmul@121: connect(this, SIGNAL(canZoom(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: QActionGroup *overlayGroup = new QActionGroup(this); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Show &No Overlays"), this); ivand_qmul@121: action->setShortcut(tr("0")); ivand_qmul@121: action->setStatusTip(tr("Hide centre indicator, frame times, layer names and scale")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(showNoOverlays())); ivand_qmul@121: action->setCheckable(true); ivand_qmul@121: action->setChecked(false); ivand_qmul@121: overlayGroup->addAction(action); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Show &Minimal Overlays"), this); ivand_qmul@121: action->setShortcut(tr("9")); ivand_qmul@121: action->setStatusTip(tr("Show centre indicator only")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(showMinimalOverlays())); ivand_qmul@121: action->setCheckable(true); ivand_qmul@121: action->setChecked(false); ivand_qmul@121: overlayGroup->addAction(action); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Show &Standard Overlays"), this); ivand_qmul@121: action->setShortcut(tr("8")); ivand_qmul@121: action->setStatusTip(tr("Show centre indicator, frame times and scale")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(showStandardOverlays())); ivand_qmul@121: action->setCheckable(true); ivand_qmul@121: action->setChecked(true); ivand_qmul@121: overlayGroup->addAction(action); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Show &All Overlays"), this); ivand_qmul@121: action->setShortcut(tr("7")); ivand_qmul@121: action->setStatusTip(tr("Show all texts and scale")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(showAllOverlays())); ivand_qmul@121: action->setCheckable(true); ivand_qmul@121: action->setChecked(false); ivand_qmul@121: overlayGroup->addAction(action); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Show &Zoom Wheels"), this); ivand_qmul@121: action->setShortcut(tr("Z")); ivand_qmul@121: action->setStatusTip(tr("Show thumbwheels for zooming horizontally and vertically")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(toggleZoomWheels())); ivand_qmul@121: action->setCheckable(true); ivand_qmul@121: action->setChecked(m_viewManager->getZoomWheelsEnabled()); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: lbajardsilogic@205: action = new QAction(tr("Show Layers and &Filters"), this); lbajardsilogic@205: action->setShortcut(tr("F")); lbajardsilogic@205: action->setStatusTip(tr("Show the layers and the real-time filters activated at the side of the main window")); lbajardsilogic@205: connect(action, SIGNAL(triggered()), m_rightExpandWidget, SLOT(changePaneState())); lbajardsilogic@205: connect(m_rightExpandWidget, SIGNAL(paneStateChanged(bool)), action, SLOT(setChecked(bool))); lbajardsilogic@205: action->setCheckable(true); lbajardsilogic@205: action->setChecked(m_rightExpandWidget->isVisible()); lbajardsilogic@205: menu->addAction(action); lbajardsilogic@205: lbajardsilogic@205: action = new QAction(tr("Show Search/Tracks &Info Panes"), this); lbajardsilogic@205: action->setShortcut(tr("I")); lbajardsilogic@205: action->setStatusTip(tr("Show the search funtionalities and tracks information at the bottom of the main window")); lbajardsilogic@205: connect(action, SIGNAL(triggered()), m_leftExpandWidget, SLOT(changePaneState())); lbajardsilogic@205: connect(m_leftExpandWidget, SIGNAL(paneStateChanged(bool)), action, SLOT(setChecked(bool))); lbajardsilogic@205: action->setCheckable(true); lbajardsilogic@205: action->setChecked(m_leftExpandWidget->isVisible()); lbajardsilogic@205: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Show Status &Bar"), this); ivand_qmul@121: action->setStatusTip(tr("Show context help information in the status bar at the bottom of the window")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(toggleStatusBar())); ivand_qmul@121: action->setCheckable(true); ivand_qmul@121: action->setChecked(true); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: QSettings settings; ivand_qmul@121: settings.beginGroup("MainWindow"); ivand_qmul@121: bool sb = settings.value("showstatusbar", true).toBool(); ivand_qmul@121: if (!sb) { ivand_qmul@121: action->setChecked(false); ivand_qmul@121: statusBar()->hide(); ivand_qmul@121: } ivand_qmul@121: settings.endGroup(); ivand_qmul@121: ivand_qmul@121: /*!!! This one doesn't work properly yet ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Show La&yer Hierarchy"), this); ivand_qmul@121: action->setShortcut(tr("Alt+L")); ivand_qmul@121: action->setStatusTip(tr("Open a window displaying the hierarchy of panes and layers in this session")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(showLayerTree())); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: */ ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::setupPaneAndLayerMenus() ivand_qmul@121: { ivand_qmul@121: if (m_paneMenu) { ivand_qmul@121: m_paneActions.clear(); ivand_qmul@121: m_paneMenu->clear(); ivand_qmul@121: } else { ivand_qmul@121: m_paneMenu = menuBar()->addMenu(tr("&Pane")); ivand_qmul@121: m_paneMenu->setTearOffEnabled(true); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (m_layerMenu) { ivand_qmul@121: m_layerActions.clear(); ivand_qmul@121: m_layerMenu->clear(); ivand_qmul@121: } else { ivand_qmul@121: m_layerMenu = menuBar()->addMenu(tr("&Layer")); ivand_qmul@121: m_layerMenu->setTearOffEnabled(true); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QMenu *menu = m_paneMenu; ivand_qmul@121: ivand_qmul@121: QAction *action = new QAction(QIcon(":/icons/pane.png"), tr("Add &New Pane"), this); ivand_qmul@121: action->setShortcut(tr("Alt+N")); ivand_qmul@121: action->setStatusTip(tr("Add a new pane containing only a time ruler")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(addPane())); ivand_qmul@121: connect(this, SIGNAL(canAddPane(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: m_paneActions[action] = PaneConfiguration(LayerFactory::TimeRuler); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: menu = m_layerMenu; ivand_qmul@121: ivand_qmul@121: // menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: LayerFactory::LayerTypeSet emptyLayerTypes = ivand_qmul@121: LayerFactory::getInstance()->getValidEmptyLayerTypes(); ivand_qmul@121: ivand_qmul@121: for (LayerFactory::LayerTypeSet::iterator i = emptyLayerTypes.begin(); ivand_qmul@121: i != emptyLayerTypes.end(); ++i) { ivand_qmul@121: ivand_qmul@121: QIcon icon; ivand_qmul@121: QString mainText, tipText, channelText; ivand_qmul@121: LayerFactory::LayerType type = *i; ivand_qmul@121: QString name = LayerFactory::getInstance()->getLayerPresentationName(type); ivand_qmul@121: ivand_qmul@121: icon = QIcon(QString(":/icons/%1.png") ivand_qmul@121: .arg(LayerFactory::getInstance()->getLayerIconName(type))); ivand_qmul@121: ivand_qmul@121: mainText = tr("Add New %1 Layer").arg(name); ivand_qmul@121: tipText = tr("Add a new empty layer of type %1").arg(name); ivand_qmul@121: ivand_qmul@121: action = new QAction(icon, mainText, this); ivand_qmul@121: action->setStatusTip(tipText); ivand_qmul@121: ivand_qmul@121: if (type == LayerFactory::Text) { ivand_qmul@121: action->setShortcut(tr("Alt+T")); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); ivand_qmul@121: connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: m_layerActions[action] = type; ivand_qmul@121: menu->addAction(action); ivand_qmul@121: m_rightButtonLayerMenu->addAction(action); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_rightButtonLayerMenu->addSeparator(); ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: LayerFactory::LayerType backgroundTypes[] = { ivand_qmul@121: LayerFactory::Waveform, ivand_qmul@121: LayerFactory::Spectrogram, ivand_qmul@121: LayerFactory::MelodicRangeSpectrogram, ivand_qmul@121: LayerFactory::PeakFrequencySpectrogram, ivand_qmul@121: LayerFactory::Spectrum ivand_qmul@121: }; ivand_qmul@121: ivand_qmul@121: std::vector models; ivand_qmul@121: if (m_document) models = m_document->getTransformInputModels(); //!!! not well named for this! ivand_qmul@121: bool plural = (models.size() > 1); ivand_qmul@121: if (models.empty()) { ivand_qmul@121: models.push_back(getMainModel()); // probably 0 ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: for (unsigned int i = 0; ivand_qmul@121: i < sizeof(backgroundTypes)/sizeof(backgroundTypes[0]); ++i) { ivand_qmul@121: ivand_qmul@121: for (int menuType = 0; menuType <= 1; ++menuType) { // pane, layer ivand_qmul@121: ivand_qmul@121: if (menuType == 0) menu = m_paneMenu; ivand_qmul@121: else menu = m_layerMenu; ivand_qmul@121: ivand_qmul@121: QMenu *submenu = 0; ivand_qmul@121: ivand_qmul@121: QIcon icon; ivand_qmul@121: QString mainText, shortcutText, tipText, channelText; ivand_qmul@121: LayerFactory::LayerType type = backgroundTypes[i]; ivand_qmul@121: bool mono = true; ivand_qmul@121: ivand_qmul@121: switch (type) { ivand_qmul@121: ivand_qmul@121: case LayerFactory::Waveform: ivand_qmul@121: icon = QIcon(":/icons/waveform.png"); ivand_qmul@121: mainText = tr("Add &Waveform"); ivand_qmul@121: if (menuType == 0) { ivand_qmul@121: shortcutText = tr("Alt+W"); ivand_qmul@121: tipText = tr("Add a new pane showing a waveform view"); ivand_qmul@121: } else { ivand_qmul@121: tipText = tr("Add a new layer showing a waveform view"); ivand_qmul@121: } ivand_qmul@121: mono = false; ivand_qmul@121: break; ivand_qmul@121: ivand_qmul@121: case LayerFactory::Spectrogram: ivand_qmul@121: icon = QIcon(":/icons/spectrogram.png"); ivand_qmul@121: mainText = tr("Add &Spectrogram"); ivand_qmul@121: if (menuType == 0) { ivand_qmul@121: shortcutText = tr("Alt+S"); ivand_qmul@121: tipText = tr("Add a new pane showing a spectrogram"); ivand_qmul@121: } else { ivand_qmul@121: tipText = tr("Add a new layer showing a spectrogram"); ivand_qmul@121: } ivand_qmul@121: break; ivand_qmul@121: ivand_qmul@121: case LayerFactory::MelodicRangeSpectrogram: ivand_qmul@121: icon = QIcon(":/icons/spectrogram.png"); ivand_qmul@121: mainText = tr("Add &Melodic Range Spectrogram"); ivand_qmul@121: if (menuType == 0) { ivand_qmul@121: shortcutText = tr("Alt+M"); ivand_qmul@121: tipText = tr("Add a new pane showing a spectrogram set up for an overview of note pitches"); ivand_qmul@121: } else { ivand_qmul@121: tipText = tr("Add a new layer showing a spectrogram set up for an overview of note pitches"); ivand_qmul@121: } ivand_qmul@121: break; ivand_qmul@121: ivand_qmul@121: case LayerFactory::PeakFrequencySpectrogram: ivand_qmul@121: icon = QIcon(":/icons/spectrogram.png"); ivand_qmul@121: mainText = tr("Add &Peak Frequency Spectrogram"); ivand_qmul@121: if (menuType == 0) { ivand_qmul@121: shortcutText = tr("Alt+P"); ivand_qmul@121: tipText = tr("Add a new pane showing a spectrogram set up for tracking frequencies"); ivand_qmul@121: } else { ivand_qmul@121: tipText = tr("Add a new layer showing a spectrogram set up for tracking frequencies"); ivand_qmul@121: } ivand_qmul@121: break; ivand_qmul@121: ivand_qmul@121: case LayerFactory::Spectrum: ivand_qmul@121: icon = QIcon(":/icons/spectrum.png"); ivand_qmul@121: mainText = tr("Add Spectr&um"); ivand_qmul@121: if (menuType == 0) { ivand_qmul@121: shortcutText = tr("Alt+U"); ivand_qmul@121: tipText = tr("Add a new pane showing a frequency spectrum"); ivand_qmul@121: } else { ivand_qmul@121: tipText = tr("Add a new layer showing a frequency spectrum"); ivand_qmul@121: } ivand_qmul@121: break; ivand_qmul@121: ivand_qmul@121: default: break; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: std::vector candidateModels; ivand_qmul@121: if (menuType == 0) { ivand_qmul@121: candidateModels = models; ivand_qmul@121: } else { ivand_qmul@121: candidateModels.push_back(0); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: for (std::vector::iterator mi = ivand_qmul@121: candidateModels.begin(); ivand_qmul@121: mi != candidateModels.end(); ++mi) { ivand_qmul@121: ivand_qmul@121: Model *model = *mi; ivand_qmul@121: ivand_qmul@121: int channels = 0; ivand_qmul@121: if (model) { ivand_qmul@121: DenseTimeValueModel *dtvm = ivand_qmul@121: dynamic_cast(model); ivand_qmul@121: if (dtvm) channels = dtvm->getChannelCount(); ivand_qmul@121: } ivand_qmul@121: if (channels < 1 && getMainModel()) { ivand_qmul@121: channels = getMainModel()->getChannelCount(); ivand_qmul@121: } ivand_qmul@121: if (channels < 1) channels = 1; ivand_qmul@121: ivand_qmul@121: for (int c = 0; c <= channels; ++c) { ivand_qmul@121: ivand_qmul@121: if (c == 1 && channels == 1) continue; ivand_qmul@121: bool isDefault = (c == 0); ivand_qmul@121: bool isOnly = (isDefault && (channels == 1)); ivand_qmul@121: ivand_qmul@121: if (menuType == 1) { ivand_qmul@121: if (isDefault) isOnly = true; ivand_qmul@121: else continue; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (isOnly && (!plural || menuType == 1)) { ivand_qmul@121: ivand_qmul@121: if (menuType == 1 && type != LayerFactory::Waveform) { ivand_qmul@121: action = new QAction(mainText, this); ivand_qmul@121: } else { ivand_qmul@121: action = new QAction(icon, mainText, this); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: action->setShortcut(shortcutText); ivand_qmul@121: action->setStatusTip(tipText); ivand_qmul@121: if (menuType == 0) { ivand_qmul@121: connect(action, SIGNAL(triggered()), ivand_qmul@121: this, SLOT(addPane())); ivand_qmul@121: connect(this, SIGNAL(canAddPane(bool)), ivand_qmul@121: action, SLOT(setEnabled(bool))); ivand_qmul@121: m_paneActions[action] = PaneConfiguration(type); ivand_qmul@121: } else { ivand_qmul@121: connect(action, SIGNAL(triggered()), ivand_qmul@121: this, SLOT(addLayer())); ivand_qmul@121: connect(this, SIGNAL(canAddLayer(bool)), ivand_qmul@121: action, SLOT(setEnabled(bool))); ivand_qmul@121: m_layerActions[action] = type; ivand_qmul@121: } ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: } else { ivand_qmul@121: ivand_qmul@121: if (!submenu) { ivand_qmul@121: submenu = menu->addMenu(mainText); ivand_qmul@121: submenu->setTearOffEnabled(true); ivand_qmul@121: } else if (isDefault) { ivand_qmul@121: submenu->addSeparator(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QString actionText; ivand_qmul@121: if (c == 0) { ivand_qmul@121: if (mono) { ivand_qmul@121: actionText = tr("&All Channels Mixed"); ivand_qmul@121: } else { ivand_qmul@121: actionText = tr("&All Channels"); ivand_qmul@121: } ivand_qmul@121: } else { ivand_qmul@121: actionText = tr("Channel &%1").arg(c); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (model) { ivand_qmul@121: actionText = tr("%1: %2") ivand_qmul@121: .arg(model->objectName()) ivand_qmul@121: .arg(actionText); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (isDefault) { ivand_qmul@121: action = new QAction(icon, actionText, this); ivand_qmul@121: if (!model || model == getMainModel()) { ivand_qmul@121: action->setShortcut(shortcutText); ivand_qmul@121: } ivand_qmul@121: } else { ivand_qmul@121: action = new QAction(actionText, this); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: action->setStatusTip(tipText); ivand_qmul@121: ivand_qmul@121: if (menuType == 0) { ivand_qmul@121: connect(action, SIGNAL(triggered()), ivand_qmul@121: this, SLOT(addPane())); ivand_qmul@121: connect(this, SIGNAL(canAddPane(bool)), ivand_qmul@121: action, SLOT(setEnabled(bool))); ivand_qmul@121: m_paneActions[action] = ivand_qmul@121: PaneConfiguration(type, model, c - 1); ivand_qmul@121: } else { ivand_qmul@121: connect(action, SIGNAL(triggered()), ivand_qmul@121: this, SLOT(addLayer())); ivand_qmul@121: connect(this, SIGNAL(canAddLayer(bool)), ivand_qmul@121: action, SLOT(setEnabled(bool))); ivand_qmul@121: m_layerActions[action] = type; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: submenu->addAction(action); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: menu = m_paneMenu; ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: action = new QAction(QIcon(":/icons/editdelete.png"), tr("&Delete Pane"), this); ivand_qmul@121: action->setShortcut(tr("Alt+D")); ivand_qmul@121: action->setStatusTip(tr("Delete the currently active pane")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(deleteCurrentPane())); ivand_qmul@121: connect(this, SIGNAL(canDeleteCurrentPane(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: menu = m_layerMenu; ivand_qmul@121: ivand_qmul@121: action = new QAction(QIcon(":/icons/timeruler.png"), tr("Add &Time Ruler"), this); ivand_qmul@121: action->setStatusTip(tr("Add a new layer showing a time ruler")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); ivand_qmul@121: connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: m_layerActions[action] = LayerFactory::TimeRuler; ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: m_existingLayersMenu = menu->addMenu(tr("Add &Existing Layer")); ivand_qmul@121: m_existingLayersMenu->setTearOffEnabled(true); ivand_qmul@121: m_rightButtonLayerMenu->addMenu(m_existingLayersMenu); ivand_qmul@121: ivand_qmul@121: m_sliceMenu = menu->addMenu(tr("Add S&lice of Layer")); ivand_qmul@121: m_sliceMenu->setTearOffEnabled(true); ivand_qmul@121: m_rightButtonLayerMenu->addMenu(m_sliceMenu); ivand_qmul@121: ivand_qmul@121: setupExistingLayersMenus(); ivand_qmul@121: ivand_qmul@121: m_rightButtonLayerMenu->addSeparator(); ivand_qmul@121: menu->addSeparator(); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("&Rename Layer..."), this); ivand_qmul@121: action->setShortcut(tr("Alt+R")); ivand_qmul@121: action->setStatusTip(tr("Rename the currently active layer")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(renameCurrentLayer())); ivand_qmul@121: connect(this, SIGNAL(canRenameLayer(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: m_rightButtonLayerMenu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(QIcon(":/icons/editdelete.png"), tr("&Delete Layer"), this); ivand_qmul@121: action->setShortcut(tr("Alt+Shift+D")); ivand_qmul@121: action->setStatusTip(tr("Delete the currently active layer")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(deleteCurrentLayer())); ivand_qmul@121: connect(this, SIGNAL(canDeleteCurrentLayer(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: m_rightButtonLayerMenu->addAction(action); benoitrigolleau@263: benoitrigolleau@263: ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::setupTransformsMenu() ivand_qmul@121: { ivand_qmul@121: if (m_transformsMenu) { ivand_qmul@121: m_transformActions.clear(); ivand_qmul@121: m_transformActionsReverse.clear(); ivand_qmul@121: m_transformsMenu->clear(); ivand_qmul@121: } else { ivand_qmul@121: m_transformsMenu = menuBar()->addMenu(tr("&Transform")); ivand_qmul@121: m_transformsMenu->setTearOffEnabled(true); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: TransformFactory::TransformList transforms = ivand_qmul@121: TransformFactory::getInstance()->getAllTransforms(); ivand_qmul@121: ivand_qmul@121: vector types = ivand_qmul@121: TransformFactory::getInstance()->getAllTransformTypes(); ivand_qmul@121: ivand_qmul@121: map > categoryMenus; ivand_qmul@121: map > makerMenus; ivand_qmul@121: ivand_qmul@121: map byPluginNameMenus; ivand_qmul@121: map > pluginNameMenus; ivand_qmul@121: ivand_qmul@121: set pendingMenus; ivand_qmul@121: ivand_qmul@121: m_recentTransformsMenu = m_transformsMenu->addMenu(tr("&Recent Transforms")); ivand_qmul@121: m_recentTransformsMenu->setTearOffEnabled(true); ivand_qmul@121: m_rightButtonTransformsMenu->addMenu(m_recentTransformsMenu); ivand_qmul@121: connect(&m_recentTransforms, SIGNAL(recentChanged()), ivand_qmul@121: this, SLOT(setupRecentTransformsMenu())); ivand_qmul@121: ivand_qmul@121: m_transformsMenu->addSeparator(); ivand_qmul@121: m_rightButtonTransformsMenu->addSeparator(); ivand_qmul@121: ivand_qmul@121: for (vector::iterator i = types.begin(); i != types.end(); ++i) { ivand_qmul@121: ivand_qmul@121: if (i != types.begin()) { ivand_qmul@121: m_transformsMenu->addSeparator(); ivand_qmul@121: m_rightButtonTransformsMenu->addSeparator(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QString byCategoryLabel = tr("%1 by Category").arg(*i); ivand_qmul@121: SubdividingMenu *byCategoryMenu = new SubdividingMenu(byCategoryLabel, ivand_qmul@121: 20, 40); ivand_qmul@121: byCategoryMenu->setTearOffEnabled(true); ivand_qmul@121: m_transformsMenu->addMenu(byCategoryMenu); ivand_qmul@121: m_rightButtonTransformsMenu->addMenu(byCategoryMenu); ivand_qmul@121: pendingMenus.insert(byCategoryMenu); ivand_qmul@121: ivand_qmul@121: vector categories = ivand_qmul@121: TransformFactory::getInstance()->getTransformCategories(*i); ivand_qmul@121: ivand_qmul@121: for (vector::iterator j = categories.begin(); ivand_qmul@121: j != categories.end(); ++j) { ivand_qmul@121: ivand_qmul@121: QString category = *j; ivand_qmul@121: if (category == "") category = tr("Unclassified"); ivand_qmul@121: ivand_qmul@121: if (categories.size() < 2) { ivand_qmul@121: categoryMenus[*i][category] = byCategoryMenu; ivand_qmul@121: continue; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QStringList components = category.split(" > "); ivand_qmul@121: QString key; ivand_qmul@121: ivand_qmul@121: for (QStringList::iterator k = components.begin(); ivand_qmul@121: k != components.end(); ++k) { ivand_qmul@121: ivand_qmul@121: QString parentKey = key; ivand_qmul@121: if (key != "") key += " > "; ivand_qmul@121: key += *k; ivand_qmul@121: ivand_qmul@121: if (categoryMenus[*i].find(key) == categoryMenus[*i].end()) { ivand_qmul@121: SubdividingMenu *m = new SubdividingMenu(*k, 20, 40); ivand_qmul@121: m->setTearOffEnabled(true); ivand_qmul@121: pendingMenus.insert(m); ivand_qmul@121: categoryMenus[*i][key] = m; ivand_qmul@121: if (parentKey == "") { ivand_qmul@121: byCategoryMenu->addMenu(m); ivand_qmul@121: } else { ivand_qmul@121: categoryMenus[*i][parentKey]->addMenu(m); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QString byPluginNameLabel = tr("%1 by Plugin Name").arg(*i); ivand_qmul@121: byPluginNameMenus[*i] = new SubdividingMenu(byPluginNameLabel); ivand_qmul@121: byPluginNameMenus[*i]->setTearOffEnabled(true); ivand_qmul@121: m_transformsMenu->addMenu(byPluginNameMenus[*i]); ivand_qmul@121: m_rightButtonTransformsMenu->addMenu(byPluginNameMenus[*i]); ivand_qmul@121: pendingMenus.insert(byPluginNameMenus[*i]); ivand_qmul@121: ivand_qmul@121: QString byMakerLabel = tr("%1 by Maker").arg(*i); ivand_qmul@121: SubdividingMenu *byMakerMenu = new SubdividingMenu(byMakerLabel, 20, 40); ivand_qmul@121: byMakerMenu->setTearOffEnabled(true); ivand_qmul@121: m_transformsMenu->addMenu(byMakerMenu); ivand_qmul@121: m_rightButtonTransformsMenu->addMenu(byMakerMenu); ivand_qmul@121: pendingMenus.insert(byMakerMenu); ivand_qmul@121: ivand_qmul@121: vector makers = ivand_qmul@121: TransformFactory::getInstance()->getTransformMakers(*i); ivand_qmul@121: ivand_qmul@121: for (vector::iterator j = makers.begin(); ivand_qmul@121: j != makers.end(); ++j) { ivand_qmul@121: ivand_qmul@121: QString maker = *j; ivand_qmul@121: if (maker == "") maker = tr("Unknown"); ivand_qmul@121: maker.replace(QRegExp(tr(" [\\(<].*$")), ""); ivand_qmul@121: ivand_qmul@121: makerMenus[*i][maker] = new SubdividingMenu(maker, 30, 40); ivand_qmul@121: makerMenus[*i][maker]->setTearOffEnabled(true); ivand_qmul@121: byMakerMenu->addMenu(makerMenus[*i][maker]); ivand_qmul@121: pendingMenus.insert(makerMenus[*i][maker]); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: for (unsigned int i = 0; i < transforms.size(); ++i) { ivand_qmul@121: ivand_qmul@121: QString name = transforms[i].name; ivand_qmul@121: if (name == "") name = transforms[i].identifier; ivand_qmul@121: ivand_qmul@121: // std::cerr << "Plugin Name: " << name.toStdString() << std::endl; ivand_qmul@121: ivand_qmul@121: QString type = transforms[i].type; ivand_qmul@121: ivand_qmul@121: QString category = transforms[i].category; ivand_qmul@121: if (category == "") category = tr("Unclassified"); ivand_qmul@121: ivand_qmul@121: QString maker = transforms[i].maker; ivand_qmul@121: if (maker == "") maker = tr("Unknown"); ivand_qmul@121: maker.replace(QRegExp(tr(" [\\(<].*$")), ""); ivand_qmul@121: ivand_qmul@121: QString pluginName = name.section(": ", 0, 0); ivand_qmul@121: QString output = name.section(": ", 1); ivand_qmul@121: ivand_qmul@121: QAction *action = new QAction(tr("%1...").arg(name), this); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); ivand_qmul@121: m_transformActions[action] = transforms[i].identifier; ivand_qmul@121: m_transformActionsReverse[transforms[i].identifier] = action; ivand_qmul@121: connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: ivand_qmul@121: action->setStatusTip(transforms[i].description); ivand_qmul@121: ivand_qmul@121: if (categoryMenus[type].find(category) == categoryMenus[type].end()) { ivand_qmul@121: std::cerr << "WARNING: MainWindow::setupMenus: Internal error: " ivand_qmul@121: << "No category menu for transform \"" ivand_qmul@121: << name.toStdString() << "\" (category = \"" ivand_qmul@121: << category.toStdString() << "\")" << std::endl; ivand_qmul@121: } else { ivand_qmul@121: categoryMenus[type][category]->addAction(action); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (makerMenus[type].find(maker) == makerMenus[type].end()) { ivand_qmul@121: std::cerr << "WARNING: MainWindow::setupMenus: Internal error: " ivand_qmul@121: << "No maker menu for transform \"" ivand_qmul@121: << name.toStdString() << "\" (maker = \"" ivand_qmul@121: << maker.toStdString() << "\")" << std::endl; ivand_qmul@121: } else { ivand_qmul@121: makerMenus[type][maker]->addAction(action); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("%1...").arg(output == "" ? pluginName : output), this); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); ivand_qmul@121: m_transformActions[action] = transforms[i].identifier; ivand_qmul@121: connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: action->setStatusTip(transforms[i].description); ivand_qmul@121: ivand_qmul@121: // cerr << "Transform: \"" << name.toStdString() << "\": plugin name \"" << pluginName.toStdString() << "\"" << endl; ivand_qmul@121: ivand_qmul@121: if (pluginNameMenus[type].find(pluginName) == ivand_qmul@121: pluginNameMenus[type].end()) { ivand_qmul@121: ivand_qmul@121: SubdividingMenu *parentMenu = byPluginNameMenus[type]; ivand_qmul@121: parentMenu->setTearOffEnabled(true); ivand_qmul@121: ivand_qmul@121: if (output == "") { ivand_qmul@121: parentMenu->addAction(pluginName, action); ivand_qmul@121: } else { ivand_qmul@121: pluginNameMenus[type][pluginName] = ivand_qmul@121: parentMenu->addMenu(pluginName); ivand_qmul@121: connect(this, SIGNAL(canAddLayer(bool)), ivand_qmul@121: pluginNameMenus[type][pluginName], ivand_qmul@121: SLOT(setEnabled(bool))); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (pluginNameMenus[type].find(pluginName) != ivand_qmul@121: pluginNameMenus[type].end()) { ivand_qmul@121: pluginNameMenus[type][pluginName]->addAction(action); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: for (set::iterator i = pendingMenus.begin(); ivand_qmul@121: i != pendingMenus.end(); ++i) { ivand_qmul@121: (*i)->entriesAdded(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: setupRecentTransformsMenu(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::setupHelpMenu() ivand_qmul@121: { ivand_qmul@121: if (m_mainMenusCreated) return; ivand_qmul@121: ivand_qmul@121: QMenu *menu = menuBar()->addMenu(tr("&Help")); ivand_qmul@121: menu->setTearOffEnabled(true); ivand_qmul@121: ivand_qmul@121: QAction *action = new QAction(QIcon(":icons/help.png"), ivand_qmul@121: tr("&Help Reference"), this); ivand_qmul@121: action->setStatusTip(tr("Open the Sonic Visualiser reference manual")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(help())); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("Sonic Visualiser on the &Web"), this); ivand_qmul@121: action->setStatusTip(tr("Open the Sonic Visualiser website")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(website())); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: ivand_qmul@121: action = new QAction(tr("&About Sound Access"), this); ivand_qmul@121: action->setStatusTip(tr("Show information about Sound Access")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(about())); ivand_qmul@121: menu->addAction(action); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::setupRecentFilesMenu() ivand_qmul@121: { ivand_qmul@121: m_recentFilesMenu->clear(); ivand_qmul@121: vector files = m_recentFiles.getRecent(); ivand_qmul@121: for (size_t i = 0; i < files.size(); ++i) { ivand_qmul@121: QAction *action = new QAction(files[i], this); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(openRecentFile())); ivand_qmul@121: m_recentFilesMenu->addAction(action); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::setupRecentTransformsMenu() ivand_qmul@121: { ivand_qmul@121: m_recentTransformsMenu->clear(); ivand_qmul@121: vector transforms = m_recentTransforms.getRecent(); ivand_qmul@121: for (size_t i = 0; i < transforms.size(); ++i) { ivand_qmul@121: TransformActionReverseMap::iterator ti = ivand_qmul@121: m_transformActionsReverse.find(transforms[i]); ivand_qmul@121: if (ti == m_transformActionsReverse.end()) { ivand_qmul@121: std::cerr << "WARNING: MainWindow::setupRecentTransformsMenu: " ivand_qmul@121: << "Unknown transform \"" << transforms[i].toStdString() ivand_qmul@121: << "\" in recent transforms list" << std::endl; ivand_qmul@121: continue; ivand_qmul@121: } ivand_qmul@121: m_recentTransformsMenu->addAction(ti->second); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::setupExistingLayersMenus() ivand_qmul@121: { ivand_qmul@121: if (!m_existingLayersMenu) return; // should have been created by setupMenus ivand_qmul@121: ivand_qmul@121: // std::cerr << "MainWindow::setupExistingLayersMenu" << std::endl; ivand_qmul@121: ivand_qmul@121: m_existingLayersMenu->clear(); ivand_qmul@121: m_existingLayerActions.clear(); ivand_qmul@121: ivand_qmul@121: m_sliceMenu->clear(); ivand_qmul@121: m_sliceActions.clear(); ivand_qmul@121: ivand_qmul@121: vector orderedLayers; ivand_qmul@121: set observedLayers; ivand_qmul@121: set sliceableLayers; ivand_qmul@121: ivand_qmul@121: LayerFactory *factory = LayerFactory::getInstance(); ivand_qmul@121: ivand_qmul@121: for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { ivand_qmul@121: ivand_qmul@121: Pane *pane = m_paneStack->getPane(i); ivand_qmul@121: if (!pane) continue; ivand_qmul@121: ivand_qmul@121: for (int j = 0; j < pane->getLayerCount(); ++j) { ivand_qmul@121: ivand_qmul@121: Layer *layer = pane->getLayer(j); ivand_qmul@121: if (!layer) continue; ivand_qmul@121: if (observedLayers.find(layer) != observedLayers.end()) { ivand_qmul@121: // std::cerr << "found duplicate layer " << layer << std::endl; ivand_qmul@121: continue; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: // std::cerr << "found new layer " << layer << " (name = " ivand_qmul@121: // << layer->getLayerPresentationName().toStdString() << ")" << std::endl; ivand_qmul@121: ivand_qmul@121: orderedLayers.push_back(layer); ivand_qmul@121: observedLayers.insert(layer); ivand_qmul@121: ivand_qmul@121: if (factory->isLayerSliceable(layer)) { ivand_qmul@121: sliceableLayers.insert(layer); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: map observedNames; ivand_qmul@121: ivand_qmul@121: for (size_t i = 0; i < orderedLayers.size(); ++i) { ivand_qmul@121: ivand_qmul@121: Layer *layer = orderedLayers[i]; ivand_qmul@121: ivand_qmul@121: QString name = layer->getLayerPresentationName(); ivand_qmul@121: int n = ++observedNames[name]; ivand_qmul@121: if (n > 1) name = QString("%1 <%2>").arg(name).arg(n); ivand_qmul@121: ivand_qmul@121: QIcon icon = QIcon(QString(":/icons/%1.png") ivand_qmul@121: .arg(factory->getLayerIconName ivand_qmul@121: (factory->getLayerType(layer)))); ivand_qmul@121: ivand_qmul@121: QAction *action = new QAction(icon, name, this); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); ivand_qmul@121: connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: m_existingLayerActions[action] = layer; ivand_qmul@121: ivand_qmul@121: m_existingLayersMenu->addAction(action); ivand_qmul@121: ivand_qmul@121: if (sliceableLayers.find(layer) != sliceableLayers.end()) { ivand_qmul@121: action = new QAction(icon, name, this); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); ivand_qmul@121: connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: m_sliceActions[action] = layer; ivand_qmul@121: m_sliceMenu->addAction(action); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_sliceMenu->setEnabled(!m_sliceActions.empty()); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::setupToolbars() ivand_qmul@121: { ivand_qmul@121: QToolBar *toolbar = addToolBar(tr("Transport Toolbar")); benoitrigolleau@217: m_toolBarVector.append(toolbar); ivand_qmul@121: ivand_qmul@121: QAction *action = toolbar->addAction(QIcon(":/icons/rewind-start.png"), ivand_qmul@121: tr("Rewind to Start")); ivand_qmul@121: action->setShortcut(tr("Home")); ivand_qmul@121: action->setStatusTip(tr("Rewind to the start")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(rewindStart())); ivand_qmul@121: connect(this, SIGNAL(canPlay(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: ivand_qmul@121: action = toolbar->addAction(QIcon(":/icons/rewind.png"), ivand_qmul@121: tr("Rewind")); ivand_qmul@121: action->setShortcut(tr("PageUp")); ivand_qmul@121: action->setStatusTip(tr("Rewind to the previous time instant in the current layer")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(rewind())); ivand_qmul@121: connect(this, SIGNAL(canRewind(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: ivand_qmul@121: action = toolbar->addAction(QIcon(":/icons/playpause.png"), ivand_qmul@121: tr("Play / Pause")); ivand_qmul@121: action->setCheckable(true); ivand_qmul@121: action->setShortcut(tr("Space")); ivand_qmul@121: action->setStatusTip(tr("Start or stop playback from the current position")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(play())); ivand_qmul@121: connect(m_playSource, SIGNAL(playStatusChanged(bool)), ivand_qmul@121: action, SLOT(setChecked(bool))); ivand_qmul@121: connect(this, SIGNAL(canPlay(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: ivand_qmul@121: action = toolbar->addAction(QIcon(":/icons/ffwd.png"), ivand_qmul@121: tr("Fast Forward")); ivand_qmul@121: action->setShortcut(tr("PageDown")); ivand_qmul@121: action->setStatusTip(tr("Fast forward to the next time instant in the current layer")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(ffwd())); ivand_qmul@121: connect(this, SIGNAL(canFfwd(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: ivand_qmul@121: action = toolbar->addAction(QIcon(":/icons/ffwd-end.png"), ivand_qmul@121: tr("Fast Forward to End")); ivand_qmul@121: action->setShortcut(tr("End")); ivand_qmul@121: action->setStatusTip(tr("Fast-forward to the end")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(ffwdEnd())); ivand_qmul@121: connect(this, SIGNAL(canPlay(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: ivand_qmul@121: toolbar = addToolBar(tr("Play Mode Toolbar")); benoitrigolleau@217: m_toolBarVector.append(toolbar); ivand_qmul@121: ivand_qmul@121: action = toolbar->addAction(QIcon(":/icons/playselection.png"), ivand_qmul@121: tr("Constrain Playback to Selection")); ivand_qmul@121: action->setCheckable(true); ivand_qmul@121: action->setChecked(m_viewManager->getPlaySelectionMode()); ivand_qmul@121: action->setShortcut(tr("s")); ivand_qmul@121: action->setStatusTip(tr("Constrain playback to the selected area")); ivand_qmul@121: connect(m_viewManager, SIGNAL(playSelectionModeChanged(bool)), ivand_qmul@121: action, SLOT(setChecked(bool))); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(playSelectionToggled())); ivand_qmul@121: connect(this, SIGNAL(canPlaySelection(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: ivand_qmul@121: action = toolbar->addAction(QIcon(":/icons/playloop.png"), ivand_qmul@121: tr("Loop Playback")); ivand_qmul@121: action->setCheckable(true); ivand_qmul@121: action->setChecked(m_viewManager->getPlayLoopMode()); ivand_qmul@121: action->setShortcut(tr("l")); ivand_qmul@121: action->setStatusTip(tr("Loop playback")); ivand_qmul@121: connect(m_viewManager, SIGNAL(playLoopModeChanged(bool)), ivand_qmul@121: action, SLOT(setChecked(bool))); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(playLoopToggled())); ivand_qmul@121: connect(this, SIGNAL(canPlay(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: ivand_qmul@121: toolbar = addToolBar(tr("Edit Toolbar")); benoitrigolleau@217: m_toolBarVector.append(toolbar); benoitrigolleau@217: ivand_qmul@121: CommandHistory::getInstance()->registerToolbar(toolbar); ivand_qmul@121: ivand_qmul@121: toolbar = addToolBar(tr("Tools Toolbar")); benoitrigolleau@217: m_toolBarVector.append(toolbar); benoitrigolleau@217: ivand_qmul@121: QActionGroup *group = new QActionGroup(this); ivand_qmul@121: ivand_qmul@121: action = toolbar->addAction(QIcon(":/icons/navigate.png"), ivand_qmul@121: tr("Navigate")); ivand_qmul@121: action->setCheckable(true); ivand_qmul@121: action->setChecked(true); ivand_qmul@121: action->setShortcut(tr("1")); ivand_qmul@121: action->setStatusTip(tr("Navigate")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(toolNavigateSelected())); ivand_qmul@121: group->addAction(action); ivand_qmul@121: m_toolActions[ViewManager::NavigateMode] = action; ivand_qmul@121: ivand_qmul@121: action = toolbar->addAction(QIcon(":/icons/select.png"), ivand_qmul@121: tr("Select")); ivand_qmul@121: action->setCheckable(true); ivand_qmul@121: action->setShortcut(tr("2")); ivand_qmul@121: action->setStatusTip(tr("Select ranges")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(toolSelectSelected())); ivand_qmul@121: group->addAction(action); ivand_qmul@121: m_toolActions[ViewManager::SelectMode] = action; ivand_qmul@121: ivand_qmul@121: action = toolbar->addAction(QIcon(":/icons/move.png"), ivand_qmul@121: tr("Edit")); ivand_qmul@121: action->setCheckable(true); ivand_qmul@121: action->setShortcut(tr("3")); ivand_qmul@121: action->setStatusTip(tr("Edit items in layer")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(toolEditSelected())); ivand_qmul@121: connect(this, SIGNAL(canEditLayer(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: group->addAction(action); ivand_qmul@121: m_toolActions[ViewManager::EditMode] = action; ivand_qmul@121: ivand_qmul@121: action = toolbar->addAction(QIcon(":/icons/draw.png"), ivand_qmul@121: tr("Draw")); ivand_qmul@121: action->setCheckable(true); ivand_qmul@121: action->setShortcut(tr("4")); ivand_qmul@121: action->setStatusTip(tr("Draw new items in layer")); ivand_qmul@121: connect(action, SIGNAL(triggered()), this, SLOT(toolDrawSelected())); ivand_qmul@121: connect(this, SIGNAL(canEditLayer(bool)), action, SLOT(setEnabled(bool))); ivand_qmul@121: group->addAction(action); ivand_qmul@121: m_toolActions[ViewManager::DrawMode] = action; ivand_qmul@121: ivand_qmul@121: // action = toolbar->addAction(QIcon(":/icons/text.png"), ivand_qmul@121: // tr("Text")); ivand_qmul@121: // action->setCheckable(true); ivand_qmul@121: // action->setShortcut(tr("5")); ivand_qmul@121: // connect(action, SIGNAL(triggered()), this, SLOT(toolTextSelected())); ivand_qmul@121: // group->addAction(action); ivand_qmul@121: // m_toolActions[ViewManager::TextMode] = action; ivand_qmul@121: lbajardsilogic@25: ConnectionStatus *connectionStatus = new ConnectionStatus(m_httpClient, tr("Connection status")); benoitrigolleau@219: m_toolBarVector.append(connectionStatus); ivand_qmul@121: addToolBar(connectionStatus); ivand_qmul@121: ivand_qmul@121: toolNavigateSelected(); benoitrigolleau@263: benoitrigolleau@263: toolbar->addSeparator(); benoitrigolleau@263: m_speechRecognitionUI = new SpeechRecognitionUI(); benoitrigolleau@263: QIcon icon = QIcon(":icons/new.png"); benoitrigolleau@263: action = new QAction(icon, tr("Speech Recognition..."), this); benoitrigolleau@263: action->setStatusTip(tr("Open speech recognition module")); benoitrigolleau@263: connect(action, SIGNAL(triggered()), this, SLOT(openSpeechQuery())); benoitrigolleau@263: toolbar->addAction(action); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::updateMenuStates() ivand_qmul@121: { ivand_qmul@121: Pane *currentPane = 0; ivand_qmul@121: Layer *currentLayer = 0; ivand_qmul@121: ivand_qmul@121: if (m_paneStack) currentPane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (currentPane) currentLayer = currentPane->getSelectedLayer(); ivand_qmul@121: ivand_qmul@121: bool haveCurrentPane = ivand_qmul@121: (currentPane != 0); ivand_qmul@121: bool haveCurrentLayer = ivand_qmul@121: (haveCurrentPane && ivand_qmul@121: (currentLayer != 0)); ivand_qmul@121: bool haveMainModel = ivand_qmul@121: (getMainModel() != 0); ivand_qmul@121: bool havePlayTarget = ivand_qmul@121: (m_playTarget != 0); ivand_qmul@121: bool haveSelection = ivand_qmul@121: (m_viewManager && ivand_qmul@121: !m_viewManager->getSelections().empty()); ivand_qmul@121: bool haveCurrentEditableLayer = ivand_qmul@121: (haveCurrentLayer && ivand_qmul@121: currentLayer->isLayerEditable()); ivand_qmul@121: bool haveCurrentTimeInstantsLayer = ivand_qmul@121: (haveCurrentLayer && ivand_qmul@121: dynamic_cast(currentLayer)); ivand_qmul@121: bool haveCurrentTimeValueLayer = ivand_qmul@121: (haveCurrentLayer && ivand_qmul@121: dynamic_cast(currentLayer)); ivand_qmul@121: bool haveCurrentColour3DPlot = ivand_qmul@121: (haveCurrentLayer && ivand_qmul@121: dynamic_cast(currentLayer)); ivand_qmul@121: bool haveClipboardContents = ivand_qmul@121: (m_viewManager && ivand_qmul@121: !m_viewManager->getClipboard().empty()); ivand_qmul@121: ivand_qmul@121: emit canAddPane(haveMainModel); ivand_qmul@121: emit canDeleteCurrentPane(haveCurrentPane); ivand_qmul@121: emit canZoom(haveMainModel && haveCurrentPane); ivand_qmul@121: emit canScroll(haveMainModel && haveCurrentPane); ivand_qmul@121: emit canAddLayer(haveMainModel && haveCurrentPane); ivand_qmul@121: emit canImportMoreAudio(haveMainModel); ivand_qmul@121: emit canImportLayer(haveMainModel && haveCurrentPane); ivand_qmul@121: emit canExportAudio(haveMainModel); ivand_qmul@121: emit canExportLayer(haveMainModel && ivand_qmul@121: (haveCurrentEditableLayer || haveCurrentColour3DPlot)); ivand_qmul@121: emit canExportImage(haveMainModel && haveCurrentPane); ivand_qmul@121: emit canDeleteCurrentLayer(haveCurrentLayer); ivand_qmul@121: emit canRenameLayer(haveCurrentLayer); ivand_qmul@121: emit canEditLayer(haveCurrentEditableLayer); ivand_qmul@121: emit canSelect(haveMainModel && haveCurrentPane); ivand_qmul@121: emit canPlay(/*!!! haveMainModel && */ havePlayTarget); ivand_qmul@121: emit canFfwd(haveCurrentTimeInstantsLayer || haveCurrentTimeValueLayer); ivand_qmul@121: emit canRewind(haveCurrentTimeInstantsLayer || haveCurrentTimeValueLayer); ivand_qmul@121: emit canPaste(haveCurrentEditableLayer && haveClipboardContents); ivand_qmul@121: emit canInsertInstant(haveCurrentPane); ivand_qmul@121: emit canInsertInstantsAtBoundaries(haveCurrentPane && haveSelection); ivand_qmul@121: emit canPlaySelection(haveMainModel && havePlayTarget && haveSelection); ivand_qmul@121: emit canClearSelection(haveSelection); ivand_qmul@121: emit canEditSelection(haveSelection && haveCurrentEditableLayer); ivand_qmul@121: emit canSave(m_sessionFile != "" && m_documentModified); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::updateDescriptionLabel() ivand_qmul@121: { ivand_qmul@121: if (!getMainModel()) { ivand_qmul@121: m_descriptionLabel->setText(tr("No audio file loaded.")); ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QString description; ivand_qmul@121: ivand_qmul@121: size_t ssr = getMainModel()->getSampleRate(); ivand_qmul@121: size_t tsr = ssr; ivand_qmul@121: if (m_playSource) tsr = m_playSource->getTargetSampleRate(); ivand_qmul@121: ivand_qmul@121: if (ssr != tsr) { ivand_qmul@121: description = tr("%1Hz (resampling to %2Hz)").arg(ssr).arg(tsr); ivand_qmul@121: } else { ivand_qmul@121: description = QString("%1Hz").arg(ssr); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: description = QString("%1 - %2") ivand_qmul@121: .arg(RealTime::frame2RealTime(getMainModel()->getEndFrame(), ssr) ivand_qmul@121: .toText(false).c_str()) ivand_qmul@121: .arg(description); ivand_qmul@121: ivand_qmul@121: m_descriptionLabel->setText(description); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::documentModified() ivand_qmul@121: { ivand_qmul@121: // std::cerr << "MainWindow::documentModified" << std::endl; ivand_qmul@121: ivand_qmul@121: if (!m_documentModified) { ivand_qmul@121: setWindowTitle(tr("%1 (modified)").arg(windowTitle())); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_documentModified = true; ivand_qmul@121: updateMenuStates(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::documentRestored() ivand_qmul@121: { ivand_qmul@121: // std::cerr << "MainWindow::documentRestored" << std::endl; ivand_qmul@121: ivand_qmul@121: if (m_documentModified) { ivand_qmul@121: QString wt(windowTitle()); ivand_qmul@121: wt.replace(tr(" (modified)"), ""); ivand_qmul@121: setWindowTitle(wt); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_documentModified = false; ivand_qmul@121: updateMenuStates(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::playLoopToggled() ivand_qmul@121: { ivand_qmul@121: QAction *action = dynamic_cast(sender()); ivand_qmul@121: ivand_qmul@121: if (action) { ivand_qmul@121: m_viewManager->setPlayLoopMode(action->isChecked()); ivand_qmul@121: } else { ivand_qmul@121: m_viewManager->setPlayLoopMode(!m_viewManager->getPlayLoopMode()); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::playSelectionToggled() ivand_qmul@121: { ivand_qmul@121: QAction *action = dynamic_cast(sender()); ivand_qmul@121: ivand_qmul@121: if (action) { ivand_qmul@121: m_viewManager->setPlaySelectionMode(action->isChecked()); ivand_qmul@121: } else { ivand_qmul@121: m_viewManager->setPlaySelectionMode(!m_viewManager->getPlaySelectionMode()); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::currentPaneChanged(Pane *p) ivand_qmul@121: { ivand_qmul@121: updateMenuStates(); ivand_qmul@121: updateVisibleRangeDisplay(p); ivand_qmul@121: emit newCurrentPane(p); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::currentLayerChanged(Pane *p, Layer *) ivand_qmul@121: { ivand_qmul@121: updateMenuStates(); ivand_qmul@121: updateVisibleRangeDisplay(p); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::toolNavigateSelected() ivand_qmul@121: { ivand_qmul@121: m_viewManager->setToolMode(ViewManager::NavigateMode); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::toolSelectSelected() ivand_qmul@121: { ivand_qmul@121: m_viewManager->setToolMode(ViewManager::SelectMode); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::toolEditSelected() ivand_qmul@121: { ivand_qmul@121: m_viewManager->setToolMode(ViewManager::EditMode); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::toolDrawSelected() ivand_qmul@121: { ivand_qmul@121: m_viewManager->setToolMode(ViewManager::DrawMode); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: //void ivand_qmul@121: //MainWindow::toolTextSelected() ivand_qmul@121: //{ ivand_qmul@121: // m_viewManager->setToolMode(ViewManager::TextMode); ivand_qmul@121: //} ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::selectAll() ivand_qmul@121: { ivand_qmul@121: if (!getMainModel()) return; ivand_qmul@121: m_viewManager->setSelection(Selection(getMainModel()->getStartFrame(), ivand_qmul@121: getMainModel()->getEndFrame())); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::selectToStart() ivand_qmul@121: { ivand_qmul@121: if (!getMainModel()) return; ivand_qmul@121: m_viewManager->setSelection(Selection(getMainModel()->getStartFrame(), ivand_qmul@121: m_viewManager->getGlobalCentreFrame())); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::selectToEnd() ivand_qmul@121: { ivand_qmul@121: if (!getMainModel()) return; ivand_qmul@121: m_viewManager->setSelection(Selection(m_viewManager->getGlobalCentreFrame(), ivand_qmul@121: getMainModel()->getEndFrame())); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::selectVisible() ivand_qmul@121: { ivand_qmul@121: Model *model = getMainModel(); ivand_qmul@121: if (!model) return; ivand_qmul@121: ivand_qmul@121: Pane *currentPane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (!currentPane) return; ivand_qmul@121: ivand_qmul@121: size_t startFrame, endFrame; ivand_qmul@121: ivand_qmul@121: if (currentPane->getStartFrame() < 0) startFrame = 0; ivand_qmul@121: else startFrame = currentPane->getStartFrame(); ivand_qmul@121: ivand_qmul@121: if (currentPane->getEndFrame() > model->getEndFrame()) endFrame = model->getEndFrame(); ivand_qmul@121: else endFrame = currentPane->getEndFrame(); ivand_qmul@121: ivand_qmul@121: m_viewManager->setSelection(Selection(startFrame, endFrame)); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::clearSelection() ivand_qmul@121: { ivand_qmul@121: m_viewManager->clearSelections(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::cut() ivand_qmul@121: { ivand_qmul@121: Pane *currentPane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (!currentPane) return; ivand_qmul@121: ivand_qmul@121: Layer *layer = currentPane->getSelectedLayer(); ivand_qmul@121: if (!layer) return; ivand_qmul@121: ivand_qmul@121: Clipboard &clipboard = m_viewManager->getClipboard(); ivand_qmul@121: clipboard.clear(); ivand_qmul@121: ivand_qmul@121: MultiSelection::SelectionList selections = m_viewManager->getSelections(); ivand_qmul@121: ivand_qmul@121: CommandHistory::getInstance()->startCompoundOperation(tr("Cut"), true); ivand_qmul@121: ivand_qmul@121: for (MultiSelection::SelectionList::iterator i = selections.begin(); ivand_qmul@121: i != selections.end(); ++i) { ivand_qmul@121: layer->copy(*i, clipboard); ivand_qmul@121: layer->deleteSelection(*i); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: CommandHistory::getInstance()->endCompoundOperation(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::copy() ivand_qmul@121: { ivand_qmul@121: Pane *currentPane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (!currentPane) return; ivand_qmul@121: ivand_qmul@121: Layer *layer = currentPane->getSelectedLayer(); ivand_qmul@121: if (!layer) return; ivand_qmul@121: ivand_qmul@121: Clipboard &clipboard = m_viewManager->getClipboard(); ivand_qmul@121: clipboard.clear(); ivand_qmul@121: ivand_qmul@121: MultiSelection::SelectionList selections = m_viewManager->getSelections(); ivand_qmul@121: ivand_qmul@121: for (MultiSelection::SelectionList::iterator i = selections.begin(); ivand_qmul@121: i != selections.end(); ++i) { ivand_qmul@121: layer->copy(*i, clipboard); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::paste() ivand_qmul@121: { ivand_qmul@121: Pane *currentPane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (!currentPane) return; ivand_qmul@121: ivand_qmul@121: //!!! if we have no current layer, we should create one of the most ivand_qmul@121: // appropriate type ivand_qmul@121: ivand_qmul@121: Layer *layer = currentPane->getSelectedLayer(); ivand_qmul@121: if (!layer) return; ivand_qmul@121: ivand_qmul@121: Clipboard &clipboard = m_viewManager->getClipboard(); ivand_qmul@121: Clipboard::PointList contents = clipboard.getPoints(); ivand_qmul@121: /* ivand_qmul@121: long minFrame = 0; ivand_qmul@121: bool have = false; ivand_qmul@121: for (int i = 0; i < contents.size(); ++i) { ivand_qmul@121: if (!contents[i].haveFrame()) continue; ivand_qmul@121: if (!have || contents[i].getFrame() < minFrame) { ivand_qmul@121: minFrame = contents[i].getFrame(); ivand_qmul@121: have = true; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: long frameOffset = long(m_viewManager->getGlobalCentreFrame()) - minFrame; ivand_qmul@121: ivand_qmul@121: layer->paste(clipboard, frameOffset); ivand_qmul@121: */ ivand_qmul@121: layer->paste(clipboard, 0, true); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::deleteSelected() ivand_qmul@121: { ivand_qmul@121: if (m_paneStack->getCurrentPane() && ivand_qmul@121: m_paneStack->getCurrentPane()->getSelectedLayer()) { ivand_qmul@121: ivand_qmul@121: MultiSelection::SelectionList selections = ivand_qmul@121: m_viewManager->getSelections(); ivand_qmul@121: ivand_qmul@121: for (MultiSelection::SelectionList::iterator i = selections.begin(); ivand_qmul@121: i != selections.end(); ++i) { ivand_qmul@121: ivand_qmul@121: m_paneStack->getCurrentPane()->getSelectedLayer()->deleteSelection(*i); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::insertInstant() ivand_qmul@121: { ivand_qmul@121: int frame = m_viewManager->getPlaybackFrame(); ivand_qmul@121: insertInstantAt(frame); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::insertInstantsAtBoundaries() ivand_qmul@121: { ivand_qmul@121: MultiSelection::SelectionList selections = m_viewManager->getSelections(); ivand_qmul@121: for (MultiSelection::SelectionList::iterator i = selections.begin(); ivand_qmul@121: i != selections.end(); ++i) { ivand_qmul@121: size_t start = i->getStartFrame(); ivand_qmul@121: size_t end = i->getEndFrame(); ivand_qmul@121: if (start != end) { ivand_qmul@121: insertInstantAt(i->getStartFrame()); ivand_qmul@121: insertInstantAt(i->getEndFrame()); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::insertInstantAt(size_t frame) ivand_qmul@121: { ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (!pane) { ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: Layer *layer = dynamic_cast ivand_qmul@121: (pane->getSelectedLayer()); ivand_qmul@121: ivand_qmul@121: if (!layer) { ivand_qmul@121: for (int i = pane->getLayerCount(); i > 0; --i) { ivand_qmul@121: layer = dynamic_cast(pane->getLayer(i - 1)); ivand_qmul@121: if (layer) break; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (!layer) { ivand_qmul@121: CommandHistory::getInstance()->startCompoundOperation ivand_qmul@121: (tr("Add Point"), true); ivand_qmul@121: layer = m_document->createEmptyLayer(LayerFactory::TimeInstants); ivand_qmul@121: if (layer) { ivand_qmul@121: m_document->addLayerToView(pane, layer); ivand_qmul@121: m_paneStack->setCurrentLayer(pane, layer); ivand_qmul@121: } ivand_qmul@121: CommandHistory::getInstance()->endCompoundOperation(); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (layer) { ivand_qmul@121: ivand_qmul@121: Model *model = layer->getModel(); ivand_qmul@121: SparseOneDimensionalModel *sodm = dynamic_cast ivand_qmul@121: (model); ivand_qmul@121: ivand_qmul@121: if (sodm) { ivand_qmul@121: SparseOneDimensionalModel::Point point ivand_qmul@121: (frame, QString("%1").arg(sodm->getPointCount() + 1)); ivand_qmul@121: CommandHistory::getInstance()->addCommand ivand_qmul@121: (new SparseOneDimensionalModel::AddPointCommand(sodm, point, ivand_qmul@121: tr("Add Points")), ivand_qmul@121: true, true); // bundled ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::importAudio() ivand_qmul@121: { ivand_qmul@121: QString path = getOpenFileName(FileFinder::AudioFile); ivand_qmul@121: ivand_qmul@121: if (path != "") { ivand_qmul@121: if (openAudioFile(path, ReplaceMainModel) == FileOpenFailed) { ivand_qmul@121: QMessageBox::critical(this, tr("Failed to open file"), ivand_qmul@121: tr("Audio file \"%1\" could not be opened").arg(path)); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::importMoreAudio() ivand_qmul@121: { ivand_qmul@121: QString path = getOpenFileName(FileFinder::AudioFile); ivand_qmul@121: ivand_qmul@121: if (path != "") { ivand_qmul@121: if (openAudioFile(path, CreateAdditionalModel) == FileOpenFailed) { ivand_qmul@121: QMessageBox::critical(this, tr("Failed to open file"), ivand_qmul@121: tr("Audio file \"%1\" could not be opened").arg(path)); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::exportAudio() ivand_qmul@121: { ivand_qmul@121: if (!getMainModel()) return; ivand_qmul@121: ivand_qmul@121: QString path = getSaveFileName(FileFinder::AudioFile); ivand_qmul@121: ivand_qmul@121: if (path == "") return; ivand_qmul@121: ivand_qmul@121: bool ok = false; ivand_qmul@121: QString error; ivand_qmul@121: ivand_qmul@121: MultiSelection ms = m_viewManager->getSelection(); ivand_qmul@121: MultiSelection::SelectionList selections = m_viewManager->getSelections(); ivand_qmul@121: ivand_qmul@121: bool multiple = false; ivand_qmul@121: ivand_qmul@121: MultiSelection *selectionToWrite = 0; ivand_qmul@121: ivand_qmul@121: if (selections.size() == 1) { ivand_qmul@121: ivand_qmul@121: QStringList items; ivand_qmul@121: items << tr("Export the selected region only") ivand_qmul@121: << tr("Export the whole audio file"); ivand_qmul@121: ivand_qmul@121: bool ok = false; ivand_qmul@121: QString item = ListInputDialog::getItem ivand_qmul@121: (this, tr("Select region to export"), ivand_qmul@121: tr("Which region from the original audio file do you want to export?"), ivand_qmul@121: items, 0, &ok); ivand_qmul@121: ivand_qmul@121: if (!ok || item.isEmpty()) return; ivand_qmul@121: ivand_qmul@121: if (item == items[0]) selectionToWrite = &ms; ivand_qmul@121: ivand_qmul@121: } else if (selections.size() > 1) { ivand_qmul@121: ivand_qmul@121: QStringList items; ivand_qmul@121: items << tr("Export the selected regions into a single audio file") ivand_qmul@121: << tr("Export the selected regions into separate files") ivand_qmul@121: << tr("Export the whole audio file"); ivand_qmul@121: ivand_qmul@121: QString item = ListInputDialog::getItem ivand_qmul@121: (this, tr("Select region to export"), ivand_qmul@121: tr("Multiple regions of the original audio file are selected.\nWhat do you want to export?"), ivand_qmul@121: items, 0, &ok); ivand_qmul@121: ivand_qmul@121: if (!ok || item.isEmpty()) return; ivand_qmul@121: ivand_qmul@121: if (item == items[0]) { ivand_qmul@121: ivand_qmul@121: selectionToWrite = &ms; ivand_qmul@121: ivand_qmul@121: } else if (item == items[1]) { ivand_qmul@121: ivand_qmul@121: multiple = true; ivand_qmul@121: ivand_qmul@121: int n = 1; ivand_qmul@121: QString base = path; ivand_qmul@121: base.replace(".wav", ""); ivand_qmul@121: ivand_qmul@121: for (MultiSelection::SelectionList::iterator i = selections.begin(); ivand_qmul@121: i != selections.end(); ++i) { ivand_qmul@121: ivand_qmul@121: MultiSelection subms; ivand_qmul@121: subms.setSelection(*i); ivand_qmul@121: ivand_qmul@121: QString subpath = QString("%1.%2.wav").arg(base).arg(n); ivand_qmul@121: ++n; ivand_qmul@121: ivand_qmul@121: if (QFileInfo(subpath).exists()) { ivand_qmul@121: error = tr("Fragment file %1 already exists, aborting").arg(subpath); ivand_qmul@121: break; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: WavFileWriter subwriter(subpath, ivand_qmul@121: getMainModel()->getSampleRate(), ivand_qmul@121: getMainModel()->getChannelCount()); ivand_qmul@121: subwriter.writeModel(getMainModel(), &subms); ivand_qmul@121: ok = subwriter.isOK(); ivand_qmul@121: ivand_qmul@121: if (!ok) { ivand_qmul@121: error = subwriter.getError(); ivand_qmul@121: break; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (!multiple) { ivand_qmul@121: WavFileWriter writer(path, ivand_qmul@121: getMainModel()->getSampleRate(), ivand_qmul@121: getMainModel()->getChannelCount()); ivand_qmul@121: writer.writeModel(getMainModel(), selectionToWrite); ivand_qmul@121: ok = writer.isOK(); ivand_qmul@121: error = writer.getError(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (ok) { ivand_qmul@121: if (!multiple) { ivand_qmul@121: m_recentFiles.addFile(path); ivand_qmul@121: } ivand_qmul@121: } else { ivand_qmul@121: QMessageBox::critical(this, tr("Failed to write file"), error); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@129: // Ivan Damnjanovic 09-10/2007 added video file import ivand_qmul@121: void ivand_qmul@121: MainWindow::importVideo() ivand_qmul@121: { ivand_qmul@121: QString path = getOpenFileName(FileFinder::VideoFile); ivand_qmul@121: ivand_qmul@121: if (path != "") { benoitrigolleau@130: if (openVideoFile(path, ReplaceMainModel) == FileOpenFailed) { benoitrigolleau@130: QMessageBox::critical(this, tr("Failed to open file"), benoitrigolleau@130: tr("Video file \"%1\" could not be opened").arg(path)); benoitrigolleau@130: } benoitrigolleau@130: ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: // ivand_qmul@121: void ivand_qmul@121: MainWindow::importLayer() ivand_qmul@121: { ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: ivand_qmul@121: if (!pane) { ivand_qmul@121: // shouldn't happen, as the menu action should have been disabled ivand_qmul@121: std::cerr << "WARNING: MainWindow::importLayer: no current pane" << std::endl; ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (!getMainModel()) { ivand_qmul@121: // shouldn't happen, as the menu action should have been disabled ivand_qmul@121: std::cerr << "WARNING: MainWindow::importLayer: No main model -- hence no default sample rate available" << std::endl; ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QString path = getOpenFileName(FileFinder::LayerFile); ivand_qmul@121: ivand_qmul@121: if (path != "") { ivand_qmul@121: ivand_qmul@121: if (openLayerFile(path) == FileOpenFailed) { ivand_qmul@121: QMessageBox::critical(this, tr("Failed to open file"), ivand_qmul@121: tr("File %1 could not be opened.").arg(path)); ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: MainWindow::FileOpenStatus ivand_qmul@121: MainWindow::openLayerFile(QString path) ivand_qmul@121: { ivand_qmul@121: return openLayerFile(path, path); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: MainWindow::FileOpenStatus ivand_qmul@121: MainWindow::openLayerFile(QString path, QString location) ivand_qmul@121: { ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: ivand_qmul@121: if (!pane) { ivand_qmul@121: // shouldn't happen, as the menu action should have been disabled ivand_qmul@121: std::cerr << "WARNING: MainWindow::openLayerFile: no current pane" << std::endl; ivand_qmul@121: return FileOpenFailed; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (!getMainModel()) { ivand_qmul@121: // shouldn't happen, as the menu action should have been disabled ivand_qmul@121: std::cerr << "WARNING: MainWindow::openLayerFile: No main model -- hence no default sample rate available" << std::endl; ivand_qmul@121: return FileOpenFailed; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: bool realFile = (location == path); ivand_qmul@121: ivand_qmul@121: if (path.endsWith(".svl") || path.endsWith(".xml")) { ivand_qmul@121: ivand_qmul@121: PaneCallback callback(this); ivand_qmul@121: QFile file(path); ivand_qmul@121: ivand_qmul@121: if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { ivand_qmul@121: std::cerr << "ERROR: MainWindow::openLayerFile(" ivand_qmul@121: << location.toStdString() ivand_qmul@121: << "): Failed to open file for reading" << std::endl; ivand_qmul@121: return FileOpenFailed; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: SVFileReader reader(m_document, callback, location); ivand_qmul@121: reader.setCurrentPane(pane); ivand_qmul@121: ivand_qmul@121: QXmlInputSource inputSource(&file); ivand_qmul@121: reader.parse(inputSource); ivand_qmul@121: ivand_qmul@121: if (!reader.isOK()) { ivand_qmul@121: std::cerr << "ERROR: MainWindow::openLayerFile(" ivand_qmul@121: << location.toStdString() ivand_qmul@121: << "): Failed to read XML file: " ivand_qmul@121: << reader.getErrorString().toStdString() << std::endl; ivand_qmul@121: return FileOpenFailed; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_recentFiles.addFile(location); ivand_qmul@121: ivand_qmul@121: if (realFile) { ivand_qmul@121: registerLastOpenedFilePath(FileFinder::LayerFile, path); // for file dialog ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: return FileOpenSucceeded; ivand_qmul@121: ivand_qmul@121: } else { ivand_qmul@121: ivand_qmul@121: Model *model = DataFileReaderFactory::load(path, getMainModel()->getSampleRate()); ivand_qmul@121: ivand_qmul@121: if (model) { ivand_qmul@121: ivand_qmul@121: Layer *newLayer = m_document->createImportedLayer(model); ivand_qmul@121: ivand_qmul@121: if (newLayer) { ivand_qmul@121: ivand_qmul@121: m_document->addLayerToView(pane, newLayer); ivand_qmul@121: m_recentFiles.addFile(location); ivand_qmul@121: ivand_qmul@121: if (realFile) { ivand_qmul@121: registerLastOpenedFilePath(FileFinder::LayerFile, path); // for file dialog ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: return FileOpenSucceeded; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: return FileOpenFailed; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::exportLayer() ivand_qmul@121: { ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (!pane) return; ivand_qmul@121: ivand_qmul@121: Layer *layer = pane->getSelectedLayer(); ivand_qmul@121: if (!layer) return; ivand_qmul@121: ivand_qmul@121: Model *model = layer->getModel(); ivand_qmul@121: if (!model) return; ivand_qmul@121: ivand_qmul@121: QString path = getSaveFileName(FileFinder::LayerFile); ivand_qmul@121: ivand_qmul@121: if (path == "") return; ivand_qmul@121: ivand_qmul@121: if (QFileInfo(path).suffix() == "") path += ".svl"; ivand_qmul@121: ivand_qmul@121: QString error; ivand_qmul@121: ivand_qmul@121: if (path.endsWith(".xml") || path.endsWith(".svl")) { ivand_qmul@121: ivand_qmul@121: QFile file(path); ivand_qmul@121: if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { ivand_qmul@121: error = tr("Failed to open file %1 for writing").arg(path); ivand_qmul@121: } else { ivand_qmul@121: QTextStream out(&file); ivand_qmul@121: out << "\n" ivand_qmul@121: << "\n" ivand_qmul@121: << "\n" ivand_qmul@121: << " \n"; ivand_qmul@121: ivand_qmul@121: model->toXml(out, " "); ivand_qmul@121: ivand_qmul@121: out << " \n" ivand_qmul@121: << " \n"; ivand_qmul@121: ivand_qmul@121: layer->toXml(out, " "); ivand_qmul@121: ivand_qmul@121: out << " \n" ivand_qmul@121: << "\n"; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else { ivand_qmul@121: ivand_qmul@121: CSVFileWriter writer(path, model, ivand_qmul@121: (path.endsWith(".csv") ? "," : "\t")); ivand_qmul@121: writer.write(); ivand_qmul@121: ivand_qmul@121: if (!writer.isOK()) { ivand_qmul@121: error = writer.getError(); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (error != "") { ivand_qmul@121: QMessageBox::critical(this, tr("Failed to write file"), error); ivand_qmul@121: } else { ivand_qmul@121: m_recentFiles.addFile(path); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::exportImage() ivand_qmul@121: { ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (!pane) return; ivand_qmul@121: ivand_qmul@121: QString path = getSaveFileName(FileFinder::ImageFile); ivand_qmul@121: ivand_qmul@121: if (path == "") return; ivand_qmul@121: ivand_qmul@121: if (QFileInfo(path).suffix() == "") path += ".png"; ivand_qmul@121: ivand_qmul@121: bool haveSelection = m_viewManager && !m_viewManager->getSelections().empty(); ivand_qmul@121: ivand_qmul@121: QSize total, visible, selected; ivand_qmul@121: total = pane->getImageSize(); ivand_qmul@121: visible = pane->getImageSize(pane->getFirstVisibleFrame(), ivand_qmul@121: pane->getLastVisibleFrame()); ivand_qmul@121: ivand_qmul@121: size_t sf0 = 0, sf1 = 0; ivand_qmul@121: ivand_qmul@121: if (haveSelection) { ivand_qmul@121: MultiSelection::SelectionList selections = m_viewManager->getSelections(); ivand_qmul@121: sf0 = selections.begin()->getStartFrame(); ivand_qmul@121: MultiSelection::SelectionList::iterator e = selections.end(); ivand_qmul@121: --e; ivand_qmul@121: sf1 = e->getEndFrame(); ivand_qmul@121: selected = pane->getImageSize(sf0, sf1); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QStringList items; ivand_qmul@121: items << tr("Export the whole pane (%1x%2 pixels)") ivand_qmul@121: .arg(total.width()).arg(total.height()); ivand_qmul@121: items << tr("Export the visible area only (%1x%2 pixels)") ivand_qmul@121: .arg(visible.width()).arg(visible.height()); ivand_qmul@121: if (haveSelection) { ivand_qmul@121: items << tr("Export the selection extent (%1x%2 pixels)") ivand_qmul@121: .arg(selected.width()).arg(selected.height()); ivand_qmul@121: } else { ivand_qmul@121: items << tr("Export the selection extent"); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QSettings settings; ivand_qmul@121: settings.beginGroup("MainWindow"); ivand_qmul@121: int deflt = settings.value("lastimageexportregion", 0).toInt(); ivand_qmul@121: if (deflt == 2 && !haveSelection) deflt = 1; ivand_qmul@121: if (deflt == 0 && total.width() > 32767) deflt = 1; ivand_qmul@121: ivand_qmul@121: ListInputDialog *lid = new ListInputDialog ivand_qmul@121: (this, tr("Select region to export"), ivand_qmul@121: tr("Which region of the current pane do you want to export as an image?"), ivand_qmul@121: items, deflt); ivand_qmul@121: ivand_qmul@121: if (!haveSelection) { ivand_qmul@121: lid->setItemAvailability(2, false); ivand_qmul@121: } ivand_qmul@121: if (total.width() > 32767) { // appears to be the limit of a QImage ivand_qmul@121: lid->setItemAvailability(0, false); ivand_qmul@121: lid->setFootnote(tr("Note: the whole pane is too wide to be exported as a single image.")); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: bool ok = lid->exec(); ivand_qmul@121: QString item = lid->getCurrentString(); ivand_qmul@121: delete lid; lbajardsilogic@180: lid = 0; ivand_qmul@121: ivand_qmul@121: if (!ok || item.isEmpty()) return; ivand_qmul@121: ivand_qmul@121: settings.setValue("lastimageexportregion", deflt); ivand_qmul@121: ivand_qmul@121: QImage *image = 0; ivand_qmul@121: ivand_qmul@121: if (item == items[0]) { ivand_qmul@121: image = pane->toNewImage(); ivand_qmul@121: } else if (item == items[1]) { ivand_qmul@121: image = pane->toNewImage(pane->getFirstVisibleFrame(), ivand_qmul@121: pane->getLastVisibleFrame()); ivand_qmul@121: } else if (haveSelection) { ivand_qmul@121: image = pane->toNewImage(sf0, sf1); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (!image) return; ivand_qmul@121: ivand_qmul@121: if (!image->save(path, "PNG")) { ivand_qmul@121: QMessageBox::critical(this, tr("Failed to save image file"), ivand_qmul@121: tr("Failed to save image file %1").arg(path)); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: delete image; lbajardsilogic@180: image = 0; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: // Ivan Damnjanovic 09-10/2007 added video file import ivand_qmul@121: MainWindow::FileOpenStatus ivand_qmul@121: MainWindow::openVideoFile(QString path, AudioFileOpenMode mode) ivand_qmul@121: { lbajardsilogic@146: m_qtabwidget->setCurrentIndex(Video); lbajardsilogic@146: ivand_qmul@121: return openAudioFile(path, path, mode); ivand_qmul@121: } ivand_qmul@121: // ivand_qmul@121: MainWindow::FileOpenStatus ivand_qmul@121: MainWindow::openAudioFile(QString path, AudioFileOpenMode mode) ivand_qmul@121: { ivand_qmul@121: return openAudioFile(path, path, mode); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: MainWindow::FileOpenStatus ivand_qmul@121: MainWindow::openAudioFile(QString path, QString location, AudioFileOpenMode mode) ivand_qmul@121: { ivand_qmul@121: if (!(QFileInfo(path).exists() && ivand_qmul@121: QFileInfo(path).isFile() && ivand_qmul@121: QFileInfo(path).isReadable())) { ivand_qmul@121: return FileOpenFailed; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_openingAudioFile = true; ivand_qmul@121: ivand_qmul@121: WaveFileModel *newModel = new WaveFileModel(path, location); ivand_qmul@121: ivand_qmul@121: if (!newModel->isOK()) { lbajardsilogic@180: delete newModel; lbajardsilogic@180: newModel = 0; ivand_qmul@121: m_openingAudioFile = false; lbajardsilogic@180: return FileOpenFailed; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: bool setAsMain = true; ivand_qmul@121: static bool prevSetAsMain = true; ivand_qmul@121: ivand_qmul@121: bool realFile = (location == path); ivand_qmul@121: ivand_qmul@121: if (mode == CreateAdditionalModel) setAsMain = false; ivand_qmul@121: else if (mode == AskUser) { ivand_qmul@121: if (m_document->getMainModel()) { ivand_qmul@121: ivand_qmul@121: QStringList items; ivand_qmul@121: items << tr("Replace the existing main waveform") ivand_qmul@121: << tr("Load this file into a new waveform pane"); ivand_qmul@121: ivand_qmul@121: bool ok = false; ivand_qmul@121: QString item = ListInputDialog::getItem ivand_qmul@121: (this, tr("Select target for import"), ivand_qmul@121: tr("You already have an audio waveform loaded.\nWhat would you like to do with the new audio file?"), ivand_qmul@121: items, prevSetAsMain ? 0 : 1, &ok); ivand_qmul@121: ivand_qmul@121: if (!ok || item.isEmpty()) { ivand_qmul@121: delete newModel; lbajardsilogic@180: newModel = 0; ivand_qmul@121: m_openingAudioFile = false; ivand_qmul@121: return FileOpenCancelled; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: setAsMain = (item == items[0]); ivand_qmul@121: prevSetAsMain = setAsMain; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (setAsMain) { ivand_qmul@121: ivand_qmul@121: Model *prevMain = getMainModel(); ivand_qmul@121: if (prevMain) { ivand_qmul@121: m_playSource->removeModel(prevMain); ivand_qmul@121: PlayParameterRepository::getInstance()->removeModel(prevMain); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: PlayParameterRepository::getInstance()->addModel(newModel); ivand_qmul@121: ivand_qmul@121: m_document->setMainModel(newModel); ivand_qmul@121: setupMenus(); ivand_qmul@121: ivand_qmul@121: if (m_sessionFile == "") { ivand_qmul@121: setWindowTitle(tr("Sound Access: %1") ivand_qmul@121: .arg(QFileInfo(location).fileName())); ivand_qmul@121: CommandHistory::getInstance()->clear(); ivand_qmul@121: CommandHistory::getInstance()->documentSaved(); ivand_qmul@121: m_documentModified = false; ivand_qmul@121: } else { ivand_qmul@121: setWindowTitle(tr("Sound Access: %1 [%2]") ivand_qmul@121: .arg(QFileInfo(m_sessionFile).fileName()) ivand_qmul@121: .arg(QFileInfo(location).fileName())); ivand_qmul@121: if (m_documentModified) { ivand_qmul@121: m_documentModified = false; ivand_qmul@121: documentModified(); // so as to restore "(modified)" window title ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (realFile) m_audioFile = path; ivand_qmul@121: ivand_qmul@121: } else { // !setAsMain ivand_qmul@121: ivand_qmul@121: CommandHistory::getInstance()->startCompoundOperation ivand_qmul@121: (tr("Import \"%1\"").arg(QFileInfo(location).fileName()), true); ivand_qmul@121: ivand_qmul@121: m_document->addImportedModel(newModel); ivand_qmul@121: ivand_qmul@121: AddPaneCommand *command = new AddPaneCommand(this); ivand_qmul@121: CommandHistory::getInstance()->addCommand(command); ivand_qmul@121: ivand_qmul@121: Pane *pane = command->getPane(); ivand_qmul@121: ivand_qmul@121: if (!m_timeRulerLayer) { ivand_qmul@121: m_timeRulerLayer = m_document->createMainModelLayer ivand_qmul@121: (LayerFactory::TimeRuler); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_document->addLayerToView(pane, m_timeRulerLayer); ivand_qmul@121: ivand_qmul@121: Layer *newLayer = m_document->createImportedLayer(newModel); ivand_qmul@121: ivand_qmul@121: if (newLayer) { ivand_qmul@121: m_document->addLayerToView(pane, newLayer); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: CommandHistory::getInstance()->endCompoundOperation(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: updateMenuStates(); ivand_qmul@121: m_recentFiles.addFile(location); ivand_qmul@121: if (realFile) { ivand_qmul@121: registerLastOpenedFilePath(FileFinder::AudioFile, path); // for file dialog ivand_qmul@121: } ivand_qmul@121: m_openingAudioFile = false; ivand_qmul@121: ivand_qmul@121: return FileOpenSucceeded; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::createPlayTarget() ivand_qmul@121: { ivand_qmul@121: if (m_playTarget) return; ivand_qmul@121: ivand_qmul@121: m_playTarget = AudioTargetFactory::createCallbackTarget(m_playSource); ivand_qmul@121: if (!m_playTarget) { ivand_qmul@121: QMessageBox::warning ivand_qmul@121: (this, tr("Couldn't open audio device"), ivand_qmul@121: tr("Could not open an audio device for playback.\nAudio playback will not be available during this session.\n"), ivand_qmul@121: QMessageBox::Ok, 0); ivand_qmul@121: } ivand_qmul@121: connect(m_fader, SIGNAL(valueChanged(float)), ivand_qmul@121: m_playTarget, SLOT(setOutputGain(float))); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: WaveFileModel * ivand_qmul@121: MainWindow::getMainModel() ivand_qmul@121: { ivand_qmul@121: if (!m_document) return 0; ivand_qmul@121: return m_document->getMainModel(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: const WaveFileModel * ivand_qmul@121: MainWindow::getMainModel() const ivand_qmul@121: { ivand_qmul@121: if (!m_document) return 0; ivand_qmul@121: return m_document->getMainModel(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::newSession() ivand_qmul@121: { ivand_qmul@121: if (!checkSaveModified()) return; ivand_qmul@121: ivand_qmul@121: closeSession(); ivand_qmul@121: createDocument(); ivand_qmul@121: createMultiPaneLayerContainer(); ivand_qmul@121: ivand_qmul@121: Pane *pane = m_paneStack->addPane(); ivand_qmul@121: ivand_qmul@121: connect(pane, SIGNAL(contextHelpChanged(const QString &)), ivand_qmul@121: this, SLOT(contextHelpChanged(const QString &))); ivand_qmul@121: ivand_qmul@121: if (!m_timeRulerLayer) { ivand_qmul@121: m_timeRulerLayer = m_document->createMainModelLayer ivand_qmul@121: (LayerFactory::TimeRuler); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_document->addLayerToView(pane, m_timeRulerLayer); ivand_qmul@121: ivand_qmul@121: Layer *waveform = m_document->createMainModelLayer(LayerFactory::Waveform); ivand_qmul@121: m_document->addLayerToView(pane, waveform); ivand_qmul@121: ivand_qmul@121: m_overview->registerView(pane); ivand_qmul@121: ivand_qmul@121: m_EasaierManager->newSession(); ivand_qmul@121: ivand_qmul@121: CommandHistory::getInstance()->clear(); ivand_qmul@121: CommandHistory::getInstance()->documentSaved(); ivand_qmul@121: documentRestored(); ivand_qmul@121: updateMenuStates(); lbajardsilogic@2: lbajardsilogic@202: setupFiltersMenu(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::createDocument() ivand_qmul@121: { ivand_qmul@121: m_document = new Document; ivand_qmul@121: ivand_qmul@121: connect(m_document, SIGNAL(layerAdded(Layer *)), ivand_qmul@121: this, SLOT(layerAdded(Layer *))); ivand_qmul@121: connect(m_document, SIGNAL(layerRemoved(Layer *)), ivand_qmul@121: this, SLOT(layerRemoved(Layer *))); ivand_qmul@121: connect(m_document, SIGNAL(layerAboutToBeDeleted(Layer *)), ivand_qmul@121: this, SLOT(layerAboutToBeDeleted(Layer *))); ivand_qmul@121: connect(m_document, SIGNAL(layerInAView(Layer *, bool)), ivand_qmul@121: this, SLOT(layerInAView(Layer *, bool))); ivand_qmul@121: ivand_qmul@121: connect(m_document, SIGNAL(modelAdded(Model *)), ivand_qmul@121: this, SLOT(modelAdded(Model *))); ivand_qmul@121: connect(m_document, SIGNAL(mainModelChanged(WaveFileModel *)), ivand_qmul@121: this, SLOT(mainModelChanged(WaveFileModel *))); ivand_qmul@121: connect(m_document, SIGNAL(modelAboutToBeDeleted(Model *)), ivand_qmul@121: this, SLOT(modelAboutToBeDeleted(Model *))); ivand_qmul@121: lbajardsilogic@21: connect(m_document, SIGNAL(audioSourceInfoAdded(AudioSourceInfoModel *)), ivand_qmul@121: this, SLOT(audioSourceInfoAdded(AudioSourceInfoModel *))); ivand_qmul@121: ivand_qmul@121: connect(m_document, SIGNAL(modelGenerationFailed(QString)), ivand_qmul@121: this, SLOT(modelGenerationFailed(QString))); ivand_qmul@121: connect(m_document, SIGNAL(modelRegenerationFailed(QString, QString)), ivand_qmul@121: this, SLOT(modelRegenerationFailed(QString, QString))); ivand_qmul@121: lbajardsilogic@223: connect(m_document, SIGNAL(newFilterAdded(PropertyContainer *)), lbajardsilogic@223: m_filterPropertyStack, SLOT(filterAdded(PropertyContainer *))); ivand_qmul@121: connect(m_document, SIGNAL(filterRemoved(QString)), ivand_qmul@121: m_filterPropertyStack, SLOT(filterRemoved(QString))); ivand_qmul@121: ivand_qmul@121: m_playSource->setRealTimeFilterStack(m_document->getRealTimeFilterStack()); ivand_qmul@121: ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::closeSession() ivand_qmul@121: { ivand_qmul@121: if (!checkSaveModified()) return; ivand_qmul@121: ivand_qmul@121: while (m_paneStack->getPaneCount() > 0) { ivand_qmul@121: ivand_qmul@121: Pane *pane = m_paneStack->getPane(m_paneStack->getPaneCount() - 1); ivand_qmul@121: ivand_qmul@121: while (pane->getLayerCount() > 0) { ivand_qmul@121: m_document->removeLayerFromView ivand_qmul@121: (pane, pane->getLayer(pane->getLayerCount() - 1)); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_overview->unregisterView(pane); ivand_qmul@121: m_paneStack->deletePane(pane); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: while (m_paneStack->getHiddenPaneCount() > 0) { ivand_qmul@121: ivand_qmul@121: Pane *pane = m_paneStack->getHiddenPane ivand_qmul@121: (m_paneStack->getHiddenPaneCount() - 1); ivand_qmul@121: ivand_qmul@121: while (pane->getLayerCount() > 0) { ivand_qmul@121: m_document->removeLayerFromView ivand_qmul@121: (pane, pane->getLayer(pane->getLayerCount() - 1)); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_overview->unregisterView(pane); ivand_qmul@121: m_paneStack->deletePane(pane); ivand_qmul@121: } ivand_qmul@121: lbajardsilogic@21: m_infoWidget->reset(); lbajardsilogic@21: m_searchWidget->reset(); ivand_qmul@121: m_resultsWidget->reset(); lbajardsilogic@143: m_relMediaWidget->reset(); ivand_qmul@121: ivand_qmul@121: delete m_document; ivand_qmul@121: m_document = 0; ivand_qmul@121: m_viewManager->clearSelections(); ivand_qmul@121: m_timeRulerLayer = 0; // document owned this ivand_qmul@121: ivand_qmul@121: m_sessionFile = ""; ivand_qmul@121: setWindowTitle(tr("Sound Access")); ivand_qmul@121: ivand_qmul@121: CommandHistory::getInstance()->clear(); ivand_qmul@121: CommandHistory::getInstance()->documentSaved(); ivand_qmul@121: documentRestored(); ivand_qmul@121: ivand_qmul@121: m_EasaierManager->closeSession(); ivand_qmul@121: ivand_qmul@121: m_toolBox->removeItem(0); ivand_qmul@121: m_multiPaneLayerContainer = 0; ivand_qmul@121: ivand_qmul@121: TempDirectory::getInstance()->cleanup(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::openSession() ivand_qmul@121: { ivand_qmul@121: if (!checkSaveModified()) return; ivand_qmul@121: ivand_qmul@121: QString orig = m_audioFile; ivand_qmul@121: if (orig == "") orig = "."; ivand_qmul@121: else orig = QFileInfo(orig).absoluteDir().canonicalPath(); ivand_qmul@121: ivand_qmul@121: QString path = getOpenFileName(FileFinder::SessionFile); ivand_qmul@121: ivand_qmul@121: if (path.isEmpty()) return; ivand_qmul@121: ivand_qmul@121: if (openSessionFile(path) == FileOpenFailed) { ivand_qmul@121: QMessageBox::critical(this, tr("Failed to open file"), ivand_qmul@121: tr("Session file \"%1\" could not be opened").arg(path)); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::openSomething() ivand_qmul@121: { ivand_qmul@121: QString orig = m_audioFile; ivand_qmul@121: if (orig == "") orig = "."; ivand_qmul@121: else orig = QFileInfo(orig).absoluteDir().canonicalPath(); ivand_qmul@121: ivand_qmul@121: bool canImportLayer = (getMainModel() != 0 && ivand_qmul@121: m_paneStack != 0 && ivand_qmul@121: m_paneStack->getCurrentPane() != 0); ivand_qmul@121: ivand_qmul@121: QString path = getOpenFileName(FileFinder::AnyFile); ivand_qmul@121: ivand_qmul@121: if (path.isEmpty()) return; ivand_qmul@121: ivand_qmul@121: if (path.endsWith(".sv")) { ivand_qmul@121: ivand_qmul@121: if (!checkSaveModified()) return; ivand_qmul@121: ivand_qmul@121: if (openSessionFile(path) == FileOpenFailed) { ivand_qmul@121: QMessageBox::critical(this, tr("Failed to open file"), ivand_qmul@121: tr("Session file \"%1\" could not be opened").arg(path)); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else { ivand_qmul@121: ivand_qmul@121: if (openAudioFile(path, AskUser) == FileOpenFailed) { ivand_qmul@121: ivand_qmul@121: if (!canImportLayer || (openLayerFile(path) == FileOpenFailed)) { ivand_qmul@121: ivand_qmul@121: QMessageBox::critical(this, tr("Failed to open file"), ivand_qmul@121: tr("File \"%1\" could not be opened").arg(path)); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::openLocation() ivand_qmul@121: { ivand_qmul@121: QSettings settings; ivand_qmul@121: settings.beginGroup("MainWindow"); ivand_qmul@121: QString lastLocation = settings.value("lastremote", "").toString(); ivand_qmul@121: ivand_qmul@121: bool ok = false; ivand_qmul@121: QString text = QInputDialog::getText ivand_qmul@121: (this, tr("Open Location"), ivand_qmul@121: tr("Please enter the URL of the location to open:"), ivand_qmul@121: QLineEdit::Normal, lastLocation, &ok); ivand_qmul@121: ivand_qmul@121: if (!ok) return; ivand_qmul@121: ivand_qmul@121: settings.setValue("lastremote", text); ivand_qmul@121: ivand_qmul@121: if (text.isEmpty()) return; ivand_qmul@121: ivand_qmul@121: if (openURL(QUrl(text)) == FileOpenFailed) { ivand_qmul@121: QMessageBox::critical(this, tr("Failed to open location"), ivand_qmul@121: tr("URL \"%1\" could not be opened").arg(text)); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::openRecentFile() ivand_qmul@121: { ivand_qmul@121: QObject *obj = sender(); ivand_qmul@121: QAction *action = dynamic_cast(obj); ivand_qmul@121: ivand_qmul@121: if (!action) { ivand_qmul@121: std::cerr << "WARNING: MainWindow::openRecentFile: sender is not an action" ivand_qmul@121: << std::endl; ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QString path = action->text(); ivand_qmul@121: if (path == "") return; ivand_qmul@121: ivand_qmul@121: QUrl url(path); ivand_qmul@121: if (RemoteFile::canHandleScheme(url)) { ivand_qmul@121: openURL(url); ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (path.endsWith("sv")) { ivand_qmul@121: ivand_qmul@121: if (!checkSaveModified()) return; ivand_qmul@121: ivand_qmul@121: if (openSessionFile(path) == FileOpenFailed) { ivand_qmul@121: QMessageBox::critical(this, tr("Failed to open file"), ivand_qmul@121: tr("Session file \"%1\" could not be opened").arg(path)); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else { ivand_qmul@121: ivand_qmul@121: if (openAudioFile(path, AskUser) == FileOpenFailed) { ivand_qmul@121: ivand_qmul@121: bool canImportLayer = (getMainModel() != 0 && ivand_qmul@121: m_paneStack != 0 && ivand_qmul@121: m_paneStack->getCurrentPane() != 0); ivand_qmul@121: ivand_qmul@121: if (!canImportLayer || (openLayerFile(path) == FileOpenFailed)) { ivand_qmul@121: ivand_qmul@121: QMessageBox::critical(this, tr("Failed to open file"), ivand_qmul@121: tr("File \"%1\" could not be opened").arg(path)); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: MainWindow::FileOpenStatus ivand_qmul@121: MainWindow::openURL(QUrl url) ivand_qmul@121: { ivand_qmul@121: if (url.scheme().toLower() == "file") { ivand_qmul@121: return openSomeFile(url.toLocalFile()); ivand_qmul@121: } else if (!RemoteFile::canHandleScheme(url)) { ivand_qmul@121: QMessageBox::critical(this, tr("Unsupported scheme in URL"), ivand_qmul@121: tr("The URL scheme \"%1\" is not supported") ivand_qmul@121: .arg(url.scheme())); ivand_qmul@121: return FileOpenFailed; ivand_qmul@121: } else { ivand_qmul@121: RemoteFile rf(url); ivand_qmul@121: rf.wait(); ivand_qmul@121: if (!rf.isOK()) { ivand_qmul@121: QMessageBox::critical(this, tr("File download failed"), ivand_qmul@121: tr("Failed to download URL \"%1\": %2") ivand_qmul@121: .arg(url.toString()).arg(rf.getErrorString())); ivand_qmul@121: return FileOpenFailed; ivand_qmul@121: } ivand_qmul@121: FileOpenStatus status; ivand_qmul@121: if ((status = openSomeFile(rf.getLocalFilename(), url.toString())) != ivand_qmul@121: FileOpenSucceeded) { ivand_qmul@121: rf.deleteLocalFile(); ivand_qmul@121: } ivand_qmul@121: return status; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: MainWindow::FileOpenStatus ivand_qmul@121: MainWindow::openSomeFile(QString path, AudioFileOpenMode mode) ivand_qmul@121: { ivand_qmul@121: return openSomeFile(path, path, mode); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: MainWindow::FileOpenStatus ivand_qmul@121: MainWindow::openSomeFile(QString path, QString location, ivand_qmul@121: AudioFileOpenMode mode) ivand_qmul@121: { ivand_qmul@121: FileOpenStatus status; ivand_qmul@121: ivand_qmul@121: bool canImportLayer = (getMainModel() != 0 && ivand_qmul@121: m_paneStack != 0 && ivand_qmul@121: m_paneStack->getCurrentPane() != 0); ivand_qmul@121: ivand_qmul@121: if ((status = openAudioFile(path, location, mode)) != FileOpenFailed) { ivand_qmul@121: return status; ivand_qmul@121: } else if ((status = openSessionFile(path, location)) != FileOpenFailed) { ivand_qmul@121: return status; ivand_qmul@121: } else if (!canImportLayer) { ivand_qmul@121: return FileOpenFailed; ivand_qmul@121: } else if ((status = openLayerFile(path, location)) != FileOpenFailed) { ivand_qmul@121: return status; ivand_qmul@121: } else { ivand_qmul@121: return FileOpenFailed; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: MainWindow::FileOpenStatus ivand_qmul@121: MainWindow::openSessionFile(QString path) ivand_qmul@121: { ivand_qmul@121: return openSessionFile(path, path); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: MainWindow::FileOpenStatus ivand_qmul@121: MainWindow::openSessionFile(QString path, QString location) ivand_qmul@121: { ivand_qmul@121: BZipFileDevice bzFile(path); ivand_qmul@121: if (!bzFile.open(QIODevice::ReadOnly)) { ivand_qmul@121: std::cerr << "Failed to open session file \"" << location.toStdString() ivand_qmul@121: << "\": " << bzFile.errorString().toStdString() << std::endl; ivand_qmul@121: return FileOpenFailed; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (!checkSaveModified()) return FileOpenCancelled; ivand_qmul@121: ivand_qmul@121: QString error; ivand_qmul@121: closeSession(); ivand_qmul@121: createDocument(); ivand_qmul@121: createMultiPaneLayerContainer(); ivand_qmul@121: PaneCallback callback(this); ivand_qmul@121: m_viewManager->clearSelections(); lbajardsilogic@203: setupFiltersMenu(); lbajardsilogic@203: ivand_qmul@121: SVFileReader reader(m_document, callback, location); ivand_qmul@121: QXmlInputSource inputSource(&bzFile); ivand_qmul@121: reader.parse(inputSource); ivand_qmul@121: ivand_qmul@121: if (!reader.isOK()) { ivand_qmul@121: error = tr("SV XML file read error:\n%1").arg(reader.getErrorString()); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: bzFile.close(); ivand_qmul@121: ivand_qmul@121: bool ok = (error == ""); ivand_qmul@121: ivand_qmul@121: bool realFile = (location == path); ivand_qmul@121: ivand_qmul@121: if (ok) { ivand_qmul@121: ivand_qmul@121: setWindowTitle(tr("Sound Access: %1") ivand_qmul@121: .arg(QFileInfo(location).fileName())); ivand_qmul@121: ivand_qmul@121: if (realFile) m_sessionFile = path; ivand_qmul@121: ivand_qmul@121: setupMenus(); ivand_qmul@121: CommandHistory::getInstance()->clear(); ivand_qmul@121: CommandHistory::getInstance()->documentSaved(); ivand_qmul@121: m_documentModified = false; ivand_qmul@121: updateMenuStates(); ivand_qmul@121: ivand_qmul@121: m_recentFiles.addFile(location); ivand_qmul@121: ivand_qmul@121: if (realFile) { ivand_qmul@121: registerLastOpenedFilePath(FileFinder::SessionFile, path); // for file dialog ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else { ivand_qmul@121: setWindowTitle(tr("Sound Access")); ivand_qmul@121: } lbajardsilogic@52: lbajardsilogic@52: m_EasaierManager->newSession(); lbajardsilogic@52: ivand_qmul@121: return ok ? FileOpenSucceeded : FileOpenFailed; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::closeEvent(QCloseEvent *e) ivand_qmul@121: { benoitrigolleau@140: ivand_qmul@121: // std::cerr << "MainWindow::closeEvent" << std::endl; ivand_qmul@121: ivand_qmul@121: if (m_openingAudioFile) { ivand_qmul@121: // std::cerr << "Busy - ignoring close event" << std::endl; ivand_qmul@121: e->ignore(); ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (!m_abandoning && !checkSaveModified()) { ivand_qmul@121: // std::cerr << "Ignoring close event" << std::endl; ivand_qmul@121: e->ignore(); ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QSettings settings; ivand_qmul@121: settings.beginGroup("MainWindow"); ivand_qmul@121: settings.setValue("size", size()); ivand_qmul@121: settings.setValue("position", pos()); ivand_qmul@121: settings.endGroup(); ivand_qmul@121: ivand_qmul@121: e->accept(); benoitrigolleau@133: exit(); ivand_qmul@121: return; benoitrigolleau@140: benoitrigolleau@140: //exit(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: bool ivand_qmul@121: MainWindow::commitData(bool mayAskUser) ivand_qmul@121: { ivand_qmul@121: if (mayAskUser) { ivand_qmul@121: return checkSaveModified(); ivand_qmul@121: } else { ivand_qmul@121: if (!m_documentModified) return true; ivand_qmul@121: ivand_qmul@121: // If we can't check with the user first, then we can't save ivand_qmul@121: // to the original session file (even if we have it) -- have ivand_qmul@121: // to use a temporary file ivand_qmul@121: ivand_qmul@121: QString svDirBase = ".sv1"; ivand_qmul@121: QString svDir = QDir::home().filePath(svDirBase); ivand_qmul@121: ivand_qmul@121: if (!QFileInfo(svDir).exists()) { ivand_qmul@121: if (!QDir::home().mkdir(svDirBase)) return false; ivand_qmul@121: } else { ivand_qmul@121: if (!QFileInfo(svDir).isDir()) return false; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: // This name doesn't have to be unguessable ivand_qmul@121: #ifndef _WIN32 ivand_qmul@121: QString fname = QString("tmp-%1-%2.sv") ivand_qmul@121: .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz")) ivand_qmul@121: .arg(QProcess().pid()); ivand_qmul@121: #else ivand_qmul@121: QString fname = QString("tmp-%1.sv") ivand_qmul@121: .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz")); ivand_qmul@121: #endif ivand_qmul@121: QString fpath = QDir(svDir).filePath(fname); ivand_qmul@121: if (saveSessionFile(fpath)) { ivand_qmul@121: m_recentFiles.addFile(fpath); ivand_qmul@121: return true; ivand_qmul@121: } else { ivand_qmul@121: return false; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: bool ivand_qmul@121: MainWindow::checkSaveModified() ivand_qmul@121: { ivand_qmul@121: // Called before some destructive operation (e.g. new session, ivand_qmul@121: // exit program). Return true if we can safely proceed, false to ivand_qmul@121: // cancel. ivand_qmul@121: ivand_qmul@121: if (!m_documentModified) return true; ivand_qmul@121: ivand_qmul@121: int button = ivand_qmul@121: QMessageBox::warning(this, ivand_qmul@121: tr("Session modified"), ivand_qmul@121: tr("The current session has been modified.\nDo you want to save it?"), ivand_qmul@121: QMessageBox::Yes, ivand_qmul@121: QMessageBox::No, ivand_qmul@121: QMessageBox::Cancel); ivand_qmul@121: ivand_qmul@121: if (button == QMessageBox::Yes) { ivand_qmul@121: saveEasaierSession(); ivand_qmul@121: if (m_documentModified) { // save failed -- don't proceed! ivand_qmul@121: return false; ivand_qmul@121: } else { ivand_qmul@121: return true; // saved, so it's safe to continue now ivand_qmul@121: } ivand_qmul@121: } else if (button == QMessageBox::No) { ivand_qmul@121: m_documentModified = false; // so we know to abandon it ivand_qmul@121: return true; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: // else cancel ivand_qmul@121: return false; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::saveSession() ivand_qmul@121: { ivand_qmul@121: if (m_sessionFile != "") { ivand_qmul@121: if (!saveSessionFile(m_sessionFile)) { ivand_qmul@121: QMessageBox::critical(this, tr("Failed to save file"), ivand_qmul@121: tr("Session file \"%1\" could not be saved.").arg(m_sessionFile)); ivand_qmul@121: } else { ivand_qmul@121: CommandHistory::getInstance()->documentSaved(); ivand_qmul@121: documentRestored(); ivand_qmul@121: } ivand_qmul@121: } else { ivand_qmul@121: saveSessionAs(); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::saveSessionAs() ivand_qmul@121: { ivand_qmul@121: QString orig = m_audioFile; ivand_qmul@121: if (orig == "") orig = "."; ivand_qmul@121: else orig = QFileInfo(orig).absoluteDir().canonicalPath(); ivand_qmul@121: ivand_qmul@121: QString path = getSaveFileName(FileFinder::SessionFile); ivand_qmul@121: ivand_qmul@121: if (path == "") return; ivand_qmul@121: ivand_qmul@121: if (!saveSessionFile(path)) { ivand_qmul@121: QMessageBox::critical(this, tr("Failed to save file"), ivand_qmul@121: tr("Session file \"%1\" could not be saved.").arg(path)); ivand_qmul@121: } else { ivand_qmul@121: setWindowTitle(tr("Sound Access: %1") ivand_qmul@121: .arg(QFileInfo(path).fileName())); ivand_qmul@121: m_sessionFile = path; ivand_qmul@121: CommandHistory::getInstance()->documentSaved(); ivand_qmul@121: documentRestored(); ivand_qmul@121: m_recentFiles.addFile(path); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: bool ivand_qmul@121: MainWindow::saveSessionFile(QString path) ivand_qmul@121: { ivand_qmul@121: BZipFileDevice bzFile(path); ivand_qmul@121: if (!bzFile.open(QIODevice::WriteOnly)) { ivand_qmul@121: std::cerr << "Failed to open session file \"" << path.toStdString() ivand_qmul@121: << "\" for writing: " ivand_qmul@121: << bzFile.errorString().toStdString() << std::endl; ivand_qmul@121: return false; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); ivand_qmul@121: ivand_qmul@121: QTextStream out(&bzFile); ivand_qmul@121: toXml(out); ivand_qmul@121: out.flush(); ivand_qmul@121: ivand_qmul@121: QApplication::restoreOverrideCursor(); ivand_qmul@121: ivand_qmul@121: if (!bzFile.isOK()) { ivand_qmul@121: QMessageBox::critical(this, tr("Failed to write file"), ivand_qmul@121: tr("Failed to write to file \"%1\": %2") ivand_qmul@121: .arg(path).arg(bzFile.errorString())); ivand_qmul@121: bzFile.close(); ivand_qmul@121: return false; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: bzFile.close(); ivand_qmul@121: return true; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::toXml(QTextStream &out) ivand_qmul@121: { ivand_qmul@121: QString indent(" "); ivand_qmul@121: ivand_qmul@121: out << "\n"; ivand_qmul@121: out << "\n"; ivand_qmul@121: out << "\n"; ivand_qmul@121: ivand_qmul@121: m_document->toXml(out, "", ""); ivand_qmul@121: ivand_qmul@121: out << "\n"; ivand_qmul@121: ivand_qmul@121: out << QString(" \n") ivand_qmul@121: .arg(width()).arg(height()); ivand_qmul@121: ivand_qmul@121: for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { ivand_qmul@121: ivand_qmul@121: Pane *pane = m_paneStack->getPane(i); ivand_qmul@121: ivand_qmul@121: if (pane) { ivand_qmul@121: pane->toXml(out, indent); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: out << "\n"; ivand_qmul@121: ivand_qmul@121: m_viewManager->getSelection().toXml(out); ivand_qmul@121: ivand_qmul@121: out << "\n"; ivand_qmul@121: } ivand_qmul@121: lbajardsilogic@21: void MainWindow::toEasaierXml(QTextStream &out) lbajardsilogic@21: { lbajardsilogic@21: QString s; lbajardsilogic@21: QString indent(" "); lbajardsilogic@21: lbajardsilogic@21: s += "\n"; lbajardsilogic@21: s += "\n"; lbajardsilogic@21: lbajardsilogic@21: s += "\n"; lbajardsilogic@21: lbajardsilogic@21: s += QString(" \n") lbajardsilogic@21: .arg(width()).arg(height()); lbajardsilogic@21: lbajardsilogic@21: for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { lbajardsilogic@21: lbajardsilogic@21: Pane *pane = m_paneStack->getPane(i); lbajardsilogic@21: lbajardsilogic@21: if (pane) { lbajardsilogic@21: s += pane->toEasaierXmlString(indent); lbajardsilogic@21: } lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: s += "\n"; lbajardsilogic@21: lbajardsilogic@21: s += m_document->toEasaierXmlString(indent, ""); lbajardsilogic@21: lbajardsilogic@21: s += "\n"; lbajardsilogic@21: lbajardsilogic@21: out << s; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: Pane * ivand_qmul@121: MainWindow::addPaneToStack() ivand_qmul@121: { ivand_qmul@121: AddPaneCommand *command = new AddPaneCommand(this); ivand_qmul@121: CommandHistory::getInstance()->addCommand(command); ivand_qmul@121: return command->getPane(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::zoomIn() ivand_qmul@121: { ivand_qmul@121: Pane *currentPane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (currentPane) currentPane->zoom(true); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::zoomOut() ivand_qmul@121: { ivand_qmul@121: Pane *currentPane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (currentPane) currentPane->zoom(false); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::zoomToFit() ivand_qmul@121: { ivand_qmul@121: Pane *currentPane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (!currentPane) return; ivand_qmul@121: ivand_qmul@121: Model *model = getMainModel(); ivand_qmul@121: if (!model) return; ivand_qmul@121: ivand_qmul@121: size_t start = model->getStartFrame(); ivand_qmul@121: size_t end = model->getEndFrame(); ivand_qmul@121: size_t pixels = currentPane->width(); ivand_qmul@121: size_t zoomLevel = (end - start) / pixels; ivand_qmul@121: ivand_qmul@121: currentPane->setZoomLevel(zoomLevel); ivand_qmul@121: currentPane->setStartFrame(start); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::zoomDefault() ivand_qmul@121: { ivand_qmul@121: Pane *currentPane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (currentPane) currentPane->setZoomLevel(1024); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::scrollLeft() ivand_qmul@121: { ivand_qmul@121: Pane *currentPane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (currentPane) currentPane->scroll(false, false); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::jumpLeft() ivand_qmul@121: { ivand_qmul@121: Pane *currentPane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (currentPane) currentPane->scroll(false, true); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::scrollRight() ivand_qmul@121: { ivand_qmul@121: Pane *currentPane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (currentPane) currentPane->scroll(true, false); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::jumpRight() ivand_qmul@121: { ivand_qmul@121: Pane *currentPane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (currentPane) currentPane->scroll(true, true); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::showNoOverlays() ivand_qmul@121: { ivand_qmul@121: m_viewManager->setOverlayMode(ViewManager::NoOverlays); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::showMinimalOverlays() ivand_qmul@121: { ivand_qmul@121: m_viewManager->setOverlayMode(ViewManager::MinimalOverlays); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::showStandardOverlays() ivand_qmul@121: { ivand_qmul@121: m_viewManager->setOverlayMode(ViewManager::StandardOverlays); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::showAllOverlays() ivand_qmul@121: { ivand_qmul@121: m_viewManager->setOverlayMode(ViewManager::AllOverlays); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::toggleZoomWheels() ivand_qmul@121: { ivand_qmul@121: if (m_viewManager->getZoomWheelsEnabled()) { ivand_qmul@121: m_viewManager->setZoomWheelsEnabled(false); ivand_qmul@121: } else { ivand_qmul@121: m_viewManager->setZoomWheelsEnabled(true); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::toggleStatusBar() ivand_qmul@121: { ivand_qmul@121: QSettings settings; ivand_qmul@121: settings.beginGroup("MainWindow"); ivand_qmul@121: bool sb = settings.value("showstatusbar", true).toBool(); ivand_qmul@121: ivand_qmul@121: if (sb) { ivand_qmul@121: statusBar()->hide(); ivand_qmul@121: } else { ivand_qmul@121: statusBar()->show(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: settings.setValue("showstatusbar", !sb); ivand_qmul@121: ivand_qmul@121: settings.endGroup(); ivand_qmul@121: } ivand_qmul@121: lbajardsilogic@204: /*void ivand_qmul@121: MainWindow::preferenceChanged(PropertyContainer::PropertyName name) ivand_qmul@121: { lbajardsilogic@204: lbajardsilogic@204: }*/ ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::play() ivand_qmul@121: { ivand_qmul@121: if (m_playSource->isPlaying()) { ivand_qmul@121: stop(); ivand_qmul@121: } else { ivand_qmul@121: playbackFrameChanged(m_viewManager->getPlaybackFrame()); ivand_qmul@121: m_playSource->play(m_viewManager->getPlaybackFrame()); ivand_qmul@121: } ivand_qmul@129: m_playSource->hardwareBufferedTime=0; ivand_qmul@129: m_playSource->lastAudioTime=0; ivand_qmul@121: } lbajardsilogic@191: // Ivan Damnjanovic 16/10/2007 functions to access data needed for video player lbajardsilogic@191: unsigned long lbajardsilogic@191: MainWindow::Get_CurAudioTime() lbajardsilogic@191: { lbajardsilogic@192: unsigned long pos = 0; lbajardsilogic@191: unsigned long newAudioTime=m_viewManager->getPlaybackFrame()/(getMainModel()->getSampleRate()/1000); benoitrigolleau@280: if(!(m_playSource->lastAudioTime==newAudioTime) || freeze) lbajardsilogic@191: { lbajardsilogic@191: m_playSource->lastAudioTime=newAudioTime; lbajardsilogic@192: long long cntClick = 0; lbajardsilogic@192: #ifdef _WIN32 ivand_qmul@129: QueryPerformanceCounter((LARGE_INTEGER *)(&cntClick)); lbajardsilogic@192: #endif lbajardsilogic@191: m_playSource->hardwareBufferedTime=cntClick; lbajardsilogic@191: pos=0; lbajardsilogic@191: } lbajardsilogic@191: else lbajardsilogic@191: { lbajardsilogic@192: long long timeTemp = 0; lbajardsilogic@192: #ifdef _WIN32 lbajardsilogic@192: QueryPerformanceCounter((LARGE_INTEGER *)(&timeTemp)); lbajardsilogic@193: pos=(timeTemp-m_playSource->hardwareBufferedTime)/(countFreq); lbajardsilogic@192: #endif lbajardsilogic@192: pos*=getPlaySpeedVal(); lbajardsilogic@191: } lbajardsilogic@191: return (newAudioTime+pos); lbajardsilogic@191: } lbajardsilogic@192: lbajardsilogic@191: unsigned long long lbajardsilogic@191: MainWindow::Get_HardwareBufferTime() lbajardsilogic@191: { lbajardsilogic@191: return (m_playSource->hardwareBufferedTime); lbajardsilogic@191: } ivand_qmul@121: bool MainWindow::isAudioPlaying() ivand_qmul@121: { ivand_qmul@121: return (m_playSource->isPlaying()); ivand_qmul@121: } ivand_qmul@121: // ivand_qmul@121: void ivand_qmul@121: MainWindow::ffwd() ivand_qmul@121: { ivand_qmul@121: if (!getMainModel()) return; ivand_qmul@121: ivand_qmul@121: int frame = m_viewManager->getPlaybackFrame(); ivand_qmul@121: ++frame; ivand_qmul@121: ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (!pane) return; ivand_qmul@121: ivand_qmul@121: Layer *layer = pane->getSelectedLayer(); ivand_qmul@121: ivand_qmul@121: if (!dynamic_cast(layer) && ivand_qmul@121: !dynamic_cast(layer)) return; ivand_qmul@121: ivand_qmul@121: size_t resolution = 0; ivand_qmul@121: if (!layer->snapToFeatureFrame(pane, frame, resolution, Layer::SnapRight)) { ivand_qmul@121: frame = getMainModel()->getEndFrame(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_viewManager->setPlaybackFrame(frame); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::ffwdEnd() ivand_qmul@121: { ivand_qmul@121: if (!getMainModel()) return; ivand_qmul@121: m_viewManager->setPlaybackFrame(getMainModel()->getEndFrame()); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::rewind() ivand_qmul@121: { ivand_qmul@121: if (!getMainModel()) return; ivand_qmul@121: ivand_qmul@121: int frame = m_viewManager->getPlaybackFrame(); ivand_qmul@121: if (frame > 0) --frame; ivand_qmul@121: ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (!pane) return; ivand_qmul@121: ivand_qmul@121: Layer *layer = pane->getSelectedLayer(); ivand_qmul@121: ivand_qmul@121: if (!dynamic_cast(layer) && ivand_qmul@121: !dynamic_cast(layer)) return; ivand_qmul@121: ivand_qmul@121: size_t resolution = 0; ivand_qmul@121: if (!layer->snapToFeatureFrame(pane, frame, resolution, Layer::SnapLeft)) { ivand_qmul@121: frame = getMainModel()->getEndFrame(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_viewManager->setPlaybackFrame(frame); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::rewindStart() ivand_qmul@121: { ivand_qmul@121: if (!getMainModel()) return; ivand_qmul@121: m_viewManager->setPlaybackFrame(getMainModel()->getStartFrame()); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::stop() ivand_qmul@121: { ivand_qmul@121: m_playSource->stop(); ivand_qmul@121: ivand_qmul@121: if (m_paneStack && m_paneStack->getCurrentPane()) { ivand_qmul@121: updateVisibleRangeDisplay(m_paneStack->getCurrentPane()); ivand_qmul@121: } else { ivand_qmul@121: m_myStatusMessage = ""; ivand_qmul@121: statusBar()->showMessage(""); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::addPane() ivand_qmul@121: { ivand_qmul@121: QObject *s = sender(); ivand_qmul@121: QAction *action = dynamic_cast(s); ivand_qmul@121: ivand_qmul@121: if (!action) { ivand_qmul@121: std::cerr << "WARNING: MainWindow::addPane: sender is not an action" ivand_qmul@121: << std::endl; ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: PaneActionMap::iterator i = m_paneActions.find(action); ivand_qmul@121: ivand_qmul@121: if (i == m_paneActions.end()) { ivand_qmul@121: std::cerr << "WARNING: MainWindow::addPane: unknown action " ivand_qmul@121: << action->objectName().toStdString() << std::endl; ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: addPane(i->second, action->text()); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::addPane(const PaneConfiguration &configuration, QString text) ivand_qmul@121: { ivand_qmul@121: CommandHistory::getInstance()->startCompoundOperation(text, true); ivand_qmul@121: ivand_qmul@121: AddPaneCommand *command = new AddPaneCommand(this); ivand_qmul@121: CommandHistory::getInstance()->addCommand(command); ivand_qmul@121: ivand_qmul@121: Pane *pane = command->getPane(); ivand_qmul@121: ivand_qmul@121: if (configuration.layer == LayerFactory::Spectrum) { ivand_qmul@121: pane->setPlaybackFollow(PlaybackScrollContinuous); ivand_qmul@121: pane->setFollowGlobalZoom(false); ivand_qmul@121: pane->setZoomLevel(512); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (configuration.layer != LayerFactory::TimeRuler && ivand_qmul@121: configuration.layer != LayerFactory::Spectrum) { ivand_qmul@121: ivand_qmul@121: if (!m_timeRulerLayer) { ivand_qmul@121: // std::cerr << "no time ruler layer, creating one" << std::endl; ivand_qmul@121: m_timeRulerLayer = m_document->createMainModelLayer ivand_qmul@121: (LayerFactory::TimeRuler); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: // std::cerr << "adding time ruler layer " << m_timeRulerLayer << std::endl; ivand_qmul@121: ivand_qmul@121: m_document->addLayerToView(pane, m_timeRulerLayer); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: Layer *newLayer = m_document->createLayer(configuration.layer); ivand_qmul@121: ivand_qmul@121: Model *suggestedModel = configuration.sourceModel; ivand_qmul@121: Model *model = 0; ivand_qmul@121: ivand_qmul@121: if (suggestedModel) { ivand_qmul@121: ivand_qmul@121: // check its validity ivand_qmul@121: std::vector inputModels = m_document->getTransformInputModels(); ivand_qmul@121: for (size_t j = 0; j < inputModels.size(); ++j) { ivand_qmul@121: if (inputModels[j] == suggestedModel) { ivand_qmul@121: model = suggestedModel; ivand_qmul@121: break; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (!model) { ivand_qmul@121: std::cerr << "WARNING: Model " << (void *)suggestedModel ivand_qmul@121: << " appears in pane action map, but is not reported " ivand_qmul@121: << "by document as a valid transform source" << std::endl; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (!model) model = m_document->getMainModel(); ivand_qmul@121: ivand_qmul@121: m_document->setModel(newLayer, model); ivand_qmul@121: ivand_qmul@121: m_document->setChannel(newLayer, configuration.channel); ivand_qmul@121: m_document->addLayerToView(pane, newLayer); ivand_qmul@121: ivand_qmul@121: m_paneStack->setCurrentPane(pane); ivand_qmul@121: m_paneStack->setCurrentLayer(pane, newLayer); ivand_qmul@121: ivand_qmul@121: // std::cerr << "MainWindow::addPane: global centre frame is " ivand_qmul@121: // << m_viewManager->getGlobalCentreFrame() << std::endl; ivand_qmul@121: // pane->setCentreFrame(m_viewManager->getGlobalCentreFrame()); ivand_qmul@121: ivand_qmul@121: CommandHistory::getInstance()->endCompoundOperation(); ivand_qmul@121: ivand_qmul@121: updateMenuStates(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: MainWindow::AddPaneCommand::AddPaneCommand(MainWindow *mw) : ivand_qmul@121: m_mw(mw), ivand_qmul@121: m_pane(0), ivand_qmul@121: m_prevCurrentPane(0), ivand_qmul@121: m_added(false) ivand_qmul@121: { ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: MainWindow::AddPaneCommand::~AddPaneCommand() ivand_qmul@121: { ivand_qmul@121: if (m_pane && !m_added) { ivand_qmul@121: m_mw->m_paneStack->deletePane(m_pane); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QString ivand_qmul@121: MainWindow::AddPaneCommand::getName() const ivand_qmul@121: { ivand_qmul@121: return tr("Add Pane"); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::AddPaneCommand::execute() ivand_qmul@121: { ivand_qmul@121: if (!m_pane) { ivand_qmul@121: m_prevCurrentPane = m_mw->m_paneStack->getCurrentPane(); ivand_qmul@121: m_pane = m_mw->m_paneStack->addPane(); ivand_qmul@121: ivand_qmul@121: connect(m_pane, SIGNAL(contextHelpChanged(const QString &)), ivand_qmul@121: m_mw, SLOT(contextHelpChanged(const QString &))); ivand_qmul@121: } else { ivand_qmul@121: m_mw->m_paneStack->showPane(m_pane); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_mw->m_paneStack->setCurrentPane(m_pane); ivand_qmul@121: m_mw->m_overview->registerView(m_pane); ivand_qmul@121: m_added = true; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::AddPaneCommand::unexecute() ivand_qmul@121: { ivand_qmul@121: m_mw->m_paneStack->hidePane(m_pane); ivand_qmul@121: m_mw->m_paneStack->setCurrentPane(m_prevCurrentPane); ivand_qmul@121: m_mw->m_overview->unregisterView(m_pane); ivand_qmul@121: m_added = false; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: MainWindow::RemovePaneCommand::RemovePaneCommand(MainWindow *mw, Pane *pane) : ivand_qmul@121: m_mw(mw), ivand_qmul@121: m_pane(pane), ivand_qmul@121: m_added(true) ivand_qmul@121: { ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: MainWindow::RemovePaneCommand::~RemovePaneCommand() ivand_qmul@121: { ivand_qmul@121: if (m_pane && !m_added) { ivand_qmul@121: m_mw->m_paneStack->deletePane(m_pane); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QString ivand_qmul@121: MainWindow::RemovePaneCommand::getName() const ivand_qmul@121: { ivand_qmul@121: return tr("Remove Pane"); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::RemovePaneCommand::execute() ivand_qmul@121: { ivand_qmul@121: m_prevCurrentPane = m_mw->m_paneStack->getCurrentPane(); ivand_qmul@121: m_mw->m_paneStack->hidePane(m_pane); ivand_qmul@121: m_mw->m_overview->unregisterView(m_pane); ivand_qmul@121: m_added = false; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::RemovePaneCommand::unexecute() ivand_qmul@121: { ivand_qmul@121: m_mw->m_paneStack->showPane(m_pane); ivand_qmul@121: m_mw->m_paneStack->setCurrentPane(m_prevCurrentPane); ivand_qmul@121: m_mw->m_overview->registerView(m_pane); ivand_qmul@121: m_added = true; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::addLayer() ivand_qmul@121: { ivand_qmul@121: QObject *s = sender(); ivand_qmul@121: QAction *action = dynamic_cast(s); ivand_qmul@121: ivand_qmul@121: if (!action) { ivand_qmul@121: std::cerr << "WARNING: MainWindow::addLayer: sender is not an action" ivand_qmul@121: << std::endl; ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: ivand_qmul@121: if (!pane) { ivand_qmul@121: std::cerr << "WARNING: MainWindow::addLayer: no current pane" << std::endl; ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: ExistingLayerActionMap::iterator ei = m_existingLayerActions.find(action); ivand_qmul@121: ivand_qmul@121: if (ei != m_existingLayerActions.end()) { ivand_qmul@121: Layer *newLayer = ei->second; ivand_qmul@121: m_document->addLayerToView(pane, newLayer); ivand_qmul@121: m_paneStack->setCurrentLayer(pane, newLayer); ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: ei = m_sliceActions.find(action); ivand_qmul@121: ivand_qmul@121: if (ei != m_sliceActions.end()) { ivand_qmul@121: Layer *newLayer = m_document->createLayer(LayerFactory::Slice); ivand_qmul@121: // document->setModel(newLayer, ei->second->getModel()); ivand_qmul@121: SliceableLayer *source = dynamic_cast(ei->second); ivand_qmul@121: SliceLayer *dest = dynamic_cast(newLayer); ivand_qmul@121: if (source && dest) { ivand_qmul@121: dest->setSliceableModel(source->getSliceableModel()); ivand_qmul@121: connect(source, SIGNAL(sliceableModelReplaced(const Model *, const Model *)), ivand_qmul@121: dest, SLOT(sliceableModelReplaced(const Model *, const Model *))); ivand_qmul@121: connect(m_document, SIGNAL(modelAboutToBeDeleted(Model *)), ivand_qmul@121: dest, SLOT(modelAboutToBeDeleted(Model *))); ivand_qmul@121: } ivand_qmul@121: m_document->addLayerToView(pane, newLayer); ivand_qmul@121: m_paneStack->setCurrentLayer(pane, newLayer); ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: TransformActionMap::iterator i = m_transformActions.find(action); ivand_qmul@121: ivand_qmul@121: if (i == m_transformActions.end()) { ivand_qmul@121: ivand_qmul@121: LayerActionMap::iterator i = m_layerActions.find(action); ivand_qmul@121: ivand_qmul@121: if (i == m_layerActions.end()) { ivand_qmul@121: std::cerr << "WARNING: MainWindow::addLayer: unknown action " ivand_qmul@121: << action->objectName().toStdString() << std::endl; ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: LayerFactory::LayerType type = i->second; ivand_qmul@121: ivand_qmul@121: LayerFactory::LayerTypeSet emptyTypes = ivand_qmul@121: LayerFactory::getInstance()->getValidEmptyLayerTypes(); ivand_qmul@121: ivand_qmul@121: Layer *newLayer; ivand_qmul@121: ivand_qmul@121: if (emptyTypes.find(type) != emptyTypes.end()) { ivand_qmul@121: ivand_qmul@121: newLayer = m_document->createEmptyLayer(type); ivand_qmul@121: m_toolActions[ViewManager::DrawMode]->trigger(); ivand_qmul@121: ivand_qmul@121: } else { ivand_qmul@121: ivand_qmul@121: newLayer = m_document->createMainModelLayer(type); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_document->addLayerToView(pane, newLayer); ivand_qmul@121: m_paneStack->setCurrentLayer(pane, newLayer); ivand_qmul@121: ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: TransformId transform = i->second; ivand_qmul@121: TransformFactory *factory = TransformFactory::getInstance(); ivand_qmul@121: ivand_qmul@121: QString configurationXml; ivand_qmul@121: ivand_qmul@121: int channel = -1; ivand_qmul@121: // pick up the default channel from any existing layers on the same pane ivand_qmul@121: for (int j = 0; j < pane->getLayerCount(); ++j) { ivand_qmul@121: int c = LayerFactory::getInstance()->getChannel(pane->getLayer(j)); ivand_qmul@121: if (c != -1) { ivand_qmul@121: channel = c; ivand_qmul@121: break; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: // We always ask for configuration, even if the plugin isn't ivand_qmul@121: // supposed to be configurable, because we need to let the user ivand_qmul@121: // change the execution context (block size etc). ivand_qmul@121: ivand_qmul@121: PluginTransform::ExecutionContext context(channel); ivand_qmul@121: ivand_qmul@121: std::vector candidateInputModels = ivand_qmul@121: m_document->getTransformInputModels(); ivand_qmul@121: ivand_qmul@121: Model *inputModel = factory->getConfigurationForTransform(transform, ivand_qmul@121: candidateInputModels, ivand_qmul@121: context, ivand_qmul@121: configurationXml, ivand_qmul@121: m_playSource); ivand_qmul@121: if (!inputModel) return; ivand_qmul@121: ivand_qmul@121: // std::cerr << "MainWindow::addLayer: Input model is " << inputModel << " \"" << inputModel->objectName().toStdString() << "\"" << std::endl; ivand_qmul@121: ivand_qmul@121: Layer *newLayer = m_document->createDerivedLayer(transform, ivand_qmul@121: inputModel, ivand_qmul@121: context, ivand_qmul@121: configurationXml); ivand_qmul@121: ivand_qmul@121: if (newLayer) { ivand_qmul@121: m_document->addLayerToView(pane, newLayer); ivand_qmul@121: m_document->setChannel(newLayer, context.channel); ivand_qmul@121: m_recentTransforms.add(transform); ivand_qmul@121: m_paneStack->setCurrentLayer(pane, newLayer); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: updateMenuStates(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::deleteCurrentPane() ivand_qmul@121: { ivand_qmul@121: CommandHistory::getInstance()->startCompoundOperation ivand_qmul@121: (tr("Delete Pane"), true); ivand_qmul@121: ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (pane) { ivand_qmul@121: while (pane->getLayerCount() > 0) { ivand_qmul@121: Layer *layer = pane->getLayer(0); ivand_qmul@121: if (layer) { ivand_qmul@121: m_document->removeLayerFromView(pane, layer); ivand_qmul@121: } else { ivand_qmul@121: break; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: RemovePaneCommand *command = new RemovePaneCommand(this, pane); ivand_qmul@121: CommandHistory::getInstance()->addCommand(command); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: CommandHistory::getInstance()->endCompoundOperation(); ivand_qmul@121: ivand_qmul@121: updateMenuStates(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::deleteCurrentLayer() ivand_qmul@121: { ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (pane) { ivand_qmul@121: Layer *layer = pane->getSelectedLayer(); ivand_qmul@121: if (layer) { lbajardsilogic@254: m_document->removeLayerFromViewWithoutCommand(pane, layer); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: updateMenuStates(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::renameCurrentLayer() ivand_qmul@121: { ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (pane) { ivand_qmul@121: Layer *layer = pane->getSelectedLayer(); ivand_qmul@121: if (layer) { ivand_qmul@121: bool ok = false; ivand_qmul@121: QString newName = QInputDialog::getText ivand_qmul@121: (this, tr("Rename Layer"), ivand_qmul@121: tr("New name for this layer:"), ivand_qmul@121: QLineEdit::Normal, layer->objectName(), &ok); ivand_qmul@121: if (ok) { ivand_qmul@121: layer->setObjectName(newName); ivand_qmul@121: setupExistingLayersMenus(); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void lbajardsilogic@127: MainWindow::playSpeedChanged(float value) ivand_qmul@121: { lbajardsilogic@127: /* lbajardsilogic@127: The value of the speed factor have been changed lbajardsilogic@127: in the TimeStretchFilter class. lbajardsilogic@127: The new hopfactor is given by value lbajardsilogic@127: */ lbajardsilogic@135: m_playSpeedVal = value; lbajardsilogic@127: lbajardsilogic@137: //std::cerr << "m_playSpeedVal : " << m_playSpeedVal << std::endl; ivand_qmul@121: } ivand_qmul@121: lbajardsilogic@127: /*void ivand_qmul@121: MainWindow::playSharpenToggled() ivand_qmul@121: { ivand_qmul@121: QSettings settings; ivand_qmul@121: settings.beginGroup("MainWindow"); ivand_qmul@121: settings.setValue("playsharpen", m_playSharpen->isChecked()); ivand_qmul@121: settings.endGroup(); ivand_qmul@121: ivand_qmul@121: playSpeedChanged(m_playSpeed->value()); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::playMonoToggled() ivand_qmul@121: { ivand_qmul@121: QSettings settings; ivand_qmul@121: settings.beginGroup("MainWindow"); ivand_qmul@121: settings.setValue("playmono", m_playMono->isChecked()); ivand_qmul@121: settings.endGroup(); ivand_qmul@121: ivand_qmul@121: playSpeedChanged(m_playSpeed->value()); ivand_qmul@121: } lbajardsilogic@127: */ ivand_qmul@121: void ivand_qmul@121: MainWindow::playbackFrameChanged(unsigned long frame) ivand_qmul@121: { ivand_qmul@121: if (!(m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; ivand_qmul@121: ivand_qmul@121: RealTime now = RealTime::frame2RealTime ivand_qmul@121: (frame, getMainModel()->getSampleRate()); ivand_qmul@121: ivand_qmul@121: if (now.sec == m_lastPlayStatusSec) return; ivand_qmul@121: ivand_qmul@121: RealTime then = RealTime::frame2RealTime ivand_qmul@121: (m_playSource->getPlayEndFrame(), getMainModel()->getSampleRate()); ivand_qmul@121: ivand_qmul@121: QString nowStr; ivand_qmul@121: QString thenStr; ivand_qmul@121: QString remainingStr; ivand_qmul@121: ivand_qmul@121: if (then.sec > 10) { ivand_qmul@121: nowStr = now.toSecText().c_str(); ivand_qmul@121: thenStr = then.toSecText().c_str(); ivand_qmul@121: remainingStr = (then - now).toSecText().c_str(); ivand_qmul@121: m_lastPlayStatusSec = now.sec; ivand_qmul@121: } else { ivand_qmul@121: nowStr = now.toText(true).c_str(); ivand_qmul@121: thenStr = then.toText(true).c_str(); ivand_qmul@121: remainingStr = (then - now).toText(true).c_str(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_myStatusMessage = tr("Playing: %1 of %2 (%3 remaining)") ivand_qmul@121: .arg(nowStr).arg(thenStr).arg(remainingStr); ivand_qmul@121: ivand_qmul@121: statusBar()->showMessage(m_myStatusMessage); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::globalCentreFrameChanged(unsigned long ) ivand_qmul@121: { ivand_qmul@121: if ((m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; ivand_qmul@121: Pane *p = 0; ivand_qmul@121: if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return; ivand_qmul@121: if (!p->getFollowGlobalPan()) return; ivand_qmul@121: updateVisibleRangeDisplay(p); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::viewCentreFrameChanged(View *v, unsigned long ) ivand_qmul@121: { ivand_qmul@121: if ((m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; ivand_qmul@121: Pane *p = 0; ivand_qmul@121: if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return; ivand_qmul@121: if (v == p) updateVisibleRangeDisplay(p); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::viewZoomLevelChanged(View *v, unsigned long , bool ) ivand_qmul@121: { ivand_qmul@121: if ((m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; ivand_qmul@121: Pane *p = 0; ivand_qmul@121: if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return; ivand_qmul@121: if (v == p) updateVisibleRangeDisplay(p); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::updateVisibleRangeDisplay(Pane *p) const ivand_qmul@121: { ivand_qmul@121: if (!getMainModel() || !p) { ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: bool haveSelection = false; ivand_qmul@121: size_t startFrame = 0, endFrame = 0; ivand_qmul@121: ivand_qmul@121: if (m_viewManager && m_viewManager->haveInProgressSelection()) { ivand_qmul@121: ivand_qmul@121: bool exclusive = false; ivand_qmul@121: Selection s = m_viewManager->getInProgressSelection(exclusive); ivand_qmul@121: ivand_qmul@121: if (!s.isEmpty()) { ivand_qmul@121: haveSelection = true; ivand_qmul@121: startFrame = s.getStartFrame(); ivand_qmul@121: endFrame = s.getEndFrame(); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (!haveSelection) { ivand_qmul@121: startFrame = p->getFirstVisibleFrame(); ivand_qmul@121: endFrame = p->getLastVisibleFrame(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: RealTime start = RealTime::frame2RealTime ivand_qmul@121: (startFrame, getMainModel()->getSampleRate()); ivand_qmul@121: ivand_qmul@121: RealTime end = RealTime::frame2RealTime ivand_qmul@121: (endFrame, getMainModel()->getSampleRate()); ivand_qmul@121: ivand_qmul@121: RealTime duration = end - start; ivand_qmul@121: ivand_qmul@121: QString startStr, endStr, durationStr; ivand_qmul@121: startStr = start.toText(true).c_str(); ivand_qmul@121: endStr = end.toText(true).c_str(); ivand_qmul@121: durationStr = duration.toText(true).c_str(); ivand_qmul@121: ivand_qmul@121: if (haveSelection) { ivand_qmul@121: m_myStatusMessage = tr("Selection: %1 to %2 (duration %3)") ivand_qmul@121: .arg(startStr).arg(endStr).arg(durationStr); ivand_qmul@121: } else { ivand_qmul@121: m_myStatusMessage = tr("Visible: %1 to %2 (duration %3)") ivand_qmul@121: .arg(startStr).arg(endStr).arg(durationStr); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: statusBar()->showMessage(m_myStatusMessage); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::outputLevelsChanged(float left, float right) ivand_qmul@121: { ivand_qmul@121: m_fader->setPeakLeft(left); ivand_qmul@121: m_fader->setPeakRight(right); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::sampleRateMismatch(size_t requested, size_t actual, ivand_qmul@121: bool willResample) ivand_qmul@121: { ivand_qmul@121: if (!willResample) { ivand_qmul@121: //!!! more helpful message needed ivand_qmul@121: QMessageBox::information ivand_qmul@121: (this, tr("Sample rate mismatch"), ivand_qmul@121: tr("The sample rate of this audio file (%1 Hz) does not match\nthe current playback rate (%2 Hz).\n\nThe file will play at the wrong speed and pitch.") ivand_qmul@121: .arg(requested).arg(actual)); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: updateDescriptionLabel(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::audioOverloadPluginDisabled() ivand_qmul@121: { ivand_qmul@121: QMessageBox::information ivand_qmul@121: (this, tr("Audio processing overload"), ivand_qmul@121: tr("Audio effects plugin auditioning has been disabled\ndue to a processing overload.")); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::layerAdded(Layer *) ivand_qmul@121: { ivand_qmul@121: // std::cerr << "MainWindow::layerAdded(" << layer << ")" << std::endl; ivand_qmul@121: // setupExistingLayersMenu(); ivand_qmul@121: updateMenuStates(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::layerRemoved(Layer *) ivand_qmul@121: { ivand_qmul@121: // std::cerr << "MainWindow::layerRemoved(" << layer << ")" << std::endl; ivand_qmul@121: setupExistingLayersMenus(); ivand_qmul@121: updateMenuStates(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::layerAboutToBeDeleted(Layer *layer) ivand_qmul@121: { ivand_qmul@121: // std::cerr << "MainWindow::layerAboutToBeDeleted(" << layer << ")" << std::endl; ivand_qmul@121: if (layer == m_timeRulerLayer) { ivand_qmul@121: // std::cerr << "(this is the time ruler layer)" << std::endl; ivand_qmul@121: m_timeRulerLayer = 0; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::layerInAView(Layer *layer, bool inAView) ivand_qmul@121: { ivand_qmul@121: // std::cerr << "MainWindow::layerInAView(" << layer << "," << inAView << ")" << std::endl; ivand_qmul@121: ivand_qmul@121: // Check whether we need to add or remove model from play source ivand_qmul@121: Model *model = layer->getModel(); ivand_qmul@121: if (model) { ivand_qmul@121: if (inAView) { ivand_qmul@121: m_playSource->addModel(model); ivand_qmul@121: } else { ivand_qmul@121: bool found = false; ivand_qmul@121: for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { ivand_qmul@121: Pane *pane = m_paneStack->getPane(i); ivand_qmul@121: if (!pane) continue; ivand_qmul@121: for (int j = 0; j < pane->getLayerCount(); ++j) { ivand_qmul@121: Layer *pl = pane->getLayer(j); ivand_qmul@121: if (pl && pl->getModel() == model) { ivand_qmul@121: found = true; ivand_qmul@121: break; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: if (found) break; ivand_qmul@121: } ivand_qmul@121: if (!found) m_playSource->removeModel(model); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: setupExistingLayersMenus(); ivand_qmul@121: updateMenuStates(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::modelAdded(Model *model) ivand_qmul@121: { ivand_qmul@121: // std::cerr << "MainWindow::modelAdded(" << model << ")" << std::endl; ivand_qmul@121: m_playSource->addModel(model); ivand_qmul@121: if (dynamic_cast(model)) { ivand_qmul@121: setupPaneAndLayerMenus(); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::mainModelChanged(WaveFileModel *model) ivand_qmul@121: { ivand_qmul@121: // std::cerr << "MainWindow::mainModelChanged(" << model << ")" << std::endl; ivand_qmul@121: updateDescriptionLabel(); ivand_qmul@121: m_panLayer->setModel(model); ivand_qmul@121: if (model) m_viewManager->setMainModelSampleRate(model->getSampleRate()); ivand_qmul@121: if (model && !m_playTarget && m_audioOutput) createPlayTarget(); ivand_qmul@121: ivand_qmul@121: updateMenuStates(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::modelAboutToBeDeleted(Model *model) ivand_qmul@121: { ivand_qmul@121: // std::cerr << "MainWindow::modelAboutToBeDeleted(" << model << ")" << std::endl; ivand_qmul@121: m_playSource->removeModel(model); ivand_qmul@121: FFTDataServer::modelAboutToBeDeleted(model); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::modelGenerationFailed(QString transformName) ivand_qmul@121: { ivand_qmul@121: QMessageBox::warning ivand_qmul@121: (this, ivand_qmul@121: tr("Failed to generate layer"), ivand_qmul@121: tr("Failed to generate a derived layer.\n\nThe layer transform \"%1\" failed.\n\nThis probably means that a plugin failed to initialise, perhaps because it\nrejected the processing block size that was requested.") ivand_qmul@121: .arg(transformName), ivand_qmul@121: QMessageBox::Ok, 0); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::modelRegenerationFailed(QString layerName, QString transformName) ivand_qmul@121: { ivand_qmul@121: QMessageBox::warning ivand_qmul@121: (this, ivand_qmul@121: tr("Failed to regenerate layer"), ivand_qmul@121: tr("Failed to regenerate derived layer \"%1\".\n\nThe layer transform \"%2\" failed to run.\n\nThis probably means the layer used a plugin that is not currently available.") ivand_qmul@121: .arg(layerName).arg(transformName), ivand_qmul@121: QMessageBox::Ok, 0); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::rightButtonMenuRequested(Pane *pane, QPoint position) ivand_qmul@121: { ivand_qmul@121: // std::cerr << "MainWindow::rightButtonMenuRequested(" << pane << ", " << position.x() << ", " << position.y() << ")" << std::endl; ivand_qmul@121: m_paneStack->setCurrentPane(pane); ivand_qmul@121: m_rightButtonMenu->popup(position); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::propertyStacksResized() ivand_qmul@121: { ivand_qmul@121: /* ivand_qmul@121: std::cerr << "MainWindow::propertyStacksResized" << std::endl; ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (pane && m_overview) { ivand_qmul@121: std::cerr << "Fixed width: " << pane->width() << std::endl; ivand_qmul@121: m_overview->setFixedWidth(pane->width()); ivand_qmul@121: } ivand_qmul@121: */ ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::showLayerTree() ivand_qmul@121: { ivand_qmul@121: QTreeView *view = new QTreeView(); ivand_qmul@121: LayerTreeModel *tree = new LayerTreeModel(m_paneStack); ivand_qmul@121: view->expand(tree->index(0, 0, QModelIndex())); ivand_qmul@121: view->setModel(tree); ivand_qmul@121: view->show(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::pollOSC() ivand_qmul@121: { ivand_qmul@121: if (!m_oscQueue || m_oscQueue->isEmpty()) return; ivand_qmul@121: std::cerr << "MainWindow::pollOSC: have " << m_oscQueue->getMessagesAvailable() << " messages" << std::endl; ivand_qmul@121: ivand_qmul@121: if (m_openingAudioFile) return; ivand_qmul@121: ivand_qmul@121: OSCMessage message = m_oscQueue->readMessage(); ivand_qmul@121: ivand_qmul@121: if (message.getTarget() != 0) { ivand_qmul@121: return; //!!! for now -- this class is target 0, others not handled yet ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: handleOSCMessage(message); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::handleOSCMessage(const OSCMessage &message) ivand_qmul@121: { ivand_qmul@121: std::cerr << "MainWindow::handleOSCMessage: thread id = " ivand_qmul@121: << QThread::currentThreadId() << std::endl; ivand_qmul@121: ivand_qmul@121: // This large function should really be abstracted out. ivand_qmul@121: ivand_qmul@121: if (message.getMethod() == "open") { ivand_qmul@121: ivand_qmul@121: if (message.getArgCount() == 1 && ivand_qmul@121: message.getArg(0).canConvert(QVariant::String)) { ivand_qmul@121: QString path = message.getArg(0).toString(); ivand_qmul@121: if (openSomeFile(path, ReplaceMainModel) != FileOpenSucceeded) { ivand_qmul@121: std::cerr << "MainWindow::handleOSCMessage: File open failed for path \"" ivand_qmul@121: << path.toStdString() << "\"" << std::endl; ivand_qmul@121: } ivand_qmul@121: //!!! we really need to spin here and not return until the ivand_qmul@121: // file has been completely decoded... ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "openadditional") { ivand_qmul@121: ivand_qmul@121: if (message.getArgCount() == 1 && ivand_qmul@121: message.getArg(0).canConvert(QVariant::String)) { ivand_qmul@121: QString path = message.getArg(0).toString(); ivand_qmul@121: if (openSomeFile(path, CreateAdditionalModel) != FileOpenSucceeded) { ivand_qmul@121: std::cerr << "MainWindow::handleOSCMessage: File open failed for path \"" ivand_qmul@121: << path.toStdString() << "\"" << std::endl; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "recent" || ivand_qmul@121: message.getMethod() == "last") { ivand_qmul@121: ivand_qmul@121: int n = 0; ivand_qmul@121: if (message.getMethod() == "recent" && ivand_qmul@121: message.getArgCount() == 1 && ivand_qmul@121: message.getArg(0).canConvert(QVariant::Int)) { ivand_qmul@121: n = message.getArg(0).toInt() - 1; ivand_qmul@121: } ivand_qmul@121: std::vector recent = m_recentFiles.getRecent(); ivand_qmul@121: if (n >= 0 && n < int(recent.size())) { ivand_qmul@121: if (openSomeFile(recent[n], ReplaceMainModel) != FileOpenSucceeded) { ivand_qmul@121: std::cerr << "MainWindow::handleOSCMessage: File open failed for path \"" ivand_qmul@121: << recent[n].toStdString() << "\"" << std::endl; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "save") { ivand_qmul@121: ivand_qmul@121: QString path; ivand_qmul@121: if (message.getArgCount() == 1 && ivand_qmul@121: message.getArg(0).canConvert(QVariant::String)) { ivand_qmul@121: path = message.getArg(0).toString(); ivand_qmul@121: if (QFileInfo(path).exists()) { ivand_qmul@121: std::cerr << "MainWindow::handleOSCMessage: Refusing to overwrite existing file in save" << std::endl; ivand_qmul@121: } else { ivand_qmul@121: saveSessionFile(path); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "export") { ivand_qmul@121: ivand_qmul@121: QString path; ivand_qmul@121: if (getMainModel()) { ivand_qmul@121: if (message.getArgCount() == 1 && ivand_qmul@121: message.getArg(0).canConvert(QVariant::String)) { ivand_qmul@121: path = message.getArg(0).toString(); ivand_qmul@121: if (QFileInfo(path).exists()) { ivand_qmul@121: std::cerr << "MainWindow::handleOSCMessage: Refusing to overwrite existing file in export" << std::endl; ivand_qmul@121: } else { ivand_qmul@121: WavFileWriter writer(path, ivand_qmul@121: getMainModel()->getSampleRate(), ivand_qmul@121: getMainModel()->getChannelCount()); ivand_qmul@121: MultiSelection ms = m_viewManager->getSelection(); ivand_qmul@121: if (!ms.getSelections().empty()) { ivand_qmul@121: writer.writeModel(getMainModel(), &ms); ivand_qmul@121: } else { ivand_qmul@121: writer.writeModel(getMainModel()); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "jump" || ivand_qmul@121: message.getMethod() == "play") { ivand_qmul@121: ivand_qmul@121: if (getMainModel()) { ivand_qmul@121: ivand_qmul@121: unsigned long frame = m_viewManager->getPlaybackFrame(); ivand_qmul@121: bool selection = false; ivand_qmul@121: bool play = (message.getMethod() == "play"); ivand_qmul@121: ivand_qmul@121: if (message.getArgCount() == 1) { ivand_qmul@121: ivand_qmul@121: if (message.getArg(0).canConvert(QVariant::String) && ivand_qmul@121: message.getArg(0).toString() == "selection") { ivand_qmul@121: ivand_qmul@121: selection = true; ivand_qmul@121: ivand_qmul@121: } else if (message.getArg(0).canConvert(QVariant::String) && ivand_qmul@121: message.getArg(0).toString() == "end") { ivand_qmul@121: ivand_qmul@121: frame = getMainModel()->getEndFrame(); ivand_qmul@121: ivand_qmul@121: } else if (message.getArg(0).canConvert(QVariant::Double)) { ivand_qmul@121: ivand_qmul@121: double time = message.getArg(0).toDouble(); ivand_qmul@121: if (time < 0.0) time = 0.0; ivand_qmul@121: ivand_qmul@121: frame = lrint(time * getMainModel()->getSampleRate()); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (frame > getMainModel()->getEndFrame()) { ivand_qmul@121: frame = getMainModel()->getEndFrame(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (play) { ivand_qmul@121: m_viewManager->setPlaySelectionMode(selection); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (selection) { ivand_qmul@121: MultiSelection::SelectionList sl = m_viewManager->getSelections(); ivand_qmul@121: if (!sl.empty()) { ivand_qmul@121: frame = sl.begin()->getStartFrame(); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_viewManager->setPlaybackFrame(frame); ivand_qmul@121: ivand_qmul@121: if (play && !m_playSource->isPlaying()) { ivand_qmul@121: m_playSource->play(frame); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "stop") { ivand_qmul@121: ivand_qmul@121: if (m_playSource->isPlaying()) m_playSource->stop(); ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "loop") { ivand_qmul@121: ivand_qmul@121: if (message.getArgCount() == 1 && ivand_qmul@121: message.getArg(0).canConvert(QVariant::String)) { ivand_qmul@121: ivand_qmul@121: QString str = message.getArg(0).toString(); ivand_qmul@121: if (str == "on") { ivand_qmul@121: m_viewManager->setPlayLoopMode(true); ivand_qmul@121: } else if (str == "off") { ivand_qmul@121: m_viewManager->setPlayLoopMode(false); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "select" || ivand_qmul@121: message.getMethod() == "addselect") { ivand_qmul@121: ivand_qmul@121: if (getMainModel()) { ivand_qmul@121: ivand_qmul@121: int f0 = getMainModel()->getStartFrame(); ivand_qmul@121: int f1 = getMainModel()->getEndFrame(); ivand_qmul@121: ivand_qmul@121: bool done = false; ivand_qmul@121: ivand_qmul@121: if (message.getArgCount() == 2 && ivand_qmul@121: message.getArg(0).canConvert(QVariant::Double) && ivand_qmul@121: message.getArg(1).canConvert(QVariant::Double)) { ivand_qmul@121: ivand_qmul@121: double t0 = message.getArg(0).toDouble(); ivand_qmul@121: double t1 = message.getArg(1).toDouble(); ivand_qmul@121: if (t1 < t0) { double temp = t0; t0 = t1; t1 = temp; } ivand_qmul@121: if (t0 < 0.0) t0 = 0.0; ivand_qmul@121: if (t1 < 0.0) t1 = 0.0; ivand_qmul@121: ivand_qmul@121: f0 = lrint(t0 * getMainModel()->getSampleRate()); ivand_qmul@121: f1 = lrint(t1 * getMainModel()->getSampleRate()); ivand_qmul@121: ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: Layer *layer = 0; ivand_qmul@121: if (pane) layer = pane->getSelectedLayer(); ivand_qmul@121: if (layer) { ivand_qmul@121: size_t resolution; ivand_qmul@121: layer->snapToFeatureFrame(pane, f0, resolution, ivand_qmul@121: Layer::SnapLeft); ivand_qmul@121: layer->snapToFeatureFrame(pane, f1, resolution, ivand_qmul@121: Layer::SnapRight); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getArgCount() == 1 && ivand_qmul@121: message.getArg(0).canConvert(QVariant::String)) { ivand_qmul@121: ivand_qmul@121: QString str = message.getArg(0).toString(); ivand_qmul@121: if (str == "none") { ivand_qmul@121: m_viewManager->clearSelections(); ivand_qmul@121: done = true; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (!done) { ivand_qmul@121: if (message.getMethod() == "select") { ivand_qmul@121: m_viewManager->setSelection(Selection(f0, f1)); ivand_qmul@121: } else { ivand_qmul@121: m_viewManager->addSelection(Selection(f0, f1)); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "add") { ivand_qmul@121: ivand_qmul@121: if (getMainModel()) { ivand_qmul@121: ivand_qmul@121: if (message.getArgCount() >= 1 && ivand_qmul@121: message.getArg(0).canConvert(QVariant::String)) { ivand_qmul@121: ivand_qmul@121: int channel = -1; ivand_qmul@121: if (message.getArgCount() == 2 && ivand_qmul@121: message.getArg(0).canConvert(QVariant::Int)) { ivand_qmul@121: channel = message.getArg(0).toInt(); ivand_qmul@121: if (channel < -1 || ivand_qmul@121: channel > int(getMainModel()->getChannelCount())) { ivand_qmul@121: std::cerr << "WARNING: MainWindow::handleOSCMessage: channel " ivand_qmul@121: << channel << " out of range" << std::endl; ivand_qmul@121: channel = -1; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: QString str = message.getArg(0).toString(); ivand_qmul@121: ivand_qmul@121: LayerFactory::LayerType type = ivand_qmul@121: LayerFactory::getInstance()->getLayerTypeForName(str); ivand_qmul@121: ivand_qmul@121: if (type == LayerFactory::UnknownLayer) { ivand_qmul@121: std::cerr << "WARNING: MainWindow::handleOSCMessage: unknown layer " ivand_qmul@121: << "type " << str.toStdString() << std::endl; ivand_qmul@121: } else { ivand_qmul@121: ivand_qmul@121: PaneConfiguration configuration(type, ivand_qmul@121: getMainModel(), ivand_qmul@121: channel); ivand_qmul@121: ivand_qmul@121: addPane(configuration, ivand_qmul@121: tr("Add %1 Pane") ivand_qmul@121: .arg(LayerFactory::getInstance()-> ivand_qmul@121: getLayerPresentationName(type))); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "undo") { ivand_qmul@121: ivand_qmul@121: CommandHistory::getInstance()->undo(); ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "redo") { ivand_qmul@121: ivand_qmul@121: CommandHistory::getInstance()->redo(); ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "set") { ivand_qmul@121: ivand_qmul@121: if (message.getArgCount() == 2 && ivand_qmul@121: message.getArg(0).canConvert(QVariant::String) && ivand_qmul@121: message.getArg(1).canConvert(QVariant::Double)) { ivand_qmul@121: ivand_qmul@121: QString property = message.getArg(0).toString(); ivand_qmul@121: float value = (float)message.getArg(1).toDouble(); ivand_qmul@121: ivand_qmul@121: if (property == "gain") { ivand_qmul@121: if (value < 0.0) value = 0.0; ivand_qmul@121: m_fader->setValue(value); ivand_qmul@121: if (m_playTarget) m_playTarget->setOutputGain(value); lbajardsilogic@127: } /*else if (property == "speedup") { ivand_qmul@121: m_playSpeed->setMappedValue(value); lbajardsilogic@127: }*/ else if (property == "overlays") { ivand_qmul@121: if (value < 0.5) { ivand_qmul@121: m_viewManager->setOverlayMode(ViewManager::NoOverlays); ivand_qmul@121: } else if (value < 1.5) { ivand_qmul@121: m_viewManager->setOverlayMode(ViewManager::MinimalOverlays); ivand_qmul@121: } else if (value < 2.5) { ivand_qmul@121: m_viewManager->setOverlayMode(ViewManager::StandardOverlays); ivand_qmul@121: } else { ivand_qmul@121: m_viewManager->setOverlayMode(ViewManager::AllOverlays); ivand_qmul@121: } ivand_qmul@121: } else if (property == "zoomwheels") { ivand_qmul@121: m_viewManager->setZoomWheelsEnabled(value > 0.5); lbajardsilogic@204: } ivand_qmul@121: ivand_qmul@121: } else { ivand_qmul@121: PropertyContainer *container = 0; ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (pane && ivand_qmul@121: message.getArgCount() == 3 && ivand_qmul@121: message.getArg(0).canConvert(QVariant::String) && ivand_qmul@121: message.getArg(1).canConvert(QVariant::String) && ivand_qmul@121: message.getArg(2).canConvert(QVariant::String)) { ivand_qmul@121: if (message.getArg(0).toString() == "pane") { ivand_qmul@121: container = pane->getPropertyContainer(0); ivand_qmul@121: } else if (message.getArg(0).toString() == "layer") { ivand_qmul@121: container = pane->getSelectedLayer(); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: if (container) { ivand_qmul@121: QString nameString = message.getArg(1).toString(); ivand_qmul@121: QString valueString = message.getArg(2).toString(); ivand_qmul@121: container->setPropertyWithCommand(nameString, valueString); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "setcurrent") { ivand_qmul@121: ivand_qmul@121: int paneIndex = -1, layerIndex = -1; ivand_qmul@121: bool wantLayer = false; ivand_qmul@121: ivand_qmul@121: if (message.getArgCount() >= 1 && ivand_qmul@121: message.getArg(0).canConvert(QVariant::Int)) { ivand_qmul@121: ivand_qmul@121: paneIndex = message.getArg(0).toInt() - 1; ivand_qmul@121: ivand_qmul@121: if (message.getArgCount() >= 2 && ivand_qmul@121: message.getArg(1).canConvert(QVariant::Int)) { ivand_qmul@121: wantLayer = true; ivand_qmul@121: layerIndex = message.getArg(1).toInt() - 1; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: if (paneIndex >= 0 && paneIndex < m_paneStack->getPaneCount()) { ivand_qmul@121: Pane *pane = m_paneStack->getPane(paneIndex); ivand_qmul@121: m_paneStack->setCurrentPane(pane); ivand_qmul@121: if (layerIndex >= 0 && layerIndex < pane->getLayerCount()) { ivand_qmul@121: Layer *layer = pane->getLayer(layerIndex); ivand_qmul@121: m_paneStack->setCurrentLayer(pane, layer); ivand_qmul@121: } else if (wantLayer && layerIndex == -1) { ivand_qmul@121: m_paneStack->setCurrentLayer(pane, 0); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "delete") { ivand_qmul@121: ivand_qmul@121: if (message.getArgCount() == 1 && ivand_qmul@121: message.getArg(0).canConvert(QVariant::String)) { ivand_qmul@121: ivand_qmul@121: QString target = message.getArg(0).toString(); ivand_qmul@121: ivand_qmul@121: if (target == "pane") { ivand_qmul@121: ivand_qmul@121: deleteCurrentPane(); ivand_qmul@121: ivand_qmul@121: } else if (target == "layer") { ivand_qmul@121: ivand_qmul@121: deleteCurrentLayer(); ivand_qmul@121: ivand_qmul@121: } else { ivand_qmul@121: ivand_qmul@121: std::cerr << "WARNING: MainWindow::handleOSCMessage: Unknown delete target " << target.toStdString() << std::endl; ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "zoom") { ivand_qmul@121: ivand_qmul@121: if (message.getArgCount() == 1) { ivand_qmul@121: if (message.getArg(0).canConvert(QVariant::String) && ivand_qmul@121: message.getArg(0).toString() == "in") { ivand_qmul@121: zoomIn(); ivand_qmul@121: } else if (message.getArg(0).canConvert(QVariant::String) && ivand_qmul@121: message.getArg(0).toString() == "out") { ivand_qmul@121: zoomOut(); ivand_qmul@121: } else if (message.getArg(0).canConvert(QVariant::String) && ivand_qmul@121: message.getArg(0).toString() == "default") { ivand_qmul@121: zoomDefault(); ivand_qmul@121: } else if (message.getArg(0).canConvert(QVariant::Double)) { ivand_qmul@121: double level = message.getArg(0).toDouble(); ivand_qmul@121: Pane *currentPane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (level < 1.0) level = 1.0; ivand_qmul@121: if (currentPane) currentPane->setZoomLevel(lrint(level)); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "zoomvertical") { ivand_qmul@121: ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: Layer *layer = 0; ivand_qmul@121: if (pane && pane->getLayerCount() > 0) { ivand_qmul@121: layer = pane->getLayer(pane->getLayerCount() - 1); ivand_qmul@121: } ivand_qmul@121: int defaultStep = 0; ivand_qmul@121: int steps = 0; ivand_qmul@121: if (layer) { ivand_qmul@121: steps = layer->getVerticalZoomSteps(defaultStep); ivand_qmul@121: if (message.getArgCount() == 1 && steps > 0) { ivand_qmul@121: if (message.getArg(0).canConvert(QVariant::String) && ivand_qmul@121: message.getArg(0).toString() == "in") { ivand_qmul@121: int step = layer->getCurrentVerticalZoomStep() + 1; ivand_qmul@121: if (step < steps) layer->setVerticalZoomStep(step); ivand_qmul@121: } else if (message.getArg(0).canConvert(QVariant::String) && ivand_qmul@121: message.getArg(0).toString() == "out") { ivand_qmul@121: int step = layer->getCurrentVerticalZoomStep() - 1; ivand_qmul@121: if (step >= 0) layer->setVerticalZoomStep(step); ivand_qmul@121: } else if (message.getArg(0).canConvert(QVariant::String) && ivand_qmul@121: message.getArg(0).toString() == "default") { ivand_qmul@121: layer->setVerticalZoomStep(defaultStep); ivand_qmul@121: } ivand_qmul@121: } else if (message.getArgCount() == 2) { ivand_qmul@121: if (message.getArg(0).canConvert(QVariant::Double) && ivand_qmul@121: message.getArg(1).canConvert(QVariant::Double)) { ivand_qmul@121: double min = message.getArg(0).toDouble(); ivand_qmul@121: double max = message.getArg(1).toDouble(); ivand_qmul@121: layer->setDisplayExtents(min, max); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "quit") { ivand_qmul@121: ivand_qmul@121: m_abandoning = true; ivand_qmul@121: close(); ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "resize") { ivand_qmul@121: ivand_qmul@121: if (message.getArgCount() == 2) { ivand_qmul@121: ivand_qmul@121: int width = 0, height = 0; ivand_qmul@121: ivand_qmul@121: if (message.getArg(1).canConvert(QVariant::Int)) { ivand_qmul@121: ivand_qmul@121: height = message.getArg(1).toInt(); ivand_qmul@121: ivand_qmul@121: if (message.getArg(0).canConvert(QVariant::String) && ivand_qmul@121: message.getArg(0).toString() == "pane") { ivand_qmul@121: ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (pane) pane->resize(pane->width(), height); ivand_qmul@121: ivand_qmul@121: } else if (message.getArg(0).canConvert(QVariant::Int)) { ivand_qmul@121: ivand_qmul@121: width = message.getArg(0).toInt(); ivand_qmul@121: resize(width, height); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else if (message.getMethod() == "transform") { ivand_qmul@121: ivand_qmul@121: Pane *pane = m_paneStack->getCurrentPane(); ivand_qmul@121: ivand_qmul@121: if (getMainModel() && ivand_qmul@121: pane && ivand_qmul@121: message.getArgCount() == 1 && ivand_qmul@121: message.getArg(0).canConvert(QVariant::String)) { ivand_qmul@121: ivand_qmul@121: TransformId transform = message.getArg(0).toString(); ivand_qmul@121: ivand_qmul@121: Layer *newLayer = m_document->createDerivedLayer ivand_qmul@121: (transform, ivand_qmul@121: getMainModel(), ivand_qmul@121: TransformFactory::getInstance()->getDefaultContextForTransform ivand_qmul@121: (transform, getMainModel()), ivand_qmul@121: ""); ivand_qmul@121: ivand_qmul@121: if (newLayer) { ivand_qmul@121: m_document->addLayerToView(pane, newLayer); ivand_qmul@121: m_recentTransforms.add(transform); ivand_qmul@121: m_paneStack->setCurrentLayer(pane, newLayer); ivand_qmul@121: } ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } else { ivand_qmul@121: std::cerr << "WARNING: MainWindow::handleOSCMessage: Unknown or unsupported " ivand_qmul@121: << "method \"" << message.getMethod().toStdString() ivand_qmul@121: << "\"" << std::endl; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::preferences() ivand_qmul@121: { ivand_qmul@121: if (!m_preferencesDialog.isNull()) { ivand_qmul@121: m_preferencesDialog->show(); ivand_qmul@121: m_preferencesDialog->raise(); ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: m_preferencesDialog = new PreferencesDialog(this); ivand_qmul@121: ivand_qmul@121: // DeleteOnClose is safe here, because m_preferencesDialog is a ivand_qmul@121: // QPointer that will be zeroed when the dialog is deleted. We ivand_qmul@121: // use it in preference to leaving the dialog lying around because ivand_qmul@121: // if you Cancel the dialog, it resets the preferences state ivand_qmul@121: // without resetting its own widgets, so its state will be ivand_qmul@121: // incorrect when next shown unless we construct it afresh ivand_qmul@121: m_preferencesDialog->setAttribute(Qt::WA_DeleteOnClose); ivand_qmul@121: ivand_qmul@121: m_preferencesDialog->show(); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::mouseEnteredWidget() ivand_qmul@121: { ivand_qmul@121: QWidget *w = dynamic_cast(sender()); ivand_qmul@121: if (!w) return; ivand_qmul@121: ivand_qmul@121: if (w == m_fader) { ivand_qmul@121: contextHelpChanged(tr("Adjust the master playback level")); lbajardsilogic@127: } /*else if (w == m_playSpeed) { ivand_qmul@121: contextHelpChanged(tr("Adjust the master playback speed")); ivand_qmul@121: } else if (w == m_playSharpen && w->isEnabled()) { ivand_qmul@121: contextHelpChanged(tr("Toggle transient sharpening for playback time scaling")); ivand_qmul@121: } else if (w == m_playMono && w->isEnabled()) { ivand_qmul@121: contextHelpChanged(tr("Toggle mono mode for playback time scaling")); lbajardsilogic@127: }*/ ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::mouseLeftWidget() ivand_qmul@121: { ivand_qmul@121: contextHelpChanged(""); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::inProgressSelectionChanged() ivand_qmul@121: { ivand_qmul@121: Pane *currentPane = 0; ivand_qmul@121: if (m_paneStack) currentPane = m_paneStack->getCurrentPane(); ivand_qmul@121: if (currentPane) updateVisibleRangeDisplay(currentPane); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::contextHelpChanged(const QString &s) ivand_qmul@121: { ivand_qmul@121: if (s == "" && m_myStatusMessage != "") { ivand_qmul@121: statusBar()->showMessage(m_myStatusMessage); ivand_qmul@121: return; ivand_qmul@121: } ivand_qmul@121: statusBar()->showMessage(s); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::website() ivand_qmul@121: { ivand_qmul@121: openHelpUrl(tr("http://www.sonicvisualiser.org/")); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::help() ivand_qmul@121: { ivand_qmul@121: openHelpUrl(tr("http://www.sonicvisualiser.org/doc/reference/1.0/en/")); ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::openHelpUrl(QString url) ivand_qmul@121: { ivand_qmul@121: // This method mostly lifted from Qt Assistant source code ivand_qmul@121: ivand_qmul@121: QProcess *process = new QProcess(this); ivand_qmul@121: connect(process, SIGNAL(finished(int)), process, SLOT(deleteLater())); ivand_qmul@121: ivand_qmul@121: QStringList args; ivand_qmul@121: ivand_qmul@121: #ifdef Q_OS_MAC ivand_qmul@121: args.append(url); ivand_qmul@121: process->start("open", args); ivand_qmul@121: #else ivand_qmul@121: #ifdef Q_OS_WIN32 ivand_qmul@121: ivand_qmul@121: QString pf(getenv("ProgramFiles")); ivand_qmul@121: QString command = pf + QString("\\Internet Explorer\\IEXPLORE.EXE"); ivand_qmul@121: ivand_qmul@121: args.append(url); ivand_qmul@121: process->start(command, args); ivand_qmul@121: ivand_qmul@121: #else ivand_qmul@121: #ifdef Q_WS_X11 ivand_qmul@121: if (!qgetenv("KDE_FULL_SESSION").isEmpty()) { ivand_qmul@121: args.append("exec"); ivand_qmul@121: args.append(url); ivand_qmul@121: process->start("kfmclient", args); ivand_qmul@121: } else if (!qgetenv("BROWSER").isEmpty()) { ivand_qmul@121: args.append(url); ivand_qmul@121: process->start(qgetenv("BROWSER"), args); ivand_qmul@121: } else { ivand_qmul@121: args.append(url); ivand_qmul@121: process->start("firefox", args); ivand_qmul@121: } ivand_qmul@121: #endif ivand_qmul@121: #endif ivand_qmul@121: #endif ivand_qmul@121: } ivand_qmul@121: ivand_qmul@121: void ivand_qmul@121: MainWindow::about() ivand_qmul@121: { ivand_qmul@121: bool debug = false; ivand_qmul@121: QString version = "(unknown version)"; ivand_qmul@121: ivand_qmul@121: #ifdef BUILD_DEBUG ivand_qmul@121: debug = true; ivand_qmul@121: #endif ivand_qmul@121: #ifdef SA_VERSION ivand_qmul@121: #ifdef SVNREV ivand_qmul@121: version = tr("Release %1 : Revision %2").arg(SA_VERSION).arg(SVNREV); ivand_qmul@121: #else ivand_qmul@121: version = tr("Release %1").arg(SA_VERSION); ivand_qmul@121: #endif ivand_qmul@121: #else ivand_qmul@121: #ifdef SVNREV ivand_qmul@121: version = tr("Unreleased : Revision %1").arg(SVNREV); ivand_qmul@121: #endif ivand_qmul@121: #endif ivand_qmul@121: ivand_qmul@121: QString aboutText; ivand_qmul@121: lbajardsilogic@40: aboutText += tr("

About Sound Access

"); lbajardsilogic@40: aboutText += tr("

Sound Access is a program for viewing and exploring multimedia archives for semantic multimedia analysis and retrieval.

"); lbajardsilogic@40: aboutText += tr("

EASAIER (EU-FP6-IST-033902) frontend client

"); lbajardsilogic@40: lbajardsilogic@40: aboutText += tr("

%1 : %2 build

") lbajardsilogic@40: .arg(version) lbajardsilogic@40: .arg(debug ? tr("Debug") : tr("Release")); lbajardsilogic@40: ivand_qmul@121: aboutText += tr("

Based on Sonic Visualizer Copyright © 2005 - 2007 Chris Cannam and Queen Mary, University of London (Version %1)

").arg(SV_VERSION); ivand_qmul@121: ivand_qmul@121: #ifndef BUILD_STATIC ivand_qmul@121: aboutText += tr("
Using Qt v%1 © Trolltech AS").arg(QT_VERSION_STR); ivand_qmul@121: #else ivand_qmul@121: #ifdef QT_SHARED ivand_qmul@121: aboutText += tr("
Using Qt v%1 © Trolltech AS").arg(QT_VERSION_STR); ivand_qmul@121: #endif ivand_qmul@121: #endif ivand_qmul@121: ivand_qmul@121: //#ifdef BUILD_STATIC ivand_qmul@121: aboutText += tr("

Linked with"); ivand_qmul@121: #ifndef QT_SHARED ivand_qmul@121: aboutText += tr("
Qt (v%1) © Trolltech AS").arg(QT_VERSION_STR); ivand_qmul@121: #endif ivand_qmul@121: #ifdef HAVE_JACK ivand_qmul@121: #ifdef JACK_VERSION ivand_qmul@121: aboutText += tr("
JACK audio output (v%1) © Paul Davis and Jack O'Quin").arg(JACK_VERSION); ivand_qmul@121: #else ivand_qmul@121: aboutText += tr("
JACK audio output © Paul Davis and Jack O'Quin"); ivand_qmul@121: #endif ivand_qmul@121: #endif ivand_qmul@121: #ifdef HAVE_PORTAUDIO ivand_qmul@121: aboutText += tr("
PortAudio audio output © Ross Bencina and Phil Burk"); ivand_qmul@121: #endif ivand_qmul@121: #ifdef HAVE_OGGZ ivand_qmul@121: #ifdef OGGZ_VERSION ivand_qmul@121: aboutText += tr("
Ogg file decoder (oggz v%1, fishsound v%2) © CSIRO Australia").arg(OGGZ_VERSION).arg(FISHSOUND_VERSION); ivand_qmul@121: #else ivand_qmul@121: aboutText += tr("
Ogg file decoder © CSIRO Australia"); ivand_qmul@121: #endif ivand_qmul@121: #endif ivand_qmul@121: #ifdef HAVE_MAD ivand_qmul@121: #ifdef MAD_VERSION ivand_qmul@121: aboutText += tr("
MAD mp3 decoder (v%1) © Underbit Technologies Inc").arg(MAD_VERSION); ivand_qmul@121: #else ivand_qmul@121: aboutText += tr("
MAD mp3 decoder © Underbit Technologies Inc"); ivand_qmul@121: #endif ivand_qmul@121: #endif ivand_qmul@121: #ifdef HAVE_SAMPLERATE ivand_qmul@121: #ifdef SAMPLERATE_VERSION ivand_qmul@121: aboutText += tr("
libsamplerate (v%1) © Erik de Castro Lopo").arg(SAMPLERATE_VERSION); ivand_qmul@121: #else ivand_qmul@121: aboutText += tr("
libsamplerate © Erik de Castro Lopo"); ivand_qmul@121: #endif ivand_qmul@121: #endif ivand_qmul@121: #ifdef HAVE_SNDFILE ivand_qmul@121: #ifdef SNDFILE_VERSION ivand_qmul@121: aboutText += tr("
libsndfile (v%1) © Erik de Castro Lopo").arg(SNDFILE_VERSION); ivand_qmul@121: #else ivand_qmul@121: aboutText += tr("
libsndfile © Erik de Castro Lopo"); ivand_qmul@121: #endif ivand_qmul@121: #endif ivand_qmul@121: #ifdef HAVE_FFTW3F ivand_qmul@121: #ifdef FFTW3_VERSION ivand_qmul@121: aboutText += tr("
FFTW3 (v%1) © Matteo Frigo and MIT").arg(FFTW3_VERSION); ivand_qmul@121: #else ivand_qmul@121: aboutText += tr("
FFTW3 © Matteo Frigo and MIT"); ivand_qmul@121: #endif ivand_qmul@121: #endif ivand_qmul@121: #ifdef HAVE_VAMP ivand_qmul@121: aboutText += tr("
Vamp plugin support (API v%1, host SDK v%2) © Chris Cannam").arg(VAMP_API_VERSION).arg(VAMP_SDK_VERSION); ivand_qmul@121: #endif ivand_qmul@121: aboutText += tr("
LADSPA plugin support (API v%1) © Richard Furse, Paul Davis, Stefan Westerfeld").arg(LADSPA_VERSION); ivand_qmul@121: aboutText += tr("
DSSI plugin support (API v%1) © Chris Cannam, Steve Harris, Sean Bolton").arg(DSSI_VERSION); ivand_qmul@121: #ifdef HAVE_LIBLO ivand_qmul@121: #ifdef LIBLO_VERSION ivand_qmul@121: aboutText += tr("
liblo Lite OSC library (v%1) © Steve Harris").arg(LIBLO_VERSION); ivand_qmul@121: #else ivand_qmul@121: aboutText += tr("
liblo Lite OSC library © Steve Harris").arg(LIBLO_VERSION); ivand_qmul@121: #endif ivand_qmul@121: if (m_oscQueue && m_oscQueue->isOK()) { ivand_qmul@121: aboutText += tr("

The OSC URL for this instance is: \"%1\"").arg(m_oscQueue->getOSCURL()); ivand_qmul@121: } ivand_qmul@121: #endif lbajardsilogic@201: lbajardsilogic@201: aboutText += tr("
DIGITAL SIGNAL PROCESSING TOOLS (v%1) © (1999) Laurent de Soras").arg(DSPT_VERSION); lbajardsilogic@201: ivand_qmul@121: aboutText += "

"; ivand_qmul@121: //#endif ivand_qmul@121: lbajardsilogic@40: aboutText += lbajardsilogic@40: tr("

This program is free software; you can redistribute it and/or
" lbajardsilogic@40: "modify it under the terms of the GNU General Public License as
" lbajardsilogic@40: "published by the Free Software Foundation; either version 2 of the
" lbajardsilogic@40: "License, or (at your option) any later version.
See the file " lbajardsilogic@40: "COPYING included with this distribution for more information.

"); lbajardsilogic@40: ivand_qmul@121: QMessageBox::about(this, tr("About Sound Access"), aboutText); ivand_qmul@121: } ivand_qmul@121: lbajardsilogic@10: void MainWindow::connectionSettings() lbajardsilogic@10: { lbajardsilogic@10: ConnectionSettings* connection = new ConnectionSettings(m_httpClient); ivand_qmul@121: } ivand_qmul@121: lbajardsilogic@2: void MainWindow::styleSetting() lbajardsilogic@2: { lbajardsilogic@2: m_gallery.show(); lbajardsilogic@10: } lbajardsilogic@10: lbajardsilogic@10: bool MainWindow::saveConfigFile() lbajardsilogic@10: { lbajardsilogic@10: QString s; lbajardsilogic@10: lbajardsilogic@10: s += QString("\n"); lbajardsilogic@10: lbajardsilogic@10: s += m_httpClient->toXmlString("\t"); lbajardsilogic@10: lbajardsilogic@10: s += QString("\n"); lbajardsilogic@10: lbajardsilogic@10: QString filePath = TempDirectory::getInstance()->getConfigPath(); lbajardsilogic@10: lbajardsilogic@10: QFile *file = new QFile(filePath); lbajardsilogic@10: lbajardsilogic@10: if (!file->open(QIODevice::WriteOnly)) lbajardsilogic@10: return false; lbajardsilogic@10: lbajardsilogic@10: QTextStream config(file); lbajardsilogic@10: lbajardsilogic@10: config << s; lbajardsilogic@10: lbajardsilogic@10: file->close(); lbajardsilogic@10: lbajardsilogic@10: return true; lbajardsilogic@10: } lbajardsilogic@10: lbajardsilogic@10: void MainWindow::exit() lbajardsilogic@10: { lbajardsilogic@10: closeSession(); lbajardsilogic@10: saveConfigFile(); lbajardsilogic@10: close(); lbajardsilogic@21: } lbajardsilogic@21: benoitrigolleau@133: lbajardsilogic@21: QueryResultsWidget * MainWindow::getQueryResultsWidget() lbajardsilogic@21: { lbajardsilogic@21: return m_resultsWidget; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@143: RelatedMediaWidget *MainWindow::getRelatedMediaWidget() lbajardsilogic@143: { lbajardsilogic@143: return m_relMediaWidget; lbajardsilogic@143: } lbajardsilogic@143: lbajardsilogic@21: void MainWindow::newEasaierSession() lbajardsilogic@21: { lbajardsilogic@21: if (!checkSaveModified()) return; lbajardsilogic@21: lbajardsilogic@21: closeSession(); lbajardsilogic@21: createDocument(); benoitrigolleau@66: createMultiPaneLayerContainer(); lbajardsilogic@21: Pane *pane = m_paneStack->addPane(); lbajardsilogic@21: lbajardsilogic@21: if (!m_timeRulerLayer) { lbajardsilogic@21: m_timeRulerLayer = m_document->createMainModelLayer lbajardsilogic@21: (LayerFactory::TimeRuler); lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: m_document->addLayerToView(pane, m_timeRulerLayer); lbajardsilogic@21: lbajardsilogic@21: Layer *waveform = m_document->createMainModelLayer(LayerFactory::Waveform); lbajardsilogic@21: m_document->addLayerToView(pane, waveform); lbajardsilogic@21: lbajardsilogic@21: m_overview->registerView(pane); lbajardsilogic@21: lbajardsilogic@21: m_EasaierManager->newSession(); lbajardsilogic@21: lbajardsilogic@21: CommandHistory::getInstance()->clear(); lbajardsilogic@21: CommandHistory::getInstance()->documentSaved(); lbajardsilogic@21: documentRestored(); lbajardsilogic@21: updateMenuStates(); lbajardsilogic@21: lbajardsilogic@69: m_qtabwidget->setCurrentIndex(Search); lbajardsilogic@202: lbajardsilogic@202: setupFiltersMenu(); benoitrigolleau@66: benoitrigolleau@262: lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: void MainWindow::openEasaierSession() lbajardsilogic@21: { lbajardsilogic@21: if (!checkSaveModified()) return; lbajardsilogic@21: lbajardsilogic@21: QString orig = m_audioFile; lbajardsilogic@21: if (orig == "") orig = "."; lbajardsilogic@21: else orig = QFileInfo(orig).absoluteDir().canonicalPath(); lbajardsilogic@21: lbajardsilogic@21: QString path = QFileDialog::getOpenFileName lbajardsilogic@21: (this, tr("Select a session file"), orig, lbajardsilogic@21: tr("Sound Access session files (*.xml)\nAll files (*.*)")); lbajardsilogic@21: lbajardsilogic@21: if (path.isEmpty()) return; lbajardsilogic@21: lbajardsilogic@21: if (!(QFileInfo(path).exists() && lbajardsilogic@21: QFileInfo(path).isFile() && lbajardsilogic@21: QFileInfo(path).isReadable())) { lbajardsilogic@21: QMessageBox::critical(this, tr("Failed to open file"), lbajardsilogic@21: tr("File \"%1\" does not exist or is not a readable file").arg(path)); lbajardsilogic@21: return; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: if (!openEasaierSessionFile(path)) { lbajardsilogic@21: QMessageBox::critical(this, tr("Failed to open file"), lbajardsilogic@21: tr("Session file \"%1\" could not be opened").arg(path)); lbajardsilogic@21: } lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: bool MainWindow::openEasaierSessionFile(QString path) lbajardsilogic@21: { lbajardsilogic@21: QFile file(path); lbajardsilogic@21: if (!file.open(QIODevice::ReadOnly)) { lbajardsilogic@21: std::cerr << "Failed to open session file \"" << path.toStdString() lbajardsilogic@21: << "\": " << file.errorString().toStdString() << std::endl; lbajardsilogic@21: return false; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: QString error; lbajardsilogic@21: closeSession(); lbajardsilogic@21: createDocument(); benoitrigolleau@66: createMultiPaneLayerContainer(); lbajardsilogic@21: PaneCallback callback(this); lbajardsilogic@21: m_viewManager->clearSelections(); lbajardsilogic@203: setupFiltersMenu(); lbajardsilogic@21: lbajardsilogic@21: ESFileReader reader(m_document, callback); lbajardsilogic@21: QXmlInputSource inputSource(&file); lbajardsilogic@21: reader.parse(inputSource); lbajardsilogic@21: lbajardsilogic@21: if (!reader.isOK()) { lbajardsilogic@21: error = tr("Easaier XML file read error:\n%1").arg(reader.getErrorString()); lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: file.close(); lbajardsilogic@21: lbajardsilogic@21: bool ok = (error == ""); lbajardsilogic@21: lbajardsilogic@21: if (ok) { lbajardsilogic@21: setWindowTitle(tr("Sound Access: %1") lbajardsilogic@21: .arg(QFileInfo(path).fileName())); lbajardsilogic@21: m_sessionFile = path; lbajardsilogic@21: setupMenus(); lbajardsilogic@21: CommandHistory::getInstance()->clear(); lbajardsilogic@21: CommandHistory::getInstance()->documentSaved(); lbajardsilogic@21: m_documentModified = false; lbajardsilogic@21: updateMenuStates(); lbajardsilogic@21: } else { lbajardsilogic@21: setWindowTitle(tr("Sound Access")); lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@226: lockWindow(); lbajardsilogic@226: lbajardsilogic@21: m_EasaierManager->openSession(m_document); lbajardsilogic@21: lbajardsilogic@21: return ok; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: void MainWindow::saveEasaierSession() lbajardsilogic@21: { lbajardsilogic@21: if (m_sessionFile != "") { lbajardsilogic@21: if (!saveEasaierSessionFile(m_sessionFile)) { lbajardsilogic@21: QMessageBox::critical(this, tr("Failed to save file"), lbajardsilogic@21: tr("Session file \"%1\" could not be saved.").arg(m_sessionFile)); lbajardsilogic@21: } else { lbajardsilogic@21: CommandHistory::getInstance()->documentSaved(); lbajardsilogic@21: documentRestored(); lbajardsilogic@21: } lbajardsilogic@21: } else { lbajardsilogic@21: saveEasaierSessionAs(); lbajardsilogic@21: } lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: void lbajardsilogic@21: MainWindow::saveEasaierSessionAs() lbajardsilogic@21: { lbajardsilogic@21: QString orig = m_audioFile; lbajardsilogic@21: if (orig == "") orig = "."; lbajardsilogic@21: else orig = QFileInfo(orig).absoluteDir().canonicalPath(); lbajardsilogic@21: lbajardsilogic@21: QString path; lbajardsilogic@21: bool good = false; lbajardsilogic@21: lbajardsilogic@21: while (!good) { lbajardsilogic@21: lbajardsilogic@21: path = QFileDialog::getSaveFileName lbajardsilogic@21: (this, tr("Select a file to save to"), orig, lbajardsilogic@21: tr("Sound Access session files (*.xml)\nAll files (*.*)"), 0, lbajardsilogic@21: QFileDialog::DontConfirmOverwrite); // we'll do that lbajardsilogic@21: lbajardsilogic@21: if (path.isEmpty()) return; lbajardsilogic@21: lbajardsilogic@21: if (!path.endsWith(".xml")) path = path + ".xml"; lbajardsilogic@21: lbajardsilogic@21: QFileInfo fi(path); lbajardsilogic@21: lbajardsilogic@21: if (fi.isDir()) { lbajardsilogic@21: QMessageBox::critical(this, tr("Directory selected"), lbajardsilogic@21: tr("File \"%1\" is a directory").arg(path)); lbajardsilogic@21: continue; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: if (fi.exists()) { lbajardsilogic@21: if (QMessageBox::question(this, tr("File exists"), lbajardsilogic@21: tr("The file \"%1\" already exists.\nDo you want to overwrite it?").arg(path), lbajardsilogic@21: QMessageBox::Ok, lbajardsilogic@21: QMessageBox::Cancel) == QMessageBox::Ok) { lbajardsilogic@21: good = true; lbajardsilogic@21: } else { lbajardsilogic@21: continue; lbajardsilogic@21: } lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: good = true; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: if (!saveEasaierSessionFile(path)) { lbajardsilogic@21: QMessageBox::critical(this, tr("Failed to save file"), lbajardsilogic@21: tr("Session file \"%1\" could not be saved.").arg(m_sessionFile)); lbajardsilogic@21: } else { lbajardsilogic@21: setWindowTitle(tr("Sound Access: %1") lbajardsilogic@21: .arg(QFileInfo(path).fileName())); lbajardsilogic@21: m_sessionFile = path; lbajardsilogic@21: CommandHistory::getInstance()->documentSaved(); lbajardsilogic@21: documentRestored(); lbajardsilogic@21: } lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: bool MainWindow::saveEasaierSessionFile(QString path) lbajardsilogic@21: { lbajardsilogic@21: QFile file(path); lbajardsilogic@21: lbajardsilogic@21: if (!file.open(QIODevice::WriteOnly)) { lbajardsilogic@21: std::cerr << "Failed to open session file \"" << path.toStdString() lbajardsilogic@21: << "\" for writing: " lbajardsilogic@21: << file.errorString().toStdString() << std::endl; lbajardsilogic@21: return false; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); lbajardsilogic@21: ivand_qmul@121: QTextStream out(&file); ivand_qmul@121: toEasaierXml(out); lbajardsilogic@21: out.flush(); lbajardsilogic@21: lbajardsilogic@21: QApplication::restoreOverrideCursor(); lbajardsilogic@21: lbajardsilogic@21: if (file.error()) { lbajardsilogic@21: QMessageBox::critical(this, tr("Failed to write file"), lbajardsilogic@21: tr("Failed to write to file \"%1\": %2") lbajardsilogic@21: .arg(path).arg(file.errorString())); lbajardsilogic@21: file.close(); lbajardsilogic@21: return false; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: file.close(); lbajardsilogic@21: return true; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: void MainWindow::importEasaierLayer(const QString& filename) lbajardsilogic@21: { lbajardsilogic@21: Pane *pane = m_paneStack->getCurrentPane(); lbajardsilogic@21: m_EasaierManager->importMetadata(filename, pane); lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@143: void MainWindow::runExternProcess(const QString& filename) lbajardsilogic@143: { lbajardsilogic@143: int pos = filename.lastIndexOf('/'); lbajardsilogic@143: QString dir = filename.left(pos); lbajardsilogic@143: QString name = filename.right(filename.length() - (pos + 1)); lbajardsilogic@194: #ifdef _WIN32 lbajardsilogic@143: QString program = "cmd /c start " + name; lbajardsilogic@194: #else lbajardsilogic@194: QString program; lbajardsilogic@194: if (!qgetenv("KDE_FULL_SESSION").isEmpty()) { lbajardsilogic@194: program = "kfmclient exec " + name; lbajardsilogic@194: } else if (!qgetenv("BROWSER").isEmpty()) { lbajardsilogic@194: program = qgetenv("BROWSER") + " " + name; lbajardsilogic@194: } else lbajardsilogic@194: { lbajardsilogic@194: program = "gnome-open " + name; lbajardsilogic@194: } lbajardsilogic@194: #endif lbajardsilogic@143: QProcess *openFile = new QProcess(this); lbajardsilogic@143: openFile->setWorkingDirectory(dir); lbajardsilogic@143: openFile->start(program); lbajardsilogic@143: } lbajardsilogic@143: lbajardsilogic@21: void MainWindow::importEasaierFile(const QString& filename) lbajardsilogic@21: { lbajardsilogic@214: if (!m_curSender) lbajardsilogic@214: { lbajardsilogic@214: m_curSender = sender(); lbajardsilogic@214: m_curSender->blockSignals(true); lbajardsilogic@214: } lbajardsilogic@214: lbajardsilogic@176: /*****remove all panes****/ lbajardsilogic@176: while (m_paneStack->getPaneCount() > 0) { lbajardsilogic@176: lbajardsilogic@176: Pane *pane = m_paneStack->getPane(m_paneStack->getPaneCount() - 1); lbajardsilogic@176: lbajardsilogic@176: while (pane->getLayerCount() > 0) { lbajardsilogic@176: m_document->removeLayerFromView lbajardsilogic@176: (pane, pane->getLayer(pane->getLayerCount() - 1)); lbajardsilogic@21: } lbajardsilogic@176: lbajardsilogic@176: m_overview->unregisterView(pane); lbajardsilogic@176: m_paneStack->deletePane(pane); lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@176: while (m_paneStack->getHiddenPaneCount() > 0) { lbajardsilogic@176: lbajardsilogic@176: Pane *pane = m_paneStack->getHiddenPane lbajardsilogic@176: (m_paneStack->getHiddenPaneCount() - 1); lbajardsilogic@176: lbajardsilogic@176: while (pane->getLayerCount() > 0) { lbajardsilogic@176: m_document->removeLayerFromView lbajardsilogic@176: (pane, pane->getLayer(pane->getLayerCount() - 1)); lbajardsilogic@176: } lbajardsilogic@176: lbajardsilogic@176: m_overview->unregisterView(pane); lbajardsilogic@176: m_paneStack->deletePane(pane); lbajardsilogic@176: } lbajardsilogic@176: /*********/ lbajardsilogic@176: lbajardsilogic@175: m_document->reset(); lbajardsilogic@21: lbajardsilogic@176: Pane *pane = m_paneStack->addPane(); lbajardsilogic@176: lbajardsilogic@176: connect(pane, SIGNAL(contextHelpChanged(const QString &)), lbajardsilogic@176: this, SLOT(contextHelpChanged(const QString &))); lbajardsilogic@21: lbajardsilogic@21: if (!m_timeRulerLayer) { lbajardsilogic@21: m_timeRulerLayer = m_document->createMainModelLayer(LayerFactory::TimeRuler); lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: m_document->addLayerToView(pane, m_timeRulerLayer); lbajardsilogic@21: lbajardsilogic@21: Layer *waveform = m_document->createMainModelLayer(LayerFactory::Waveform); lbajardsilogic@21: m_document->addLayerToView(pane, waveform); lbajardsilogic@21: lbajardsilogic@208: m_overview->registerView(pane); lbajardsilogic@208: lbajardsilogic@21: m_document->setAudioSourceInfoFileName(filename); lbajardsilogic@21: m_EasaierManager->openAudioInfoFile(m_document); lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: void MainWindow::queryModelLoaded(QueryModel* queryModel) lbajardsilogic@21: { lbajardsilogic@21: if (m_searchWidget) lbajardsilogic@21: m_searchWidget->displayQuerymodel(queryModel); lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: void MainWindow::audioSourceInfoAdded(AudioSourceInfoModel * info) lbajardsilogic@21: { lbajardsilogic@21: if (m_infoWidget) lbajardsilogic@143: { lbajardsilogic@21: m_infoWidget->displayAudioSourceInfo(info); lbajardsilogic@143: m_relMediaWidget->reset(); lbajardsilogic@143: } lbajardsilogic@21: lbajardsilogic@21: m_qtabwidget->setCurrentIndex(Info); benoitrigolleau@276: emit (addAudioSourceInfo(info)); lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: void MainWindow::queryDatabase() lbajardsilogic@21: { lbajardsilogic@21: QString themeName = sender()->objectName(); benoitrigolleau@88: m_EasaierManager->queryDatabase(themeName); benoitrigolleau@88: m_qtabwidget->setCurrentIndex(Result); lbajardsilogic@21: benoitrigolleau@66: } benoitrigolleau@66: benoitrigolleau@66: void MainWindow::createMultiPaneLayerContainer(){ ivand_qmul@121: m_multiPaneLayerContainer = new MultiPaneLayerContainer; ivand_qmul@121: connect(m_paneStack, SIGNAL(newPaneAdded(Pane*)),m_multiPaneLayerContainer,SLOT(paneAdded(Pane*))); ivand_qmul@121: connect(m_paneStack, SIGNAL(paneDeleted(Pane*)),m_multiPaneLayerContainer,SLOT(paneRemoved(Pane*))); ivand_qmul@121: connect(m_multiPaneLayerContainer, SIGNAL(removeSelectedItem()), this, SLOT(deleteCurrentLayer())); lbajardsilogic@206: connect(m_multiPaneLayerContainer, SIGNAL(contextHelpChanged(const QString &)), this, SLOT(contextHelpChanged(const QString &))); ivand_qmul@121: connect(this, SIGNAL(newCurrentPane(Pane*)), m_multiPaneLayerContainer, SLOT(currentPaneChanged(Pane*))); lbajardsilogic@96: connect(m_multiPaneLayerContainer, SIGNAL(propertyContainerSelected(View *, PropertyContainer *)), lbajardsilogic@96: m_paneStack, SLOT(propertyContainerSelected(View *, PropertyContainer *))); benoitrigolleau@66: m_toolBox->insertItem(0,"Layers", m_multiPaneLayerContainer); lbajardsilogic@79: } lbajardsilogic@79: lbajardsilogic@79: void MainWindow::setupFiltersMenu() lbajardsilogic@79: { ivand_qmul@121: RealTimeFilterFactory::FilterTypeSet filterTypes = RealTimeFilterFactory::getInstance()->getFilterTypes(); ivand_qmul@121: RealTimeFilterFactory::FilterTypeSet::iterator iter; ivand_qmul@121: ivand_qmul@121: for (iter = filterTypes.begin(); iter != filterTypes.end(); iter++) { lbajardsilogic@202: QString filterType = RealTimeFilterFactory::getInstance()->getFilterLabel(*iter); lbajardsilogic@202: Filter* filter = m_document->createFilter(RealTimeFilterFactory::getInstance()->getFilterType(filterType)); lbajardsilogic@79: } lbajardsilogic@79: ivand_qmul@121: connect(m_filterPropertyStack, SIGNAL(removeFilter(QString)), this, SLOT(removeFilter(QString))); lbajardsilogic@79: lbajardsilogic@79: } lbajardsilogic@79: lbajardsilogic@79: void MainWindow::removeFilter(QString name) lbajardsilogic@79: { lbajardsilogic@79: if (m_document) lbajardsilogic@79: m_document->removeFilter(name); benoitrigolleau@133: } benoitrigolleau@133: benoitrigolleau@145: SDLWidget* MainWindow::getSDLWidget(){ benoitrigolleau@145: return m_sdlWidget; benoitrigolleau@145: } benoitrigolleau@145: benoitrigolleau@145: void MainWindow::setSDLInitSize(int w, int h){ benoitrigolleau@145: m_sdlWidget->setInitSize(w,h); lbajardsilogic@214: } benoitrigolleau@276: lbajardsilogic@214: void MainWindow::audioFileLoaded() lbajardsilogic@214: { lbajardsilogic@214: if (m_curSender) lbajardsilogic@214: { lbajardsilogic@214: m_curSender->blockSignals(false); lbajardsilogic@214: } lbajardsilogic@214: m_curSender = 0; lbajardsilogic@214: } lbajardsilogic@214: benoitrigolleau@262: EasaierSessionManager *MainWindow::getEasaierSessionManager(){ benoitrigolleau@262: return m_EasaierManager; benoitrigolleau@263: } benoitrigolleau@263: benoitrigolleau@263: SpeechRecognitionUI* MainWindow::getSpeechRecognitionUI(){ benoitrigolleau@263: return m_speechRecognitionUI; benoitrigolleau@263: } benoitrigolleau@263: benoitrigolleau@263: void MainWindow::openSpeechQuery(){ benoitrigolleau@263: m_speechRecognitionUI->show(); benoitrigolleau@263: m_speechRecognitionUI->topLevelWidget(); lbajardsilogic@268: } lbajardsilogic@268: lbajardsilogic@268: size_t MainWindow::getMainModelSampleRate() lbajardsilogic@268: { lbajardsilogic@268: return getMainModel()->getSampleRate(); lbajardsilogic@268: } benoitrigolleau@276: benoitrigolleau@276: void MainWindow::createNewResultItem(){ benoitrigolleau@276: m_resultsWidget->newResult(); benoitrigolleau@276: } benoitrigolleau@276: benoitrigolleau@276: void MainWindow::addInfoIntoResultItem(QString curBindingName,QString str){ benoitrigolleau@276: m_resultsWidget->addInfo(curBindingName, str); benoitrigolleau@276: } benoitrigolleau@276: benoitrigolleau@276: void MainWindow::saveCurrentResultItem(){ benoitrigolleau@276: m_resultsWidget->saveCurResult(); benoitrigolleau@276: } benoitrigolleau@276: benoitrigolleau@276: void MainWindow::displayResultList(){ benoitrigolleau@276: m_resultsWidget->displayResult(); benoitrigolleau@276: } benoitrigolleau@276: benoitrigolleau@276: Document* MainWindow::getDocument(){ benoitrigolleau@276: return m_document; benoitrigolleau@276: }