diff --git a/CMakeLists.txt b/CMakeLists.txt
index 852875f..0d32ed5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -19,6 +19,7 @@ file(GLOB
"src/*"
"src/MainWidget/*"
"src/LicenseModel/*"
+ "src/EditClientDialog/*"
"deps/deps.qrc"
)
diff --git a/deps/deps.qrc b/deps/deps.qrc
index 92d38fb..29a02b0 100644
--- a/deps/deps.qrc
+++ b/deps/deps.qrc
@@ -7,6 +7,7 @@
edit.png
delete.png
info.png
+ dropFiles.png
tables.ddl
\ No newline at end of file
diff --git a/deps/dropFiles.png b/deps/dropFiles.png
new file mode 100644
index 0000000..6fd475b
Binary files /dev/null and b/deps/dropFiles.png differ
diff --git a/src/EditClientDialog/DropFileWidget.cpp b/src/EditClientDialog/DropFileWidget.cpp
new file mode 100644
index 0000000..c863991
--- /dev/null
+++ b/src/EditClientDialog/DropFileWidget.cpp
@@ -0,0 +1,85 @@
+#include "DropFileWidget.h"
+
+// Qt
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+DropFileWidget::DropFileWidget(QWidget *parent)
+ : QWidget(parent)
+{
+ setAcceptDrops(true);
+
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ setLayout(layout);
+
+ QIcon icon(":/deps/dropFiles.png");
+ QLabel *iconLabel = new QLabel(this);
+ iconLabel->setPixmap(icon.pixmap(300, 300));
+ iconLabel->setAlignment(Qt::AlignCenter);
+ layout->addWidget(iconLabel);
+}
+
+void DropFileWidget::dragEnterEvent(QDragEnterEvent *e)
+{
+ if (e->mimeData()->hasUrls())
+ e->acceptProposedAction();
+ else
+ e->ignore();
+}
+
+void DropFileWidget::dragMoveEvent(QDragMoveEvent *e)
+{
+ if (e->mimeData()->hasUrls())
+ e->acceptProposedAction();
+ else
+ e->ignore();
+}
+
+void DropFileWidget::dropEvent(QDropEvent *e)
+{
+ if (e->mimeData()->hasUrls())
+ {
+ QStringList paths;
+ const auto urls = e->mimeData()->urls();
+ for (const QUrl &url : urls)
+ {
+ if (url.isLocalFile())
+ {
+ const QString path = url.toLocalFile();
+ if (!path.isEmpty())
+ paths << path;
+ }
+ }
+
+ if (!paths.isEmpty())
+ {
+ emit filesDropped(paths);
+ e->acceptProposedAction();
+ }
+ else
+ e->ignore();
+ }
+}
+
+void DropFileWidget::mousePressEvent(QMouseEvent *e)
+{
+ if (e->button() == Qt::LeftButton)
+ selectFiles();
+ QWidget::mousePressEvent(e);
+}
+
+void DropFileWidget::selectFiles()
+{
+ auto files = QFileDialog::getOpenFileNames(
+ this
+ , tr("Select config file")
+ , QStandardPaths::writableLocation(QStandardPaths::HomeLocation)
+ );
+ emit filesDropped(files);
+}
diff --git a/src/EditClientDialog/DropFileWidget.h b/src/EditClientDialog/DropFileWidget.h
new file mode 100644
index 0000000..911bea0
--- /dev/null
+++ b/src/EditClientDialog/DropFileWidget.h
@@ -0,0 +1,23 @@
+#ifndef LICENSEMANAGER_DROPFILEWIDGET_H
+#define LICENSEMANAGER_DROPFILEWIDGET_H
+
+// Qt
+#include
+class QLabel;
+
+class DropFileWidget : public QWidget {
+ Q_OBJECT
+public:
+ explicit DropFileWidget(QWidget *parent = nullptr);
+signals:
+ void filesDropped(const QStringList &paths);
+protected:
+ void dragEnterEvent(QDragEnterEvent *e) override;
+ void dragMoveEvent(QDragMoveEvent *e) override;
+ void dropEvent(QDropEvent *e) override;
+ void mousePressEvent(QMouseEvent *e) override;
+private:
+ void selectFiles();
+};
+
+#endif //LICENSEMANAGER_DROPFILEWIDGET_H
diff --git a/src/EditClientDialog/EditClientDialog.cpp b/src/EditClientDialog/EditClientDialog.cpp
new file mode 100644
index 0000000..bcb9358
--- /dev/null
+++ b/src/EditClientDialog/EditClientDialog.cpp
@@ -0,0 +1,103 @@
+#include "EditClientDialog.h"
+
+// Qt
+#include
+#include
+#include
+#include
+
+// Self
+#include "DropFileWidget.h"
+#include "LicenseModel/LicenseModel.h"
+
+EditClientDialog::EditClientDialog(LicenseModel* model, QWidget *parent)
+ : QDialog(parent)
+ , m_model(model)
+{
+ setWindowTitle(tr("Edit Client"));
+ setModal(true);
+ setAcceptDrops(true);
+
+ // Ui
+ {
+ auto vLayout = new QVBoxLayout;
+ setLayout(vLayout);
+ m_tabWidget = new QTabWidget(this);
+ vLayout->addWidget(m_tabWidget);
+
+ // Auto filled widget
+ {
+ auto autoFilledWidget = new QWidget(m_tabWidget);
+ auto layout = new QVBoxLayout;
+ autoFilledWidget->setLayout(layout);
+
+ auto dropWidget = new DropFileWidget(autoFilledWidget);
+ layout->addWidget(dropWidget);
+ layout->addStretch();
+ m_configPathLabel = new QLabel(tr("Drop file here"));
+ m_configPathLabel->setAlignment(Qt::AlignCenter);
+ layout->addWidget(m_configPathLabel);
+ m_tabWidget->addTab(autoFilledWidget, tr("File autofilled"));
+
+ connect(dropWidget, &DropFileWidget::filesDropped, this, &EditClientDialog::onFilesChanged);
+ }
+
+ // Manual user add widget
+ {
+ auto manualWidget = new QWidget(m_tabWidget);
+ auto layout = new QVBoxLayout;
+ manualWidget->setLayout(layout);
+
+
+
+ m_tabWidget->addTab(manualWidget, tr("Manual"));
+ }
+
+ auto hLayout = new QHBoxLayout;
+ hLayout->setSpacing(vLayout->spacing());
+ hLayout->addStretch();
+ m_saveButton = new QPushButton(tr("Save"), this);
+ hLayout->addWidget(m_saveButton);
+ auto cancelButton = new QPushButton(tr("Cancel"), this);
+ hLayout->addWidget(cancelButton);
+ vLayout->addItem(hLayout);
+
+ connect(m_saveButton, &QPushButton::clicked, this, &EditClientDialog::onSaveButtonClicked);
+ connect(cancelButton, &QPushButton::clicked, this, &QDialog::reject);
+ }
+
+ loadSettings();
+}
+
+EditClientDialog::~EditClientDialog()
+{
+ saveSettings();
+}
+
+void EditClientDialog::loadSettings()
+{
+
+}
+
+void EditClientDialog::saveSettings()
+{
+
+}
+
+void EditClientDialog::onSaveButtonClicked()
+{
+
+}
+
+void EditClientDialog::onFilesChanged(const QStringList &paths)
+{
+ if (paths.isEmpty())
+ return;
+ QFile file(paths.at(0));
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
+ return;
+
+ file.close();
+ m_filesPath = paths.at(0);
+ m_configPathLabel->setText(paths.at(0).split("/").last());
+}
diff --git a/src/EditClientDialog/EditClientDialog.h b/src/EditClientDialog/EditClientDialog.h
new file mode 100644
index 0000000..8aa46a2
--- /dev/null
+++ b/src/EditClientDialog/EditClientDialog.h
@@ -0,0 +1,37 @@
+#ifndef LICENSEMANAGER_EDITCLIENTDIALOG_H
+#define LICENSEMANAGER_EDITCLIENTDIALOG_H
+
+// Qt
+#include
+#include
+#include
+#include
+#include
+class QTabWidget;
+
+// Self
+class LicenseModel;
+
+class EditClientDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ EditClientDialog(LicenseModel* model, QWidget *parent = nullptr);
+ ~EditClientDialog();
+
+private slots:
+ void onSaveButtonClicked();
+ void onFilesChanged(const QStringList &paths);
+private:
+ void loadSettings();
+ void saveSettings();
+private:
+ LicenseModel* m_model{nullptr};
+ QTabWidget* m_tabWidget{nullptr};
+ QLabel* m_configPathLabel{nullptr};
+
+ QPushButton* m_saveButton{nullptr};
+ QString m_filesPath;
+};
+
+#endif //LICENSEMANAGER_EDITCLIENTDIALOG_H
diff --git a/src/MainWidget/MainWidget.cpp b/src/MainWidget/MainWidget.cpp
index a719731..e15e9b6 100644
--- a/src/MainWidget/MainWidget.cpp
+++ b/src/MainWidget/MainWidget.cpp
@@ -16,6 +16,7 @@
// Self
#include "LicenseModel/LicenseModel.h"
+#include "EditClientDialog/EditClientDialog.h"
MainWidget::MainWidget(QWidget *parent)
: QMainWindow(parent)
@@ -107,7 +108,7 @@ void MainWidget::onGetInfoTriggered()
auto vLayout = new QVBoxLayout;
dialog.setLayout(vLayout);
QIcon icon(":/deps/icon.png");
- QLabel *iconLabel = new QLabel;
+ QLabel *iconLabel = new QLabel(&dialog);
iconLabel->setPixmap(icon.pixmap(300, 300));
iconLabel->setAlignment(Qt::AlignCenter);
vLayout->addWidget(iconLabel);
@@ -137,7 +138,8 @@ void MainWidget::onReloadTableTriggered()
void MainWidget::onAddClientTriggered()
{
-
+ EditClientDialog dialog(m_licenseModel, this);
+ dialog.exec();
}
void MainWidget::onEditClientTriggered()