From d89657c0d9251b4e5411502266d713e8263f350f Mon Sep 17 00:00:00 2001 From: Serhii Hadzhilov Date: Fri, 9 Apr 2021 17:53:27 +0300 Subject: [PATCH] SYNERGY-799 Implement add computer button --- src/gui/src/ScreenSetupModel.cpp | 19 +++++++++++++++++++ src/gui/src/ScreenSetupModel.h | 2 ++ src/gui/src/ServerConfigDialog.cpp | 22 ++++++++++++++++++++++ src/gui/src/ServerConfigDialog.h | 2 ++ src/gui/src/TrashScreenWidget.cpp | 5 +++++ src/gui/src/TrashScreenWidget.h | 4 ++++ 6 files changed, 54 insertions(+) diff --git a/src/gui/src/ScreenSetupModel.cpp b/src/gui/src/ScreenSetupModel.cpp index 40e93c87b..a622436fe 100644 --- a/src/gui/src/ScreenSetupModel.cpp +++ b/src/gui/src/ScreenSetupModel.cpp @@ -141,3 +141,22 @@ bool ScreenSetupModel::dropMimeData(const QMimeData* data, Qt::DropAction action return true; } +void ScreenSetupModel::addScreen(const Screen& newScreen) +{ + auto screenTest = std::find_if(m_Screens.begin(), m_Screens.end(), + [](const Screen& item) { return item.isNull(); }); + + if (screenTest != m_Screens.end()) + { + (*screenTest) = newScreen; + } +} + +bool ScreenSetupModel::isFull() const +{ + auto emptyScreen = std::find_if(m_Screens.cbegin(), m_Screens.cend(), + [](const Screen& item) { return item.isNull(); }); + + return (emptyScreen == m_Screens.cend()); +} + diff --git a/src/gui/src/ScreenSetupModel.h b/src/gui/src/ScreenSetupModel.h index 726c6ed8b..2bf5f3191 100644 --- a/src/gui/src/ScreenSetupModel.h +++ b/src/gui/src/ScreenSetupModel.h @@ -51,6 +51,7 @@ class ScreenSetupModel : public QAbstractTableModel Qt::ItemFlags flags(const QModelIndex& index) const; QStringList mimeTypes() const; QMimeData* mimeData(const QModelIndexList& indexes) const; + bool isFull() const; protected: bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); @@ -58,6 +59,7 @@ class ScreenSetupModel : public QAbstractTableModel Screen& screen(const QModelIndex& index) { return screen(index.column(), index.row()); } const Screen& screen(int column, int row) const { return m_Screens[row * m_NumColumns + column]; } Screen& screen(int column, int row) { return m_Screens[row * m_NumColumns + column]; } + void addScreen(const Screen& newScreen); private: ScreenList& m_Screens; diff --git a/src/gui/src/ServerConfigDialog.cpp b/src/gui/src/ServerConfigDialog.cpp index 8ca5c058b..72647ed37 100644 --- a/src/gui/src/ServerConfigDialog.cpp +++ b/src/gui/src/ServerConfigDialog.cpp @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +#include "ScreenSettingsDialog.h" #include "ServerConfigDialog.h" #include "ServerConfig.h" #include "HotkeyDialog.h" @@ -79,6 +80,9 @@ ServerConfigDialog::ServerConfigDialog(QWidget* parent, ServerConfig& config) : } } } + + m_pButtonAddComputer->setEnabled(!model().isFull()); + connect(m_pTrashScreenWidget, SIGNAL(screenRemoved()), this, SLOT(onScreenRemoved())); } void ServerConfigDialog::showEvent(QShowEvent* event) @@ -239,3 +243,21 @@ void ServerConfigDialog::on_m_pListActions_itemSelectionChanged() m_pButtonEditAction->setEnabled(!m_pListActions->selectedItems().isEmpty()); m_pButtonRemoveAction->setEnabled(!m_pListActions->selectedItems().isEmpty()); } + +void ServerConfigDialog::on_m_pButtonAddComputer_clicked() +{ + Screen newScreen(""); + + ScreenSettingsDialog dlg(this, &newScreen, &model().m_Screens); + if (dlg.exec() == QDialog::Accepted) + { + model().addScreen(newScreen); + } + + m_pButtonAddComputer->setEnabled(!model().isFull()); +} + +void ServerConfigDialog::onScreenRemoved() +{ + m_pButtonAddComputer->setEnabled(true); +} diff --git a/src/gui/src/ServerConfigDialog.h b/src/gui/src/ServerConfigDialog.h index 974dc0384..5f0746c43 100644 --- a/src/gui/src/ServerConfigDialog.h +++ b/src/gui/src/ServerConfigDialog.h @@ -51,6 +51,8 @@ class ServerConfigDialog : public QDialog, public Ui::ServerConfigDialogBase void on_m_pButtonRemoveAction_clicked(); void on_m_pCheckBoxEnableClipboard_stateChanged(int state); + void on_m_pButtonAddComputer_clicked(); + void onScreenRemoved(); protected: ServerConfig& serverConfig() { return m_ServerConfig; } diff --git a/src/gui/src/TrashScreenWidget.cpp b/src/gui/src/TrashScreenWidget.cpp index 9d980d978..056ab0856 100644 --- a/src/gui/src/TrashScreenWidget.cpp +++ b/src/gui/src/TrashScreenWidget.cpp @@ -36,8 +36,13 @@ void TrashScreenWidget::dragEnterEvent(QDragEnterEvent* event) void TrashScreenWidget::dropEvent(QDropEvent* event) { if (event->mimeData()->hasFormat(ScreenSetupModel::mimeType())) + { event->acceptProposedAction(); + emit screenRemoved(); + } else + { event->ignore(); + } } diff --git a/src/gui/src/TrashScreenWidget.h b/src/gui/src/TrashScreenWidget.h index 524b39eed..39e2442ac 100644 --- a/src/gui/src/TrashScreenWidget.h +++ b/src/gui/src/TrashScreenWidget.h @@ -36,6 +36,10 @@ class TrashScreenWidget : public QLabel public: void dragEnterEvent(QDragEnterEvent* event); void dropEvent(QDropEvent* event); + + signals: + void screenRemoved(); + }; #endif