]> git.sesse.net Git - kdenlive/blobdiff - src/mainwindow.cpp
Prefer the better quality Vorbis encoder, libvorbis, over the native.
[kdenlive] / src / mainwindow.cpp
index 532a481d76aa02455472db77734562b37437cca2..1b4cb3973ab5bef3203f646293195c2292bfca3a 100644 (file)
@@ -58,7 +58,9 @@
 #include <KLocale>
 #include <KGlobal>
 #include <KActionCollection>
+#include <KActionCategory>
 #include <KStandardAction>
+#include <KShortcutsDialog>
 #include <KFileDialog>
 #include <KMessageBox>
 #include <KDebug>
@@ -355,6 +357,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
     m_timelineContextMenu->addAction(actionCollection()->action(KStandardAction::name(KStandardAction::Paste)));
 
     m_timelineContextClipMenu->addAction(actionCollection()->action("clip_in_project_tree"));
+    //m_timelineContextClipMenu->addAction(actionCollection()->action("clip_to_project_tree"));
     m_timelineContextClipMenu->addAction(actionCollection()->action("edit_item_duration"));
     m_timelineContextClipMenu->addAction(actionCollection()->action("delete_item"));
     m_timelineContextClipMenu->addAction(actionCollection()->action("group_clip"));
@@ -450,7 +453,10 @@ bool MainWindow::queryClose()
     }
     saveOptions();
     if (m_monitorManager) m_monitorManager->stopActiveMonitor();
