]> git.sesse.net Git - kdenlive/blobdiff - src/mainwindow.cpp
Delete selected effect instead of clip when effect stack has focus:
[kdenlive] / src / mainwindow.cpp
index de8df448d0ad80f3cc227f16d4835a6b0c04ba52..e9a896760c55ab966d5b53ee2cf17cada2e0922a 100644 (file)
@@ -663,7 +663,6 @@ void MainWindow::slotUpdateClip(const QString &id)
 
 void MainWindow::slotConnectMonitors()
 {
-
     m_projectList->setRenderer(m_projectMonitor->render);
     //connect(m_projectList, SIGNAL(receivedClipDuration(const QString &)), this, SLOT(slotUpdateClip(const QString &)));
     connect(m_projectList, SIGNAL(deleteProjectClips(QStringList, QMap<QString, QString>)), this, SLOT(slotDeleteProjectClips(QStringList, QMap<QString, QString>)));
@@ -810,25 +809,23 @@ void MainWindow::setupActions()
     m_buttonFitZoom = new KAction(KIcon("zoom-fit-best"), i18n("Fit zoom to project"), this);
     toolbar->addAction(m_buttonFitZoom);
     m_buttonFitZoom->setCheckable(false);
-    connect(m_buttonFitZoom, SIGNAL(triggered()), this, SLOT(slotFitZoom()));
 
-    m_zoomIn = new KAction(KIcon("zoom-in"), i18n("Zoom In"), this);
-    toolbar->addAction(m_zoomIn);
-    connect(m_zoomIn, SIGNAL(triggered(bool)), this, SLOT(slotZoomIn()));
-    m_zoomIn->setShortcut(Qt::CTRL + Qt::Key_Plus);
+    m_zoomOut = new KAction(KIcon("zoom-out"), i18n("Zoom Out"), this);
+    toolbar->addAction(m_zoomOut);
+    m_zoomOut->setShortcut(Qt::CTRL + Qt::Key_Minus);
 
     m_zoomSlider = new QSlider(Qt::Horizontal, this);
     m_zoomSlider->setMaximum(13);
     m_zoomSlider->setPageStep(1);
+    m_zoomSlider->setInvertedAppearance(true);
 
     m_zoomSlider->setMaximumWidth(150);
     m_zoomSlider->setMinimumWidth(100);
     toolbar->addWidget(m_zoomSlider);
 
-    m_zoomOut = new KAction(KIcon("zoom-out"), i18n("Zoom Out"), this);
-    toolbar->addAction(m_zoomOut);
-    connect(m_zoomOut, SIGNAL(triggered(bool)), this, SLOT(slotZoomOut()));
-    m_zoomOut->setShortcut(Qt::CTRL + Qt::Key_Minus);
+    m_zoomIn = new KAction(KIcon("zoom-in"), i18n("Zoom In"), this);
+    toolbar->addAction(m_zoomIn);
+    m_zoomIn->setShortcut(Qt::CTRL + Qt::Key_Plus);
 
     actionWidget = toolbar->widgetForAction(m_buttonFitZoom);
     actionWidget->setMaximumWidth(max);
@@ -845,6 +842,12 @@ void MainWindow::setupActions()
     actionWidget->setMaximumHeight(max - 4);
     actionWidget->setStyleSheet(styleBorderless);
 
+    connect(m_zoomSlider, SIGNAL(valueChanged(int)), this, SLOT(slotSetZoom(int)));
+    connect(m_zoomSlider, SIGNAL(sliderMoved(int)), this, SLOT(slotShowZoomSliderToolTip(int)));
+    connect(m_buttonFitZoom, SIGNAL(triggered()), this, SLOT(slotFitZoom()));
+    connect(m_zoomIn, SIGNAL(triggered(bool)), this, SLOT(slotZoomIn()));
+    connect(m_zoomOut, SIGNAL(triggered(bool)), this, SLOT(slotZoomOut()));
+
     toolbar->addSeparator();
 
     m_buttonVideoThumbs = new KAction(KIcon("kdenlive-show-videothumb"), i18n("Show video thumbnails"), this);
@@ -1588,12 +1591,7 @@ bool MainWindow::saveFileAs(const QString &outputFileName)
 
 bool MainWindow::saveFileAs()
 {
-    // Check that the Kdenlive mime type is correctly installed
-    QString mimetype = "application/x-kdenlive";
-    KMimeType::Ptr mime = KMimeType::mimeType(mimetype);
-    if (!mime) mimetype = "*.kdenlive";
-
-    QString outputFile = KFileDialog::getSaveFileName(KUrl(), mimetype);
+    QString outputFile = KFileDialog::getSaveFileName(KUrl(), getMimeType());
     if (outputFile.isEmpty()) return false;
     if (QFile::exists(outputFile)) {
         // Show the file dialog again if the user does not want to overwrite the file
@@ -1622,12 +1620,7 @@ void MainWindow::openFile()
         m_startUrl = KUrl();
         return;
     }
-    // Check that the Kdenlive mime type is correctly installed
-    QString mimetype = "application/x-kdenlive";
-    KMimeType::Ptr mime = KMimeType::mimeType(mimetype);
-    if (!mime) mimetype = "*.kdenlive";
-
-    KUrl url = KFileDialog::getOpenUrl(KUrl("kfiledialog:///projectfolder"), mimetype);
+    KUrl url = KFileDialog::getOpenUrl(KUrl("kfiledialog:///projectfolder"), getMimeType());
     if (url.isEmpty()) return;
     m_fileOpenRecent->addUrl(url);
     openFile(url);
@@ -1995,7 +1988,6 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
             disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_transitionConfig, SLOT(slotTransitionItemSelected(Transition*, int, QPoint, bool)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), this, SLOT(slotActivateTransitionView(Transition *)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay()));
-            disconnect(m_zoomSlider, SIGNAL(valueChanged(int)), m_activeTimeline, SLOT(slotChangeZoom(int)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint, const int)));
             disconnect(m_activeTimeline, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(activateMonitor()));
