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