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 {
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);
}
// 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)
m_audioOnly = force;
if (m_audioOnly) setBrush(QColor(141, 215, 166));
else setBrush(QColor(141, 166, 215));
+ audioThumbCachePic.clear();
}
bool ClipItem::isAudioOnly() const
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);
m_scene->clearSelection();
event->accept();
emit clipItemSelected(NULL);
+ updateClipTypeActions(NULL);
if (m_tool == SPACERTOOL) {
QList<QGraphicsItem *> selection;
if (event->modifiers() == Qt::ControlModifier) {
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);
}
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);
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();
}
}
-void CustomTrackView::videoOnly()
+void CustomTrackView::setVideoOnly()
{
resetSelectionGroup();
QList<QGraphicsItem *> selection = scene()->selectedItems();
m_commandStack->push(videoCommand);
}
-void CustomTrackView::audioOnly()
+void CustomTrackView::setAudioOnly()
{
resetSelectionGroup();
QList<QGraphicsItem *> selection = scene()->selectedItems();
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);
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"
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);
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:
QAction *m_changeSpeedAction;
QAction *m_pasteEffectsAction;
QAction *m_ungroupAction;
+ QActionGroup *m_clipTypeGroup;
QTimer m_scrollTimer;
int m_scrollOffset;
bool m_clipDrag;
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();
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();
*/
QFile data2(m_authorFile.fileName());
if (data2.open(QFile::WriteOnly)) {
- QTextStream out(&data2);
- out << dvddoc.toString();
+ data2.write(dvddoc.toString().toUtf8());
}
data2.close();
/*kDebug() << "------------------";
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()) {
}
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());
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();
<?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>
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);
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());
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)
QAction *m_loopZone;
QAction *m_playZone;
StatusBarMessageLabel *m_messageLabel;
+ QActionGroup *m_clipTypeGroup;
bool m_findActivated;
QString m_findString;
void slotGroupClips();
void slotUnGroupClips();
void slotSplitAudio();
- void slotVideoOnly();
- void slotAudioOnly();
+ void slotUpdateClipType(QAction *action);
void slotShowTimeline(bool show);
void slotMaximizeCurrent(bool show);
{
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);