@@ -2070,7 +2062,6 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
     connect(trackView->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_transitionConfig, SLOT(slotTransitionItemSelected(Transition*, int, QPoint, bool)));
     connect(trackView->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), this, SLOT(slotActivateTransitionView(Transition *)));
     m_zoomSlider->setValue(doc->zoom().x());
-    connect(m_zoomSlider, SIGNAL(valueChanged(int)), trackView, SLOT(slotChangeZoom(int)));
     connect(trackView->projectView(), SIGNAL(zoomIn()), this, SLOT(slotZoomIn()));
     connect(trackView->projectView(), SIGNAL(zoomOut()), this, SLOT(slotZoomOut()));
     connect(trackView, SIGNAL(setZoom(int)), this, SLOT(slotSetZoom(int)));
@@ -2238,17 +2229,19 @@ void MainWindow::slotDeleteItem()
             && QApplication::focusWidget()->parentWidget()->parentWidget() == m_projectListDock) {
         m_projectList->slotRemoveClip();
 
-    } else if (QApplication::focusWidget()
-               && QApplication::focusWidget()->parentWidget()
-               && QApplication::focusWidget()->parentWidget()->parentWidget()
-               && QApplication::focusWidget()->parentWidget()->parentWidget()->parentWidget()
-               && QApplication::focusWidget()->parentWidget()->parentWidget()->parentWidget()->parentWidget()
-               && QApplication::focusWidget()->parentWidget()->parentWidget()->parentWidget()->parentWidget() == m_effectStackDock) {
-        // TODO: also delete effect when an effect widget (slider, geomtryval, ...) has focus
-        m_effectStack->slotItemDel();
+    } else {
+        QWidget *widget = QApplication::focusWidget();
+        while (widget) {
+            if (widget == m_effectStackDock) {
+                m_effectStack->slotItemDel();
+                return;
+            }
+            widget = widget->parentWidget();
+        }
 
-    } else if (m_activeTimeline) {
-        m_activeTimeline->projectView()->deleteSelectedClips();
+        // effect stack has no focus
+        if (m_activeTimeline)
+            m_activeTimeline->projectView()->deleteSelectedClips();
     }
 }
 
