tabs/dynamicmodeltab.cpp \
tabs/pathmappingtab.cpp \
tabs/hosttab.cpp \
+ tabs/watcheddirectoriestab.cpp \
fonts.cpp \
aniaddsyntaxhighlighter.cpp \
settingsdialog.cpp \
tabs/dynamicmodeltab.h \
tabs/pathmappingtab.h \
tabs/hosttab.h \
+ tabs/watcheddirectoriestab.h \
fonts.h \
aniaddsyntaxhighlighter.h \
settingsdialog.h \
tabs/clientlogtab.ui \
tabs/dynamicmodeltab.ui \
tabs/pathmappingtab.ui \
- tabs/hosttab.ui
+ tabs/hosttab.ui \
+ tabs/watcheddirectoriestab.ui
RESOURCES += resources.qrc
#include "tabs/clientlogtab.h"
#include "tabs/dynamicmodeltab.h"
#include "tabs/pathmappingtab.h"
+#include "tabs/watcheddirectoriestab.h"
#include "tabs/hosttab.h"
void registerTabs()
TabWidget::registerTab<DatabaseLogTab>();
TabWidget::registerTab<ClientLogTab>();
TabWidget::registerTab<PathMappingTab>();
+ TabWidget::registerTab<WatchedDirectoriesTab>();
TabWidget::registerTab<HostTab>();
TabWidget::registerTab<MyListTab>();
}
--- /dev/null
+#include "watcheddirectoriestab.h"
+#include "ui_watcheddirectoriestab.h"
+
+#include <QSqlRelationalDelegate>
+#include <QSqlError>
+#include <QMessageBox>
+#include "mylist.h"
+#include "database.h"
+
+WatchedDirectoriesTab::WatchedDirectoriesTab(QWidget *parent) :
+ AbstractTabBase(parent),
+ ui(new Ui::WatchedDirectoriesTab)
+{
+ ui->setupUi(this);
+ setLabel(name());
+}
+
+WatchedDirectoriesTab::~WatchedDirectoriesTab()
+{
+ delete ui;
+}
+
+QString WatchedDirectoriesTab::staticId()
+{
+ return "watched_directories";
+}
+
+QString WatchedDirectoriesTab::name()
+{
+ return tr("Watched Directories");
+}
+
+void WatchedDirectoriesTab::init()
+{
+ model = new QSqlRelationalTableModel(this,
+ LocalMyList::instance()->database()->connection());
+
+ model->setTable("watched_directory");
+ model->setRelation(1, QSqlRelation("host", "host_id", "name"));
+ model->setEditStrategy(QSqlTableModel::OnManualSubmit);
+
+ model->setHeaderData(0, Qt::Horizontal, tr("ID"));
+ model->setHeaderData(1, Qt::Horizontal, tr("Host"));
+ model->setHeaderData(2, Qt::Horizontal, tr("Directory"));
+ model->setHeaderData(2, Qt::Horizontal, tr("Enabled"));
+
+ ui->watchedDirectoriesView->setModel(model);
+ ui->watchedDirectoriesView->hideColumn(0);
+ ui->watchedDirectoriesView->setItemDelegateForColumn(1, new QSqlRelationalDelegate);
+ ui->watchedDirectoriesView->setSelectionBehavior(QAbstractItemView::SelectRows);
+ reload();
+}
+
+AbstractTab::TabActions WatchedDirectoriesTab::availableActions() const
+{
+ return Reload | SelectAll | ClearSelection | SaveChanges | DiscardChanges
+ | AddEntry | RemoveSelected;
+}
+
+void WatchedDirectoriesTab::reload()
+{
+ model->select();
+ ui->watchedDirectoriesView->resizeColumnsToContents();
+}
+
+void WatchedDirectoriesTab::addEntry()
+{
+ model->insertRecord(-1, QSqlRecord());
+}
+
+void WatchedDirectoriesTab::saveChanges()
+{
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+ if(!model->isDirty())
+ return;
+#endif
+
+ if (model->submitAll())
+ return;
+
+ QMessageBox::critical(this, tr("Error while saving changes"),
+ model->lastError().text());
+}
+
+void WatchedDirectoriesTab::discardChanges()
+{
+ model->revertAll();
+}
+
+void WatchedDirectoriesTab::removeSelected()
+{
+ using namespace LocalMyList;
+
+ QModelIndexList selection = ui->watchedDirectoriesView->selectionModel()->selectedRows();
+
+ for (const QModelIndex &idx : selection)
+ {
+ model->removeRow(idx.row());
+ }
+}
--- /dev/null
+#ifndef WATCHEDDIRECTORIESTAB_H
+#define WATCHEDDIRECTORIESTAB_H
+
+#include "abstracttab.h"
+#include <QSqlRelationalTableModel>
+
+namespace Ui {
+class WatchedDirectoriesTab;
+}
+
+class WatchedDirectoriesTab : public AbstractTabBase<WatchedDirectoriesTab>
+{
+ Q_OBJECT
+
+public:
+ explicit WatchedDirectoriesTab(QWidget *parent = 0);
+ ~WatchedDirectoriesTab();
+
+ static QString staticId();
+ static QString name();
+
+ void init() override;
+
+ TabActions availableActions() const override;
+ void reload() override;
+ void addEntry() override;
+ void saveChanges() override;
+ void discardChanges() override;
+ void removeSelected() override;
+
+private:
+ Ui::WatchedDirectoriesTab *ui;
+ QSqlRelationalTableModel *model;
+};
+
+#endif // WATCHEDDIRECTORIESTAB_H
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>WatchedDirectoriesTab</class>
+ <widget class="QWidget" name="WatchedDirectoriesTab">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTableView" name="watchedDirectoriesView"/>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
return exec(q);
}
-QStringList Database::getWatchedDirectories(int hostId)
+QStringList Database::getWatchedDirectories(int hostId, bool onlyEnabled)
{
- QSqlQuery &q = prepare("SELECT directory FROM watched_directory WHERE host_id = :hostId");
+ QSqlQuery &q = prepare(R"(
+ SELECT directory
+ FROM watched_directory
+ WHERE host_id = :hostId
+ AND ((:onlyEnabled1 = true AND enabled = true)
+ OR :onlyEnabled2 = false)
+ )");
q.bindValue(":hostId", hostId);
+ q.bindValue(":onlyEnabled1", onlyEnabled);
+ q.bindValue(":onlyEnabled2", onlyEnabled);
if (!exec(q))
return QStringList();
d->db.driver()->subscribeToNotification("episode_delete");
d->db.driver()->subscribeToNotification("file_delete");
d->db.driver()->subscribeToNotification("file_location_delete");
+ d->db.driver()->subscribeToNotification("watched_directory_changed");
}
void Database::unsubscribeFromNotifications()
if (locationId)
emit fileLocationDelete(locationId, fid);
}
+ else if (name == "watched_directory_changed")
+ {
+ int id = payload.toInt();
+ if (id && id == LocalMyList::instance()->hostId())
+ emit watchedDirectoriesChanged();
+ }
#endif
}
QList<PendingMyListUpdate> getPendingMyListUpdateBatch(int limit = 10);
bool clearPendingMyListUpdate(const LocalMyList::PendingMyListUpdate &request);
- QStringList getWatchedDirectories(int hostId);
+ QStringList getWatchedDirectories(int hostId, bool onlyEnabled = true);
QList<LocalMyList::PathMapping> getMappingsToHost(int hostId);
void newPendingMyListUpdate();
void renameDataChanged();
void configChanged();
+ void watchedDirectoriesChanged();
void animeUpdate(int aid);
void episodeUpdate(int eid, int aid);
bool DirectoryWatcher::doStart()
{
+ connect(db, SIGNAL(watchedDirectoriesChanged()), this, SLOT(setWatchedDirectories()));
connect(watcher, SIGNAL(directoryChanged(QString)), this, SLOT(watchedDirectoryChanged(QString)), Qt::QueuedConnection);
setWatchedDirectories();
void LocalMyList::DirectoryWatcher::doStop()
{
disconnect(watcher, SIGNAL(directoryChanged(QString)), this, SLOT(watchedDirectoryChanged(QString)));
+ disconnect(db, SIGNAL(watchedDirectoriesChanged()), this, SLOT(setWatchedDirectories()));
}
void DirectoryWatcher::doProcessRequests()
CREATE TABLE watched_directory
(
+ directory_id serial NOT NULL,
host_id integer NOT NULL,
directory text NOT NULL,
- CONSTRAINT watched_directory_pk PRIMARY KEY (host_id, directory)
+ enabled boolean NOT NULL default true,
+ CONSTRAINT watched_directory_pk PRIMARY KEY (directory_id),
+ CONSTRAINT watched_directory_unique_directory UNIQUE (host_id, directory)
);
CREATE TABLE path_map
ON INSERT TO file_location DO SELECT
pg_notify('file_location_insert', new.location_id::text);
+CREATE OR REPLACE RULE watched_directory_insert_notify_rule AS
+ ON INSERT TO watched_directory DO SELECT
+ pg_notify('watched_directory_changed', new.host_id::text);
+
-- Update rules
CREATE OR REPLACE RULE anime_update_notify_rule AS
ON UPDATE TO anime DO SELECT pg_notify('rename_data_changed', ''),
ON UPDATE TO file_location DO SELECT pg_notify('rename_data_changed', ''),
pg_notify('file_location_update', new.location_id::text || ',' || new.fid::text);
+CREATE OR REPLACE RULE watched_directory_update_notify_rule AS
+ ON UPDATE TO watched_directory DO SELECT
+ CASE
+ WHEN old.host_id <> new.host_id THEN
+ pg_notify('watched_directory_changed', old.host_id::text)
+ ELSE NULL::void
+ END,
+ pg_notify('watched_directory_changed', new.host_id::text);
+
-- Delete rules
CREATE OR REPLACE RULE anime_delete_notify_rule AS
ON DELETE TO anime DO SELECT pg_notify('anime_delete', old.aid::text);
CREATE OR REPLACE RULE file_location_delete_notify_rule AS
ON DELETE TO file_location DO SELECT pg_notify('file_location_delete', old.location_id::text || ',' || old.fid::text);
+CREATE OR REPLACE RULE watched_directory_delete_notify_rule AS
+ ON DELETE TO watched_directory DO SELECT
+ pg_notify('watched_directory_changed', old.host_id::text);
-- Sequences
CREATE SEQUENCE udp_client_session;