Windows-specific improvments

This commit is contained in:
Alex Spataru 2021-11-14 19:52:41 -06:00
parent f3b8e6b409
commit 02ae0e0db1
9 changed files with 222 additions and 238 deletions

View File

@ -99,6 +99,7 @@ CONFIG += silent
# Unity build # Unity build
#----------------------------------------------------------------------------------------- #-----------------------------------------------------------------------------------------
CONFIG += unity_build
CONFIG(unity_build) { CONFIG(unity_build) {
CONFIG += ltcg # Enable linker optimization CONFIG += ltcg # Enable linker optimization
DEFINES += UNITY_BUILD=1 # Enable unity build DEFINES += UNITY_BUILD=1 # Enable unity build

View File

@ -51,6 +51,7 @@ Window {
property bool firstChange: true property bool firstChange: true
property bool isMaximized: false property bool isMaximized: false
property bool isMinimized: false property bool isMinimized: false
property alias showIcon: _title.showIcon
property alias isFullscreen: _title.isFullscreen property alias isFullscreen: _title.isFullscreen
readonly property int customFlags: Qt.Window | readonly property int customFlags: Qt.Window |
Qt.CustomizeWindowHint | Qt.CustomizeWindowHint |

View File

@ -42,6 +42,7 @@ Rectangle {
// Window controls // Window controls
// //
property Window window property Window window
property bool showIcon: false
property bool closeEnabled: true property bool closeEnabled: true
property bool isFullscreen: false property bool isFullscreen: false
property bool minimizeEnabled: true property bool minimizeEnabled: true
@ -81,14 +82,11 @@ Rectangle {
// Calculations for Windows/Linux layout // Calculations for Windows/Linux layout
else { else {
// Default spacer
margin = 10 margin = 10
// Add space for fullscreen button if (root.showIcon)
if (fullscreenEnabled) margin += 24
margin += 18
// Add extra spacer if icon is visible
if (margin > 10) if (margin > 10)
margin += 8 margin += 8
} }
@ -305,16 +303,12 @@ Rectangle {
} }
WindowButton { WindowButton {
width: 16 visible: root.showIcon
height: 16 enabled: root.showIcon
rotation: 90
textColor: root.textColor textColor: root.textColor
visible: root.fullscreenEnabled highlightColor: root.textColor
enabled: root.fullscreenEnabled
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
onClicked: root.toggleFullscreen() source: "qrc:/images/icon-window.svg"
highlightColor: Cpp_ThemeManager.highlight
name: root.isFullscreen ? "restore" : "fullscreen"
} }
Item { Item {
@ -359,7 +353,6 @@ Rectangle {
window.close() window.close()
root.closed() root.closed()
} }
} }
Item { Item {

View File

@ -369,82 +369,10 @@ Item {
} }
// //
// RX/TX LEDs // Vertical spacer
// //
Item { Item {
Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
RowLayout {
spacing: app.spacing
anchors {
left: parent.left
right: parent.right
verticalCenter: parent.verticalCenter
}
Item {
Layout.fillWidth: true
}
Widgets.LED {
id: _rx
enabled: false
Layout.alignment: Qt.AlignVCenter
Connections {
target: Cpp_IO_Manager
function onRx() {
_rx.flash()
}
}
}
Label {
text: "RX"
font.bold: true
font.pixelSize: 18
font.family: app.monoFont
Layout.alignment: Qt.AlignVCenter
color: _rx.enabled ? Cpp_ThemeManager.ledEnabled : Cpp_ThemeManager.ledDisabled
}
Widgets.Icon {
width: 32
height: 32
source: "qrc:/icons/ethernet.svg"
Layout.alignment: Qt.AlignVCenter
color: Cpp_ThemeManager.ledDisabled
}
Label {
text: "TX"
font.bold: true
font.pixelSize: 18
font.family: app.monoFont
Layout.alignment: Qt.AlignVCenter
color: _tx.enabled ? Cpp_ThemeManager.ledEnabled : Cpp_ThemeManager.ledDisabled
}
Widgets.LED {
id: _tx
enabled: false
layoutDirection: Qt.RightToLeft
Layout.alignment: Qt.AlignVCenter
Connections {
target: Cpp_IO_Manager
function onTx() {
_tx.flash()
}
}
}
Item {
Layout.fillWidth: true
}
}
} }
} }
} }

View File