-    if (m_activeDocument && m_activeDocument->isModified()) {
+    // warn the user to save if document is modified and we have clips in our project list
+    if (m_activeDocument && m_activeDocument->isModified()
+            && ((m_projectList->documentClipList().isEmpty() && !m_activeDocument->url().isEmpty())
+                || !m_projectList->documentClipList().isEmpty())) {
         switch (KMessageBox::warningYesNoCancel(this, i18n("Save changes to document?"))) {
         case KMessageBox::Yes :
             // save document here. If saving fails, return false;
@@ -851,6 +857,13 @@ void MainWindow::setupActions()
 
     toolbar->addSeparator();
 
+    //create automatic audio split button
+    m_buttonAutomaticSplitAudio = new KAction(KIcon("kdenlive-split-audio"), i18n("Split audio and video automatically"), this);
+    toolbar->addAction(m_buttonAutomaticSplitAudio);
+    m_buttonAutomaticSplitAudio->setCheckable(true);
+    m_buttonAutomaticSplitAudio->setChecked(KdenliveSettings::splitaudio());
+    connect(m_buttonAutomaticSplitAudio, SIGNAL(triggered()), this, SLOT(slotSwitchSplitAudio()));
+
     m_buttonVideoThumbs = new KAction(KIcon("kdenlive-show-videothumb"), i18n("Show video thumbnails"), this);
     toolbar->addAction(m_buttonVideoThumbs);
     m_buttonVideoThumbs->setCheckable(true);
@@ -875,6 +888,10 @@ void MainWindow::setupActions()
     m_buttonSnap->setChecked(KdenliveSettings::snaptopoints());
     connect(m_buttonSnap, SIGNAL(triggered()), this, SLOT(slotSwitchSnap()));
 
+    actionWidget = toolbar->widgetForAction(m_buttonAutomaticSplitAudio);
+    actionWidget->setMaximumWidth(max);
+    actionWidget->setMaximumHeight(max - 4);
+
     actionWidget = toolbar->widgetForAction(m_buttonVideoThumbs);
     actionWidget->setMaximumWidth(max);
     actionWidget->setMaximumHeight(max - 4);
@@ -908,6 +925,7 @@ void MainWindow::setupActions()
     collection->addAction("razor_tool", m_buttonRazorTool);
     collection->addAction("spacer_tool", m_buttonSpacerTool);
 
+    collection->addAction("automatic_split_audio", m_buttonAutomaticSplitAudio);
     collection->addAction("show_video_thumbs", m_buttonVideoThumbs);
     collection->addAction("show_audio_thumbs", m_buttonAudioThumbs);
     collection->addAction("show_markers", m_buttonShowMarkers);
@@ -931,13 +949,10 @@ void MainWindow::setupActions()
     collection->addAction("manage_profiles", profilesAction);
     connect(profilesAction, SIGNAL(triggered(bool)), this, SLOT(slotEditProfiles()));
 
-    KNS3::standardAction(i18n("Download New Wipes..."), this, SLOT(slotGetNewLumaStuff()), actionCollection(), "get_new_lumas");
-
-    KNS3::standardAction(i18n("Download New Render Profiles..."), this, SLOT(slotGetNewRenderStuff()), actionCollection(), "get_new_profiles");
-
+    KNS3::standardAction(i18n("Download New Wipes..."),            this, SLOT(slotGetNewLumaStuff()),       actionCollection(), "get_new_lumas");
+    KNS3::standardAction(i18n("Download New Render Profiles..."),  this, SLOT(slotGetNewRenderStuff()),     actionCollection(), "get_new_profiles");
     KNS3::standardAction(i18n("Download New Project Profiles..."), this, SLOT(slotGetNewMltProfileStuff()), actionCollection(), "get_new_mlt_profiles");
-
-    KNS3::standardAction(i18n("Download New Title Templates..."), this, SLOT(slotGetNewTitleStuff()), actionCollection(), "get_new_titles");
+    KNS3::standardAction(i18n("Download New Title Templates..."),  this, SLOT(slotGetNewTitleStuff()),      actionCollection(), "get_new_titles");
 
     KAction* wizAction = new KAction(KIcon("configure"), i18n("Run Config Wizard"), this);
     collection->addAction("run_wizard", wizAction);
@@ -1123,6 +1138,10 @@ void MainWindow::setupActions()
     collection->addAction("clip_in_project_tree", clipInProjectTree);
     connect(clipInProjectTree, SIGNAL(triggered(bool)), this, SLOT(slotClipInProjectTree()));
 
+    /*KAction* clipToProjectTree = new KAction(KIcon("go-jump-definition"), i18n("Add Clip to Project Tree"), this);
+    collection->addAction("clip_to_project_tree", clipToProjectTree);
+    connect(clipToProjectTree, SIGNAL(triggered(bool)), this, SLOT(slotClipToProjectTree()));*/
+
     KAction* insertOvertwrite = new KAction(KIcon(), i18n("Insert Clip Zone in Timeline (Overwrite)"), this);
     insertOvertwrite->setShortcut(Qt::Key_V);
     collection->addAction("overwrite_to_in_point", insertOvertwrite);
@@ -1265,26 +1284,19 @@ void MainWindow::setupActions()
     maxCurrent->setChecked(false);
     connect(maxCurrent, SIGNAL(triggered(bool)), this, SLOT(slotMaximizeCurrent(bool)));*/
 
-
-    m_closeAction = KStandardAction::close(this, SLOT(closeCurrentDocument()), collection);
-
-    KStandardAction::quit(this, SLOT(queryQuit()), collection);
-
-    KStandardAction::open(this, SLOT(openFile()), collection);
-
-    m_saveAction = KStandardAction::save(this, SLOT(saveFile()), collection);
-
-    KStandardAction::saveAs(this, SLOT(saveFileAs()), collection);
-
-    KStandardAction::openNew(this, SLOT(newFile()), collection);
-
-    KStandardAction::preferences(this, SLOT(slotPreferences()), collection);
-
-    KStandardAction::configureNotifications(this , SLOT(configureNotifications()), collection);
-
-    KStandardAction::copy(this, SLOT(slotCopy()), collection);
-
-    KStandardAction::paste(this, SLOT(slotPaste()), collection);
+    m_closeAction = KStandardAction::close(this,  SLOT(closeCurrentDocument()),   collection);
+    KStandardAction::quit(this,                   SLOT(queryQuit()),              collection);
+    KStandardAction::open(this,                   SLOT(openFile()),               collection);
+    m_saveAction = KStandardAction::save(this,    SLOT(saveFile()),               collection);
+    KStandardAction::saveAs(this,                 SLOT(saveFileAs()),             collection);
+    KStandardAction::openNew(this,                SLOT(newFile()),                collection);
+    // TODO: make the following connection to slotEditKeys work
+    KStandardAction::keyBindings(this,            SLOT(slotEditKeys()),           collection);
+    KStandardAction::preferences(this,            SLOT(slotPreferences()),        collection);
+    KStandardAction::configureNotifications(this, SLOT(configureNotifications()), collection);
+    KStandardAction::copy(this,                   SLOT(slotCopy()),               collection);
+    KStandardAction::paste(this,                  SLOT(slotPaste()),              collection);
+    KStandardAction::fullScreen(this,             SLOT(slotFullScreen()), this,   collection);
 
     KAction *undo = KStandardAction::undo(m_commandStack, SLOT(undo()), collection);
     undo->setEnabled(false);
@@ -1294,8 +1306,6 @@ void MainWindow::setupActions()
     redo->setEnabled(false);
     connect(m_commandStack, SIGNAL(canRedoChanged(bool)), redo, SLOT(setEnabled(bool)));
 
-    KStandardAction::fullScreen(this, SLOT(slotFullScreen()), this, collection);
-
     /*
     //TODO: Add status tooltip to actions ?
     connect(collection, SIGNAL(actionHovered(QAction*)),
@@ -1365,38 +1375,48 @@ void MainWindow::setupActions()
     m_projectList->setupMenu(addClips, addClip);
 
     // Setup effects and transitions actions.
+    m_effectsActionCollection = new KActionCollection(this, KGlobal::mainComponent());
+    //KActionCategory *videoEffectActions = new KActionCategory(i18n("Video Effects"), m_effectsActionCollection);
+    KActionCategory *videoEffectActions = new KActionCategory(i18n("Video Effects"), collection);
     m_videoEffects = new KAction*[videoEffects.count()];
     for (int i = 0; i < videoEffects.count(); ++i) {
         QStringList effectInfo = videoEffects.effectIdInfo(i);
         m_videoEffects[i] = new KAction(KIcon("kdenlive-show-video"), effectInfo.at(0), this);
         m_videoEffects[i]->setData(effectInfo);
         m_videoEffects[i]->setIconVisibleInMenu(false);
-        collection->addAction("video_effect_" + effectInfo.at(0), m_videoEffects[i]);
+        videoEffectActions->addAction("video_effect_" + effectInfo.at(0), m_videoEffects[i]);
     }
+    //KActionCategory *audioEffectActions = new KActionCategory(i18n("Audio Effects"), m_effectsActionCollection);
+    KActionCategory *audioEffectActions = new KActionCategory(i18n("Audio Effects"), collection);
     m_audioEffects = new KAction*[audioEffects.count()];
     for (int i = 0; i < audioEffects.count(); ++i) {
         QStringList effectInfo = audioEffects.effectIdInfo(i);
         m_audioEffects[i] = new KAction(KIcon("kdenlive-show-audio"), effectInfo.at(0), this);
         m_audioEffects[i]->setData(effectInfo);
         m_audioEffects[i]->setIconVisibleInMenu(false);
-        collection->addAction("audio_effect_" + effectInfo.at(0), m_audioEffects[i]);
+        audioEffectActions->addAction("audio_effect_" + effectInfo.at(0), m_audioEffects[i]);
     }
+    //KActionCategory *customEffectActions = new KActionCategory(i18n("Custom Effects"), m_effectsActionCollection);
+    KActionCategory *customEffectActions = new KActionCategory(i18n("Custom Effects"), collection);
     m_customEffects = new KAction*[customEffects.count()];
     for (int i = 0; i < customEffects.count(); ++i) {
         QStringList effectInfo = customEffects.effectIdInfo(i);
         m_customEffects[i] = new KAction(KIcon("kdenlive-custom-effect"), effectInfo.at(0), this);
         m_customEffects[i]->setData(effectInfo);
         m_customEffects[i]->setIconVisibleInMenu(false);
-        collection->addAction("custom_effect_" + effectInfo.at(0), m_customEffects[i]);
+        customEffectActions->addAction("custom_effect_" + effectInfo.at(0), m_customEffects[i]);
     }
+    //KActionCategory *transitionActions = new KActionCategory(i18n("Transitions"), m_effectsActionCollection);
+    KActionCategory *transitionActions = new KActionCategory(i18n("Transitions"), collection);
     m_transitions = new KAction*[transitions.count()];
     for (int i = 0; i < transitions.count(); i++) {
         QStringList effectInfo = transitions.effectIdInfo(i);
         m_transitions[i] = new KAction(effectInfo.at(0), this);
         m_transitions[i]->setData(effectInfo);
         m_transitions[i]->setIconVisibleInMenu(false);
-        collection->addAction("transition_" + effectInfo.at(0), m_transitions[i]);
+        transitionActions->addAction("transition_" + effectInfo.at(0), m_transitions[i]);
     }
+    m_effectsActionCollection->readSettings();
 
     //connect(collection, SIGNAL( clearStatusText() ),
     //statusBar(), SLOT( clear() ) );
@@ -2131,6 +2151,14 @@ void MainWindow::slotGuidesUpdated()
     if (m_renderWidget) m_renderWidget->setGuides(m_activeDocument->guidesXml(), m_activeDocument->projectDuration());
 }
 
+void MainWindow::slotEditKeys()
+{
+    KShortcutsDialog dialog(KShortcutsEditor::AllActions, KShortcutsEditor::LetterShortcutsAllowed, this);
+    dialog.addCollection(actionCollection(), i18nc("general keyboard shortcuts", "General"));
+    dialog.addCollection(m_effectsActionCollection, i18nc("effects and transitions keyboard shortcuts", "Effects & Transitions"));
+    dialog.configure(); 
+}
+
 void MainWindow::slotPreferences(int page, int option)
 {
     //An instance of your dialog could be already created and could be
@@ -2176,6 +2204,7 @@ void MainWindow::updateConfiguration()
     }
     m_buttonAudioThumbs->setChecked(KdenliveSettings::audiothumbnails());
     m_buttonVideoThumbs->setChecked(KdenliveSettings::videothumbnails());
+    m_buttonAutomaticSplitAudio->setChecked(KdenliveSettings::splitaudio());
 
     // Update list of transcoding profiles
     loadTranscoders();
@@ -2185,6 +2214,11 @@ void MainWindow::updateConfiguration()
 
 }
 
+void MainWindow::slotSwitchSplitAudio()
+{
+    KdenliveSettings::setSplitaudio(!KdenliveSettings::splitaudio());
+    m_buttonAutomaticSplitAudio->setChecked(KdenliveSettings::splitaudio());
+}
 
 void MainWindow::slotSwitchVideoThumbs()
 {
@@ -2912,7 +2946,6 @@ void MainWindow::slotClipInTimeline(const QString &clipId)
                 j++;
             }
             actionList.insert(j, a);
-
         }
         inTimelineMenu->addActions(actionList);
 
@@ -2937,6 +2970,18 @@ void MainWindow::slotClipInProjectTree()
     }
 }
 
+/*void MainWindow::slotClipToProjectTree()
+{
+    if (m_activeTimeline) {
+    const QList<ClipItem *> clips =  m_activeTimeline->projectView()->selectedClipItems();
+        if (clips.isEmpty()) return;
+        for (int i = 0; i < clips.count(); i++) {
+        m_projectList->slotAddXmlClip(clips.at(i)->itemXml());
+        }
+        //m_projectList->selectItemById(clipIds.at(i));
+    }
+}*/
+
 void MainWindow::slotSelectClipInTimeline()
 {
     if (m_activeTimeline) {
@@ -3386,6 +3431,7 @@ void MainWindow::slotChangePalette(QAction *action, const QString &themename)
                 ((QWidget*)subchild)->setPalette(plt);
         }
     }
+    if (m_activeTimeline) m_activeTimeline->projectView()->updatePalette();
 }