X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=4a6375497733639b43960629e1961ece2ef34b85;hb=ffbd98f8303b09f3fd4f7cf2c74c20080c7fd115;hp=bed6612a6cb2614a3ea406e0590c1e892b87ab58;hpb=6b62aea6ca623bc772fb4440ac88b390dc577eb1;p=kdenlive diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index bed6612a..4a637549 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -82,6 +82,7 @@ #include #include #include +#include #include #include @@ -89,6 +90,7 @@ #include #include #include +#include #include @@ -123,7 +125,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent dbus.registerObject("/MainWindow", this); setlocale(LC_NUMERIC, "POSIX"); - slotChangePalette(NULL, KdenliveSettings::colortheme()); + if (!KdenliveSettings::colortheme().isEmpty()) slotChangePalette(NULL, KdenliveSettings::colortheme()); setFont(KGlobalSettings::toolBarFont()); parseProfiles(MltPath); m_commandStack = new QUndoGroup; @@ -254,17 +256,51 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent QAction *action; // build themes menus QMenu *themesMenu = static_cast(factory()->container("themes_menu", this)); + QActionGroup *themegroup = new QActionGroup(this); + themegroup->setExclusive(true); action = new QAction(i18n("Default"), this); - themesMenu->addAction(action); - KGlobal::dirs()->addResourceDir("themes", KStandardDirs::installPath("data") + QString("kdenlive/themes")); + action->setCheckable(true); + themegroup->addAction(action); + if (KdenliveSettings::colortheme().isEmpty()) action->setChecked(true); + + + const QStringList schemeFiles = KGlobal::dirs()->findAllResources("data", "color-schemes/*.colors", KStandardDirs::NoDuplicates); + + for (int i = 0; i < schemeFiles.size(); ++i) { + // get the file name + const QString filename = schemeFiles.at(i); + const QFileInfo info(filename); + + // add the entry + KSharedConfigPtr config = KSharedConfig::openConfig(filename); + QIcon icon = createSchemePreviewIcon(config); + KConfigGroup group(config, "General"); + const QString name = group.readEntry("Name", info.baseName()); + action = new QAction(name, this); + action->setData(filename); + action->setIcon(icon); + action->setCheckable(true); + themegroup->addAction(action); + if (KdenliveSettings::colortheme() == filename) action->setChecked(true); + } + + + + + + + /*KGlobal::dirs()->addResourceDir("themes", KStandardDirs::installPath("data") + QString("kdenlive/themes")); QStringList themes = KGlobal::dirs()->findAllResources("themes", QString(), KStandardDirs::Recursive | KStandardDirs::NoDuplicates); for (QStringList::const_iterator it = themes.constBegin(); it != themes.constEnd(); ++it) { - QFileInfo fi(*it); + QFileInfo fi(*it); action = new QAction(fi.fileName(), this); action->setData(*it); - themesMenu->addAction(action); - } + action->setCheckable(true); + themegroup->addAction(action); + if (KdenliveSettings::colortheme() == *it) action->setChecked(true); + }*/ + themesMenu->addActions(themegroup->actions()); connect(themesMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotChangePalette(QAction*))); // build effects menus @@ -656,7 +692,8 @@ 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(showClipProperties(DocClipBase *)), this, SLOT(slotShowClipProperties(DocClipBase *))); - connect(m_projectList, SIGNAL(getFileProperties(const QDomElement, const QString &, bool)), m_projectMonitor->render, SLOT(getFileProperties(const QDomElement, const QString &, bool))); + connect(m_projectList, SIGNAL(showClipProperties(QList , QMap)), this, SLOT(slotShowClipProperties(QList , QMap))); + connect(m_projectList, SIGNAL(getFileProperties(const QDomElement, const QString &, int, bool)), m_projectMonitor->render, SLOT(getFileProperties(const QDomElement, const QString &, int, bool))); connect(m_projectMonitor->render, SIGNAL(replyGetImage(const QString &, const QPixmap &)), m_projectList, SLOT(slotReplyGetImage(const QString &, const QPixmap &))); connect(m_projectMonitor->render, SIGNAL(replyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool)), m_projectList, SLOT(slotReplyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool))); @@ -703,10 +740,41 @@ void MainWindow::setupActions() KToolBar *toolbar = new KToolBar("statusToolBar", this, Qt::BottomToolBarArea); toolbar->setMovable(false); - m_toolGroup = new QActionGroup(this); statusBar()->setStyleSheet(QString("QStatusBar QLabel {font-size:%1pt;} QStatusBar::item { border: 0px; font-size:%1pt;padding:0px; }").arg(statusBar()->font().pointSize())); QString style1 = "QToolBar { border: 0px } QToolButton { border-style: inset; border:1px solid #999999;border-radius: 3px;margin: 0px 3px;padding: 0px;} QToolButton:checked { background-color: rgba(224, 224, 0, 100); border-style: inset; border:1px solid #cc6666;border-radius: 3px;}"; + // create edit mode buttons + m_normalEditTool = new KAction(KIcon("kdenlive-normal-edit"), i18n("Normal mode"), this); + m_normalEditTool->setShortcut(i18nc("Normal editing", "n")); + toolbar->addAction(m_normalEditTool); + m_normalEditTool->setCheckable(true); + m_normalEditTool->setChecked(true); + + m_overwriteEditTool = new KAction(KIcon("kdenlive-overwrite-edit"), i18n("Overwrite mode"), this); + //m_overwriteEditTool->setShortcut(i18nc("Overwrite mode shortcut", "o")); + toolbar->addAction(m_overwriteEditTool); + m_overwriteEditTool->setCheckable(true); + m_overwriteEditTool->setChecked(false); + + m_insertEditTool = new KAction(KIcon("kdenlive-insert-edit"), i18n("Insert mode"), this); + //m_insertEditTool->setShortcut(i18nc("Insert mode shortcut", "i")); + toolbar->addAction(m_insertEditTool); + m_insertEditTool->setCheckable(true); + m_insertEditTool->setChecked(false); + // not implemented yet + m_insertEditTool->setEnabled(false); + + QActionGroup *editGroup = new QActionGroup(this); + editGroup->addAction(m_normalEditTool); + editGroup->addAction(m_overwriteEditTool); + editGroup->addAction(m_insertEditTool); + editGroup->setExclusive(true); + connect(editGroup, SIGNAL(triggered(QAction *)), this, SLOT(slotChangeEdit(QAction *))); + //connect(m_overwriteEditTool, SIGNAL(toggled(bool)), this, SLOT(slotSetOverwriteMode(bool))); + + toolbar->addSeparator(); + + // create tools buttons m_buttonSelectTool = new KAction(KIcon("kdenlive-select-tool"), i18n("Selection tool"), this); m_buttonSelectTool->setShortcut(i18nc("Selection tool shortcut", "s")); toolbar->addAction(m_buttonSelectTool); @@ -725,14 +793,27 @@ void MainWindow::setupActions() m_buttonSpacerTool->setCheckable(true); m_buttonSpacerTool->setChecked(false); - m_toolGroup->addAction(m_buttonSelectTool); - m_toolGroup->addAction(m_buttonRazorTool); - m_toolGroup->addAction(m_buttonSpacerTool); - m_toolGroup->setExclusive(true); + QActionGroup *toolGroup = new QActionGroup(this); + toolGroup->addAction(m_buttonSelectTool); + toolGroup->addAction(m_buttonRazorTool); + toolGroup->addAction(m_buttonSpacerTool); + toolGroup->setExclusive(true); toolbar->setToolButtonStyle(Qt::ToolButtonIconOnly); QWidget * actionWidget; int max = toolbar->iconSizeDefault() + 2; + actionWidget = toolbar->widgetForAction(m_normalEditTool); + actionWidget->setMaximumWidth(max); + actionWidget->setMaximumHeight(max - 4); + + actionWidget = toolbar->widgetForAction(m_insertEditTool); + actionWidget->setMaximumWidth(max); + actionWidget->setMaximumHeight(max - 4); + + actionWidget = toolbar->widgetForAction(m_overwriteEditTool); + actionWidget->setMaximumWidth(max); + actionWidget->setMaximumHeight(max - 4); + actionWidget = toolbar->widgetForAction(m_buttonSelectTool); actionWidget->setMaximumWidth(max); actionWidget->setMaximumHeight(max - 4); @@ -746,7 +827,7 @@ void MainWindow::setupActions() actionWidget->setMaximumHeight(max - 4); toolbar->setStyleSheet(style1); - connect(m_toolGroup, SIGNAL(triggered(QAction *)), this, SLOT(slotChangeTool(QAction *))); + connect(toolGroup, SIGNAL(triggered(QAction *)), this, SLOT(slotChangeTool(QAction *))); toolbar->addSeparator(); m_buttonFitZoom = new KAction(KIcon("zoom-fit-best"), i18n("Fit zoom to project"), this); @@ -816,6 +897,9 @@ void MainWindow::setupActions() statusBar()->addPermanentWidget(m_timecodeFormat); //statusBar()->setMaximumHeight(statusBar()->font().pointSize() * 3); + collection->addAction("normal_mode", m_normalEditTool); + collection->addAction("overwrite_mode", m_overwriteEditTool); + collection->addAction("insert_mode", m_insertEditTool); collection->addAction("select_tool", m_buttonSelectTool); collection->addAction("razor_tool", m_buttonRazorTool); collection->addAction("spacer_tool", m_buttonSpacerTool); @@ -901,15 +985,40 @@ void MainWindow::setupActions() connect(transcodeClip, SIGNAL(triggered(bool)), this, SLOT(slotTranscodeClip())); KAction *markIn = collection->addAction("mark_in"); - markIn->setText(i18n("Set In Point")); + markIn->setText(i18n("Set Zone In")); markIn->setShortcut(Qt::Key_I); connect(markIn, SIGNAL(triggered(bool)), this, SLOT(slotSetInPoint())); KAction *markOut = collection->addAction("mark_out"); - markOut->setText(i18n("Set Out Point")); + markOut->setText(i18n("Set Zone Out")); markOut->setShortcut(Qt::Key_O); connect(markOut, SIGNAL(triggered(bool)), this, SLOT(slotSetOutPoint())); + KAction *switchMon = collection->addAction("switch_monitor"); + switchMon->setText(i18n("Switch monitor")); + switchMon->setShortcut(Qt::Key_T); + connect(switchMon, SIGNAL(triggered(bool)), this, SLOT(slotSwitchMonitors())); + + KAction *insertTree = collection->addAction("insert_project_tree"); + insertTree->setText(i18n("Insert zone in project tree")); + insertTree->setShortcut(Qt::CTRL + Qt::Key_I); + connect(insertTree, SIGNAL(triggered(bool)), this, SLOT(slotInsertZoneToTree())); + + KAction *insertTimeline = collection->addAction("insert_timeline"); + insertTimeline->setText(i18n("Insert zone in timeline")); + insertTimeline->setShortcut(Qt::SHIFT + Qt::CTRL + Qt::Key_I); + connect(insertTimeline, SIGNAL(triggered(bool)), this, SLOT(slotInsertZoneToTimeline())); + + KAction *resizeStart = new KAction(KIcon(), i18n("Resize Item Start"), this); + collection->addAction("resize_timeline_clip_start", resizeStart); + resizeStart->setShortcut(Qt::Key_1); + connect(resizeStart, SIGNAL(triggered(bool)), this, SLOT(slotResizeItemStart())); + + KAction *resizeEnd = new KAction(KIcon(), i18n("Resize Item End"), this); + collection->addAction("resize_timeline_clip_end", resizeEnd); + resizeEnd->setShortcut(Qt::Key_2); + connect(resizeEnd, SIGNAL(triggered(bool)), this, SLOT(slotResizeItemEnd())); + KAction* monitorSeekBackward = new KAction(KIcon("media-seek-backward"), i18n("Rewind"), this); monitorSeekBackward->setShortcut(Qt::Key_J); collection->addAction("monitor_seek_backward", monitorSeekBackward); @@ -945,6 +1054,16 @@ void MainWindow::setupActions() collection->addAction("seek_clip_end", clipEnd); connect(clipEnd, SIGNAL(triggered(bool)), this, SLOT(slotClipEnd())); + KAction* zoneStart = new KAction(KIcon("media-seek-backward"), i18n("Go to Zone Start"), this); + zoneStart->setShortcut(Qt::SHIFT + Qt::Key_I); + collection->addAction("seek_zone_start", zoneStart); + connect(zoneStart, SIGNAL(triggered(bool)), this, SLOT(slotZoneStart())); + + KAction* zoneEnd = new KAction(KIcon("media-seek-forward"), i18n("Go to Zone End"), this); + zoneEnd->setShortcut(Qt::SHIFT + Qt::Key_O); + collection->addAction("seek_zone_end", zoneEnd); + connect(zoneEnd, SIGNAL(triggered(bool)), this, SLOT(slotZoneEnd())); + KAction* projectStart = new KAction(KIcon("go-first"), i18n("Go to Project Start"), this); projectStart->setShortcut(Qt::CTRL + Qt::Key_Home); collection->addAction("seek_start", projectStart); @@ -998,6 +1117,41 @@ void MainWindow::setupActions() ungroupClip->setData("ungroup_clip"); connect(ungroupClip, SIGNAL(triggered(bool)), this, SLOT(slotUnGroupClips())); + 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); + connect(insertOvertwrite, SIGNAL(triggered(bool)), this, SLOT(slotInsertClipOverwrite())); + + KAction* selectTimelineClip = new KAction(KIcon("edit-select"), i18n("Select Clip"), this); + selectTimelineClip->setShortcut(Qt::Key_Plus); + collection->addAction("select_timeline_clip", selectTimelineClip); + connect(selectTimelineClip, SIGNAL(triggered(bool)), this, SLOT(slotSelectTimelineClip())); + + KAction* deselectTimelineClip = new KAction(KIcon("edit-select"), i18n("Deselect Clip"), this); + deselectTimelineClip->setShortcut(Qt::Key_Minus); + collection->addAction("deselect_timeline_clip", deselectTimelineClip); + connect(deselectTimelineClip, SIGNAL(triggered(bool)), this, SLOT(slotDeselectTimelineClip())); + + KAction* selectAddTimelineClip = new KAction(KIcon("edit-select"), i18n("Add Clip To Selection"), this); + selectAddTimelineClip->setShortcut(Qt::ALT + Qt::Key_Plus); + collection->addAction("select_add_timeline_clip", selectAddTimelineClip); + connect(selectAddTimelineClip, SIGNAL(triggered(bool)), this, SLOT(slotSelectAddTimelineClip())); + + KAction* selectTimelineTransition = new KAction(KIcon("edit-select"), i18n("Select Transition"), this); + selectTimelineTransition->setShortcut(Qt::SHIFT + Qt::Key_Plus); + collection->addAction("select_timeline_transition", selectTimelineTransition); + connect(selectTimelineTransition, SIGNAL(triggered(bool)), this, SLOT(slotSelectTimelineTransition())); + + KAction* deselectTimelineTransition = new KAction(KIcon("edit-select"), i18n("Deselect Transition"), this); + deselectTimelineTransition->setShortcut(Qt::SHIFT + Qt::Key_Minus); + collection->addAction("deselect_timeline_transition", deselectTimelineTransition); + connect(deselectTimelineTransition, SIGNAL(triggered(bool)), this, SLOT(slotDeselectTimelineTransition())); + + KAction* selectAddTimelineTransition = new KAction(KIcon("edit-select"), i18n("Add Transition To Selection"), this); + selectAddTimelineTransition->setShortcut(Qt::ALT + Qt::SHIFT + Qt::Key_Plus); + collection->addAction("select_add_timeline_transition", selectAddTimelineTransition); + connect(selectAddTimelineTransition, SIGNAL(triggered(bool)), this, SLOT(slotSelectAddTimelineTransition())); + KAction* cutTimelineClip = new KAction(KIcon("edit-cut"), i18n("Cut Clip"), this); cutTimelineClip->setShortcut(Qt::SHIFT + Qt::Key_R); collection->addAction("cut_timeline_clip", cutTimelineClip); @@ -1265,30 +1419,30 @@ void MainWindow::slotRunWizard() delete w; } -void MainWindow::newFile(bool showProjectSettings) +void MainWindow::newFile(bool showProjectSettings, bool force) { - if (!m_timelineArea->isEnabled()) return; + if (!m_timelineArea->isEnabled() && !force) return; m_fileRevert->setEnabled(false); QString profileName; KUrl projectFolder; QPoint projectTracks(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()); - if (!showProjectSettings && m_timelineArea->count() == 0) { + if (!showProjectSettings) { if (!KdenliveSettings::activatetabs()) closeCurrentDocument(); profileName = KdenliveSettings::default_profile(); projectFolder = KdenliveSettings::defaultprojectfolder(); } else { - ProjectSettings *w = new ProjectSettings(NULL, projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, true, this); + ProjectSettings *w = new ProjectSettings(NULL, QStringList(), projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, true, this); if (w->exec() != QDialog::Accepted) return; if (!KdenliveSettings::activatetabs()) closeCurrentDocument(); - KdenliveSettings::setVideothumbnails(w->enableVideoThumbs()); - m_buttonVideoThumbs->setChecked(KdenliveSettings::videothumbnails()); - KdenliveSettings::setAudiothumbnails(w->enableAudioThumbs()); - m_buttonAudioThumbs->setChecked(KdenliveSettings::audiothumbnails()); + if (KdenliveSettings::videothumbnails() != w->enableVideoThumbs()) slotSwitchVideoThumbs(); + if (KdenliveSettings::audiothumbnails() != w->enableAudioThumbs()) slotSwitchAudioThumbs(); profileName = w->selectedProfile(); projectFolder = w->selectedFolder(); projectTracks = w->tracks(); delete w; } + m_timelineArea->setEnabled(true); + m_projectList->setEnabled(true); KdenliveDoc *doc = new KdenliveDoc(KUrl(), projectFolder, m_commandStack, profileName, projectTracks, m_projectMonitor->render, this); doc->m_autosave = new KAutoSaveFile(KUrl(), doc); bool ok; @@ -1296,9 +1450,8 @@ void MainWindow::newFile(bool showProjectSettings) m_timelineArea->addTab(trackView, KIcon("kdenlive"), doc->description()); if (!ok) { // MLT is broken - m_timelineArea->setEnabled(false); - m_projectList->setEnabled(false); - m_monitorManager->slotBlockMonitors(); + //m_timelineArea->setEnabled(false); + //m_projectList->setEnabled(false); slotPreferences(6); return; } @@ -1504,8 +1657,9 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) if (!ok) { m_timelineArea->setEnabled(false); m_projectList->setEnabled(false); - m_monitorManager->slotBlockMonitors(); - slotPreferences(6); + KMessageBox::sorry(this, i18n("Cannot open file %1.\nProject is corrupted.", url.path())); + slotGotProgressInfo(QString(), -1); + newFile(false, true); return; } m_timelineArea->setTabToolTip(m_timelineArea->currentIndex(), doc->url().path()); @@ -1644,16 +1798,14 @@ void MainWindow::slotDetectAudioDriver() void MainWindow::slotEditProjectSettings() { QPoint p = m_activeDocument->getTracksCount(); - ProjectSettings *w = new ProjectSettings(m_activeDocument->clipManager(), p.x(), p.y(), m_activeDocument->projectFolder().path(), true, !m_activeDocument->isModified(), this); + ProjectSettings *w = new ProjectSettings(m_projectList, m_activeTimeline->projectView()->extractTransitionsLumas(), p.x(), p.y(), m_activeDocument->projectFolder().path(), true, !m_activeDocument->isModified(), this); if (w->exec() == QDialog::Accepted) { - if (w->deleteUnused()) { - // we are going to trash the unused clips - m_projectList->trashUnusedClips(); - } QString profile = w->selectedProfile(); m_activeDocument->setProjectFolder(w->selectedFolder()); if (m_renderWidget) m_renderWidget->setDocumentPath(w->selectedFolder().path(KUrl::AddTrailingSlash)); + if (KdenliveSettings::videothumbnails() != w->enableVideoThumbs()) slotSwitchVideoThumbs(); + if (KdenliveSettings::audiothumbnails() != w->enableAudioThumbs()) slotSwitchAudioThumbs(); if (m_activeDocument->profilePath() != profile) { // Profile was changed double dar = m_activeDocument->dar(); @@ -1661,7 +1813,7 @@ void MainWindow::slotEditProjectSettings() // Deselect current effect / transition m_effectStack->slotClipItemSelected(NULL, 0); m_transitionConfig->slotTransitionItemSelected(NULL, 0, QPoint(), false); - m_clipMonitor->slotSetXml(NULL, 0); + m_clipMonitor->slotSetXml(NULL); bool updateFps = m_activeDocument->setProfilePath(profile); KdenliveSettings::setCurrent_profile(profile); KdenliveSettings::setProject_fps(m_activeDocument->fps()); @@ -1787,9 +1939,10 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha disconnect(m_activeTimeline->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), this, SLOT(slotActivateEffectStackView())); 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 *, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, const int))); + 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())); disconnect(m_activeTimeline, SIGNAL(insertTrack(int)), this, SLOT(slotInsertTrack(int))); disconnect(m_activeTimeline, SIGNAL(deleteTrack(int)), this, SLOT(slotDeleteTrack(int))); @@ -1820,7 +1973,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha m_projectList->setDocument(doc); m_transitionConfig->updateProjectFormat(doc->mltProfile(), doc->timecode(), doc->tracksList()); m_effectStack->updateProjectFormat(doc->mltProfile(), doc->timecode()); - connect(m_projectList, SIGNAL(clipSelected(DocClipBase *)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *))); + connect(m_projectList, SIGNAL(clipSelected(DocClipBase *, QPoint)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint))); connect(m_projectList, SIGNAL(refreshClip()), m_clipMonitor, SLOT(refreshMonitor())); connect(m_projectList, SIGNAL(projectModified()), doc, SLOT(setModified())); connect(m_projectList, SIGNAL(clipNameChanged(const QString, const QString)), trackView->projectView(), SLOT(clipNameChanged(const QString, const QString))); @@ -1834,6 +1987,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(trackView, SIGNAL(mousePosition(int)), this, SLOT(slotUpdateMousePosition(int))); connect(m_projectMonitor, SIGNAL(renderPosition(int)), trackView, SLOT(moveCursorPos(int))); connect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), trackView, SLOT(slotSetZone(QPoint))); + connect(m_clipMonitor, SIGNAL(zoneUpdated(QPoint)), m_projectList, SLOT(slotUpdateClipCut(QPoint))); connect(m_projectMonitor, SIGNAL(durationChanged(int)), trackView, SLOT(setDuration(int))); connect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers()), doc, SLOT(checkProjectClips())); @@ -1861,7 +2015,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(trackView, SIGNAL(setZoom(int)), this, SLOT(slotSetZoom(int))); connect(trackView->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType))); - connect(trackView->projectView(), SIGNAL(showClipFrame(DocClipBase *, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, const int))); + connect(trackView->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint, const int))); + connect(trackView->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay())); connect(m_effectStack, SIGNAL(updateClipEffect(ClipItem*, QDomElement, QDomElement, int)), trackView->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, QDomElement, QDomElement, int))); @@ -1898,6 +2053,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha setCaption(doc->description(), doc->isModified()); m_saveAction->setEnabled(doc->isModified()); + m_normalEditTool->setChecked(true); m_activeDocument = doc; m_activeTimeline->updateProjectFps(); m_activeDocument->checkProjectClips(); @@ -1947,7 +2103,7 @@ void MainWindow::slotPreferences(int page, int option) void MainWindow::slotUpdatePreviewSettings() { if (m_activeDocument) { - m_clipMonitor->slotSetXml(NULL, 0); + m_clipMonitor->slotSetXml(NULL); m_activeDocument->updatePreviewSettings(); } } @@ -2204,6 +2360,56 @@ void MainWindow::slotCutTimelineClip() } } +void MainWindow::slotInsertClipOverwrite() +{ + if (m_activeTimeline) { + QStringList data = m_clipMonitor->getZoneInfo(); + m_activeTimeline->projectView()->insertZoneOverwrite(data, m_activeTimeline->inPoint()); + } +} + +void MainWindow::slotSelectTimelineClip() +{ + if (m_activeTimeline) { + m_activeTimeline->projectView()->selectClip(true); + } +} + +void MainWindow::slotSelectTimelineTransition() +{ + if (m_activeTimeline) { + m_activeTimeline->projectView()->selectTransition(true); + } +} + +void MainWindow::slotDeselectTimelineClip() +{ + if (m_activeTimeline) { + m_activeTimeline->projectView()->selectClip(false, true); + } +} + +void MainWindow::slotDeselectTimelineTransition() +{ + if (m_activeTimeline) { + m_activeTimeline->projectView()->selectTransition(false, true); + } +} + +void MainWindow::slotSelectAddTimelineClip() +{ + if (m_activeTimeline) { + m_activeTimeline->projectView()->selectClip(true, true); + } +} + +void MainWindow::slotSelectAddTimelineTransition() +{ + if (m_activeTimeline) { + m_activeTimeline->projectView()->selectTransition(true, true); + } +} + void MainWindow::slotGroupClips() { if (m_activeTimeline) { @@ -2347,10 +2553,12 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) if (description.isEmpty()) description = clip->getProperty("description"); else newprops.insert("templatetext", description); //newprops.insert("xmldata", m_projectList->generateTemplateXml(newtemplate, description).toString()); - - EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true); - m_activeDocument->commandStack()->push(command); + if (!newprops.isEmpty()) { + EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true); + m_activeDocument->commandStack()->push(command); + } } + delete dia; return; } QString path = clip->getProperty("resource"); @@ -2378,7 +2586,9 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) ClipProperties dia(clip, m_activeDocument->timecode(), m_activeDocument->fps(), this); connect(&dia, SIGNAL(addMarker(const QString &, GenTime, QString)), m_activeTimeline->projectView(), SLOT(slotAddClipMarker(const QString &, GenTime, QString))); if (dia.exec() == QDialog::Accepted) { - EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), dia.properties(), true); + QMap newprops = dia.properties(); + if (newprops.isEmpty()) return; + EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true); m_activeDocument->commandStack()->push(command); if (dia.needsTimelineRefresh()) { @@ -2388,6 +2598,24 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) } } + +void MainWindow::slotShowClipProperties(QList cliplist, QMap commonproperties) +{ + ClipProperties dia(cliplist, commonproperties, this); + if (dia.exec() == QDialog::Accepted) { + QUndoCommand *command = new QUndoCommand(); + command->setText(i18n("Edit clips")); + for (int i = 0; i < cliplist.count(); i++) { + DocClipBase *clip = cliplist.at(i); + new EditClipCommand(m_projectList, clip->getId(), clip->properties(), dia.properties(), true, command); + } + m_activeDocument->commandStack()->push(command); + for (int i = 0; i < cliplist.count(); i++) { + m_activeTimeline->projectView()->slotUpdateClip(cliplist.at(i)->getId(), dia.needsTimelineReload()); + } + } +} + void MainWindow::customEvent(QEvent* e) { if (e->type() == QEvent::User) { @@ -2436,6 +2664,18 @@ void MainWindow::slotClipEnd() } } +void MainWindow::slotZoneStart() +{ + if (m_projectMonitor->isActive()) m_projectMonitor->slotZoneStart(); + else m_clipMonitor->slotZoneStart(); +} + +void MainWindow::slotZoneEnd() +{ + if (m_projectMonitor->isActive()) m_projectMonitor->slotZoneEnd(); + else m_clipMonitor->slotZoneEnd(); +} + void MainWindow::slotChangeTool(QAction * action) { if (action == m_buttonSelectTool) slotSetTool(SELECTTOOL); @@ -2443,6 +2683,14 @@ void MainWindow::slotChangeTool(QAction * action) else if (action == m_buttonSpacerTool) slotSetTool(SPACERTOOL); } +void MainWindow::slotChangeEdit(QAction * action) +{ + if (!m_activeTimeline) return; + if (action == m_overwriteEditTool) m_activeTimeline->projectView()->setEditMode(OVERWRITEEDIT); + else if (action == m_insertEditTool) m_activeTimeline->projectView()->setEditMode(INSERTEDIT); + else m_activeTimeline->projectView()->setEditMode(NORMALEDIT); +} + void MainWindow::slotSetTool(PROJECTTOOL tool) { if (m_activeDocument && m_activeTimeline) { @@ -2615,14 +2863,26 @@ void MainWindow::slotSetInPoint() { if (m_clipMonitor->isActive()) { m_clipMonitor->slotSetZoneStart(); - } else m_activeTimeline->projectView()->setInPoint(); + } else m_projectMonitor->slotSetZoneStart(); + //else m_activeTimeline->projectView()->setInPoint(); } void MainWindow::slotSetOutPoint() { if (m_clipMonitor->isActive()) { m_clipMonitor->slotSetZoneEnd(); - } else m_activeTimeline->projectView()->setOutPoint(); + } else m_projectMonitor->slotSetZoneEnd(); + // else m_activeTimeline->projectView()->setOutPoint(); +} + +void MainWindow::slotResizeItemStart() +{ + if (m_activeTimeline) m_activeTimeline->projectView()->setInPoint(); +} + +void MainWindow::slotResizeItemEnd() +{ + if (m_activeTimeline) m_activeTimeline->projectView()->setOutPoint(); } void MainWindow::slotGetNewLumaStuff() @@ -2761,8 +3021,12 @@ void MainWindow::loadTranscoders() QMapIterator i(profiles); while (i.hasNext()) { i.next(); + QStringList data = i.value().split(";", QString::SkipEmptyParts); QAction *a = transMenu->addAction(i.key()); - a->setData(i.value()); + a->setData(data); + if (data.count() > 1) { + a->setToolTip(data.at(1)); + } connect(a, SIGNAL(triggered()), this, SLOT(slotTranscode())); } } @@ -2770,13 +3034,22 @@ void MainWindow::loadTranscoders() void MainWindow::slotTranscode(KUrl::List urls) { QString params; + QString desc; + QString condition; if (urls.isEmpty()) { - urls.append(m_projectList->currentClipUrl()); QAction *action = qobject_cast(sender()); - params = action->data().toString(); + QStringList data = action->data().toStringList(); + params = data.at(0); + if (data.count() > 1) desc = data.at(1); + if (data.count() > 2) condition = data.at(2); + urls << m_projectList->getConditionalUrls(condition); + urls.removeAll(KUrl()); } - if (urls.isEmpty()) return; - ClipTranscode *d = new ClipTranscode(urls, params); + if (urls.isEmpty()) { + m_messageLabel->setMessage(i18n("No clip to transcode"), ErrorMessage); + return; + } + ClipTranscode *d = new ClipTranscode(urls, params, desc); connect(d, SIGNAL(addClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl))); d->show(); //QProcess::startDetached("ffmpeg", parameters); @@ -2931,74 +3204,86 @@ void MainWindow::slotChangePalette(QAction *action, const QString &themename) QPalette plt; if (theme.isEmpty()) plt = QApplication::desktop()->palette(); - else - { - KConfig confFile(theme, KConfig::SimpleConfig); - plt = kapp->palette(); - int h, s, v; - const QColor fg(confFile.entryMap().value("TextRegularColor")); - const QColor bg(confFile.entryMap().value("BaseColor")); - - bg.getHsv(&h, &s, &v); - v += (v < 128) ? +50 : -50; - v &= 255; //ensures 0 <= v < 256 - const QColor highlight = QColor::fromHsv(h, s, v); - - fg.getHsv(&h, &s, &v); - v += (v < 128) ? +150 : -150; - v &= 255; //ensures 0 <= v < 256 - const QColor alternate = QColor::fromHsv(h, s, v); - - plt.setColor(QPalette::Active, QPalette::Base, bg); - plt.setColor(QPalette::Active, QPalette::AlternateBase, alternate); - plt.setColor(QPalette::Active, QPalette::Background, bg.dark(115)); - plt.setColor(QPalette::Active, QPalette::Foreground, fg); - plt.setColor(QPalette::Active, QPalette::Highlight, highlight); - plt.setColor(QPalette::Active, QPalette::HighlightedText, confFile.entryMap().value("TextSelectedColor")); - plt.setColor(QPalette::Active, QPalette::Dark, Qt::darkGray); - plt.setColor(QPalette::Active, QPalette::Button, bg); - plt.setColor(QPalette::Active, QPalette::ButtonText, fg); - plt.setColor(QPalette::Active, QPalette::Text, fg); - plt.setColor(QPalette::Active, QPalette::Link, confFile.entryMap().value("TextSpecialRegularColor")); - plt.setColor(QPalette::Active, QPalette::LinkVisited, confFile.entryMap().value("TextSpecialSelectedColor")); - - plt.setColor(QPalette::Inactive, QPalette::Base, bg); - plt.setColor(QPalette::Inactive, QPalette::AlternateBase, alternate); - plt.setColor(QPalette::Inactive, QPalette::Background, bg.dark(115)); - plt.setColor(QPalette::Inactive, QPalette::Foreground, fg); - plt.setColor(QPalette::Inactive, QPalette::Highlight, highlight); - plt.setColor(QPalette::Inactive, QPalette::HighlightedText, confFile.entryMap().value("TextSelectedColor")); - plt.setColor(QPalette::Inactive, QPalette::Dark, Qt::darkGray); - plt.setColor(QPalette::Inactive, QPalette::Button, bg); - plt.setColor(QPalette::Inactive, QPalette::ButtonText, fg); - plt.setColor(QPalette::Inactive, QPalette::Text, fg); - plt.setColor(QPalette::Inactive, QPalette::Link, confFile.entryMap().value("TextSpecialRegularColor")); - plt.setColor(QPalette::Inactive, QPalette::LinkVisited, confFile.entryMap().value("TextSpecialSelectedColor")); - - plt.setColor(QPalette::Disabled, QPalette::Base, bg); - plt.setColor(QPalette::Disabled, QPalette::AlternateBase, alternate); - plt.setColor(QPalette::Disabled, QPalette::Background, bg.dark(115)); - plt.setColor(QPalette::Disabled, QPalette::Foreground, fg); - plt.setColor(QPalette::Disabled, QPalette::Highlight, highlight); - plt.setColor(QPalette::Disabled, QPalette::HighlightedText, confFile.entryMap().value("TextSelectedColor")); - plt.setColor(QPalette::Disabled, QPalette::Dark, Qt::darkGray); - plt.setColor(QPalette::Disabled, QPalette::Button, bg); - plt.setColor(QPalette::Disabled, QPalette::ButtonText, fg); - plt.setColor(QPalette::Disabled, QPalette::Text, fg); - plt.setColor(QPalette::Disabled, QPalette::Link, confFile.entryMap().value("TextSpecialRegularColor")); - plt.setColor(QPalette::Disabled, QPalette::LinkVisited, confFile.entryMap().value("TextSpecialSelectedColor")); - - /* - cg.setColor(QColorGroup::Light, ThemeEngine::instance()->textRegColor()); - cg.setColor(QColorGroup::Midlight, ThemeEngine::instance()->textRegColor()); - cg.setColor(QColorGroup::Mid, ThemeEngine::instance()->textRegColor()); - cg.setColor(QColorGroup::Shadow, ThemeEngine::instance()->textRegColor()); - */ + else { + KSharedConfigPtr config = KSharedConfig::openConfig(theme); + plt = KGlobalSettings::createApplicationPalette(config); } kapp->setPalette(plt); + const QObjectList children = statusBar()->children(); + + foreach(QObject *child, children) { + if (child->isWidgetType()) + ((QWidget*)child)->setPalette(plt); + const QObjectList subchildren = child->children(); + foreach(QObject *subchild, subchildren) { + if (subchild->isWidgetType()) + ((QWidget*)subchild)->setPalette(plt); + } + } +} + + +QPixmap MainWindow::createSchemePreviewIcon(const KSharedConfigPtr &config) +{ + // code taken from kdebase/workspace/kcontrol/colors/colorscm.cpp + const uchar bits1[] = { 0xff, 0xff, 0xff, 0x2c, 0x16, 0x0b }; + const uchar bits2[] = { 0x68, 0x34, 0x1a, 0xff, 0xff, 0xff }; + const QSize bitsSize(24, 2); + const QBitmap b1 = QBitmap::fromData(bitsSize, bits1); + const QBitmap b2 = QBitmap::fromData(bitsSize, bits2); + + QPixmap pixmap(23, 16); + pixmap.fill(Qt::black); // ### use some color other than black for borders? + + KConfigGroup group(config, "WM"); + QPainter p(&pixmap); + KColorScheme windowScheme(QPalette::Active, KColorScheme::Window, config); + p.fillRect(1, 1, 7, 7, windowScheme.background()); + p.fillRect(2, 2, 5, 2, QBrush(windowScheme.foreground().color(), b1)); + + KColorScheme buttonScheme(QPalette::Active, KColorScheme::Button, config); + p.fillRect(8, 1, 7, 7, buttonScheme.background()); + p.fillRect(9, 2, 5, 2, QBrush(buttonScheme.foreground().color(), b1)); + + p.fillRect(15, 1, 7, 7, group.readEntry("activeBackground", QColor(96, 148, 207))); + p.fillRect(16, 2, 5, 2, QBrush(group.readEntry("activeForeground", QColor(255, 255, 255)), b1)); + + KColorScheme viewScheme(QPalette::Active, KColorScheme::View, config); + p.fillRect(1, 8, 7, 7, viewScheme.background()); + p.fillRect(2, 12, 5, 2, QBrush(viewScheme.foreground().color(), b2)); + + KColorScheme selectionScheme(QPalette::Active, KColorScheme::Selection, config); + p.fillRect(8, 8, 7, 7, selectionScheme.background()); + p.fillRect(9, 12, 5, 2, QBrush(selectionScheme.foreground().color(), b2)); + + p.fillRect(15, 8, 7, 7, group.readEntry("inactiveBackground", QColor(224, 223, 222))); + p.fillRect(16, 12, 5, 2, QBrush(group.readEntry("inactiveForeground", QColor(20, 19, 18)), b2)); + + p.end(); + return pixmap; } +void MainWindow::slotSwitchMonitors() +{ + m_monitorManager->slotSwitchMonitors(); + if (m_projectMonitor->isActive()) m_activeTimeline->projectView()->setFocus(); + else m_projectList->focusTree(); +} + +void MainWindow::slotInsertZoneToTree() +{ + if (!m_clipMonitor->isActive() || m_clipMonitor->activeClip() == NULL) return; + QStringList info = m_clipMonitor->getZoneInfo(); + m_projectList->slotAddClipCut(info.at(0), info.at(1).toInt(), info.at(2).toInt()); +} + +void MainWindow::slotInsertZoneToTimeline() +{ + if (m_activeTimeline == NULL || m_clipMonitor->activeClip() == NULL) return; + QStringList info = m_clipMonitor->getZoneInfo(); + m_activeTimeline->projectView()->insertClipCut(m_clipMonitor->activeClip(), info.at(1).toInt(), info.at(2).toInt()); +} #include "mainwindow.moc"