@@ -2561,11 +2554,13 @@ void MainWindow::slotAddCustomEffect(QAction *result)
 void MainWindow::slotZoomIn()
 {
     m_zoomSlider->setValue(m_zoomSlider->value() - 1);
+    slotShowZoomSliderToolTip();
 }
 
 void MainWindow::slotZoomOut()
 {
     m_zoomSlider->setValue(m_zoomSlider->value() + 1);
+    slotShowZoomSliderToolTip();
 }
 
 void MainWindow::slotFitZoom()
@@ -2577,7 +2572,32 @@ void MainWindow::slotFitZoom()
 
 void MainWindow::slotSetZoom(int value)
 {
+    if (m_activeTimeline)
+        m_activeTimeline->slotChangeZoom(value);
+
+    m_zoomOut->setEnabled(value < m_zoomSlider->maximum());
+    m_zoomIn->setEnabled(value > m_zoomSlider->minimum());
+    slotUpdateZoomSliderToolTip(value);
+
+    m_zoomSlider->blockSignals(true);
     m_zoomSlider->setValue(value);
+    m_zoomSlider->blockSignals(false);
+}
+
+void MainWindow::slotShowZoomSliderToolTip(int zoomlevel)
+{
+    if (zoomlevel != -1)
+        slotUpdateZoomSliderToolTip(zoomlevel);
+
+    QPoint global = m_zoomSlider->rect().topLeft();
+    global.ry() += m_zoomSlider->height() / 2;
+    QHelpEvent toolTipEvent(QEvent::ToolTip, QPoint(0, 0), m_zoomSlider->mapToGlobal(global));
+    QApplication::sendEvent(m_zoomSlider, &toolTipEvent);
+}
+
+void MainWindow::slotUpdateZoomSliderToolTip(int zoomlevel)
+{
+    m_zoomSlider->setToolTip(i18n("Zoom Level: %1/13", (13 - zoomlevel)));
 }
 
 void MainWindow::slotGotProgressInfo(const QString &message, int progress)
@@ -3427,12 +3447,16 @@ void MainWindow::slotInsertZoneToTimeline()
 
 void MainWindow::slotDeleteProjectClips(QStringList ids, QMap<QString, QString> folderids)
 {
-    for (int i = 0; i < ids.size(); ++i) {
-        m_activeTimeline->slotDeleteClip(ids.at(i));
+    if (m_activeDocument && m_activeTimeline) {
+        if (!ids.isEmpty()) {
+            for (int i = 0; i < ids.size(); ++i) {
+                m_activeTimeline->slotDeleteClip(ids.at(i));
+            }
+            m_activeDocument->clipManager()->slotDeleteClips(ids);
+        }
+        if (!folderids.isEmpty()) m_projectList->deleteProjectFolder(folderids);
+        m_activeDocument->setModified(true);
     }
-    m_activeDocument->clipManager()->slotDeleteClips(ids);
-    if (!folderids.isEmpty()) m_projectList->deleteProjectFolder(folderids);
-
 }
 
 void MainWindow::slotShowTitleBars(bool show)
@@ -3468,5 +3492,13 @@ void MainWindow::slotSwitchTitles()
     slotShowTitleBars(!KdenliveSettings::showtitlebars());
 }
 
+QString MainWindow::getMimeType()
+{
+    QString mimetype = "application/x-kdenlive";
+    KMimeType::Ptr mime = KMimeType::mimeType(mimetype);
+    if (!mime) mimetype = "*.kdenlive";
+    return mimetype;
+}
+
 #include "mainwindow.moc"