Only actions the current tab supports are enabled.
{
}
+AbstractTab::TabActions AbstractTab::availableActions() const
+{
+ return AbstractTab::TabActions{};
+}
+
void AbstractTab::reload()
{
}
{
}
+void AbstractTab::saveChanges()
+{
+}
+
+void AbstractTab::discardChanges()
+{
+}
+
+void AbstractTab::addEntry()
+{
+}
+
+void AbstractTab::removeSelected()
+{
+}
+
void AbstractTab::loadSettings(QSettings *settings)
{
Q_UNUSED(settings);
Q_PROPERTY(QString label READ label WRITE setLabel NOTIFY nameChanged)
public:
+
+ enum TabAction
+ {
+ Reload = 1 << 0,
+ SelectAll = 1 << 1,
+ ClearSelection = 1 << 2,
+ SaveChanges = 1 << 3,
+ DiscardChanges = 1 << 4,
+ AddEntry = 1 << 5,
+ RemoveSelected = 1 << 6,
+ };
+
+ Q_FLAGS(TabActions)
+ Q_DECLARE_FLAGS(TabActions, TabAction)
+
explicit AbstractTab(QWidget *parent = 0);
~AbstractTab();
virtual void activate();
virtual void deactivate();
+ virtual TabActions availableActions() const;
virtual void reload();
virtual void selectAll();
virtual void clearSelection();
+ virtual void saveChanges();
+ virtual void discardChanges();
+ virtual void addEntry();
+ virtual void removeSelected();
virtual void loadSettings(QSettings *settings);
virtual void saveSettings(QSettings *settings);
MainWindow *m_mainWindow;
};
+Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractTab::TabActions)
+
template<typename T> class AbstractTabBase : public AbstractTab
{
public:
#include "reporteditordialog.h"
#include "versiondialog.h"
-#include "tabs/mylisttab.h"
-#include "tabs/reportstab.h"
#include <QDebug>
connect(ui->actionReload, SIGNAL(triggered()), ui->tabWidget, SLOT(reloadCurrentTab()));
connect(ui->actionSelectAll, SIGNAL(triggered()), ui->tabWidget, SLOT(tabSelectAll()));
connect(ui->actionClearSelection, SIGNAL(triggered()), ui->tabWidget, SLOT(tabClearSelection()));
+ connect(ui->actionSaveChanges, SIGNAL(triggered()), ui->tabWidget, SLOT(tabSaveChanges()));
+ connect(ui->actionDiscardChanges, SIGNAL(triggered()), ui->tabWidget, SLOT(tabDiscardChanges()));
+ connect(ui->actionAdd, SIGNAL(triggered()), ui->tabWidget, SLOT(tabAddEntry()));
+ connect(ui->actionRemoveSelected, SIGNAL(triggered()), ui->tabWidget, SLOT(tabRemoveSelected()));
registerTabs();
ui->tabWidget->setMainWindow(this);
saveSettings();
ui->tabWidget->saveSettings(MyList::instance()->defaultLocalQSettings());
delete ui;
+ ui = nullptr;
}
MyListModel *MainWindow::myListModel() const
ui->statusBar->showMessage(message);
}
+void MainWindow::updateTabActions(AbstractTab::TabActions actions)
+{
+ if (!ui) return;
+
+ ui->actionReload->setEnabled(actions.testFlag(AbstractTab::Reload));
+ ui->actionSelectAll->setEnabled(actions.testFlag(AbstractTab::SelectAll));
+ ui->actionClearSelection->setEnabled(actions.testFlag(AbstractTab::ClearSelection));
+ ui->actionSaveChanges->setEnabled(actions.testFlag(AbstractTab::SaveChanges));
+ ui->actionDiscardChanges->setEnabled(actions.testFlag(AbstractTab::DiscardChanges));
+ ui->actionAdd->setEnabled(actions.testFlag(AbstractTab::AddEntry));
+ ui->actionRemoveSelected->setEnabled(actions.testFlag(AbstractTab::RemoveSelected));
+}
+
void MainWindow::on_actionConnection_triggered()
{
DatabaseConnectionDialog d;
#define MAINWINDOW_H
#include <QMainWindow>
+#include "abstracttab.h"
namespace Ui {
class MainWindow;
void showMessage(const QString &message);
+ void updateTabActions(AbstractTab::TabActions actions);
+
private slots:
void dbConnected();
void dbDisconnected();
void on_actionClearFailedRequests_triggered();
void on_actionCheckFileLocations_triggered();
-
void on_actionRemoveKnownUnknownFiles_triggered();
-
void on_actionRenameScript_triggered();
-
void on_actionAddRelatedEpisodeInfo_triggered();
-
void on_actionAboutLocalMyList_triggered();
-
void on_actionConnection_triggered();
-
void on_actionSettings_triggered();
-
void on_actionQuit_triggered();
protected:
<bool>false</bool>
</attribute>
<addaction name="actionReload"/>
+ <addaction name="separator"/>
<addaction name="actionSelectAll"/>
<addaction name="actionClearSelection"/>
+ <addaction name="separator"/>
+ <addaction name="actionSaveChanges"/>
+ <addaction name="actionDiscardChanges"/>
+ <addaction name="separator"/>
+ <addaction name="actionAdd"/>
+ <addaction name="actionRemoveSelected"/>
</widget>
<widget class="QStatusBar" name="statusBar"/>
<action name="actionConnect">
<string>Settings...</string>
</property>
</action>
+ <action name="actionSaveChanges">
+ <property name="text">
+ <string>Save Changes</string>
+ </property>
+ <property name="toolTip">
+ <string>Save changes made in the current tab</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+S</string>
+ </property>
+ </action>
+ <action name="actionDiscardChanges">
+ <property name="text">
+ <string>Discard Changes</string>
+ </property>
+ <property name="toolTip">
+ <string>Discard Changes made in the current tab</string>
+ </property>
+ </action>
+ <action name="actionAdd">
+ <property name="text">
+ <string>Add</string>
+ </property>
+ <property name="toolTip">
+ <string>Add a new entry for the current tab</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+N</string>
+ </property>
+ </action>
+ <action name="actionRemoveSelected">
+ <property name="text">
+ <string>Remove Selected</string>
+ </property>
+ <property name="toolTip">
+ <string>Remove selected entries for the current tab</string>
+ </property>
+ </action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
reload();
}
+AbstractTab::TabActions DatabaseLogTab::availableActions() const
+{
+ return Reload;
+}
+
void DatabaseLogTab::reload()
{
QSqlQuery &q = LocalMyList::instance()->database()->prepare(
static QString staticId();
static QString name();
- void init();
- void activate();
+ void init() override;
+ void activate() override;
- void reload();
+ TabActions availableActions() const override;
+ void reload() override;
private:
Ui::DatabaseLogTab *ui;
ui->filterInput->setFocus();
}
+AbstractTab::TabActions DynamicModelTab::availableActions() const
+{
+ return Reload;
+}
+
void DynamicModelTab::reload()
{
model->reload();
static QString staticId();
static QString name();
- void init();
- void activate();
+ void init() override;
+ void activate() override;
- void reload();
+ TabActions availableActions() const override;
+ void reload() override;
- void loadSettings(QSettings *settings);
- void saveSettings(QSettings *settings);
+ void loadSettings(QSettings *settings) override;
+ void saveSettings(QSettings *settings) override;
protected:
- void changeEvent(QEvent *e);
+ void changeEvent(QEvent *e) override;
private slots:
void on_myListView_openFileRequested(const QModelIndex &index);
ui->filterInput->setFocus();
}
+AbstractTab::TabActions MyListTab::availableActions() const
+{
+ return Reload;
+}
+
void MyListTab::reload()
{
myListModel()->reload();
static QString staticId();
static QString name();
- void init();
- void activate();
+ void init() override;
+ void activate() override;
- void reload();
+ TabActions availableActions() const override;
+ void reload() override;
- void loadSettings(QSettings *settings);
- void saveSettings(QSettings *settings);
+ void loadSettings(QSettings *settings) override;
+ void saveSettings(QSettings *settings) override;
private slots:
void on_myListView_openFileRequested(const QModelIndex &index);
reload();
}
-void PathMappingTab::activate()
+AbstractTab::TabActions PathMappingTab::availableActions() const
{
+ return Reload | SelectAll | ClearSelection | SaveChanges | DiscardChanges
+ | AddEntry | RemoveSelected;
}
void PathMappingTab::reload()
ui->pathMappingView->resizeColumnsToContents();
}
-void PathMappingTab::on_addNewButton_clicked()
+void PathMappingTab::addEntry()
{
model->insertRecord(-1, QSqlRecord());
}
-void PathMappingTab::on_saveButton_clicked()
+void PathMappingTab::saveChanges()
{
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
if(!model->isDirty())
model->lastError().text());
}
-void PathMappingTab::on_discardButton_clicked()
+void PathMappingTab::discardChanges()
{
model->revertAll();
}
-void PathMappingTab::on_removeSelectedButton_clicked()
+void PathMappingTab::removeSelected()
{
using namespace LocalMyList;
static QString staticId();
static QString name();
- void init();
- void activate();
-
- void reload();
-
-private slots:
- void on_addNewButton_clicked();
-
- void on_saveButton_clicked();
-
- void on_discardButton_clicked();
-
- void on_removeSelectedButton_clicked();
+ void init() override;
+
+ TabActions availableActions() const override;
+ void reload() override;
+ void addEntry() override;
+ void saveChanges() override;
+ void discardChanges() override;
+ void removeSelected() override;
private:
Ui::PathMappingTab *ui;
<item>
<widget class="QTableView" name="pathMappingView"/>
</item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QPushButton" name="saveButton">
- <property name="text">
- <string>Save Changes</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="discardButton">
- <property name="text">
- <string>Discard Changes</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QPushButton" name="addNewButton">
- <property name="text">
- <string>Add New</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="removeSelectedButton">
- <property name="text">
- <string>Remove Selected</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
</layout>
</widget>
<resources/>
ui->view->setSelectionMode(QAbstractItemView::MultiSelection);
connect(ui->retryButton, SIGNAL(clicked()), this, SLOT(resetFailCount()));
- connect(ui->deleteButton, SIGNAL(clicked()), this, SLOT(deleteSelected()));
}
void PendingRequestTab::activate()
reload();
}
+AbstractTab::TabActions PendingRequestTab::availableActions() const
+{
+ return Reload | SelectAll | ClearSelection;
+}
+
void PendingRequestTab::reload()
{
QSqlQuery &q = LocalMyList::instance()->database()->prepare(
ui->view->clearSelection();
}
-void PendingRequestTab::deleteSelected()
-{
- QList<LocalMyList::PendingRequest> requests = selectionToPendingRequestList();
-
- if (!requests.count())
- return;
-
- {
- LocalMyList::RaiiTransaction t(LocalMyList::instance()->database());
- for (const LocalMyList::PendingRequest &request : requests)
- {
- LocalMyList::instance()->database()->clearRequest(request);
- }
- t.commit();
- }
-
- reload();
-}
-
void PendingRequestTab::resetFailCount()
{
QList<LocalMyList::PendingRequest> requests = selectionToPendingRequestList();
static QString staticId();
static QString name();
- void init();
- void activate();
+ void init() override;
+ void activate() override;
- void reload();
- void selectAll();
- void clearSelection();
+ TabActions availableActions() const override;
+ void reload() override;
+ void selectAll() override;
+ void clearSelection() override;
public slots:
- void deleteSelected();
void resetFailCount();
private:
</property>
</widget>
</item>
- <item>
- <widget class="QPushButton" name="deleteButton">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="text">
- <string>Delete</string>
- </property>
- </widget>
- </item>
</layout>
</item>
</layout>
reload();
}
+AbstractTab::TabActions ReportsTab::availableActions() const
+{
+ return Reload;
+}
+
void ReportsTab::reload()
{
ui->reports->clear();
static QString staticId();
static QString name();
- void init();
- void activate();
+ void init() override;
+ void activate() override;
- void reload();
+ TabActions availableActions() const override;
+ void reload() override;
private slots:
void on_reports_currentIndexChanged(int index);
ui->view->setModel(model);
}
-void SearchTab::activate()
-{
-}
-
void SearchTab::on_input_textChanged(const QString &text)
{
QString query;
static QString staticId();
static QString name();
- void init();
- void activate();
+ void init() override;
private slots:
void on_input_textChanged(const QString &text);
model->setHeaderData(1, Qt::Horizontal, tr("Size"));
model->setHeaderData(2, Qt::Horizontal, tr("Host"));
model->setHeaderData(3, Qt::Horizontal, tr("Path"));
-
- connect(ui->deleteButton, SIGNAL(clicked()), this, SLOT(deleteSelected()));
}
void UnknownFilesTab::activate()
reload();
}
+AbstractTab::TabActions UnknownFilesTab::availableActions() const
+{
+ return Reload | SelectAll | ClearSelection | RemoveSelected;
+}
+
void UnknownFilesTab::reload()
{
model->select();
ui->unknownFilesView->clearSelection();
}
-void UnknownFilesTab::deleteSelected()
+void UnknownFilesTab::removeSelected()
{
using namespace LocalMyList;
static QString staticId();
static QString name();
- void init();
- void activate();
-
- void reload();
- void selectAll();
- void clearSelection();
-
-public slots:
- void deleteSelected();
+ void init() override;
+ void activate() override;
+
+ TabActions availableActions() const override;
+ void reload() override;
+ void selectAll() override;
+ void clearSelection() override;
+ void removeSelected() override;
private:
Ui::UnknownFilesTab *ui;
<item>
<widget class="QTableView" name="unknownFilesView"/>
</item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QPushButton" name="deleteButton">
- <property name="text">
- <string>Delete Selected</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
</layout>
</widget>
<resources/>
void TabWidget::reloadCurrentTab()
{
AbstractTab *t = tab(currentIndex());
-
- if (!t)
- return;
-
+ if (!t) return;
t->reload();
}
void TabWidget::tabSelectAll()
{
AbstractTab *t = tab(currentIndex());
-
- if (!t)
- return;
-
+ if (!t) return;
t->selectAll();
}
void TabWidget::tabClearSelection()
{
AbstractTab *t = tab(currentIndex());
+ if (!t) return;
+ t->clearSelection();
+}
- if (!t)
- return;
+void TabWidget::tabSaveChanges()
+{
+ AbstractTab *t = tab(currentIndex());
+ if (!t) return;
+ t->saveChanges();
+}
- t->clearSelection();
+void TabWidget::tabDiscardChanges()
+{
+ AbstractTab *t = tab(currentIndex());
+ if (!t) return;
+ t->discardChanges();
+}
+
+void TabWidget::tabAddEntry()
+{
+ AbstractTab *t = tab(currentIndex());
+ if (!t) return;
+ t->addEntry();
+}
+
+void TabWidget::tabRemoveSelected()
+{
+ AbstractTab *t = tab(currentIndex());
+ if (!t) return;
+ t->removeSelected();
}
void TabWidget::tabNameChanged(const QString &newName)
previousTab = tab(newIndex);
if (previousTab)
+ {
+ mainWindow()->updateTabActions(previousTab->availableActions());
previousTab->activate();
+ }
+ else
+ {
+ mainWindow()->updateTabActions(AbstractTab::TabActions{});
+ }
}
void TabWidget::addTabRequested(const QString &id)
void reloadCurrentTab();
void tabSelectAll();
void tabClearSelection();
+ void tabSaveChanges();
+ void tabDiscardChanges();
+ void tabAddEntry();
+ void tabRemoveSelected();
void setMainWindow(MainWindow *mainWindow);
void setLockLayout(bool locked);