diff --git a/src/app/AppController.cpp b/src/app/AppController.cpp index dfa36b5..303e093 100644 --- a/src/app/AppController.cpp +++ b/src/app/AppController.cpp @@ -141,6 +141,25 @@ void AppController::setQuickSave(bool enabled) } } +QString AppController::deviceType() const +{ + return LocalSend::deviceTypeToString(m_settings->deviceType()); +} + +void AppController::setDeviceType(const QString& type) +{ + LocalSend::DeviceType newType = LocalSend::deviceTypeFromString(type); + if (m_settings->deviceType() != newType) { + m_settings->setDeviceType(newType); + emit deviceTypeChanged(); + + LocalSend::InfoDto info = buildInfoDto(); + m_server->setLocalInfo(info, m_security->fingerprint()); + m_discovery->setLocalInfo(info, m_security->fingerprint(), m_settings->port(), + m_settings->https() ? LocalSend::ProtocolType::Https : LocalSend::ProtocolType::Http); + } +} + QVariantList AppController::devices() const { QVariantList result; diff --git a/src/app/AppController.h b/src/app/AppController.h index ce22f6a..a085d3f 100644 --- a/src/app/AppController.h +++ b/src/app/AppController.h @@ -33,6 +33,7 @@ class AppController : public QObject Q_PROPERTY(int currentReceiveFileIndex READ currentReceiveFileIndex NOTIFY receiveProgressChanged) Q_PROPERTY(int totalReceiveFiles READ totalReceiveFiles NOTIFY receivingChanged) Q_PROPERTY(QString currentReceiveSenderAlias READ currentReceiveSenderAlias NOTIFY receivingChanged) + Q_PROPERTY(QString deviceType READ deviceType WRITE setDeviceType NOTIFY deviceTypeChanged) public: explicit AppController(QObject* parent = nullptr); @@ -72,6 +73,9 @@ public: int totalReceiveFiles() const; QString currentReceiveSenderAlias() const; + QString deviceType() const; + void setDeviceType(const QString& type); + Q_INVOKABLE void startDiscovery(); Q_INVOKABLE void stopDiscovery(); Q_INVOKABLE void refreshDevices(); @@ -110,6 +114,7 @@ signals: void receivePinChanged(); void receivingChanged(); void receiveProgressChanged(); + void deviceTypeChanged(); private slots: void onDeviceDiscovered(const LocalSend::Device& device); diff --git a/src/app/qml/main.qml b/src/app/qml/main.qml index 5ecf6ea..93ecce8 100644 --- a/src/app/qml/main.qml +++ b/src/app/qml/main.qml @@ -15,6 +15,17 @@ ApplicationWindow { property string currentSenderAlias: "" property string currentSenderIp: "" + function getDeviceTypeIcon(deviceType) { + switch (deviceType) { + case "mobile": return "\u{1F4F1}" + case "desktop": return "\u{1F4BB}" + case "web": return "\u{1F310}" + case "headless": return "\u{1F5A5}" + case "server": return "\u{1F4E1}" + default: return "\u{1F4BB}" + } + } + DropArea { id: dropArea anchors.fill: parent @@ -587,6 +598,13 @@ ApplicationWindow { RowLayout { anchors.fill: parent + spacing: 12 + + Label { + text: getDeviceTypeIcon(modelData.deviceType) + font.pixelSize: 32 + Layout.alignment: Qt.AlignVCenter + } Column { Layout.fillWidth: true @@ -728,6 +746,33 @@ ApplicationWindow { onClicked: appController.receivePin = "" } } + + Label { text: qsTr("Device Type:") } + ComboBox { + id: deviceTypeCombo + Layout.fillWidth: true + model: [ + { text: qsTr("Mobile"), value: "mobile" }, + { text: qsTr("Desktop"), value: "desktop" }, + { text: qsTr("Web"), value: "web" }, + { text: qsTr("Headless"), value: "headless" }, + { text: qsTr("Server"), value: "server" } + ] + textRole: "text" + Component.onCompleted: { + for (var i = 0; i < model.length; i++) { + if (model[i].value === appController.deviceType) { + currentIndex = i + break + } + } + } + onCurrentIndexChanged: { + if (currentIndex >= 0 && currentIndex < model.length) { + appController.deviceType = model[currentIndex].value + } + } + } } FolderDialog { diff --git a/src/core/src/Settings.cpp b/src/core/src/Settings.cpp index 6e0cf98..243b66c 100644 --- a/src/core/src/Settings.cpp +++ b/src/core/src/Settings.cpp @@ -1,6 +1,7 @@ #include "LocalSendCore/Settings.h" #include "LocalSendCore/Constants.h" #include +#include namespace LocalSend { @@ -11,6 +12,18 @@ Settings::Settings(QObject* parent) { } +namespace { + DeviceType detectDeviceType() { +#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) + return DeviceType::Mobile; +#elif defined(Q_OS_LINUX) || defined(Q_OS_MACOS) || defined(Q_OS_WINDOWS) + return DeviceType::Desktop; +#else + return DeviceType::Headless; +#endif + } +} + QString Settings::alias() const { return m_settings.value(QStringLiteral("alias"), @@ -108,8 +121,11 @@ void Settings::setDeviceModel(const QString& model) DeviceType Settings::deviceType() const { - return deviceTypeFromString(m_settings.value(QStringLiteral("deviceType"), - QStringLiteral("desktop")).toString()); + QVariant stored = m_settings.value(QStringLiteral("deviceType")); + if (stored.isValid()) { + return deviceTypeFromString(stored.toString()); + } + return detectDeviceType(); } void Settings::setDeviceType(DeviceType type)