diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt
index 3820a80..1c95feb 100644
--- a/gui/CMakeLists.txt
+++ b/gui/CMakeLists.txt
@@ -44,7 +44,9 @@ add_executable(chiaki
include/host.h
src/host.cpp
include/settingsdialog.h
- src/settingsdialog.cpp)
+ src/settingsdialog.cpp
+ include/manualhostdialog.h
+ src/manualhostdialog.cpp)
target_include_directories(chiaki PRIVATE include)
target_link_libraries(chiaki chiaki-lib chiaki-cli-lib)
diff --git a/gui/include/host.h b/gui/include/host.h
index 4d0671c..5fede37 100644
--- a/gui/include/host.h
+++ b/gui/include/host.h
@@ -78,7 +78,30 @@ class RegisteredHost
static RegisteredHost LoadFromSettings(QSettings *settings);
};
-Q_DECLARE_METATYPE(RegisteredHost)
+class ManualHost
+{
+ private:
+ int id;
+ QString host;
+ bool registered;
+ HostMAC registered_mac;
+
+ public:
+ ManualHost();
+ ManualHost(int id, const QString &host, bool registered, const HostMAC ®istered_mac);
+ ManualHost(int id, const ManualHost &o);
+
+ int GetID() const { return id; }
+ QString GetHost() const { return host; }
+ bool GetRegistered() const { return registered; }
+ HostMAC GetMAC() const { return registered_mac; }
+
+ void SaveToSettings(QSettings *settings) const;
+ static ManualHost LoadFromSettings(QSettings *settings);
+};
+
Q_DECLARE_METATYPE(HostMAC)
+Q_DECLARE_METATYPE(RegisteredHost)
+Q_DECLARE_METATYPE(ManualHost)
#endif //CHIAKI_HOST_H
diff --git a/gui/include/manualhostdialog.h b/gui/include/manualhostdialog.h
new file mode 100644
index 0000000..eeb3c03
--- /dev/null
+++ b/gui/include/manualhostdialog.h
@@ -0,0 +1,54 @@
+/*
+ * This file is part of Chiaki.
+ *
+ * Chiaki is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chiaki is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Chiaki. If not, see .
+ */
+
+#ifndef CHIAKI_MANUALHOSTDIALOG_H
+#define CHIAKI_MANUALHOSTDIALOG_H
+
+#include
+
+class Settings;
+
+class QLineEdit;
+class QComboBox;
+class QDialogButtonBox;
+class QAbstractButton;
+
+class ManualHostDialog: public QDialog
+{
+ Q_OBJECT
+
+ private:
+ Settings *settings;
+ int host_id;
+
+ QLineEdit *host_edit;
+ QComboBox *registered_host_combo_box;
+ QDialogButtonBox *button_box;
+
+ private slots:
+ void ValidateInput();
+
+ void ButtonClicked(QAbstractButton *button);
+
+ public:
+ explicit ManualHostDialog(Settings *settings, int id, QWidget *parent = nullptr);
+
+ public slots:
+ void accept() override;
+};
+
+#endif // CHIAKI_MANUALHOSTDIALOG_H
diff --git a/gui/include/settings.h b/gui/include/settings.h
index ccf8a0e..268f4cb 100644
--- a/gui/include/settings.h
+++ b/gui/include/settings.h
@@ -32,10 +32,15 @@ class Settings : public QObject
QSettings settings;
QMap registered_hosts;
+ QMap manual_hosts;
+ int manual_hosts_id_next;
void LoadRegisteredHosts();
void SaveRegisteredHosts();
+ void LoadManualHosts();
+ void SaveManualHosts();
+
public:
explicit Settings(QObject *parent = nullptr);
@@ -58,8 +63,15 @@ class Settings : public QObject
bool GetRegisteredHostRegistered(const HostMAC &mac) const { return registered_hosts.contains(mac); }
RegisteredHost GetRegisteredHost(const HostMAC &mac) const { return registered_hosts[mac]; }
+ QList GetManualHosts() const { return manual_hosts.values(); }
+ int SetManualHost(const ManualHost &host);
+ void RemoveManualHost(int id);
+ bool GetManualHostExists(int id) { return manual_hosts.contains(id); }
+ ManualHost GetManualHost(int id) const { return manual_hosts[id]; }
+
signals:
void RegisteredHostsUpdated();
+ void ManualHostsUpdated();
};
#endif // CHIAKI_SETTINGS_H
diff --git a/gui/src/host.cpp b/gui/src/host.cpp
index 2ccb029..f81807c 100644
--- a/gui/src/host.cpp
+++ b/gui/src/host.cpp
@@ -84,3 +84,45 @@ RegisteredHost RegisteredHost::LoadFromSettings(QSettings *settings)
memcpy(r.rp_key, rp_key.constData(), sizeof(r.rp_key));
return r;
}
+
+ManualHost::ManualHost()
+{
+ id = -1;
+ registered = false;
+}
+
+ManualHost::ManualHost(int id, const QString &host, bool registered, const HostMAC ®istered_mac)
+ : id(id),
+ host(host),
+ registered(registered),
+ registered_mac(registered_mac)
+{
+}
+
+ManualHost::ManualHost(int id, const ManualHost &o)
+ : id(id),
+ host(o.host),
+ registered(o.registered),
+ registered_mac(o.registered_mac)
+{
+}
+
+void ManualHost::SaveToSettings(QSettings *settings) const
+{
+ settings->setValue("id", id);
+ settings->setValue("host", host);
+ settings->setValue("registered", registered);
+ settings->setValue("registered_mac", QByteArray((const char *)registered_mac.GetMAC(), 6));
+}
+
+ManualHost ManualHost::LoadFromSettings(QSettings *settings)
+{
+ ManualHost r;
+ r.id = settings->value("id", -1).toInt();
+ r.host = settings->value("host").toString();
+ r.registered = settings->value("registered").toBool();
+ auto registered_mac = settings->value("registered_mac").toByteArray();
+ if(registered_mac.size() == 6)
+ r.registered_mac = HostMAC((const uint8_t *)registered_mac.constData());
+ return r;
+}
diff --git a/gui/src/mainwindow.cpp b/gui/src/mainwindow.cpp
index d966f1b..cf0c442 100644
--- a/gui/src/mainwindow.cpp
+++ b/gui/src/mainwindow.cpp
@@ -23,6 +23,7 @@
#include
#include
#include
+#include
#include
#include
@@ -54,10 +55,10 @@ MainWindow::MainWindow(Settings *settings, QWidget *parent)
tool_bar_spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Ignored);
tool_bar->addWidget(tool_bar_spacer);
- auto regist_action = new QAction(tr("Register"), this);
+ auto regist_action = new QAction(tr("Add Console manually"), this);
tool_bar->addAction(regist_action);
connect(regist_action, &QAction::triggered, this, [this]() {
- RegistDialog dialog(this->settings, QString(), this);
+ ManualHostDialog dialog(this->settings, -1, this);
dialog.exec();
});
diff --git a/gui/src/manualhostdialog.cpp b/gui/src/manualhostdialog.cpp
new file mode 100644
index 0000000..b07ab9b
--- /dev/null
+++ b/gui/src/manualhostdialog.cpp
@@ -0,0 +1,90 @@
+/*
+ * This file is part of Chiaki.
+ *
+ * Chiaki is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chiaki is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Chiaki. If not, see .
+ */
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+ManualHostDialog::ManualHostDialog(Settings *settings, int id, QWidget *parent)
+ : QDialog(parent)
+{
+ this->settings = settings;
+ host_id = id;
+
+ ManualHost host;
+ if(id >= 0 && settings->GetManualHostExists(id))
+ host = settings->GetManualHost(id);
+
+ auto layout = new QVBoxLayout(this);
+ setLayout(layout);
+
+ auto form_layout = new QFormLayout();
+ layout->addLayout(form_layout);
+
+ host_edit = new QLineEdit(this);
+ host_edit->setText(host.GetHost());
+ form_layout->addRow(tr("Host:"), host_edit);
+ connect(host_edit, &QLineEdit::textChanged, this, &ManualHostDialog::ValidateInput);
+
+ registered_host_combo_box = new QComboBox(this);
+ registered_host_combo_box->addItem(tr("Register on first Connection"));
+ auto registered_hosts = settings->GetRegisteredHosts();
+ for(const auto ®istered_host : registered_hosts)
+ registered_host_combo_box->addItem(QString("%1 (%2)").arg(registered_host.GetPS4MAC().ToString(), registered_host.GetPS4Nickname()), QVariant::fromValue(registered_host.GetPS4MAC()));
+ form_layout->addRow(tr("Registered Console:"), registered_host_combo_box);
+
+ button_box = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Discard, this);
+ layout->addWidget(button_box);
+ connect(button_box, &QDialogButtonBox::accepted, this, &QDialog::accept);
+ connect(button_box, &QDialogButtonBox::clicked, this, &ManualHostDialog::ButtonClicked);
+
+ ValidateInput();
+}
+
+void ManualHostDialog::ValidateInput()
+{
+ button_box->button(QDialogButtonBox::Save)->setEnabled(!host_edit->text().trimmed().isEmpty());
+}
+
+void ManualHostDialog::ButtonClicked(QAbstractButton *button)
+{
+ if(button_box->buttonRole(button) == QDialogButtonBox::DestructiveRole)
+ reject();
+}
+
+void ManualHostDialog::accept()
+{
+ bool registered = false;
+ HostMAC registered_mac;
+ QVariant registered_host_data = registered_host_combo_box->currentData();
+ if(registered_host_data.isValid())
+ {
+ registered = true;
+ registered_mac = registered_host_data.value();
+ }
+
+ ManualHost host(host_id, host_edit->text().trimmed(), registered, registered_mac);
+ settings->SetManualHost(host);
+ QDialog::accept();
+}
\ No newline at end of file
diff --git a/gui/src/settings.cpp b/gui/src/settings.cpp
index 5508ae2..c60f260 100644
--- a/gui/src/settings.cpp
+++ b/gui/src/settings.cpp
@@ -21,8 +21,10 @@
Settings::Settings(QObject *parent) : QObject(parent)
{
+ manual_hosts_id_next = 0;
settings.setValue("version", SETTINGS_VERSION);
LoadRegisteredHosts();
+ LoadManualHosts();
}
uint32_t Settings::GetLogLevelMask()
@@ -114,3 +116,53 @@ void Settings::RemoveRegisteredHost(const HostMAC &mac)
SaveRegisteredHosts();
emit RegisteredHostsUpdated();
}
+
+void Settings::LoadManualHosts()
+{
+ manual_hosts.clear();
+
+ int count = settings.beginReadArray("manual_hosts");
+ for(int i=0; i