X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=e4e2bf04a91c89ac2c457239002ddbb3afbd99b3;hb=7ac1f7b70439ce38c29fb6ff02439f24cb040ccc;hp=8f940fffa1e936ba0ec456ad5ae432f78f27a75f;hpb=f4d4a64f48d304220eb5e5cd59298e5cd40a2aff;p=kdenlive diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 8f940fff..e4e2bf04 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -151,6 +151,9 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent m_projectListDock->setWidget(m_projectList); addDockWidget(Qt::TopDockWidgetArea, m_projectListDock); + m_shortcutRemoveFocus = new QShortcut(QKeySequence("Esc"), this); + connect(m_shortcutRemoveFocus, SIGNAL(activated()), this, SLOT(slotRemoveFocus())); + m_effectListDock = new QDockWidget(i18n("Effect List"), this); m_effectListDock->setObjectName("effect_list"); m_effectList = new EffectsListView(); @@ -191,6 +194,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent m_projectMonitorDock->setWidget(m_projectMonitor); addDockWidget(Qt::TopDockWidgetArea, m_projectMonitorDock); +#ifndef Q_WS_MAC m_recMonitorDock = new QDockWidget(i18n("Record Monitor"), this); m_recMonitorDock->setObjectName("record_monitor"); m_recMonitor = new RecMonitor("record", this); @@ -199,6 +203,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent connect(m_recMonitor, SIGNAL(addProjectClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl))); connect(m_recMonitor, SIGNAL(showConfigDialog(int, int)), this, SLOT(slotPreferences(int, int))); +#endif m_undoViewDock = new QDockWidget(i18n("Undo History"), this); m_undoViewDock->setObjectName("undo_history"); @@ -223,7 +228,9 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent tabifyDockWidget(m_clipMonitorDock, m_projectMonitorDock); +#ifndef Q_WS_MAC tabifyDockWidget(m_clipMonitorDock, m_recMonitorDock); +#endif setCentralWidget(m_timelineArea); @@ -328,7 +335,6 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent m_timelineContextMenu->addAction(actionCollection()->action(KStandardAction::name(KStandardAction::Paste))); m_timelineContextClipMenu->addAction(actionCollection()->action("delete_timeline_clip")); - m_timelineContextClipMenu->addAction(actionCollection()->action("change_clip_speed")); m_timelineContextClipMenu->addAction(actionCollection()->action("group_clip")); m_timelineContextClipMenu->addAction(actionCollection()->action("ungroup_clip")); m_timelineContextClipMenu->addAction(actionCollection()->action("cut_timeline_clip")); @@ -353,7 +359,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent connect(m_clipMonitorDock, SIGNAL(visibilityChanged(bool)), m_clipMonitor, SLOT(refreshMonitor(bool))); //connect(m_monitorManager, SIGNAL(connectMonitors()), this, SLOT(slotConnectMonitors())); connect(m_monitorManager, SIGNAL(raiseClipMonitor(bool)), this, SLOT(slotRaiseMonitor(bool))); - connect(m_effectList, SIGNAL(addEffect(QDomElement)), this, SLOT(slotAddEffect(QDomElement))); + connect(m_effectList, SIGNAL(addEffect(const QDomElement)), this, SLOT(slotAddEffect(const QDomElement))); connect(m_effectList, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects())); m_monitorManager->initMonitors(m_clipMonitor, m_projectMonitor); @@ -381,8 +387,15 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent void MainWindow::queryQuit() { - kDebug() << "----- SAVING CONFUIG"; if (queryClose()) { + if (m_projectMonitor) m_projectMonitor->stop(); + if (m_clipMonitor) m_clipMonitor->stop(); + delete m_effectStack; + delete m_activeTimeline; + delete m_projectMonitor; + delete m_clipMonitor; + delete m_activeDocument; + delete m_shortcutRemoveFocus; Mlt::Factory::close(); kapp->quit(); } @@ -513,9 +526,12 @@ void MainWindow::readProperties(const KConfigGroup &config) void MainWindow::slotReloadEffects() { - initEffects::parseCustomEffectsFile(); + kDebug() << "START RELOAD; COUNR: " << m_customEffectsMenu->actions().count(); m_customEffectsMenu->clear(); + kDebug() << "START RELOAD; CLR: " << m_customEffectsMenu->actions().count(); + initEffects::parseCustomEffectsFile(); const QStringList effects = customEffects.effectNames(); + kDebug() << "NEW EFFS: " << effects; QAction *action; if (effects.isEmpty()) m_customEffectsMenu->setEnabled(false); else m_customEffectsMenu->setEnabled(true); @@ -589,14 +605,15 @@ void MainWindow::slotFullScreen() KToggleFullScreenAction::setFullScreen(this, actionCollection()->action("fullscreen")->isChecked()); } -void MainWindow::slotAddEffect(QDomElement effect, GenTime pos, int track) +void MainWindow::slotAddEffect(const QDomElement effect, GenTime pos, int track) { if (!m_activeDocument) return; if (effect.isNull()) { kDebug() << "--- ERROR, TRYING TO APPEND NULL EFFECT"; return; } - m_activeTimeline->projectView()->slotAddEffect(effect.cloneNode().toElement(), pos, track); + QDomElement effectToAdd = effect.cloneNode().toElement(); + m_activeTimeline->projectView()->slotAddEffect(effectToAdd, pos, track); } void MainWindow::slotRaiseMonitor(bool clipMonitor) @@ -617,7 +634,7 @@ 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(getFileProperties(const QDomElement, const QString &, bool)), m_projectMonitor->render, SLOT(getFileProperties(const QDomElement, const QString &, 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))); @@ -653,6 +670,8 @@ void MainWindow::setupActions() m_timecodeFormat = new KComboBox(this); m_timecodeFormat->addItem(i18n("hh:mm:ss::ff")); m_timecodeFormat->addItem(i18n("Frames")); + if (KdenliveSettings::frametimecode()) m_timecodeFormat->setCurrentIndex(1); + connect(m_timecodeFormat, SIGNAL(activated(int)), this, SLOT(slotUpdateTimecodeFormat(int))); m_statusProgressBar = new QProgressBar(this); m_statusProgressBar->setMinimum(0); @@ -673,16 +692,19 @@ void MainWindow::setupActions() QString style1 = "QToolButton {background-color: rgba(230, 230, 230, 220); 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;}"; m_buttonSelectTool = new KAction(KIcon("kdenlive-select-tool"), i18n("Selection tool"), this); + m_buttonSelectTool->setShortcut(i18nc("Selection tool shortcut", "s")); toolbar->addAction(m_buttonSelectTool); m_buttonSelectTool->setCheckable(true); m_buttonSelectTool->setChecked(true); m_buttonRazorTool = new KAction(KIcon("edit-cut"), i18n("Razor tool"), this); + m_buttonRazorTool->setShortcut(i18nc("Razor tool shortcut", "x")); toolbar->addAction(m_buttonRazorTool); m_buttonRazorTool->setCheckable(true); m_buttonRazorTool->setChecked(false); m_buttonSpacerTool = new KAction(KIcon("kdenlive-spacer-tool"), i18n("Spacer tool"), this); + m_buttonSpacerTool->setShortcut(i18nc("Spacer tool shortcut", "m")); toolbar->addAction(m_buttonSpacerTool); m_buttonSpacerTool->setCheckable(true); m_buttonSpacerTool->setChecked(false); @@ -726,7 +748,11 @@ void MainWindow::setupActions() m_zoomSlider->setMaximumWidth(150); m_zoomSlider->setMinimumWidth(100); +#ifdef Q_WS_MAC + const int contentHeight = QFontMetrics(w->font()).height() + 14; +#else const int contentHeight = QFontMetrics(w->font()).height() + 8; +#endif QString style = "QSlider::groove:horizontal { background-color: rgba(230, 230, 230, 220);border: 1px solid #999999;height: 8px;border-radius: 3px;margin-top:3px }"; style.append("QSlider::handle:horizontal { background-color: white; border: 1px solid #999999;width: 9px;margin: -2px 0;border-radius: 3px; }"); @@ -946,10 +972,10 @@ void MainWindow::setupActions() collection->addAction("delete_timeline_clip", deleteTimelineClip); connect(deleteTimelineClip, SIGNAL(triggered(bool)), this, SLOT(slotDeleteTimelineClip())); - KAction* editTimelineClipSpeed = new KAction(i18n("Change Clip Speed"), this); + /*KAction* editTimelineClipSpeed = new KAction(i18n("Change Clip Speed"), this); collection->addAction("change_clip_speed", editTimelineClipSpeed); editTimelineClipSpeed->setData("change_speed"); - connect(editTimelineClipSpeed, SIGNAL(triggered(bool)), this, SLOT(slotChangeClipSpeed())); + connect(editTimelineClipSpeed, SIGNAL(triggered(bool)), this, SLOT(slotChangeClipSpeed()));*/ KAction *stickTransition = collection->addAction("auto_transition"); stickTransition->setData(QString("auto")); @@ -1194,15 +1220,17 @@ void MainWindow::readOptions() KConfigGroup initialGroup(config, "version"); bool upgrade = false; if (initialGroup.exists()) { - if (initialGroup.readEntry("version", QString()).section(' ', 0, 0) != QString(version).section(' ', 0, 0)) + if (initialGroup.readEntry("version", QString()).section(' ', 0, 0) != QString(version).section(' ', 0, 0)) { upgrade = true; + } if (initialGroup.readEntry("version") == "0.7") { //Add new settings from 0.7.1 if (KdenliveSettings::defaultprojectfolder().isEmpty()) { QString path = QDir::homePath() + "/kdenlive"; - if (KStandardDirs::makeDir(path) == false) kDebug() << "/// ERROR CREATING PROJECT FOLDER: " << path; - KdenliveSettings::setDefaultprojectfolder(path); + if (KStandardDirs::makeDir(path) == false) { + kDebug() << "/// ERROR CREATING PROJECT FOLDER: " << path; + } else KdenliveSettings::setDefaultprojectfolder(path); } } @@ -1612,17 +1640,29 @@ void MainWindow::slotEditProjectSettings() if (m_activeDocument->profilePath() != profile) { // Profile was changed double dar = m_activeDocument->dar(); + + // Deselect current effect / transition + m_effectStack->slotClipItemSelected(NULL, 0); + m_transitionConfig->slotTransitionItemSelected(NULL, 0, QPoint(), false); + m_clipMonitor->slotSetXml(NULL, 0); m_activeDocument->setProfilePath(profile); KdenliveSettings::setCurrent_profile(profile); KdenliveSettings::setProject_fps(m_activeDocument->fps()); setCaption(m_activeDocument->description(), m_activeDocument->isModified()); + + m_activeDocument->clipManager()->clearUnusedProducers(); m_monitorManager->resetProfiles(m_activeDocument->timecode()); + + m_transitionConfig->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode(), m_activeTimeline->tracksNumber()); + m_effectStack->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode()); if (m_renderWidget) m_renderWidget->setProfile(m_activeDocument->mltProfile()); m_timelineArea->setTabText(m_timelineArea->currentIndex(), m_activeDocument->description()); - m_activeDocument->clipManager()->resetProducersList(m_projectMonitor->render->producersList()); + //m_activeDocument->clipManager()->resetProducersList(m_projectMonitor->render->producersList()); if (dar != m_activeDocument->dar()) m_projectList->reloadClipThumbnails(); + m_activeTimeline->updateProjectFps(); + // We need to desactivate & reactivate monitors to get a refresh - m_monitorManager->switchMonitors(); + //m_monitorManager->switchMonitors(); } } delete w; @@ -1710,7 +1750,6 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha disconnect(m_projectList, SIGNAL(projectModified()), m_activeDocument, SLOT(setModified())); disconnect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers()), m_activeDocument, SLOT(checkProjectClips())); - disconnect(m_activeDocument, SIGNAL(guidesUpdated()), this, SLOT(slotGuidesUpdated())); disconnect(m_activeDocument, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool))); disconnect(m_activeDocument, SIGNAL(resetProjectList()), m_projectList, SLOT(slotResetProjectList())); @@ -1769,6 +1808,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), trackView, SLOT(slotSetZone(QPoint))); connect(m_projectMonitor, SIGNAL(durationChanged(int)), trackView, SLOT(setDuration(int))); connect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers()), doc, SLOT(checkProjectClips())); + connect(doc, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool))); connect(doc, SIGNAL(resetProjectList()), m_projectList, SLOT(slotResetProjectList())); connect(doc, SIGNAL(signalDeleteProjectClip(const QString &)), m_projectList, SLOT(slotDeleteClip(const QString &))); @@ -1817,7 +1857,6 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha //doc->setRenderer(m_projectMonitor->render); m_commandStack->setActiveStack(doc->commandStack()); KdenliveSettings::setProject_display_ratio(doc->dar()); - m_projectList->updateAllClips(); //doc->clipManager()->checkAudioThumbs(); //m_overView->setScene(trackView->projectScene()); @@ -1827,6 +1866,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha setCaption(doc->description(), doc->isModified()); m_saveAction->setEnabled(doc->isModified()); m_activeDocument = doc; + m_activeTimeline->updateProjectFps(); + m_projectList->updateAllClips(); if (KdenliveSettings::dropbframes()) slotUpdatePreviewSettings(); // set tool to select tool @@ -1862,7 +1903,9 @@ void MainWindow::slotPreferences(int page, int option) //connect(dialog, SIGNAL(doResetProfile()), this, SLOT(slotDetectAudioDriver())); connect(dialog, SIGNAL(doResetProfile()), m_monitorManager, SLOT(slotResetProfiles())); connect(dialog, SIGNAL(updatePreviewSettings()), this, SLOT(slotUpdatePreviewSettings())); +#ifndef Q_WS_MAC connect(dialog, SIGNAL(updateCaptureFolder()), m_recMonitor, SLOT(slotUpdateCaptureFolder())); +#endif //connect(dialog, SIGNAL(updatePreviewSettings()), this, SLOT(slotUpdatePreviewSettings())); dialog->show(); if (page != -1) dialog->showPage(page, option); @@ -1941,13 +1984,6 @@ void MainWindow::slotDeleteTimelineClip() } } -void MainWindow::slotChangeClipSpeed() -{ - if (m_activeTimeline) { - m_activeTimeline->projectView()->changeClipSpeed(); - } -} - void MainWindow::slotAddClipMarker() { DocClipBase *clip = NULL; @@ -2225,7 +2261,7 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) { if (clip->clipType() == TEXT) { QString titlepath = m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash) + "titles/"; - if (!clip->getProperty("xmltemplate").isEmpty()) { + if (!clip->getProperty("resource").isEmpty() && clip->getProperty("xmldata").isEmpty()) { // template text clip // Get the list of existing templates @@ -2237,7 +2273,7 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) Ui::TemplateClip_UI dia_ui; dia_ui.setupUi(dia); int ix = -1; - const QString templatePath = clip->getProperty("xmltemplate"); + const QString templatePath = clip->getProperty("resource"); for (int i = 0; i < templateFiles.size(); ++i) { dia_ui.template_list->comboBox()->addItem(templateFiles.at(i), titlepath + templateFiles.at(i)); if (templatePath == KUrl(titlepath + templateFiles.at(i)).path()) ix = i; @@ -2249,7 +2285,6 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) KUrl startDir(titlepath); dia_ui.template_list->fileDialog()->setUrl(startDir); dia_ui.description->setText(clip->getProperty("description")); - dia_ui.clone_clip->setChecked(true); if (dia->exec() == QDialog::Accepted) { QString textTemplate = dia_ui.template_list->comboBox()->itemData(dia_ui.template_list->comboBox()->currentIndex()).toString(); if (textTemplate.isEmpty()) textTemplate = dia_ui.template_list->comboBox()->currentText(); @@ -2258,7 +2293,7 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) if (KUrl(textTemplate).path() != templatePath) { // The template was changed - newprops.insert("xmltemplate", textTemplate); + newprops.insert("resource", textTemplate); } if (dia_ui.description->toPlainText() != clip->getProperty("description")) { @@ -2271,28 +2306,26 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) // template modified we need to update xmldata QString description = newprops.value("description"); if (description.isEmpty()) description = clip->getProperty("description"); - newprops.insert("xmldata", m_projectList->generateTemplateXml(newtemplate, description).toString()); - if (dia_ui.normal_clip->isChecked()) { - // Switch clip to normal clip - newprops.insert("xmltemplate", QString()); - } + 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); } return; } QString path = clip->getProperty("resource"); - TitleWidget *dia_ui = new TitleWidget(KUrl(), titlepath, m_projectMonitor->render, this); + TitleWidget *dia_ui = new TitleWidget(KUrl(), m_activeDocument->timecode(), titlepath, m_projectMonitor->render, this); QDomDocument doc; doc.setContent(clip->getProperty("xmldata")); dia_ui->setXml(doc); if (dia_ui->exec() == QDialog::Accepted) { - QRect rect = dia_ui->renderedRect(); QMap newprops; newprops.insert("xmldata", dia_ui->xml().toString()); - newprops.insert("frame_size", QString::number(rect.width()) + 'x' + QString::number(rect.height())); + newprops.insert("out", QString::number(dia_ui->duration())); EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true); m_activeDocument->commandStack()->push(command); + m_activeTimeline->projectView()->slotUpdateClip(clip->getId()); m_activeDocument->setModified(true); } delete dia_ui; @@ -2303,13 +2336,13 @@ 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, dia.clipId(), clip->properties(), dia.properties(), true); + EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), dia.properties(), true); m_activeDocument->commandStack()->push(command); //m_projectList->slotUpdateClipProperties(dia.clipId(), dia.properties()); if (dia.needsTimelineRefresh()) { // update clip occurences in timeline - m_activeTimeline->projectView()->slotUpdateClip(dia.clipId()); + m_activeTimeline->projectView()->slotUpdateClip(clip->getId()); } } } @@ -2779,8 +2812,9 @@ void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QS kWarning() << "////// ERROR writing DVD CHAPTER file: " << chapterFile; } else { file.write(doc.toString().toUtf8()); - if (file.error() != QFile::NoError) + if (file.error() != QFile::NoError) { kWarning() << "////// ERROR writing DVD CHAPTER file: " << chapterFile; + } file.close(); } } @@ -2789,4 +2823,20 @@ void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QS m_renderWidget->slotExport(scriptExport, m_activeTimeline->inPoint(), m_activeTimeline->outPoint(), playlistPath, scriptPath); } +void MainWindow::slotUpdateTimecodeFormat(int ix) +{ + KdenliveSettings::setFrametimecode(ix == 1); + m_clipMonitor->updateTimecodeFormat(); + m_projectMonitor->updateTimecodeFormat(); +} + +void MainWindow::slotRemoveFocus() +{ + statusBar()->setFocus(); + statusBar()->clearFocus(); +} + + + + #include "mainwindow.moc"