From 016a94f656331fb439a7f4e91dc8a4ada74526b5 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 18 Jan 2019 00:19:13 +1100 Subject: [PATCH] added option to hide sequences --- mainwindow.cpp | 2 +- olive.pro | 6 +++-- panels/project.cpp | 4 ++-- panels/project.h | 4 ++-- project/projectfilter.cpp | 31 ++++++++++++++++++++++++++ project/projectfilter.h | 19 ++++++++++++++++ project/sourcescommon.cpp | 46 ++++++++++++++++++++++----------------- 7 files changed, 85 insertions(+), 27 deletions(-) create mode 100644 project/projectfilter.cpp create mode 100644 project/projectfilter.h diff --git a/mainwindow.cpp b/mainwindow.cpp index 5353265bb..8b51f868a 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -8,6 +8,7 @@ #include "project/clip.h" #include "project/undo.h" #include "project/media.h" +#include "project/projectfilter.h" #include "ui/sourcetable.h" #include "ui/viewerwidget.h" @@ -43,7 +44,6 @@ #include #include #include -#include #include #include #include diff --git a/olive.pro b/olive.pro index 6cc52430a..9d32fd908 100644 --- a/olive.pro +++ b/olive.pro @@ -127,7 +127,8 @@ SOURCES += \ dialogs/debugdialog.cpp \ ui/renderthread.cpp \ ui/renderfunctions.cpp \ - ui/viewerwindow.cpp + ui/viewerwindow.cpp \ + project/projectfilter.cpp HEADERS += \ mainwindow.h \ @@ -222,7 +223,8 @@ HEADERS += \ dialogs/debugdialog.h \ ui/renderthread.h \ ui/renderfunctions.h \ - ui/viewerwindow.h + ui/viewerwindow.h \ + project/projectfilter.h FORMS += diff --git a/panels/project.cpp b/panels/project.cpp index 035d58a0b..de617adbd 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -25,6 +25,7 @@ #include "ui/sourcetable.h" #include "ui/sourceiconview.h" #include "project/sourcescommon.h" +#include "project/projectfilter.h" #include "debug.h" #include @@ -37,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -72,7 +72,7 @@ Project::Project(QWidget *parent) : sources_common = new SourcesCommon(this); - sorter = new QSortFilterProxyModel(this); + sorter = new ProjectFilter(this); sorter->setSourceModel(&project_model); // optional toolbar diff --git a/panels/project.h b/panels/project.h index 25eace33a..0653d7c48 100644 --- a/panels/project.h +++ b/panels/project.h @@ -18,7 +18,7 @@ class Media; class QXmlStreamWriter; class QXmlStreamReader; class QFile; -class QSortFilterProxyModel; +class ProjectFilter; class ComboAction; class SourceIconView; class QPushButton; @@ -69,7 +69,7 @@ public: SourceIconView* icon_view; SourcesCommon* sources_common; - QSortFilterProxyModel* sorter; + ProjectFilter* sorter; QVector last_imported_media; diff --git a/project/projectfilter.cpp b/project/projectfilter.cpp new file mode 100644 index 000000000..798174c6e --- /dev/null +++ b/project/projectfilter.cpp @@ -0,0 +1,31 @@ +#include "projectfilter.h" + +#include "project/media.h" + +#include + +ProjectFilter::ProjectFilter(QObject *parent) : + QSortFilterProxyModel(parent), + show_sequences(true) +{} + +bool ProjectFilter::get_show_sequences() { + return show_sequences; +} + +void ProjectFilter::set_show_sequences(bool b) { + show_sequences = b; + invalidateFilter(); +} + +bool ProjectFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { + if (!show_sequences) { + // hide sequences if show_sequences is false + QModelIndex index = sourceModel()->index(source_row, 0, source_parent); + Media* media = static_cast(index.internalPointer()); + if (media != nullptr && media->get_type() == MEDIA_TYPE_SEQUENCE) { + return false; + } + } + return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent); +} diff --git a/project/projectfilter.h b/project/projectfilter.h new file mode 100644 index 000000000..6b14bb680 --- /dev/null +++ b/project/projectfilter.h @@ -0,0 +1,19 @@ +#ifndef PROJECTFILTER_H +#define PROJECTFILTER_H + +#include + +class ProjectFilter : public QSortFilterProxyModel { + Q_OBJECT +public: + ProjectFilter(QObject *parent = nullptr); + bool get_show_sequences(); +public slots: + void set_show_sequences(bool b); +protected: + bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; +private: + bool show_sequences; +}; + +#endif // PROJECTFILTER_H diff --git a/project/sourcescommon.cpp b/project/sourcescommon.cpp index 543d12bb3..31734b339 100644 --- a/project/sourcescommon.cpp +++ b/project/sourcescommon.cpp @@ -7,6 +7,7 @@ #include "panels/project.h" #include "project/footage.h" #include "panels/viewer.h" +#include "project/projectfilter.h" #include "io/config.h" #include "mainwindow.h" @@ -49,10 +50,10 @@ void SourcesCommon::show_context_menu(QWidget* parent, const QModelIndexList& it selected_items = items; - QAction* import_action = menu.addAction(tr("Import...")); + QAction* import_action = menu.addAction(tr("Import...")); QObject::connect(import_action, SIGNAL(triggered(bool)), project_parent, SLOT(import_dialog())); - QMenu* new_menu = menu.addMenu(tr("New")); + QMenu* new_menu = menu.addMenu(tr("New")); mainWindow->make_new_menu(new_menu); if (items.size() > 0) { @@ -62,20 +63,20 @@ void SourcesCommon::show_context_menu(QWidget* parent, const QModelIndexList& it // replace footage int type = m->get_type(); if (type == MEDIA_TYPE_FOOTAGE) { - QAction* replace_action = menu.addAction(tr("Replace/Relink Media")); + QAction* replace_action = menu.addAction(tr("Replace/Relink Media")); QObject::connect(replace_action, SIGNAL(triggered(bool)), project_parent, SLOT(replace_selected_file())); #if defined(Q_OS_WIN) - QAction* reveal_in_explorer = menu.addAction(tr("Reveal in Explorer")); + QAction* reveal_in_explorer = menu.addAction(tr("Reveal in Explorer")); #elif defined(Q_OS_MAC) - QAction* reveal_in_explorer = menu.addAction(tr("Reveal in Finder")); + QAction* reveal_in_explorer = menu.addAction(tr("Reveal in Finder")); #else - QAction* reveal_in_explorer = menu.addAction(tr("Reveal in File Manager")); + QAction* reveal_in_explorer = menu.addAction(tr("Reveal in File Manager")); #endif QObject::connect(reveal_in_explorer, SIGNAL(triggered(bool)), this, SLOT(reveal_in_browser())); } if (type != MEDIA_TYPE_FOLDER) { - QAction* replace_clip_media = menu.addAction(tr("Replace Clips Using This Media")); + QAction* replace_clip_media = menu.addAction(tr("Replace Clips Using This Media")); QObject::connect(replace_clip_media, SIGNAL(triggered(bool)), project_parent, SLOT(replace_clip_media())); } } @@ -93,45 +94,50 @@ void SourcesCommon::show_context_menu(QWidget* parent, const QModelIndexList& it } // create sequence from - QAction* create_seq_from = menu.addAction(tr("Create Sequence With This Media")); + QAction* create_seq_from = menu.addAction(tr("Create Sequence With This Media")); QObject::connect(create_seq_from, SIGNAL(triggered(bool)), this, SLOT(create_seq_from_selected())); // ONLY sequences are selected if (all_sequences) { // ONLY sequences are selected - QAction* duplicate_action = menu.addAction(tr("Duplicate")); + QAction* duplicate_action = menu.addAction(tr("Duplicate")); QObject::connect(duplicate_action, SIGNAL(triggered(bool)), project_parent, SLOT(duplicate_selected())); } // ONLY footage is selected if (all_footage) { - QAction* delete_footage_from_sequences = menu.addAction(tr("Delete All Clips Using This Media")); + QAction* delete_footage_from_sequences = menu.addAction(tr("Delete All Clips Using This Media")); QObject::connect(delete_footage_from_sequences, SIGNAL(triggered(bool)), project_parent, SLOT(delete_clips_using_selected_media())); } // delete media - QAction* delete_action = menu.addAction(tr("Delete")); + QAction* delete_action = menu.addAction(tr("Delete")); QObject::connect(delete_action, SIGNAL(triggered(bool)), project_parent, SLOT(delete_selected_media())); if (items.size() == 1) { - QAction* properties_action = menu.addAction(tr("Properties...")); + QAction* properties_action = menu.addAction(tr("Properties...")); QObject::connect(properties_action, SIGNAL(triggered(bool)), project_parent, SLOT(open_properties())); } } menu.addSeparator(); - QAction* tree_view_action = menu.addAction(tr("Tree View")); + QAction* tree_view_action = menu.addAction(tr("Tree View")); connect(tree_view_action, SIGNAL(triggered(bool)), project_parent, SLOT(set_tree_view())); - QAction* icon_view_action = menu.addAction(tr("Icon View")); + QAction* icon_view_action = menu.addAction(tr("Icon View")); connect(icon_view_action, SIGNAL(triggered(bool)), project_parent, SLOT(set_icon_view())); - QAction* toolbar_action = menu.addAction(tr("Show Toolbar")); + QAction* toolbar_action = menu.addAction(tr("Show Toolbar")); toolbar_action->setCheckable(true); toolbar_action->setChecked(project_parent->toolbar_widget->isVisible()); connect(toolbar_action, SIGNAL(triggered(bool)), project_parent->toolbar_widget, SLOT(setVisible(bool))); + QAction* show_sequences = menu.addAction(tr("Show Sequences")); + show_sequences->setCheckable(true); + show_sequences->setChecked(panel_project->sorter->get_show_sequences()); + connect(show_sequences, SIGNAL(triggered(bool)), panel_project->sorter, SLOT(set_show_sequences(bool))); + menu.exec(QCursor::pos()); } @@ -183,11 +189,11 @@ void SourcesCommon::dropEvent(QWidget* parent, QDropEvent *event, const QModelIn && m->get_type() == MEDIA_TYPE_FOOTAGE && !QFileInfo(paths.at(0)).isDir() && config.drop_on_media_to_replace - && QMessageBox::question( - parent, - tr("Replace Media"), - tr("You dropped a file onto '%1'. Would you like to replace it with the dropped file?").arg(m->get_name()), - QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { + && QMessageBox::question( + parent, + tr("Replace Media"), + tr("You dropped a file onto '%1'. Would you like to replace it with the dropped file?").arg(m->get_name()), + QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { replace = true; project_parent->replace_media(m, paths.at(0)); }