diff src/gui/dialog/settings/library.cc @ 226:f784b5b1914c

settings: add library page
author Paper <mrpapersonic@gmail.com>
date Mon, 08 Jan 2024 21:23:00 -0500
parents
children d030b30526d5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gui/dialog/settings/library.cc	Mon Jan 08 21:23:00 2024 -0500
@@ -0,0 +1,207 @@
+#include "core/session.h"
+#include "core/strings.h"
+#include "gui/dialog/settings.h"
+
+#include <QListWidget>
+#include <QListWidgetItem>
+#include <QGroupBox>
+#include <QCheckBox>
+#include <QLabel>
+#include <QSizePolicy>
+#include <QVBoxLayout>
+#include <QDir>
+#include <QFileDialog>
+#include <QFileInfo>
+#include <QPushButton>
+#include <QDropEvent>
+#include <QMimeData>
+
+#include <algorithm>
+#include <iostream>
+
+class DroppableListWidget : public QListWidget {
+	Q_OBJECT
+
+public:
+	explicit DroppableListWidget(QWidget* parent);
+
+signals:
+	void FilesDropped(QStringList list);
+
+protected:
+	void dragEnterEvent(QDragEnterEvent* event) override;
+	void dragMoveEvent(QDragMoveEvent* event) override;
+	void dropEvent(QDropEvent* event) override;
+};
+
+DroppableListWidget::DroppableListWidget(QWidget* parent) : QListWidget(parent) {
+	setAcceptDrops(true);
+}
+
+void DroppableListWidget::dragMoveEvent(QDragMoveEvent* event) {
+    if (event->mimeData()->hasUrls())
+        event->acceptProposedAction();
+}
+
+void DroppableListWidget::dragEnterEvent(QDragEnterEvent* event) {
+    if (event->mimeData()->hasUrls())
+        event->acceptProposedAction();
+}
+
+void DroppableListWidget::dropEvent(QDropEvent* event) {
+	const QMimeData *mime_data = event->mimeData();
+
+	if (!mime_data->hasUrls())
+		return;
+
+	QStringList path_list;
+	QList<QUrl> url_list = mime_data->urls();
+
+	for (const auto& url : url_list) {
+		if (!url.isLocalFile())
+			continue;
+
+		const QString file = url.toLocalFile();
+		const QFileInfo fileinfo(file);
+		if (fileinfo.exists() && fileinfo.isDir())
+			path_list.append(file);
+	}
+
+	if (!path_list.isEmpty())
+		emit FilesDropped(path_list);
+
+	event->acceptProposedAction();
+}
+
+QWidget* SettingsPageLibrary::CreateFoldersWidget() {
+	QWidget* result = new QWidget(this);
+	result->setAutoFillBackground(true);
+	result->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
+
+	QVBoxLayout* full_layout = new QVBoxLayout(result);
+
+	{
+		QGroupBox* group_box = new QGroupBox(tr("Library folders"), result);
+		group_box->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
+
+		QVBoxLayout* group_box_layout = new QVBoxLayout(group_box);
+
+		{
+			QLabel* label = new QLabel(tr("These folders will be scanned and monitored for new episodes."), group_box);
+			group_box_layout->addWidget(label);
+		}
+
+		{
+			DroppableListWidget* listwidget = new DroppableListWidget(group_box);
+			listwidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
+
+			for (const auto& path : paths) {
+				QListWidgetItem* item = new QListWidgetItem(listwidget);
+				item->setText(Strings::ToQString(path));
+				/* add icons as well soon */
+			}
+
+			connect(listwidget, &DroppableListWidget::FilesDropped, this, [this, listwidget](QStringList list){
+				for (const auto& dir : list) {
+					paths.insert(Strings::ToUtf8String(dir));
+					QListWidgetItem* item = new QListWidgetItem(listwidget);
+					item->setText(dir);
+				}
+			});
+
+			group_box_layout->addWidget(listwidget);
+
+			{
+				QWidget* widget = new QWidget(group_box);
+				QHBoxLayout* widget_layout = new QHBoxLayout(widget);
+
+				{
+					QLabel* label = new QLabel(tr("Tip: You can drag and drop folders here."), widget);
+					widget_layout->addWidget(label);
+				}
+
+				widget_layout->addStretch();
+
+				{
+					QPushButton* button = new QPushButton(tr("Add new..."), widget);
+
+					connect(button, &QPushButton::clicked, this, [this, listwidget]{
+						const QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),
+																			QDir::homePath(),
+																			QFileDialog::ShowDirsOnly
+																			| QFileDialog::DontResolveSymlinks);
+						if (dir.isEmpty())
+							return;
+						paths.insert(Strings::ToUtf8String(dir));
+						QListWidgetItem* item = new QListWidgetItem(listwidget);
+						item->setText(dir);
+					});
+
+					widget_layout->addWidget(button);
+				}
+
+				{
+					QPushButton* button = new QPushButton(tr("Remove"), widget);
+
+					connect(listwidget, &QListWidget::itemSelectionChanged, this, [button, listwidget]{
+						QList<QListWidgetItem*> selection = listwidget->selectedItems();
+						button->setEnabled(selection.size() > 0);
+					});
+
+					connect(button, &QPushButton::clicked, this, [this, listwidget]{
+						QList<QListWidgetItem*> selection = listwidget->selectedItems();
+						for (const auto& item : selection) {
+							paths.erase(Strings::ToUtf8String(item->text()));
+							delete item;
+						}
+					});
+
+					widget_layout->addWidget(button);
+				}
+
+				group_box_layout->addWidget(widget);
+			}
+		}
+
+		full_layout->addWidget(group_box);
+	}
+
+	{
+		QGroupBox* group_box = new QGroupBox(tr("Real-time monitor"), result);
+		group_box->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
+
+		QVBoxLayout* group_box_layout = new QVBoxLayout(group_box);
+
+		{
+			QCheckBox* checkbox = new QCheckBox(tr("Detect new files and folders under library folders"), group_box);
+			checkbox->setCheckState(real_time_monitor ? Qt::Checked : Qt::Unchecked);
+
+			connect(checkbox, &QCheckBox::stateChanged, this, [this](int state) {
+				real_time_monitor = (state != Qt::Unchecked);
+			});
+
+			group_box_layout->addWidget(checkbox);
+		}
+
+		full_layout->addWidget(group_box);
+	}
+
+	full_layout->setSpacing(10);
+	full_layout->addStretch();
+
+	return result;
+}
+
+void SettingsPageLibrary::SaveInfo() {
+	session.config.library.paths = paths;
+	session.config.library.real_time_monitor = real_time_monitor;
+}
+
+SettingsPageLibrary::SettingsPageLibrary(QWidget* parent)
+	: SettingsPage(parent, tr("Library")),
+	  paths(session.config.library.paths) {
+	real_time_monitor = session.config.library.real_time_monitor;
+	AddTab(CreateFoldersWidget(), tr("Folder"));
+}
+
+#include "gui/dialog/settings/library.moc"