From abff5da67b766a941c9ccf33c2cb348561a80f59 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 24 Dec 2018 23:20:55 +1100 Subject: [PATCH] added directory browsing and icon size slider --- icons/dirup-disabled.png | Bin 0 -> 1933 bytes icons/dirup.png | Bin 0 -> 1926 bytes icons/icons.qrc | 2 ++ olive.pro | 6 ++-- panels/project.cpp | 63 +++++++++++++++++++++++++++++++++++---- panels/project.h | 10 +++++-- ui/sourceiconview.cpp | 17 +++++++++++ ui/sourceiconview.h | 18 +++++++++++ 8 files changed, 107 insertions(+), 9 deletions(-) create mode 100644 icons/dirup-disabled.png create mode 100644 icons/dirup.png create mode 100644 ui/sourceiconview.cpp create mode 100644 ui/sourceiconview.h diff --git a/icons/dirup-disabled.png b/icons/dirup-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..f23fa3f683abe3a5f18474cbb18489b37d1820f4 GIT binary patch literal 1933 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 p(-o=R@{-Ztransition-tool.png transition-tool-disabled.png error.png + dirup.png + dirup-disabled.png diff --git a/olive.pro b/olive.pro index 78bd16870..ef37b525d 100644 --- a/olive.pro +++ b/olive.pro @@ -96,7 +96,8 @@ SOURCES += \ project/effectgizmo.cpp \ io/clipboard.cpp \ dialogs/stabilizerdialog.cpp \ - io/avtogl.cpp + io/avtogl.cpp \ + ui/sourceiconview.cpp HEADERS += \ mainwindow.h \ @@ -172,7 +173,8 @@ HEADERS += \ project/effectgizmo.h \ io/clipboard.h \ dialogs/stabilizerdialog.h \ - io/avtogl.h + io/avtogl.h \ + ui/sourceiconview.h FORMS += \ mainwindow.ui \ diff --git a/panels/project.cpp b/panels/project.cpp index 7d52ac2c0..70346b558 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -23,6 +23,7 @@ #include "io/clipboard.h" #include "project/media.h" #include "ui/sourcetable.h" +#include "ui/sourceiconview.h" #include "debug.h" #include @@ -38,7 +39,6 @@ #include #include #include -#include #include #include @@ -86,12 +86,47 @@ Project::Project(QWidget *parent) : tree_view->setModel(sorter); verticalLayout->addWidget(tree_view); - icon_view = new QListView(dockWidgetContents); + icon_view_container = new QWidget(); + + QVBoxLayout* icon_view_container_layout = new QVBoxLayout(); + icon_view_container_layout->setMargin(0); + icon_view_container_layout->setSpacing(0); + icon_view_container->setLayout(icon_view_container_layout); + + QHBoxLayout* icon_view_controls = new QHBoxLayout(); + icon_view_controls->setMargin(0); + icon_view_controls->setSpacing(0); + + QIcon directory_up_button; + directory_up_button.addFile(":/icons/dirup.png", QSize(), QIcon::Normal); + directory_up_button.addFile(":/icons/dirup-disabled.png", QSize(), QIcon::Disabled); + + directory_up = new QPushButton(); + directory_up->setIcon(directory_up_button); + directory_up->setEnabled(false); + icon_view_controls->addWidget(directory_up); + + icon_view_controls->addStretch(); + + QSlider* icon_size_slider = new QSlider(Qt::Horizontal); + icon_size_slider->setMinimum(16); + icon_size_slider->setMaximum(120); + icon_view_controls->addWidget(icon_size_slider); + connect(icon_size_slider, SIGNAL(valueChanged(int)), this, SLOT(set_icon_view_size(int))); + + icon_view_container_layout->addLayout(icon_view_controls); + + icon_view = new SourceIconView(dockWidgetContents); + icon_view->project_parent = this; icon_view->setModel(sorter); icon_view->setIconSize(QSize(100, 100)); icon_view->setViewMode(QListView::IconMode); icon_view->setUniformItemSizes(true); - verticalLayout->addWidget(icon_view); + icon_view_container_layout->addWidget(icon_view); + + icon_size_slider->setValue(icon_view->iconSize().height()); + + verticalLayout->addWidget(icon_view_container); QPushButton* tree_view_button = new QPushButton("Tree View"); verticalLayout->addWidget(tree_view_button); @@ -100,6 +135,9 @@ Project::Project(QWidget *parent) : verticalLayout->addWidget(icon_view_button); connect(icon_view_button, SIGNAL(clicked(bool)), this, SLOT(set_icon_view())); + connect(directory_up, SIGNAL(clicked(bool)), this, SLOT(go_up_dir())); + connect(icon_view, SIGNAL(changed_root()), this, SLOT(set_up_dir_enabled())); + //retranslateUi(Project); setWindowTitle(QApplication::translate("Project", "Project", nullptr)); @@ -1000,7 +1038,7 @@ void Project::save_project(bool autorecovery) { void Project::update_view_type() { tree_view->setVisible(config.project_view_type == PROJECT_VIEW_TREE); - icon_view->setVisible(config.project_view_type == PROJECT_VIEW_ICON); + icon_view_container->setVisible(config.project_view_type == PROJECT_VIEW_ICON); } void Project::set_icon_view() { @@ -1032,7 +1070,22 @@ void Project::save_recent_projects() { void Project::clear_recent_projects() { recent_projects.clear(); - save_recent_projects(); + save_recent_projects(); +} + +void Project::set_icon_view_size(int s) { + icon_view->setIconSize(QSize(s, s)); + // icon_view->setGridSize(QSize(s, s)); +} + +void Project::set_up_dir_enabled() { + dout << icon_view->rootIndex().isValid(); + directory_up->setEnabled(icon_view->rootIndex().isValid()); +} + +void Project::go_up_dir() { + icon_view->setRootIndex(icon_view->rootIndex().parent()); + set_up_dir_enabled(); } void Project::add_recent_project(QString url) { diff --git a/panels/project.h b/panels/project.h index f027c4298..b1e223855 100644 --- a/panels/project.h +++ b/panels/project.h @@ -20,7 +20,8 @@ class QXmlStreamReader; class QFile; class QSortFilterProxyModel; class ComboAction; -class QListView; +class SourceIconView; +class QPushButton; #define LOAD_TYPE_VERSION 69 #define LOAD_TYPE_URL 70 @@ -68,7 +69,7 @@ public: QVector list_all_project_sequences(); SourceTable* tree_view; - QListView* icon_view; + SourceIconView* icon_view; QSortFilterProxyModel* sorter; @@ -94,11 +95,16 @@ private: void list_all_sequences_worker(QVector *list, Media* parent); QString get_file_name_from_path(const QString &path); QDir proj_dir; + QWidget* icon_view_container; + QPushButton* directory_up; private slots: void update_view_type(); void set_icon_view(); void set_tree_view(); void clear_recent_projects(); + void set_icon_view_size(int); + void set_up_dir_enabled(); + void go_up_dir(); }; class MediaThrobber : public QObject { diff --git a/ui/sourceiconview.cpp b/ui/sourceiconview.cpp new file mode 100644 index 000000000..d1de9e4c2 --- /dev/null +++ b/ui/sourceiconview.cpp @@ -0,0 +1,17 @@ +#include "sourceiconview.h" + +#include "panels/project.h" +#include "project/media.h" +#include "debug.h" + +SourceIconView::SourceIconView(QWidget *parent) : QListView(parent) {} + +void SourceIconView::mouseDoubleClickEvent(QMouseEvent *event) { + if (selectedIndexes().size() == 1) { + Media* m = project_parent->item_to_media(selectedIndexes().at(0)); + if (m->get_type() == MEDIA_TYPE_FOLDER) { + setRootIndex(selectedIndexes().at(0)); + emit changed_root(); + } + } +} diff --git a/ui/sourceiconview.h b/ui/sourceiconview.h new file mode 100644 index 000000000..ea255d10d --- /dev/null +++ b/ui/sourceiconview.h @@ -0,0 +1,18 @@ +#ifndef SOURCEICONVIEW_H +#define SOURCEICONVIEW_H + +#include + +class Project; + +class SourceIconView : public QListView { + Q_OBJECT +public: + SourceIconView(QWidget* parent = 0); + Project* project_parent; + void mouseDoubleClickEvent(QMouseEvent *event); +signals: + void changed_root(); +}; + +#endif // SOURCEICONVIEW_H