@ -196,8 +196,8 @@ MenuBar {
DecentMenuItem { DecentMenuItem {
sequence: "f11" sequence: "f11"
onTriggered: app.mainWindow.toggleFullscreen() onTriggered: app.mainWindow.toggleFullscreen()
text: app.mainWindow.fullScreen ? qsTr("Exit full screen") : text: app.mainWindow.isFullscreen ? qsTr("Exit full screen") :
qsTr("Enter full screen") qsTr("Enter full screen")
} }
} }

View File

@ -62,8 +62,8 @@ RowLayout {
// //
Rectangle { Rectangle {
id: _dot id: _dot
width: 18 width: 14
height: 18 height: 14
radius: width / 2 radius: width / 2
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
color: root.enabled ? Cpp_ThemeManager.ledEnabled : Cpp_ThemeManager.ledDisabled color: root.enabled ? Cpp_ThemeManager.ledEnabled : Cpp_ThemeManager.ledDisabled

View File

@ -45,6 +45,7 @@ FramelessWindow.CustomWindow {
// //
// Customize window border // Customize window border
// //
showIcon: true
borderWidth: 1 borderWidth: 1
fullscreenEnabled: true fullscreenEnabled: true
borderColor: Qt.darker(Cpp_ThemeManager.toolbarGradient2, 1.5) borderColor: Qt.darker(Cpp_ThemeManager.toolbarGradient2, 1.5)
@ -167,12 +168,8 @@ FramelessWindow.CustomWindow {
// Startup code // Startup code
// //
Component.onCompleted: { Component.onCompleted: {
// Load welcome guide
terminal.showWelcomeGuide() terminal.showWelcomeGuide()
root.showMainWindow()
// Display the window & check for updates in 500 ms (we do this so that
// we wait for the window to read settings before showing it)
timer.start()
} }
// //
@ -223,15 +220,6 @@ FramelessWindow.CustomWindow {
property alias autoUpdater: root.automaticUpdates property alias autoUpdater: root.automaticUpdates
} }
//
// Startup timer
//
Timer {
id: timer
interval: 500
onTriggered: root.showMainWindow()
}
// //
// macOS menubar loader // macOS menubar loader
// //
@ -247,11 +235,6 @@ FramelessWindow.CustomWindow {
RowLayout { RowLayout {
spacing: app.spacing spacing: app.spacing
height: titlebar.height height: titlebar.height
opacity: enabled ? 1 : 0
enabled: !root.showMacControls || isFullscreen
visible: !root.showMacControls || isFullscreen
Behavior on opacity {NumberAnimation{}}
anchors { anchors {
top: parent.top top: parent.top
@ -262,17 +245,98 @@ FramelessWindow.CustomWindow {
topMargin: root.shadowMargin + (!root.showMacControls ? 1 : 0) topMargin: root.shadowMargin + (!root.showMacControls ? 1 : 0)
} }
//
// Menubar
//
PlatformDependent.Menubar { PlatformDependent.Menubar {
id: menubar id: menubar
opacity: 0.8 opacity: enabled ? 0.8 : 0
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
enabled: !root.showMacControls || isFullscreen
visible: !root.showMacControls || isFullscreen
Behavior on opacity {NumberAnimation{}}
} }
// Leaving this layout for future usage... //
// Spacer
//
Item { Item {
Layout.fillWidth: true Layout.fillWidth: true
} }
//
// RX LED
//
LED {
id: _rx
enabled: false
Layout.alignment: Qt.AlignVCenter
Connections {
target: Cpp_IO_Manager
function onRx() {
_rx.flash()
}
}
}
//
// RX label
//
Label {
text: "RX"
font.bold: true
font.family: app.monoFont
Layout.alignment: Qt.AlignVCenter
color: _rx.enabled ? Cpp_ThemeManager.ledEnabled : Cpp_ThemeManager.ledDisabled
}
//
// RX/TX middleman icon
//
Icon {
width: 24
height: 24
source: "qrc:/icons/ethernet.svg"
Layout.alignment: Qt.AlignVCenter
color: Cpp_ThemeManager.ledDisabled
}
//
// TX Label
//
Label {
text: "TX"
font.bold: true
font.family: app.monoFont
Layout.alignment: Qt.AlignVCenter
color: _tx.enabled ? Cpp_ThemeManager.ledEnabled : Cpp_ThemeManager.ledDisabled
}
//
// TX LED
//
LED {
id: _tx
enabled: false
layoutDirection: Qt.RightToLeft
Layout.alignment: Qt.AlignVCenter
Connections {
target: Cpp_IO_Manager
function onTx() {
_tx.flash()
}
}
}
//
// Spacer
//
Item {
width: app.spacing
}
} }
// //

View File

@ -34,8 +34,8 @@
"alternativeHighlight":"#53ab27", "alternativeHighlight":"#53ab27",
"setupPanelBackground":"#e8e8e8", "setupPanelBackground":"#e8e8e8",
"paneWindowBackground":"#f1f1f1", "paneWindowBackground":"#f1f1f1",
"ledEnabled":"#0072C3", "ledEnabled":"#fe696e",
"ledDisabled":"#686868", "ledDisabled":"#0072C3",
"csvCheckbox":"#2e895c", "csvCheckbox":"#2e895c",
"connectButtonChecked":"#fe696e", "connectButtonChecked":"#fe696e",
"connectButtonUnchecked":"#26cd40", "connectButtonUnchecked":"#26cd40",

View File

@ -118,15 +118,15 @@ int Client::mqttVersion() const
{ {
switch (m_client.version()) switch (m_client.version())
{ {
case QMQTT::V3_1_0: case QMQTT::V3_1_0:
return 0; return 0;
break; break;
case QMQTT::V3_1_1: case QMQTT::V3_1_1:
return 1; return 1;
break; break;
default: default:
return -1; return -1;
break; break;
} }
} }
@ -206,8 +206,8 @@ StringList Client::qosLevels() const
// clang-format off // clang-format off
return StringList { return StringList {
tr("0: At most once"), tr("0: At most once"),
tr("1: At least once"), tr("1: At least once"),
tr("2: Exactly once") tr("2: Exactly once")
}; };
// clang-format on // clang-format on
} }
@ -235,12 +235,12 @@ StringList Client::sslProtocols() const
{ {
return StringList { return StringList {
tr("System default"), tr("System default"),
"TLS v1.0", "TLS v1.0",
"TLS v1.1", "TLS v1.1",
"TLS v1.2", "TLS v1.2",
"DTLS v1.0", "DTLS v1.0",
"DTLS v1.2", "DTLS v1.2",
"DTLS v1.3" "DTLS v1.3"
}; };
} }
@ -277,11 +277,8 @@ void Client::disconnectFromHost()
*/ */
void Client::setQos(const quint8 qos) void Client::setQos(const quint8 qos)
{ {
if (qos >= 0 && qos <= 2) m_client.setWillQos(qos);
{ emit qosChanged();
m_client.setWillQos(qos);
emit qosChanged();
}
} }
/** /**
@ -378,14 +375,14 @@ void Client::setMqttVersion(const int versionIndex)
{ {
switch (versionIndex) switch (versionIndex)
{ {
case 0: case 0:
m_client.setVersion(QMQTT::V3_1_0); m_client.setVersion(QMQTT::V3_1_0);
break; break;
case 1: case 1:
m_client.setVersion(QMQTT::V3_1_1); m_client.setVersion(QMQTT::V3_1_1);
break; break;
default: default:
break; break;
} }
emit mqttVersionChanged(); emit mqttVersionChanged();
@ -467,99 +464,99 @@ void Client::onError(const QMQTT::ClientError error)
switch (error) switch (error)
{ {
case QMQTT::UnknownError: case QMQTT::UnknownError:
str = tr("Unknown error"); str = tr("Unknown error");
break; break;
case QMQTT::SocketConnectionRefusedError: case QMQTT::SocketConnectionRefusedError:
str = tr("Connection refused"); str = tr("Connection refused");
break; break;
case QMQTT::SocketRemoteHostClosedError: case QMQTT::SocketRemoteHostClosedError:
str = tr("Remote host closed the connection"); str = tr("Remote host closed the connection");
break; break;
case QMQTT::SocketHostNotFoundError: case QMQTT::SocketHostNotFoundError:
str = tr("Host not found"); str = tr("Host not found");
break; break;
case QMQTT::SocketAccessError: case QMQTT::SocketAccessError:
str = tr("Socket access error"); str = tr("Socket access error");
break; break;
case QMQTT::SocketResourceError: case QMQTT::SocketResourceError:
str = tr("Socket resource error"); str = tr("Socket resource error");
break; break;
case QMQTT::SocketTimeoutError: case QMQTT::SocketTimeoutError:
str = tr("Socket timeout"); str = tr("Socket timeout");
break; break;
case QMQTT::SocketDatagramTooLargeError: case QMQTT::SocketDatagramTooLargeError:
str = tr("Socket datagram too large"); str = tr("Socket datagram too large");
break; break;
case QMQTT::SocketNetworkError: case QMQTT::SocketNetworkError:
str = tr("Network error"); str = tr("Network error");
break; break;
case QMQTT::SocketAddressInUseError: case QMQTT::SocketAddressInUseError:
str = tr("Address in use"); str = tr("Address in use");
break; break;
case QMQTT::SocketAddressNotAvailableError: case QMQTT::SocketAddressNotAvailableError:
str = tr("Address not available"); str = tr("Address not available");
break; break;
case QMQTT::SocketUnsupportedSocketOperationError: case QMQTT::SocketUnsupportedSocketOperationError:
str = tr("Unsupported socket operation"); str = tr("Unsupported socket operation");
break; break;
case QMQTT::SocketUnfinishedSocketOperationError: case QMQTT::SocketUnfinishedSocketOperationError:
str = tr("Unfinished socket operation"); str = tr("Unfinished socket operation");
break; break;
case QMQTT::SocketProxyAuthenticationRequiredError: case QMQTT::SocketProxyAuthenticationRequiredError:
str = tr("Proxy authentication required"); str = tr("Proxy authentication required");
break; break;
case QMQTT::SocketSslHandshakeFailedError: case QMQTT::SocketSslHandshakeFailedError:
str = tr("SSL handshake failed"); str = tr("SSL handshake failed");
break; break;
case QMQTT::SocketProxyConnectionRefusedError: case QMQTT::SocketProxyConnectionRefusedError:
str = tr("Proxy connection refused"); str = tr("Proxy connection refused");
break; break;
case QMQTT::SocketProxyConnectionClosedError: case QMQTT::SocketProxyConnectionClosedError:
str = tr("Proxy connection closed"); str = tr("Proxy connection closed");
break; break;
case QMQTT::SocketProxyConnectionTimeoutError: case QMQTT::SocketProxyConnectionTimeoutError:
str = tr("Proxy connection timeout"); str = tr("Proxy connection timeout");
break; break;
case QMQTT::SocketProxyNotFoundError: case QMQTT::SocketProxyNotFoundError:
str = tr("Proxy not found"); str = tr("Proxy not found");
break; break;
case QMQTT::SocketProxyProtocolError: case QMQTT::SocketProxyProtocolError:
str = tr("Proxy protocol error"); str = tr("Proxy protocol error");
break; break;
case QMQTT::SocketOperationError: case QMQTT::SocketOperationError:
str = tr("Operation error"); str = tr("Operation error");
break; break;
case QMQTT::SocketSslInternalError: case QMQTT::SocketSslInternalError:
str = tr("SSL internal error"); str = tr("SSL internal error");
break; break;
case QMQTT::SocketSslInvalidUserDataError: case QMQTT::SocketSslInvalidUserDataError:
str = tr("Invalid SSL user data"); str = tr("Invalid SSL user data");
break; break;
case QMQTT::SocketTemporaryError: case QMQTT::SocketTemporaryError:
str = tr("Socket temprary error"); str = tr("Socket temprary error");
break; break;
case QMQTT::MqttUnacceptableProtocolVersionError: case QMQTT::MqttUnacceptableProtocolVersionError:
str = tr("Unacceptable MQTT protocol"); str = tr("Unacceptable MQTT protocol");
break; break;
case QMQTT::MqttIdentifierRejectedError: case QMQTT::MqttIdentifierRejectedError:
str = tr("MQTT identifier rejected"); str = tr("MQTT identifier rejected");
break; break;
case QMQTT::MqttServerUnavailableError: case QMQTT::MqttServerUnavailableError:
str = tr("MQTT server unavailable"); str = tr("MQTT server unavailable");
break; break;
case QMQTT::MqttBadUserNameOrPasswordError: case QMQTT::MqttBadUserNameOrPasswordError:
str = tr("Bad MQTT username or password"); str = tr("Bad MQTT username or password");
break; break;
case QMQTT::MqttNotAuthorizedError: case QMQTT::MqttNotAuthorizedError:
str = tr("MQTT authorization error"); str = tr("MQTT authorization error");
break; break;
case QMQTT::MqttNoPingResponse: case QMQTT::MqttNoPingResponse:
str = tr("MQTT no ping response"); str = tr("MQTT no ping response");
break; break;
default: default:
str = ""; str = "";
break; break;
} }
if (!str.isEmpty()) if (!str.isEmpty())