]> git.sesse.net Git - kdenlive/commitdiff
* Update to the "video only / audio only" options in clip menu
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 4 Apr 2009 21:53:26 +0000 (21:53 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 4 Apr 2009 21:53:26 +0000 (21:53 +0000)
* Force saving kdenlive documents in UTF-8 format

svn path=/trunk/kdenlive/; revision=3213

src/clipitem.cpp
src/customtrackview.cpp
src/customtrackview.h
src/dvdwizard.cpp
src/kdenlivedoc.cpp
src/kdenliveui.rc
src/mainwindow.cpp
src/mainwindow.h
src/monitor.cpp

index 53e2bfc4ee566c94a23eadbd99e7ff005ca216b4..e270b4ee2df595f22b0836d2970d7f81535a9070 100644 (file)
@@ -43,8 +43,8 @@ ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, b
     setRect(0, 0, (info.endPos - info.startPos).frames(fps) - 0.02, (double)(KdenliveSettings::trackheight() - 2));
     setPos(info.startPos.frames(fps), (double)(info.track * KdenliveSettings::trackheight()) + 1);
 
-    m_videoPix = KIcon("video-x-generic").pixmap(QSize(15, 15));
-    m_audioPix = KIcon("audio-x-generic").pixmap(QSize(15, 15));
+    m_videoPix = KIcon("kdenlive-show-video").pixmap(QSize(16, 16));
+    m_audioPix = KIcon("kdenlive-show-audio").pixmap(QSize(16, 16));
 
     if (m_speed == 1.0) m_clipName = clip->name();
     else {
@@ -501,7 +501,7 @@ QPixmap ClipItem::endThumb() const
 void ClipItem::slotGotAudioData()
 {
     audioThumbReady = true;
-    if (m_clipType == AV) {
+    if (m_clipType == AV && !isAudioOnly()) {
         QRectF r = boundingRect();
         r.setTop(r.top() + r.height() / 2 - 1);
         update(r);
@@ -626,7 +626,7 @@ void ClipItem::paint(QPainter *painter,
     }
 
     // draw audio thumbnails
-    if (KdenliveSettings::audiothumbnails() && m_speed == 1.0 && !isVideoOnly() && ((m_clipType == AV && exposed.bottom() > (itemHeight / 2)) || m_clipType == AUDIO) && audioThumbReady) {
+    if (KdenliveSettings::audiothumbnails() && m_speed == 1.0 && !isVideoOnly() && ((m_clipType == AV && (exposed.bottom() > (itemHeight / 2) || isAudioOnly())) || m_clipType == AUDIO) && audioThumbReady) {
 
         double startpixel = exposed.left();
         if (startpixel < 0)
@@ -1494,6 +1494,7 @@ void ClipItem::setAudioOnly(bool force)
     m_audioOnly = force;
     if (m_audioOnly) setBrush(QColor(141, 215, 166));
     else setBrush(QColor(141, 166, 215));
+    audioThumbCachePic.clear();
 }
 
 bool ClipItem::isAudioOnly() const
index 6c17d122990664186757c5bc79794c6590c45c04..24ee9f21f068801b5229b6f04101de1d34790d68 100644 (file)
@@ -125,10 +125,11 @@ void CustomTrackView::setDocumentModified()
     m_document->setModified(true);
 }
 
-void CustomTrackView::setContextMenu(QMenu *timeline, QMenu *clip, QMenu *transition)
+void CustomTrackView::setContextMenu(QMenu *timeline, QMenu *clip, QMenu *transition, QActionGroup *clipTypeGroup)
 {
     m_timelineContextMenu = timeline;
     m_timelineContextClipMenu = clip;
+    m_clipTypeGroup = clipTypeGroup;
     QList <QAction *> list = m_timelineContextClipMenu->actions();
     for (int i = 0; i < list.count(); i++) {
         if (list.at(i)->data().toString() == "change_speed") m_changeSpeedAction = list.at(i);
@@ -646,6 +647,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
         m_scene->clearSelection();
         event->accept();
         emit clipItemSelected(NULL);
+        updateClipTypeActions(NULL);
         if (m_tool == SPACERTOOL) {
             QList<QGraphicsItem *> selection;
             if (event->modifiers() == Qt::ControlModifier) {
@@ -742,8 +744,10 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
         bool selected = !m_dragItem->isSelected();
         if (dragGroup) dragGroup->setSelected(selected);
         else m_dragItem->setSelected(selected);
+
         groupSelectedItems();
         ClipItem *clip = static_cast <ClipItem *>(m_dragItem);
+        updateClipTypeActions(dragGroup == NULL ? clip : NULL);
         m_changeSpeedAction->setEnabled(clip->clipType() == AV || clip->clipType() == VIDEO);
         m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
     }
@@ -1026,11 +1030,13 @@ void CustomTrackView::displayContextMenu(QPoint pos, AbstractClipItem *clip, Abs
         m_changeSpeedAction->setEnabled(false);
         m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
         m_ungroupAction->setEnabled(true);
+        updateClipTypeActions(NULL);
         m_timelineContextClipMenu->popup(pos);
     } else {
         m_ungroupAction->setEnabled(false);
         if (clip->type() == AVWIDGET) {
             ClipItem *item = static_cast <ClipItem*>(clip);
+            updateClipTypeActions(item);
             m_changeSpeedAction->setEnabled(item->clipType() == AV || item->clipType() == VIDEO);
             m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
             m_timelineContextClipMenu->popup(pos);
@@ -1604,6 +1610,11 @@ void CustomTrackView::dropEvent(QDropEvent * event)
         for (int i = 0; i < items.count(); i++) {
             ClipItem *item = static_cast <ClipItem *>(items.at(i));
             if (!hasVideoClip && (item->clipType() == AV || item->clipType() == VIDEO)) hasVideoClip = true;
+            if (items.count() == 1) {
+                updateClipTypeActions(item);
+            } else {
+                updateClipTypeActions(NULL);
+            }
             AddTimelineClipCommand *command = new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, false);
             m_commandStack->push(command);
             item->baseClip()->addReference();
@@ -4302,7 +4313,7 @@ void CustomTrackView::doSplitAudio(const GenTime &pos, int track, bool split)
     }
 }
 
-void CustomTrackView::videoOnly()
+void CustomTrackView::setVideoOnly()
 {
     resetSelectionGroup();
     QList<QGraphicsItem *> selection = scene()->selectedItems();
@@ -4327,7 +4338,7 @@ void CustomTrackView::videoOnly()
     m_commandStack->push(videoCommand);
 }
 
-void CustomTrackView::audioOnly()
+void CustomTrackView::setAudioOnly()
 {
     resetSelectionGroup();
     QList<QGraphicsItem *> selection = scene()->selectedItems();
@@ -4352,6 +4363,31 @@ void CustomTrackView::audioOnly()
     m_commandStack->push(videoCommand);
 }
 
+void CustomTrackView::setAudioAndVideo()
+{
+    resetSelectionGroup();
+    QList<QGraphicsItem *> selection = scene()->selectedItems();
+    if (selection.isEmpty()) {
+        emit displayMessage(i18n("You must select one clip for this action"), ErrorMessage);
+        return;
+    }
+    QUndoCommand *videoCommand = new QUndoCommand();
+    videoCommand->setText(i18n("Audio and Video"));
+    for (int i = 0; i < selection.count(); i++) {
+        if (selection.at(i)->type() == AVWIDGET) {
+            ClipItem *clip = static_cast <ClipItem *>(selection.at(i));
+            if (clip->clipType() == AV || clip->clipType() == PLAYLIST) {
+                if (clip->parentItem()) {
+                    emit displayMessage(i18n("Cannot change grouped clips"), ErrorMessage);
+                } else {
+                    new ChangeClipTypeCommand(this, clip->track(), clip->startPos(), false, false, clip->isVideoOnly(), clip->isAudioOnly(), true, videoCommand);
+                }
+            }
+        }
+    }
+    m_commandStack->push(videoCommand);
+}
+
 void CustomTrackView::doChangeClipType(const GenTime &pos, int track, bool videoOnly, bool audioOnly)
 {
     ClipItem *clip = getClipItemAt(pos, track);
@@ -4378,4 +4414,24 @@ void CustomTrackView::doChangeClipType(const GenTime &pos, int track, bool video
     clip->update();
 }
 
+void CustomTrackView::updateClipTypeActions(ClipItem *clip)
+{
+    if (clip == NULL || (clip->clipType() != AV && clip->clipType() != PLAYLIST)) {
+        m_clipTypeGroup->setEnabled(false);
+    } else {
+        m_clipTypeGroup->setEnabled(true);
+        QList <QAction *> actions = m_clipTypeGroup->actions();
+        QString lookup;
+        if (clip->isAudioOnly()) lookup = "clip_audio_only";
+        else if (clip->isVideoOnly()) lookup = "clip_video_only";
+        else  lookup = "clip_audio_and_video";
+        for (int i = 0; i < actions.count(); i++) {
+            if (actions.at(i)->data().toString() == lookup) {
+                actions.at(i)->setChecked(true);
+                break;
+            }
+        }
+    }
+}
+
 #include "customtrackview.moc"
index 58a48c6589a938af8aec49e11f3ef51cff128bc3..85e98abb77de0d2f632738a71bd4cf3dba916444 100644 (file)
@@ -80,7 +80,7 @@ public:
     int duration() const;
     void deleteSelectedClips();
     void cutSelectedClips();
-    void setContextMenu(QMenu *timeline, QMenu *clip, QMenu *transition);
+    void setContextMenu(QMenu *timeline, QMenu *clip, QMenu *transition, QActionGroup *clipTypeGroup);
     void checkTrackHeight();
     //QList <TrackInfo> tracksList() const;
     void setTool(PROJECTTOOL tool);
@@ -116,8 +116,9 @@ public:
     void loadGroups(const QDomNodeList groups);
     void splitAudio();
     void doSplitAudio(const GenTime &pos, int track, bool split);
-    void videoOnly();
-    void audioOnly();
+    void setVideoOnly();
+    void setAudioOnly();
+    void setAudioAndVideo();
     void doChangeClipType(const GenTime &pos, int track, bool videoOnly, bool audioOnly);
 
 public slots:
@@ -211,6 +212,7 @@ private:
     QAction *m_changeSpeedAction;
     QAction *m_pasteEffectsAction;
     QAction *m_ungroupAction;
+    QActionGroup *m_clipTypeGroup;
     QTimer m_scrollTimer;
     int m_scrollOffset;
     bool m_clipDrag;
@@ -242,7 +244,7 @@ private:
     void getClipAvailableSpace(AbstractClipItem *item, GenTime &minimum, GenTime &maximum);
     /** Get available space for transition move (min and max free positions) */
     void getTransitionAvailableSpace(AbstractClipItem *item, GenTime &minimum, GenTime &maximum);
-
+    void updateClipTypeActions(ClipItem *clip);
 
 private slots:
     void slotRefreshGuides();
index 162f0196cf0efbd84d3edad2a7b2bb1e52b75e5e..e1e7e2d5283ba85bcde4ed5382f8f8bbdaec5e79 100644 (file)
@@ -253,13 +253,9 @@ void DvdWizard::generateDvd()
             i++;
         }
 
-        kDebug() << "///// SPU: ";
-        kDebug() << doc.toString();
-
         QFile data(temp6.fileName());
         if (data.open(QFile::WriteOnly)) {
-            QTextStream out(&data);
-            out << doc.toString();
+            data.write(doc.toString().toUtf8());
         }
         data.close();
 
@@ -397,8 +393,7 @@ void DvdWizard::generateDvd()
     */
     QFile data2(m_authorFile.fileName());
     if (data2.open(QFile::WriteOnly)) {
-        QTextStream out(&data2);
-        out << dvddoc.toString();
+        data2.write(dvddoc.toString().toUtf8());
     }
     data2.close();
     /*kDebug() << "------------------";
index a161ee9c8ec92e7de20441b230a51376840b6795..0d5ea94b8a3a8dbd1f559b3072ea4ba527a27357 100644 (file)
@@ -49,10 +49,19 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
     m_autoSaveTimer->setSingleShot(true);
     if (!url.isEmpty()) {
         QString tmpFile;
-        if (KIO::NetAccess::download(url.path(), tmpFile, parent)) {
+        bool success = KIO::NetAccess::download(url.path(), tmpFile, parent);
+        if (success) {
             QFile file(tmpFile);
-            m_document.setContent(&file, false);
+            QString errorMsg;
+            success = m_document.setContent(&file, false, &errorMsg);
             file.close();
+            if (success == false) {
+                // File is corrupted, warn user
+                KMessageBox::error(parent, errorMsg);
+            }
+        } else KMessageBox::error(parent, KIO::NetAccess::lastErrorString());
+
+        if (success) {
             QDomNode infoXmlNode = m_document.elementsByTagName("kdenlivedoc").at(0);
             QDomNode westley = m_document.elementsByTagName("westley").at(0);
             if (!infoXmlNode.isNull()) {
@@ -187,7 +196,6 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
             }
             KIO::NetAccess::removeTempFile(tmpFile);
         } else {
-            KMessageBox::error(parent, KIO::NetAccess::lastErrorString());
             parent->slotGotProgressInfo(i18n("File %1 is not a Kdenlive project file."), 100);
             m_url = KUrl();
             m_document = createEmptyDocument(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks());
@@ -1014,8 +1022,7 @@ bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene)
         return false;
     }
 
-    QTextStream out(&file);
-    out << sceneList.toString();
+    file.write(sceneList.toString().toUtf8());
     if (file.error() != QFile::NoError) {
         KMessageBox::error(kapp->activeWindow(), i18n("Cannot write to file %1", path));
         file.close();
index 3a57d142ef40415747962c3c94ad4371b63e64f9..a776cef6178dfae31d79e6738a63905f2110d037 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
-<gui name="kdenlive" version="40">
+<gui name="kdenlive" version="42">
   <ToolBar name="extraToolBar" >
     <text>Extra Toolbar</text>
        <Action name="project_render" />
          </Menu>
          <Action name="auto_transition" />
          <Action name="split_audio" />
+         <Separator />
          <Action name="clip_audio_only" />
          <Action name="clip_video_only" />
+         <Action name="clip_audio_and_video" />
 </Menu>
 
     <Menu name="timeline" ><text>Timeline</text>
index 88a942233e5284abd6003914ba9128704b56d95e..265f0c555a555f09ad39dd68e1c039d1e289a3f0 100644 (file)
@@ -964,11 +964,25 @@ void MainWindow::setupActions()
 
     KAction* audioOnly = new KAction(KIcon("document-new"), i18n("Audio Only"), this);
     collection->addAction("clip_audio_only", audioOnly);
-    connect(audioOnly, SIGNAL(triggered(bool)), this, SLOT(slotAudioOnly()));
+    audioOnly->setData("clip_audio_only");
+    audioOnly->setCheckable(true);
 
     KAction* videoOnly = new KAction(KIcon("document-new"), i18n("Video Only"), this);
     collection->addAction("clip_video_only", videoOnly);
-    connect(videoOnly, SIGNAL(triggered(bool)), this, SLOT(slotVideoOnly()));
+    videoOnly->setData("clip_video_only");
+    videoOnly->setCheckable(true);
+
+    KAction* audioAndVideo = new KAction(KIcon("document-new"), i18n("Audio and Video"), this);
+    collection->addAction("clip_audio_and_video", audioAndVideo);
+    audioAndVideo->setData("clip_audio_and_video");
+    audioAndVideo->setCheckable(true);
+
+    m_clipTypeGroup = new QActionGroup(this);
+    m_clipTypeGroup->addAction(audioOnly);
+    m_clipTypeGroup->addAction(videoOnly);
+    m_clipTypeGroup->addAction(audioAndVideo);
+    connect(m_clipTypeGroup, SIGNAL(triggered(QAction *)), this, SLOT(slotUpdateClipType(QAction *)));
+    m_clipTypeGroup->setEnabled(false);
 
     KAction *insertSpace = new KAction(KIcon(), i18n("Insert Space"), this);
     collection->addAction("insert_space", insertSpace);
@@ -1786,7 +1800,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
     connect(trackView, SIGNAL(zoneMoved(int, int)), this, SLOT(slotZoneMoved(int, int)));
     connect(m_projectList, SIGNAL(loadingIsOver()), trackView->projectView(), SLOT(slotUpdateAllThumbs()));
 
-    trackView->projectView()->setContextMenu(m_timelineContextMenu, m_timelineContextClipMenu, m_timelineContextTransitionMenu);
+    trackView->projectView()->setContextMenu(m_timelineContextMenu, m_timelineContextClipMenu, m_timelineContextTransitionMenu, m_clipTypeGroup);
     m_activeTimeline = trackView;
     if (m_renderWidget) {
         m_renderWidget->setProfile(doc->mltProfile());
@@ -2534,14 +2548,13 @@ void MainWindow::slotSplitAudio()
     if (m_activeTimeline) m_activeTimeline->projectView()->splitAudio();
 }
 
-void MainWindow::slotAudioOnly()
+void MainWindow::slotUpdateClipType(QAction *action)
 {
-    if (m_activeTimeline) m_activeTimeline->projectView()->audioOnly();
-}
-
-void MainWindow::slotVideoOnly()
-{
-    if (m_activeTimeline) m_activeTimeline->projectView()->videoOnly();
+    if (m_activeTimeline) {
+        if (action->data().toString() == "clip_audio_only") m_activeTimeline->projectView()->setAudioOnly();
+        else if (action->data().toString() == "clip_video_only") m_activeTimeline->projectView()->setVideoOnly();
+        else m_activeTimeline->projectView()->setAudioAndVideo();
+    }
 }
 
 void MainWindow::slotDvdWizard(const QString &url, const QString &profile)
index 106fbe6d33f97e78401cd5431a27dec54c33b951..ec949c45261462f065af53a521a4ba4dbfa088a2 100644 (file)
@@ -171,6 +171,7 @@ private:
     QAction *m_loopZone;
     QAction *m_playZone;
     StatusBarMessageLabel *m_messageLabel;
+    QActionGroup *m_clipTypeGroup;
 
     bool m_findActivated;
     QString m_findString;
@@ -297,8 +298,7 @@ private slots:
     void slotGroupClips();
     void slotUnGroupClips();
     void slotSplitAudio();
-    void slotVideoOnly();
-    void slotAudioOnly();
+    void slotUpdateClipType(QAction *action);
     void slotShowTimeline(bool show);
     void slotMaximizeCurrent(bool show);
 
index 7edc2a5922a1f62f604dda5b884bc42d076248f3..08fdc919f64e53e1c463b2fd43c33be503df7a6a 100644 (file)
@@ -150,7 +150,7 @@ void Monitor::setupMenu(QMenu *goMenu, QAction *playZone, QAction *loopZone, QMe
 {
     m_contextMenu = new QMenu(this);
     m_contextMenu->addMenu(m_playMenu);
-    m_contextMenu->addMenu(goMenu);
+    if (goMenu) m_contextMenu->addMenu(goMenu);
     if (markerMenu) m_contextMenu->addMenu(markerMenu);
 
     m_playMenu->addAction(playZone);