diff --git a/icons/dirup-disabled.png b/icons/dirup-disabled.png new file mode 100644 index 000000000..f23fa3f68 Binary files /dev/null and b/icons/dirup-disabled.png differ diff --git a/icons/dirup.png b/icons/dirup.png new file mode 100644 index 000000000..f67b44672 Binary files /dev/null and b/icons/dirup.png differ diff --git a/icons/icons.qrc b/icons/icons.qrc index 711fdcdc0..ac37d6339 100644 --- a/icons/icons.qrc +++ b/icons/icons.qrc @@ -49,5 +49,7 @@ transition-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