diff --git a/src/assets/assetlist/view/qml/assetList.qml b/src/assets/assetlist/view/qml/assetList.qml --- a/src/assets/assetlist/view/qml/assetList.qml +++ b/src/assets/assetlist/view/qml/assetList.qml @@ -132,6 +132,15 @@ assetlist.setFilterType("favorites") } } + ToolButton { + id: downloadTransitions + visible: !isEffectList + iconName: "edit-download" + tooltip: i18n('Download New Wipes...') + onClicked: { + assetlist.downloadNewLumas() + } + } Rectangle { //This is a spacer Layout.fillHeight: false diff --git a/src/dialogs/renderwidget.h b/src/dialogs/renderwidget.h --- a/src/dialogs/renderwidget.h +++ b/src/dialogs/renderwidget.h @@ -183,6 +183,7 @@ void slotPlayRendering(QTreeWidgetItem *item, int); void slotStartCurrentJob(); void slotCopyToFavorites(); + void slotDownloadNewRenderProfiles(); void slotUpdateEncodeThreads(int); void slotUpdateRescaleHeight(int); void slotUpdateRescaleWidth(int); @@ -228,6 +229,7 @@ /** @brief Create a rendering profile from MLT preset. */ QTreeWidgetItem *loadFromMltPreset(const QString &groupName, const QString &path, const QString &profileName); void checkCodecs(); + int getNewStuff(const QString &configFile); signals: void abortProcess(const QString &url); diff --git a/src/dialogs/renderwidget.cpp b/src/dialogs/renderwidget.cpp --- a/src/dialogs/renderwidget.cpp +++ b/src/dialogs/renderwidget.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include "kdenlive_debug.h" #include @@ -187,6 +188,7 @@ m_view.buttonEdit->setIconSize(iconSize); m_view.buttonSave->setIconSize(iconSize); m_view.buttonFavorite->setIconSize(iconSize); + m_view.buttonDownload->setIconSize(iconSize); m_view.buttonDelete->setIcon(QIcon::fromTheme(QStringLiteral("trash-empty"))); m_view.buttonDelete->setToolTip(i18n("Delete profile")); @@ -204,6 +206,9 @@ m_view.buttonFavorite->setIcon(QIcon::fromTheme(QStringLiteral("favorite"))); m_view.buttonFavorite->setToolTip(i18n("Copy profile to favorites")); + m_view.buttonDownload->setIcon(QIcon::fromTheme(QStringLiteral("edit-download"))); + m_view.buttonDownload->setToolTip(i18n("Download New Render Profiles...")); + m_view.out_file->button()->setToolTip(i18n("Select output destination")); m_view.advanced_params->setMaximumHeight(QFontMetrics(font()).lineSpacing() * 5); @@ -289,6 +294,7 @@ connect(m_view.buttonEdit, &QAbstractButton::clicked, this, &RenderWidget::slotEditProfile); connect(m_view.buttonDelete, &QAbstractButton::clicked, this, &RenderWidget::slotDeleteProfile); connect(m_view.buttonFavorite, &QAbstractButton::clicked, this, &RenderWidget::slotCopyToFavorites); + connect(m_view.buttonDownload, &QAbstractButton::clicked, this, &RenderWidget::slotDownloadNewRenderProfiles); connect(m_view.abort_job, &QAbstractButton::clicked, this, &RenderWidget::slotAbortCurrentJob); connect(m_view.start_job, &QAbstractButton::clicked, this, &RenderWidget::slotStartCurrentJob); @@ -762,6 +768,29 @@ } } +void RenderWidget::slotDownloadNewRenderProfiles() +{ + if (getNewStuff(QStringLiteral(":data/kdenlive_renderprofiles.knsrc")) > 0) { + reloadProfiles(); + } +} + +int RenderWidget::getNewStuff(const QString &configFile) +{ + KNS3::Entry::List entries; + QPointer dialog = new KNS3::DownloadDialog(configFile); + if (dialog->exec() != 0) { + entries = dialog->changedEntries(); + } + for (const KNS3::Entry &entry : entries) { + if (entry.status() == KNS3::Entry::Installed) { + qCDebug(KDENLIVE_LOG) << "// Installed files: " << entry.installedFiles(); + } + } + delete dialog; + return entries.size(); +} + void RenderWidget::slotEditProfile() { QTreeWidgetItem *item = m_view.formats->currentItem(); diff --git a/src/kdenliveui.rc b/src/kdenliveui.rc --- a/src/kdenliveui.rc +++ b/src/kdenliveui.rc @@ -215,11 +215,7 @@ - - - - diff --git a/src/mainwindow.h b/src/mainwindow.h --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -371,10 +371,7 @@ /** @brief Select all clips in timeline. */ void slotSelectAllTracks(); void slotUnselectAllTracks(); - void slotGetNewLumaStuff(); - void slotGetNewKeyboardStuff(); - void slotGetNewTitleStuff(); - void slotGetNewRenderStuff(); + void slotGetNewKeyboardStuff(QComboBox *schemesList); void slotAutoTransition(); void slotRunWizard(); void slotZoneMoved(int start, int end); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1155,11 +1155,6 @@ addAction(QStringLiteral("zoom_in"), m_zoomIn); addAction(QStringLiteral("zoom_out"), m_zoomOut); - KNS3::standardAction(i18n("Download New Wipes..."), this, SLOT(slotGetNewLumaStuff()), actionCollection(), "get_new_lumas"); - KNS3::standardAction(i18n("Download New Keyboard Schemes..."), this, SLOT(slotGetNewKeyboardStuff()), actionCollection(), "get_new_keyboardschemes"); - KNS3::standardAction(i18n("Download New Render Profiles..."), this, SLOT(slotGetNewRenderStuff()), actionCollection(), "get_new_profiles"); - KNS3::standardAction(i18n("Download New Title Templates..."), this, SLOT(slotGetNewTitleStuff()), actionCollection(), "get_new_titles"); - addAction(QStringLiteral("run_wizard"), i18n("Run Config Wizard"), this, SLOT(slotRunWizard()), QIcon::fromTheme(QStringLiteral("tools-wizard"))); addAction(QStringLiteral("project_settings"), i18n("Project Settings"), this, SLOT(slotEditProjectSettings()), QIcon::fromTheme(QStringLiteral("configure"))); @@ -2072,6 +2067,29 @@ void MainWindow::slotEditKeys() { KShortcutsDialog dialog(KShortcutsEditor::AllActions, KShortcutsEditor::LetterShortcutsAllowed, this); + // Find the combobox inside KShortcutsDialog for choosing keyboard scheme + QComboBox *schemesList = nullptr; + foreach (QLabel *label, dialog.findChildren()) { + if (label->text() == i18n("Current scheme:")) { + schemesList = qobject_cast(label->buddy()); + break; + } + } + // If scheme choosing combobox was found, find the "More Actions" button in the same + // dialog that provides a dropdown menu with additional actions, and add + // "Download New Keyboard Schemes..." button into that menu + if (schemesList) { + foreach (QPushButton *button, dialog.findChildren()) { + if (button->text() == i18n("More Actions")) { + QMenu *moreActionsMenu = button->menu(); + moreActionsMenu->addAction(i18n("Download New Keyboard Schemes..."), this, + [this, schemesList]{slotGetNewKeyboardStuff(schemesList);}); + break; + } + } + } else { + qWarning() << "Could not get list of schemes. Downloading new schemes is not available."; + } dialog.addCollection(actionCollection(), i18nc("general keyboard shortcuts", "General")); dialog.configure(); } @@ -2935,36 +2953,24 @@ return entries.size(); } -void MainWindow::slotGetNewTitleStuff() -{ - if (getNewStuff(QStringLiteral(":data/kdenlive_titles.knsrc")) > 0) { - // get project title path - QString titlePath = pCore->currentDoc()->projectDataFolder() + QStringLiteral("/titles/"); - TitleWidget::refreshTitleTemplates(titlePath); - } -} - -void MainWindow::slotGetNewLumaStuff() -{ - if (getNewStuff(QStringLiteral(":data/kdenlive_wipes.knsrc")) > 0) { - initEffects::refreshLumas(); - // TODO: refresh currently displayd trans ? - } -} - -void MainWindow::slotGetNewKeyboardStuff() +void MainWindow::slotGetNewKeyboardStuff(QComboBox *schemesList) { if (getNewStuff(QStringLiteral(":data/kdenlive_keyboardschemes.knsrc")) > 0) { - // Is there something to do ? - } -} - -void MainWindow::slotGetNewRenderStuff() -{ - if (getNewStuff(QStringLiteral(":data/kdenlive_renderprofiles.knsrc")) > 0) - if (m_renderWidget) { - m_renderWidget->reloadProfiles(); - } + // Refresh keyboard schemes list (schemes list creation code copied from KShortcutSchemesEditor) + QStringList schemes; + schemes << QStringLiteral("Default"); + // List files in the shortcuts subdir, each one is a scheme. See KShortcutSchemesHelper::{shortcutSchemeFileName,exportActionCollection} + const QStringList shortcutsDirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QCoreApplication::applicationName() + QStringLiteral("/shortcuts"), QStandardPaths::LocateDirectory); + qCDebug(KDENLIVE_LOG) << "shortcut scheme dirs:" << shortcutsDirs; + Q_FOREACH (const QString &dir, shortcutsDirs) { + Q_FOREACH (const QString &file, QDir(dir).entryList(QDir::Files | QDir::NoDotAndDotDot)) { + qCDebug(KDENLIVE_LOG) << "shortcut scheme file:" << file; + schemes << file; + } + } + schemesList->clear(); + schemesList->addItems(schemes); + } } void MainWindow::slotAutoTransition() diff --git a/src/titler/titlewidget.h b/src/titler/titlewidget.h --- a/src/titler/titlewidget.h +++ b/src/titler/titlewidget.h @@ -135,6 +135,7 @@ QAction *m_buttonCursor; QAction *m_buttonSave; QAction *m_buttonLoad; + QAction *m_buttonDownload; QAction *m_unicodeAction; QAction *m_zUp; @@ -205,6 +206,9 @@ /** @brief Removes the "start" and "end" info text from animation viewports. */ void deleteAnimInfoText(); + /** @brief Refreshes the contents of combobox based on list of title templates. */ + void refreshTemplateBoxContents(); + qreal maxZIndex(); /** @brief Gets the minimum/maximum Z index of items. @@ -223,6 +227,10 @@ void loadGradients(); void storeGradient(const QString &gradientData); + /** Open title download dialog */ + void downloadTitleTemplates(); + int getNewStuff(const QString &configFile); + public slots: void slotNewText(MyTextItem *tt); void slotNewRect(QGraphicsRectItem *rect); diff --git a/src/titler/titlewidget.cpp b/src/titler/titlewidget.cpp --- a/src/titler/titlewidget.cpp +++ b/src/titler/titlewidget.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "kdenlive_debug.h" #include @@ -68,6 +69,15 @@ const int SHADOWEFFECT = 2; const int TYPEWRITEREFFECT = 3; +void TitleWidget::refreshTemplateBoxContents() +{ + templateBox->clear(); + templateBox->addItem(QString()); + for (const TitleTemplate &t : titletemplates) { + templateBox->addItem(t.icon, t.name, t.file); + } +} + TitleWidget::TitleWidget(const QUrl &url, const Timecode &tc, const QString &projectTitlePath, Monitor *monitor, QWidget *parent) : QDialog(parent) , Ui::TitleWidget_UI() @@ -415,6 +425,12 @@ m_buttonSave->setToolTip(i18n("Save As") + QLatin1Char(' ') + m_buttonSave->shortcut().toString()); connect(m_buttonSave, SIGNAL(triggered()), this, SLOT(saveTitle())); + m_buttonDownload = m_toolbar->addAction(QIcon::fromTheme(QStringLiteral("edit-download")), i18n("Download New Title Templates...")); + m_buttonDownload->setCheckable(false); + m_buttonDownload->setShortcut(Qt::ALT + Qt::Key_D); + m_buttonDownload->setToolTip(i18n("Download New Title Templates...") + QLatin1Char(' ') + m_buttonDownload->shortcut().toString()); + connect(m_buttonDownload, &QAction::triggered, this, &TitleWidget::downloadTitleTemplates); + layout->addWidget(m_toolbar); // initialize graphic scene @@ -520,11 +536,7 @@ refreshTitleTemplates(m_projectTitlePath); } // templateBox->setIconSize(QSize(60,60)); - templateBox->clear(); - templateBox->addItem(QString()); - for (const TitleTemplate &t : titletemplates) { - templateBox->addItem(t.icon, t.name, t.file); - } + refreshTemplateBoxContents(); lastDocumentHash = QCryptographicHash::hash(xml().toString().toLatin1(), QCryptographicHash::Md5).toHex(); } @@ -1921,6 +1933,30 @@ } } +void TitleWidget::downloadTitleTemplates() +{ + if (getNewStuff(QStringLiteral(":data/kdenlive_titles.knsrc")) > 0) { + refreshTitleTemplates(m_projectTitlePath); + refreshTemplateBoxContents(); + } +} + +int TitleWidget::getNewStuff(const QString &configFile) +{ + KNS3::Entry::List entries; + QPointer dialog = new KNS3::DownloadDialog(configFile); + if (dialog->exec() != 0) { + entries = dialog->changedEntries(); + } + for (const KNS3::Entry &entry : entries) { + if (entry.status() == KNS3::Entry::Installed) { + qCDebug(KDENLIVE_LOG) << "// Installed files: " << entry.installedFiles(); + } + } + delete dialog; + return entries.size(); +} + QDomDocument TitleWidget::xml() { QDomDocument doc = m_titledocument.xml(m_startViewport, m_endViewport); diff --git a/src/transitions/transitionlist/view/transitionlistwidget.hpp b/src/transitions/transitionlist/view/transitionlistwidget.hpp --- a/src/transitions/transitionlist/view/transitionlistwidget.hpp +++ b/src/transitions/transitionlist/view/transitionlistwidget.hpp @@ -42,9 +42,11 @@ or kdenlive/transition*/ QString getMimeType(const QString &assetId) const override; void updateFavorite(const QModelIndex &index); + void downloadNewLumas(); private: TransitionListWidgetProxy *m_proxy; + int getNewStuff(const QString &configFile); signals: void reloadFavorites(); @@ -72,6 +74,7 @@ Q_INVOKABLE void setFilterName(const QString &pattern) { q->setFilterName(pattern); } Q_INVOKABLE QString getMimeType(const QString &assetId) const { return q->getMimeType(assetId); } + Q_INVOKABLE void downloadNewLumas() { q->downloadNewLumas(); } bool showDescription() const { return KdenliveSettings::showeffectinfo(); } void setShowDescription(bool show) diff --git a/src/transitions/transitionlist/view/transitionlistwidget.cpp b/src/transitions/transitionlist/view/transitionlistwidget.cpp --- a/src/transitions/transitionlist/view/transitionlistwidget.cpp +++ b/src/transitions/transitionlist/view/transitionlistwidget.cpp @@ -23,8 +23,11 @@ #include "transitions/transitionlist/model/transitionfilter.hpp" #include "../model/transitiontreemodel.hpp" #include "transitions/transitionsrepository.hpp" +#include "effectslist/initeffects.h" +#include "dialogs/profilesdialog.h" #include +#include TransitionListWidget::TransitionListWidget(QWidget *parent) : AssetListWidget(parent) @@ -75,3 +78,27 @@ static_cast(m_proxyModel.get())->setFilterType(false, TransitionType::Favorites); } } + +int TransitionListWidget::getNewStuff(const QString &configFile) +{ + KNS3::Entry::List entries; + QPointer dialog = new KNS3::DownloadDialog(configFile); + if (dialog->exec() != 0) { + entries = dialog->changedEntries(); + } + for (const KNS3::Entry &entry : entries) { + if (entry.status() == KNS3::Entry::Installed) { + qCDebug(KDENLIVE_LOG) << "// Installed files: " << entry.installedFiles(); + } + } + delete dialog; + return entries.size(); +} + +void TransitionListWidget::downloadNewLumas() +{ + if (getNewStuff(QStringLiteral(":data/kdenlive_wipes.knsrc")) > 0) { + initEffects::refreshLumas(); + // TODO: refresh currently displayd trans ? + } +} diff --git a/src/ui/renderwidget_ui.ui b/src/ui/renderwidget_ui.ui --- a/src/ui/renderwidget_ui.ui +++ b/src/ui/renderwidget_ui.ui @@ -128,6 +128,13 @@ + + + &Download + + + + &Save diff --git a/src/ui/titlewidget_ui.ui b/src/ui/titlewidget_ui.ui --- a/src/ui/titlewidget_ui.ui +++ b/src/ui/titlewidget_ui.ui @@ -128,7 +128,7 @@ - 94 + 82 20 @@ -287,7 +287,11 @@ - + + + QComboBox::AdjustToContents + +