From b75f662c4185b863d47e78a1a3f0c7ff5deca059 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 1 May 2020 18:34:15 -0700 Subject: [PATCH] Add the ability to rename PCs --- app/backend/computermanager.cpp | 13 +++++++++ app/backend/computermanager.h | 2 ++ app/backend/nvcomputer.cpp | 9 +++++- app/backend/nvcomputer.h | 1 + app/gui/PcView.qml | 52 +++++++++++++++++++++++++++++++++ app/gui/computermodel.cpp | 7 +++++ app/gui/computermodel.h | 2 ++ 7 files changed, 85 insertions(+), 1 deletion(-) diff --git a/app/backend/computermanager.cpp b/app/backend/computermanager.cpp index 846599a6..ec00918b 100644 --- a/app/backend/computermanager.cpp +++ b/app/backend/computermanager.cpp @@ -416,6 +416,19 @@ void ComputerManager::deleteHost(NvComputer* computer) QThreadPool::globalInstance()->start(new DeferredHostDeletionTask(this, computer)); } +void ComputerManager::renameHost(NvComputer* computer, QString name) +{ + { + QWriteLocker(&computer->lock); + + computer->name = name; + computer->hasCustomName = true; + } + + // Notify the UI of the state change + handleComputerStateChanged(computer); +} + void ComputerManager::handleAboutToQuit() { QWriteLocker lock(&m_Lock); diff --git a/app/backend/computermanager.h b/app/backend/computermanager.h index 5d546874..d9d1c976 100644 --- a/app/backend/computermanager.h +++ b/app/backend/computermanager.h @@ -179,6 +179,8 @@ public: // computer is deleted inside this call void deleteHost(NvComputer* computer); + void renameHost(NvComputer* computer, QString name); + signals: void computerStateChanged(NvComputer* computer); diff --git a/app/backend/nvcomputer.cpp b/app/backend/nvcomputer.cpp index d89c5e9c..c87297ed 100644 --- a/app/backend/nvcomputer.cpp +++ b/app/backend/nvcomputer.cpp @@ -14,6 +14,7 @@ #define SER_IPV6ADDR "ipv6address" #define SER_APPLIST "apps" #define SER_SRVCERT "srvcert" +#define SER_CUSTOMNAME "customname" #define SER_APPNAME "name" #define SER_APPID "id" @@ -23,6 +24,7 @@ NvComputer::NvComputer(QSettings& settings) { this->name = settings.value(SER_NAME).toString(); this->uuid = settings.value(SER_UUID).toString(); + this->hasCustomName = settings.value(SER_CUSTOMNAME).toBool(); this->macAddress = settings.value(SER_MAC).toByteArray(); this->localAddress = settings.value(SER_LOCALADDR).toString(); this->remoteAddress = settings.value(SER_REMOTEADDR).toString(); @@ -62,6 +64,7 @@ void NvComputer::serialize(QSettings& settings) const QReadLocker lock(&this->lock); settings.setValue(SER_NAME, name); + settings.setValue(SER_CUSTOMNAME, hasCustomName); settings.setValue(SER_UUID, uuid); settings.setValue(SER_MAC, macAddress); settings.setValue(SER_LOCALADDR, localAddress); @@ -96,6 +99,7 @@ NvComputer::NvComputer(QString address, QString serverInfo, QSslCertificate serv { this->serverCert = serverCert; + this->hasCustomName = false; this->name = NvHTTP::getXmlString(serverInfo, "hostname"); if (this->name.isEmpty()) { this->name = "UNKNOWN"; @@ -377,7 +381,10 @@ bool NvComputer::update(NvComputer& that) changed = true; \ } - ASSIGN_IF_CHANGED(name); + if (!hasCustomName) { + // Only overwrite the name if it's not custom + ASSIGN_IF_CHANGED(name); + } ASSIGN_IF_CHANGED_AND_NONEMPTY(macAddress); ASSIGN_IF_CHANGED_AND_NONEMPTY(localAddress); ASSIGN_IF_CHANGED_AND_NONEMPTY(remoteAddress); diff --git a/app/backend/nvcomputer.h b/app/backend/nvcomputer.h index 33ccd8fa..da268013 100644 --- a/app/backend/nvcomputer.h +++ b/app/backend/nvcomputer.h @@ -71,6 +71,7 @@ public: QString manualAddress; QByteArray macAddress; QString name; + bool hasCustomName; QString uuid; QSslCertificate serverCert; QVector appList; diff --git a/app/gui/PcView.qml b/app/gui/PcView.qml index ea5d1887..7931e6ba 100644 --- a/app/gui/PcView.qml +++ b/app/gui/PcView.qml @@ -1,5 +1,6 @@ import QtQuick 2.9 import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 import ComputerModel 1.0 @@ -159,6 +160,15 @@ CenteredGridView { deletePcDialog.open() } } + NavigableMenuItem { + parentMenu: pcContextMenu + text: "Rename PC" + onTriggered: { + renamePcDialog.pcIndex = index + renamePcDialog.originalName = model.name + renamePcDialog.open() + } + } NavigableMenuItem { parentMenu: pcContextMenu text: "Wake PC" @@ -265,6 +275,48 @@ CenteredGridView { onAccepted: deletePc() } + NavigableDialog { + id: renamePcDialog + property string label: "Enter the new name for this PC:" + property string originalName + property int pcIndex : -1; + + standardButtons: Dialog.Ok | Dialog.Cancel + + onOpened: { + // Force keyboard focus on the textbox so keyboard navigation works + editText.forceActiveFocus() + } + + onClosed: { + editText.clear() + } + + onAccepted: { + if (editText.text) { + computerModel.renameComputer(pcIndex, editText.text) + } + } + + ColumnLayout { + Label { + text: renamePcDialog.label + font.bold: true + } + + TextField { + id: editText + placeholderText: renamePcDialog.originalName + Layout.fillWidth: true + focus: true + + Keys.onReturnPressed: { + renamePcDialog.accept() + } + } + } + } + ScrollBar.vertical: ScrollBar { parent: pcGrid.parent anchors { diff --git a/app/gui/computermodel.cpp b/app/gui/computermodel.cpp index 8fbba8a6..141070ca 100644 --- a/app/gui/computermodel.cpp +++ b/app/gui/computermodel.cpp @@ -128,6 +128,13 @@ void ComputerModel::wakeComputer(int computerIndex) QThreadPool::globalInstance()->start(wakeTask); } +void ComputerModel::renameComputer(int computerIndex, QString name) +{ + Q_ASSERT(computerIndex < m_Computers.count()); + + m_ComputerManager->renameHost(m_Computers[computerIndex], name); +} + void ComputerModel::pairComputer(int computerIndex, QString pin) { Q_ASSERT(computerIndex < m_Computers.count()); diff --git a/app/gui/computermodel.h b/app/gui/computermodel.h index de63a259..a0fd5def 100644 --- a/app/gui/computermodel.h +++ b/app/gui/computermodel.h @@ -35,6 +35,8 @@ public: Q_INVOKABLE void wakeComputer(int computerIndex); + Q_INVOKABLE void renameComputer(int computerIndex, QString name); + Q_INVOKABLE Session* createSessionForCurrentGame(int computerIndex); signals: