X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=8ad31a6ff782afa489d50b2e48ad1ddf0679eeab;hb=8bcc799b522e6e5ae0299973b4d296bef831a17f;hp=14070abd0c188d66c1e74c48f6260b40182a08ff;hpb=25c92889493822bdfea7bfb970fa24dce8ca8077;p=kdenlive diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 14070abd..8ad31a6f 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -82,12 +82,15 @@ #include #include #include +#include #include #include #include #include #include +#include +#include #include @@ -122,6 +125,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent dbus.registerObject("/MainWindow", this); setlocale(LC_NUMERIC, "POSIX"); + if (!KdenliveSettings::colortheme().isEmpty()) slotChangePalette(NULL, KdenliveSettings::colortheme()); setFont(KGlobalSettings::toolBarFont()); parseProfiles(MltPath); m_commandStack = new QUndoGroup; @@ -176,22 +180,23 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent addDockWidget(Qt::TopDockWidgetArea, m_transitionConfigDock); KdenliveSettings::setCurrent_profile(KdenliveSettings::default_profile()); - m_fileOpenRecent = KStandardAction::openRecent(this, SLOT(openFile(const KUrl &)), - actionCollection()); + m_fileOpenRecent = KStandardAction::openRecent(this, SLOT(openFile(const KUrl &)), actionCollection()); readOptions(); + m_fileRevert = KStandardAction::revert(this, SLOT(slotRevert()), actionCollection()); + m_fileRevert->setEnabled(false); //slotDetectAudioDriver(); m_clipMonitorDock = new QDockWidget(i18n("Clip Monitor"), this); m_clipMonitorDock->setObjectName("clip_monitor"); - m_clipMonitor = new Monitor("clip", m_monitorManager, this); + m_clipMonitor = new Monitor("clip", m_monitorManager, QString(), this); m_clipMonitorDock->setWidget(m_clipMonitor); addDockWidget(Qt::TopDockWidgetArea, m_clipMonitorDock); //m_clipMonitor->stop(); m_projectMonitorDock = new QDockWidget(i18n("Project Monitor"), this); m_projectMonitorDock->setObjectName("project_monitor"); - m_projectMonitor = new Monitor("project", m_monitorManager, this); + m_projectMonitor = new Monitor("project", m_monitorManager, QString(), this); m_projectMonitorDock->setWidget(m_projectMonitor); addDockWidget(Qt::TopDockWidgetArea, m_projectMonitorDock); @@ -248,8 +253,57 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent m_clipMonitor->setupMenu(static_cast(factory()->container("monitor_go", this)), m_playZone, m_loopZone, static_cast(factory()->container("marker_menu", this))); m_projectList->setupGeneratorMenu(static_cast(factory()->container("generators", this)), static_cast(factory()->container("transcoders", this))); - // build effects menus 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); + 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); + action = new QAction(fi.fileName(), this); + action->setData(*it); + 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 QMenu *videoEffectsMenu = static_cast(factory()->container("video_effects_menu", this)); QStringList effectInfo; @@ -371,13 +425,12 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent // precedence, then "openlastproject", then just a plain empty file. // If opening Url fails, openlastproject will _not_ be used. if (!Url.isEmpty()) { - openFile(Url); - } else { - if (KdenliveSettings::openlastproject()) { - openLastFile(); - } - } - if (m_timelineArea->count() == 0) { + // delay loading so that the window shows up + m_startUrl = Url; + QTimer::singleShot(500, this, SLOT(openFile())); + } else if (KdenliveSettings::openlastproject()) { + QTimer::singleShot(500, this, SLOT(openLastFile())); + } else { //if (m_timelineArea->count() == 0) { newFile(false); } @@ -412,7 +465,7 @@ bool MainWindow::queryClose() if (m_renderWidget) { int waitingJobs = m_renderWidget->waitingJobsCount(); if (waitingJobs > 0) { - switch (KMessageBox::warningYesNoCancel(this, i18n("You have %1 rendering jobs waiting in the queue.\nWhat do you want to do with these jobs?", waitingJobs), QString(), KGuiItem(i18n("Start them now")), KGuiItem(i18n("Delete them")))) { + switch (KMessageBox::warningYesNoCancel(this, i18np("You have 1 rendering job waiting in the queue.\nWhat do you want to do with this job?", "You have %1 rendering jobs waiting in the queue.\nWhat do you want to do with these jobs?", waitingJobs), QString(), KGuiItem(i18n("Start them now")), KGuiItem(i18n("Delete them")))) { case KMessageBox::Yes : // create script with waiting jobs and start it if (m_renderWidget->startWaitingRenderJobs() == false) return false; @@ -637,9 +690,9 @@ 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(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 &, 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))); @@ -684,12 +737,43 @@ void MainWindow::setupActions() m_statusProgressBar->setMaximumWidth(150); m_statusProgressBar->setVisible(false); - KToolBar *toolbar = new KToolBar("statusToolBar", this, Qt::NoToolBarArea); + 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 {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;}"; + 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); @@ -708,14 +792,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); @@ -729,7 +826,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); @@ -799,6 +896,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); @@ -853,6 +953,10 @@ void MainWindow::setupActions() projectRender->setShortcut(Qt::CTRL + Qt::Key_Return); connect(projectRender, SIGNAL(triggered(bool)), this, SLOT(slotRenderProject())); + KAction* projectClean = new KAction(KIcon("edit-clear"), i18n("Clean Project"), this); + collection->addAction("project_clean", projectClean); + connect(projectClean, SIGNAL(triggered(bool)), this, SLOT(slotCleanProject())); + KAction* monitorPlay = new KAction(KIcon("media-playback-start"), i18n("Play"), this); KShortcut playShortcut; playShortcut.setPrimary(Qt::Key_Space); @@ -875,20 +979,35 @@ void MainWindow::setupActions() collection->addAction("dvd_wizard", dvdWizard); connect(dvdWizard, SIGNAL(triggered(bool)), this, SLOT(slotDvdWizard())); - KAction *transcodeClip = new KAction(KIcon("edit-copy"), i18n("Transcode Clip"), this); + KAction *transcodeClip = new KAction(KIcon("edit-copy"), i18n("Transcode Clips"), this); collection->addAction("transcode_clip", transcodeClip); 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 *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); @@ -924,6 +1043,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); @@ -977,6 +1106,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); @@ -1247,6 +1411,7 @@ void MainWindow::slotRunWizard() void MainWindow::newFile(bool showProjectSettings) { if (!m_timelineArea->isEnabled()) return; + m_fileRevert->setEnabled(false); QString profileName; KUrl projectFolder; QPoint projectTracks(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()); @@ -1255,13 +1420,11 @@ void MainWindow::newFile(bool showProjectSettings) profileName = KdenliveSettings::default_profile(); projectFolder = KdenliveSettings::defaultprojectfolder(); } else { - ProjectSettings *w = new ProjectSettings(projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, 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(); @@ -1296,7 +1459,7 @@ void MainWindow::activateDocument() connectDocument(currentTab, currentDoc); } -void MainWindow::closeCurrentDocument() +void MainWindow::closeCurrentDocument(bool saveChanges) { QWidget *w = m_timelineArea->currentWidget(); if (!w) return; @@ -1306,7 +1469,7 @@ void MainWindow::closeCurrentDocument() m_timelineArea->setCurrentIndex(ix); TrackView *tabToClose = (TrackView *) w; KdenliveDoc *docToClose = tabToClose->document(); - if (docToClose && docToClose->isModified()) { + if (docToClose && docToClose->isModified() && saveChanges) { switch (KMessageBox::warningYesNoCancel(this, i18n("Save changes to document?"))) { case KMessageBox::Yes : // save document here. If saving fails, return false; @@ -1361,6 +1524,7 @@ bool MainWindow::saveFileAs(const QString &outputFileName) m_timelineArea->setTabToolTip(m_timelineArea->currentIndex(), m_activeDocument->url().path()); m_activeDocument->setModified(false); m_fileOpenRecent->addUrl(KUrl(outputFileName)); + m_fileRevert->setEnabled(true); return true; } @@ -1393,6 +1557,11 @@ bool MainWindow::saveFile() void MainWindow::openFile() { + if (!m_startUrl.isEmpty()) { + openFile(m_startUrl); + m_startUrl = KUrl(); + return; + } // Check that the Kdenlive mime type is correctly installed QString mimetype = "application/x-kdenlive"; KMimeType::Ptr mime = KMimeType::mimeType(mimetype); @@ -1450,12 +1619,15 @@ void MainWindow::openFile(const KUrl &url) } } if (!KdenliveSettings::activatetabs()) closeCurrentDocument(); + m_messageLabel->setMessage(i18n("Opening file %1", url.path()), InformationMessage); + qApp->processEvents(); doOpenFile(url, NULL); } void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) { if (!m_timelineArea->isEnabled()) return; + m_fileRevert->setEnabled(true); KdenliveDoc *doc = new KdenliveDoc(url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, this); if (stale == NULL) { stale = new KAutoSaveFile(url, doc); @@ -1613,12 +1785,14 @@ void MainWindow::slotDetectAudioDriver() void MainWindow::slotEditProjectSettings() { QPoint p = m_activeDocument->getTracksCount(); - ProjectSettings *w = new ProjectSettings(p.x(), p.y(), m_activeDocument->projectFolder().path(), true, 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) { 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(); @@ -1626,8 +1800,8 @@ 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_activeDocument->setProfilePath(profile); + m_clipMonitor->slotSetXml(NULL); + bool updateFps = m_activeDocument->setProfilePath(profile); KdenliveSettings::setCurrent_profile(profile); KdenliveSettings::setProject_fps(m_activeDocument->fps()); setCaption(m_activeDocument->description(), m_activeDocument->isModified()); @@ -1635,14 +1809,15 @@ void MainWindow::slotEditProjectSettings() m_activeDocument->clipManager()->clearUnusedProducers(); m_monitorManager->resetProfiles(m_activeDocument->timecode()); - m_transitionConfig->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode(), m_activeTimeline->tracksNumber()); + m_transitionConfig->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode(), m_activeDocument->tracksList()); 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()); if (dar != m_activeDocument->dar()) m_projectList->reloadClipThumbnails(); - m_activeTimeline->updateProjectFps(); - + if (updateFps) m_activeTimeline->updateProjectFps(); + m_activeDocument->setModified(true); + m_commandStack->activeStack()->clear(); // We need to desactivate & reactivate monitors to get a refresh //m_monitorManager->switchMonitors(); } @@ -1650,11 +1825,13 @@ void MainWindow::slotEditProjectSettings() delete w; } + void MainWindow::slotRenderProject() { if (!m_renderWidget) { QString projectfolder = m_activeDocument ? m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash) : KdenliveSettings::defaultprojectfolder(); m_renderWidget = new RenderWidget(projectfolder, this); + connect(m_renderWidget, SIGNAL(shutdown()), this, SLOT(slotShutdown())); connect(m_renderWidget, SIGNAL(selectedRenderProfile(const QString &, const QString &, const QString&)), this, SLOT(slotSetDocumentRenderProfile(const QString &, const QString &, const QString&))); connect(m_renderWidget, SIGNAL(prepareRenderingData(bool, bool, const QString&)), this, SLOT(slotPrepareRendering(bool, bool, const QString&))); connect(m_renderWidget, SIGNAL(abortProcess(const QString &)), this, SIGNAL(abortRenderJob(const QString &))); @@ -1683,6 +1860,12 @@ void MainWindow::setRenderingFinished(const QString &url, int status, const QStr if (m_renderWidget) m_renderWidget->setRenderStatus(url, status, error); } +void MainWindow::slotCleanProject() +{ + if (KMessageBox::warningContinueCancel(this, i18n("This will remove all unused clips from your project."), i18n("Clean up project")) == KMessageBox::Cancel) return; + m_projectList->cleanup(); +} + void MainWindow::slotUpdateMousePosition(int pos) { if (m_activeDocument) @@ -1745,7 +1928,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), this, SLOT(slotActivateTransitionView(Transition *))); 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))); @@ -1762,6 +1945,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor())); disconnect(m_activeTimeline, SIGNAL(zoneMoved(int, int)), this, SLOT(slotZoneMoved(int, int))); disconnect(m_projectList, SIGNAL(loadingIsOver()), m_activeTimeline->projectView(), SLOT(slotUpdateAllThumbs())); + disconnect(m_projectList, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int))); m_effectStack->clear(); } //m_activeDocument->setRenderer(NULL); @@ -1773,9 +1957,9 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha KdenliveSettings::setProject_fps(doc->fps()); m_monitorManager->resetProfiles(doc->timecode()); m_projectList->setDocument(doc); - m_transitionConfig->updateProjectFormat(doc->mltProfile(), doc->timecode(), trackView->tracksNumber()); + 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))); @@ -1785,9 +1969,11 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(trackView, SIGNAL(insertTrack(int)), this, SLOT(slotInsertTrack(int))); connect(trackView, SIGNAL(deleteTrack(int)), this, SLOT(slotDeleteTrack(int))); connect(trackView, SIGNAL(changeTrack(int)), this, SLOT(slotChangeTrack(int))); + connect(trackView, SIGNAL(updateTracksInfo()), this, SLOT(slotUpdateTrackInfo())); 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())); @@ -1803,6 +1989,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), m_effectStack, SLOT(slotClipItemSelected(ClipItem*, int))); + connect(trackView->projectView(), SIGNAL(updateClipMarkers(DocClipBase *)), this, SLOT(slotUpdateClipMarkers(DocClipBase*))); + connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), this, SLOT(slotActivateEffectStackView())); 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 *))); @@ -1810,9 +1998,10 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha 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))); 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(m_effectStack, SIGNAL(updateClipEffect(ClipItem*, QDomElement, QDomElement, int)), trackView->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, QDomElement, QDomElement, int))); @@ -1827,6 +2016,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(trackView->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor())); connect(trackView, SIGNAL(zoneMoved(int, int)), this, SLOT(slotZoneMoved(int, int))); connect(m_projectList, SIGNAL(loadingIsOver()), trackView->projectView(), SLOT(slotUpdateAllThumbs())); + connect(m_projectList, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int))); + trackView->projectView()->setContextMenu(m_timelineContextMenu, m_timelineContextClipMenu, m_timelineContextTransitionMenu, m_clipTypeGroup); m_activeTimeline = trackView; @@ -1847,9 +2038,10 @@ 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_projectList->updateAllClips(); + m_activeDocument->checkProjectClips(); if (KdenliveSettings::dropbframes()) slotUpdatePreviewSettings(); // set tool to select tool @@ -1896,7 +2088,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(); } } @@ -1960,12 +2152,18 @@ void MainWindow::slotSwitchSnap() void MainWindow::slotDeleteTimelineClip() { - if (QApplication::focusWidget()->parentWidget()->parentWidget() == m_projectListDock) m_projectList->slotRemoveClip(); + if (QApplication::focusWidget() && QApplication::focusWidget()->parentWidget() && QApplication::focusWidget()->parentWidget()->parentWidget() && QApplication::focusWidget()->parentWidget()->parentWidget() == m_projectListDock) m_projectList->slotRemoveClip(); else if (m_activeTimeline) { m_activeTimeline->projectView()->deleteSelectedClips(); } } +void MainWindow::slotUpdateClipMarkers(DocClipBase *clip) +{ + if (m_clipMonitor->isActive()) m_clipMonitor->checkOverlay(); + m_clipMonitor->updateMarkers(clip); +} + void MainWindow::slotAddClipMarker() { DocClipBase *clip = NULL; @@ -1974,7 +2172,7 @@ void MainWindow::slotAddClipMarker() if (m_activeTimeline) { ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor(); if (item) { - pos = (m_projectMonitor->position() - item->startPos() + item->cropStart()) / item->speed(); + pos = GenTime((int)((m_projectMonitor->position() - item->startPos() + item->cropStart()).frames(m_activeDocument->fps()) * item->speed() + 0.5), m_activeDocument->fps()); clip = item->baseClip(); } } @@ -1992,7 +2190,6 @@ void MainWindow::slotAddClipMarker() if (d.exec() == QDialog::Accepted) { m_activeTimeline->projectView()->slotAddClipMarker(id, d.newMarker().time(), d.newMarker().comment()); } - if (m_clipMonitor->isActive()) m_clipMonitor->checkOverlay(); } void MainWindow::slotDeleteClipMarker() @@ -2023,8 +2220,6 @@ void MainWindow::slotDeleteClipMarker() return; } m_activeTimeline->projectView()->slotDeleteClipMarker(comment, id, pos); - if (m_clipMonitor->isActive()) m_clipMonitor->checkOverlay(); - } void MainWindow::slotDeleteAllClipMarkers() @@ -2045,7 +2240,6 @@ void MainWindow::slotDeleteAllClipMarkers() return; } m_activeTimeline->projectView()->slotDeleteAllClipMarkers(clip->getId()); - if (m_clipMonitor->isActive()) m_clipMonitor->checkOverlay(); } void MainWindow::slotEditClipMarker() @@ -2084,7 +2278,6 @@ void MainWindow::slotEditClipMarker() // remove old marker m_activeTimeline->projectView()->slotAddClipMarker(id, pos, QString()); } - if (m_clipMonitor->isActive()) m_clipMonitor->checkOverlay(); } } @@ -2152,6 +2345,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) { @@ -2227,6 +2470,11 @@ void MainWindow::slotFitZoom() } } +void MainWindow::slotSetZoom(int value) +{ + m_zoomSlider->setValue(value); +} + void MainWindow::slotGotProgressInfo(const QString &message, int progress) { m_statusProgressBar->setValue(progress); @@ -2304,7 +2552,10 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) if (dia_ui->exec() == QDialog::Accepted) { QMap newprops; newprops.insert("xmldata", dia_ui->xml().toString()); - newprops.insert("out", QString::number(dia_ui->duration())); + if (dia_ui->duration() != clip->duration().frames(m_activeDocument->fps()) - 1) { + // duration changed, we need to update duration + 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()); @@ -2321,10 +2572,9 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) 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(clip->getId()); + m_activeTimeline->projectView()->slotUpdateClip(clip->getId(), dia.needsTimelineReload()); } } } @@ -2377,6 +2627,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); @@ -2384,10 +2646,31 @@ 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) { //m_activeDocument->setTool(tool); + QString message; + switch (tool) { + case SPACERTOOL: + message = i18n("Ctrl + click to use spacer on current track only"); + break; + case RAZORTOOL: + message = i18n("Click on a clip to cut it"); + break; + default: + message = i18n("Shift + click to create a selection rectangle, Ctrl + click to add an item to selection"); + break; + } + m_messageLabel->setMessage(message, InformationMessage); m_activeTimeline->projectView()->setTool(tool); } } @@ -2543,14 +2826,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() @@ -2640,8 +2935,12 @@ void MainWindow::slotUpdateClipType(QAction *action) void MainWindow::slotDvdWizard(const QString &url, const QString &profile) { - DvdWizard *w = new DvdWizard(url, profile, this); - w->exec(); + // We must stop the monitors since we create a new on in the dvd wizard + m_clipMonitor->stop(); + m_projectMonitor->stop(); + DvdWizard w(url, profile, this); + w.exec(); + m_projectMonitor->start(); } void MainWindow::slotShowTimeline(bool show) @@ -2818,7 +3117,109 @@ void MainWindow::slotRemoveFocus() statusBar()->clearFocus(); } +void MainWindow::slotRevert() +{ + if (KMessageBox::warningContinueCancel(this, i18n("This will delete all changes made since you last saved your project. Are you sure you want to continue?"), i18n("Revert to last saved version")) == KMessageBox::Cancel) return; + KUrl url = m_activeDocument->url(); + closeCurrentDocument(false); + doOpenFile(url, NULL); +} +void MainWindow::slotShutdown() +{ + if (m_activeDocument) m_activeDocument->setModified(false); + // Call shutdown + QDBusConnectionInterface* interface = QDBusConnection::sessionBus().interface(); + if (interface && interface->isServiceRegistered("org.kde.ksmserver")) { + QDBusInterface smserver("org.kde.ksmserver", "/KSMServer", "org.kde.KSMServerInterface"); + smserver.call("logout", 1, 2, 2); + } +} + +void MainWindow::slotUpdateTrackInfo() +{ + if (m_activeDocument) + m_transitionConfig->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode(), m_activeDocument->tracksList()); +} + +void MainWindow::slotChangePalette(QAction *action, const QString &themename) +{ + // Load the theme file + QString theme; + if (action == NULL) theme = themename; + else theme = action->data().toString(); + KdenliveSettings::setColortheme(theme); + // Make palette for all widgets. + QPalette plt; + if (theme.isEmpty()) + plt = QApplication::desktop()->palette(); + 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(); +} #include "mainwindow.moc" +