From 28977313daab4c1b2196f3b648f5abb47ea90039 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Mon, 3 Jan 2022 18:43:07 +0100 Subject: [PATCH] UI/UX fixes for OSX version. --- app/app.pro | 2 +- app/main.cpp | 8 +-- app/qml/ApplicationSettings.qml | 6 ++- app/qml/BurnInEffect.qml | 30 ++++++++--- app/qml/ColorButton.qml | 6 +-- app/qml/PreprocessedTerminal.qml | 52 ++++++++++++++----- app/qml/SettingsGeneralTab.qml | 2 + app/qml/SettingsTerminalTab.qml | 5 +- app/qml/SettingsWindow.qml | 2 +- app/qml/main.qml | 22 +++++--- app/qml/menus/OSXMenu.qml | 89 ++++++++++++++++++++++++++++++++ app/qml/resources.qrc | 1 + qmltermwidget | 2 +- 13 files changed, 189 insertions(+), 38 deletions(-) create mode 100644 app/qml/menus/OSXMenu.qml diff --git a/app/app.pro b/app/app.pro index 39bd4ec..1e42dcc 100644 --- a/app/app.pro +++ b/app/app.pro @@ -1,4 +1,4 @@ -QT += qml quick widgets sql +QT += qml quick widgets sql quickcontrols2 TARGET = cool-retro-term DESTDIR = $$OUT_PWD/../ diff --git a/app/main.cpp b/app/main.cpp index c58679e..b2a74d5 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -40,6 +41,9 @@ int main(int argc, char *argv[]) #if defined(Q_OS_MAC) // This allows UTF-8 characters usage in OSX. setenv("LC_CTYPE", "UTF-8", 1); + + // Force fusion style on macOS + QQuickStyle::setStyle("Fusion"); #endif if (argc>1 && (!strcmp(argv[1],"-h") || !strcmp(argv[1],"--help"))) { @@ -65,9 +69,7 @@ int main(int argc, char *argv[]) } QApplication app(argc, argv); - // set application attributes - // Has no effects, see https://bugreports.qt.io/browse/QTBUG-51293 - // app.setAttribute(Qt::AA_MacDontSwapCtrlAndMeta, true); + app.setAttribute(Qt::AA_MacDontSwapCtrlAndMeta, true); QQmlApplicationEngine engine; FileIO fileIO; diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml index d8a1d70..544c193 100644 --- a/app/qml/ApplicationSettings.qml +++ b/app/qml/ApplicationSettings.qml @@ -34,6 +34,8 @@ QtObject { readonly property real minBurnInFadeTime: 160 readonly property real maxBurnInFadeTime: 1600 + property bool isMacOS: Qt.platform.os === "osx" + // GENERAL SETTINGS /////////////////////////////////////////////////////// property int x: 100 property int y: 100 @@ -41,7 +43,7 @@ QtObject { property int height: 768 property bool fullscreen: false - property bool showMenubar: Qt.platform.os === "osx" ? true : false + property bool showMenubar: false property string wintitle: "cool-retro-term" @@ -54,7 +56,7 @@ QtObject { property real bloomQuality: 0.5 property real burnInQuality: 0.5 - property bool useFastBurnIn: Qt.platform.os === "osx" ? false : true + property bool useFastBurnIn: true property bool blinkingCursor: false diff --git a/app/qml/BurnInEffect.qml b/app/qml/BurnInEffect.qml index 9061b9c..9e9d9ac 100644 --- a/app/qml/BurnInEffect.qml +++ b/app/qml/BurnInEffect.qml @@ -72,20 +72,38 @@ Loader { Connections { target: kterminal - onImagePainted: completelyUpdate() + + function onImagePainted() { + completelyUpdate() + } } // Restart blurred source settings change. Connections{ target: appSettings - onBurnInChanged: burnInEffect.restartBlurSource(); - onTerminalFontChanged: burnInEffect.restartBlurSource(); - onRasterizationChanged: burnInEffect.restartBlurSource(); - onBurnInQualityChanged: burnInEffect.restartBlurSource(); + + function onBurnInChanged() { + burnInEffect.restartBlurSource() + } + + function onTerminalFontChanged() { + burnInEffect.restartBlurSource() + } + + function onRasterizationChanged() { + burnInEffect.restartBlurSource() + } + + function onBurnInQualityChanged() { + burnInEffect.restartBlurSource() + } } Connections { target: kterminalScrollbar - onOpacityChanged: completelyUpdate() + + function onOpacityChanged() { + completelyUpdate() + } } } diff --git a/app/qml/ColorButton.qml b/app/qml/ColorButton.qml index f46134b..a2d97e3 100644 --- a/app/qml/ColorButton.qml +++ b/app/qml/ColorButton.qml @@ -34,10 +34,8 @@ Item { visible: false //This is a workaround to a Qt 5.2 bug. - onColorChanged: if (Qt.platform.os !== "osx") - colorSelected(color) - onAccepted: if (Qt.platform.os === "osx") - colorSelected(color) + onColorChanged: if (!appSettings.isMacOS) colorSelected(color) + onAccepted: if (appSettings.isMacOS) colorSelected(color) } Rectangle { anchors.fill: parent diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index 9edf981..d6823db 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -45,28 +45,54 @@ Item{ property size fontMetrics: kterminal.fontMetrics // Manage copy and paste - Connections{ + Connections { target: copyAction - onTriggered: kterminal.copyClipboard(); + + function onTriggered() { + kterminal.copyClipboard() + } } - Connections{ + Connections { target: pasteAction - onTriggered: kterminal.pasteClipboard() + + function onTriggered() { + kterminal.pasteClipboard() + } } //When settings are updated sources need to be redrawn. - Connections{ + Connections { target: appSettings - onFontScalingChanged: terminalContainer.updateSources(); - onFontWidthChanged: terminalContainer.updateSources(); + + function onFontScalingChanged() { + terminalContainer.updateSources() + } + + function onFontWidthChanged() { + terminalContainer.updateSources() + } } - Connections{ + Connections { target: terminalContainer - onWidthChanged: terminalContainer.updateSources(); - onHeightChanged: terminalContainer.updateSources(); + + function onWidthChanged() { + terminalContainer.updateSources() + } + + function onHeightChanged() { + terminalContainer.updateSources() + } } + Connections { + target: terminalWindow + + function onActiveChanged() { + kterminal.forceActiveFocus() + } + } + function updateSources() { - kterminal.update(); + kterminal.update() } QMLTermWidget { @@ -143,7 +169,7 @@ Item{ var args = Utils.tokenizeCommandLine(appSettings.customCommand); ksession.setShellProgram(args[0]); ksession.setArgs(args.slice(1)); - } else if (!defaultCmd && Qt.platform.os === "osx") { + } else if (!defaultCmd && appSettings.isMacOS) { // OSX Requires the following default parameters for auto login. ksession.setArgs(["-i", "-l"]); } @@ -173,7 +199,7 @@ Item{ Loader { id: menuLoader - sourceComponent: (Qt.platform.os === "osx" || appSettings.showMenubar ? shortContextMenu : fullContextMenu) + sourceComponent: (appSettings.isMacOS || appSettings.showMenubar ? shortContextMenu : fullContextMenu) } property alias contextmenu: menuLoader.item diff --git a/app/qml/SettingsGeneralTab.qml b/app/qml/SettingsGeneralTab.qml index ed3359e..88e781d 100644 --- a/app/qml/SettingsGeneralTab.qml +++ b/app/qml/SettingsGeneralTab.qml @@ -215,10 +215,12 @@ ColumnLayout { } Label { text: qsTr("Opacity") + visible: !appSettings.isMacOS } SimpleSlider { onValueChanged: appSettings.windowOpacity = value value: appSettings.windowOpacity + visible: !appSettings.isMacOS } } } diff --git a/app/qml/SettingsTerminalTab.qml b/app/qml/SettingsTerminalTab.qml index 8e3a35c..7811d4c 100644 --- a/app/qml/SettingsTerminalTab.qml +++ b/app/qml/SettingsTerminalTab.qml @@ -68,7 +68,10 @@ ColumnLayout { } Connections { target: appSettings - onTerminalFontChanged: fontChanger.updateIndex() + + function onTerminalFontChanged() { + fontChanger.updateIndex() + } } Component.onCompleted: updateIndex() } diff --git a/app/qml/SettingsWindow.qml b/app/qml/SettingsWindow.qml index 6b5c024..0c0a8e1 100644 --- a/app/qml/SettingsWindow.qml +++ b/app/qml/SettingsWindow.qml @@ -34,7 +34,7 @@ Window { TabBar { id: bar - width: parent.width + anchors { left: parent.left; right: parent.right; top: parent.top } TabButton { text: qsTr("General") } diff --git a/app/qml/main.qml b/app/qml/main.qml index 0e8395f..8ae0774 100644 --- a/app/qml/main.qml +++ b/app/qml/main.qml @@ -53,20 +53,30 @@ ApplicationWindow { property bool fullscreen: appSettings.fullscreen onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed) - menuBar: WindowMenu { - id: mainMenu - visible: (Qt.platform.os === "osx" || appSettings.showMenubar) + menuBar: qtquickMenuLoader.item + + Loader { + id: qtquickMenuLoader + active: !appSettings.isMacOS && appSettings.showMenubar + sourceComponent: WindowMenu { } + } + + Loader { + id: globalMenuLoader + active: appSettings.isMacOS + sourceComponent: OSXMenu { } } property string wintitle: appSettings.wintitle color: "#00000000" + title: terminalContainer.title || qsTr(appSettings.wintitle) Action { id: showMenubarAction text: qsTr("Show Menubar") - enabled: Qt.platform.os !== "osx" + enabled: !appSettings.isMacOS shortcut: "Ctrl+Shift+M" checkable: true checked: appSettings.showMenubar @@ -75,7 +85,7 @@ ApplicationWindow { Action { id: fullscreenAction text: qsTr("Fullscreen") - enabled: Qt.platform.os !== "osx" + enabled: !appSettings.isMacOS shortcut: "Alt+F11" onTriggered: appSettings.fullscreen = !appSettings.fullscreen checkable: true @@ -154,7 +164,7 @@ ApplicationWindow { onClosing: { // OSX Since we are currently supporting only one window // quit the application when it is closed. - if (Qt.platform.os === "osx") + if (appSettings.isMacOS) Qt.quit() } } diff --git a/app/qml/menus/OSXMenu.qml b/app/qml/menus/OSXMenu.qml new file mode 100644 index 0000000..3fe9971 --- /dev/null +++ b/app/qml/menus/OSXMenu.qml @@ -0,0 +1,89 @@ +/******************************************************************************* +* Copyright (c) 2013-2021 "Filippo Scognamiglio" +* https://github.com/Swordfish90/cool-retro-term +* +* This file is part of cool-retro-term. +* +* cool-retro-term 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. +* +* This program 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 this program. If not, see . +*******************************************************************************/ + +import QtQuick 2.3 +import Qt.labs.platform 1.1 + +MenuBar { + id: defaultMenuBar + + Menu { + title: qsTr("File") + MenuItem { + text: quitAction.text + onTriggered: quitAction.trigger() + } + } + Menu { + title: qsTr("Edit") + MenuItem { + text: copyAction.text + shortcut: "Meta+C" + onTriggered: copyAction.trigger() + } + MenuItem { + text: pasteAction.text + shortcut: "Meta+V" + onTriggered: pasteAction.trigger() + } + MenuSeparator {} + MenuItem { + text: showsettingsAction.text + shortcut: showsettingsAction.shortcut + onTriggered: showsettingsAction.trigger() + } + } + Menu { + title: qsTr("View") + MenuItem { + text: zoomIn.text + shortcut: "Meta++" + onTriggered: zoomIn.trigger() + } + MenuItem { + text: zoomOut.text + shortcut: "Meta+-" + onTriggered: zoomOut.trigger() + } + } + Menu { + id: profilesMenu + title: qsTr("Profiles") + Instantiator { + model: appSettings.profilesList + delegate: MenuItem { + text: model.text + onTriggered: { + appSettings.loadProfileString(obj_string) + appSettings.handleFontChanged() + } + } + onObjectAdded: profilesMenu.insertItem(index, object) + onObjectRemoved: profilesMenu.removeItem(object) + } + } + Menu { + title: qsTr("Help") + MenuItem { + text: showAboutAction.text + onTriggered: showAboutAction.trigger() + } + } +} diff --git a/app/qml/resources.qrc b/app/qml/resources.qrc index 0cb4d24..f4f4431 100644 --- a/app/qml/resources.qrc +++ b/app/qml/resources.qrc @@ -46,5 +46,6 @@ menus/FullContextMenu.qml menus/ShortContextMenu.qml ShaderLibrary.qml + menus/OSXMenu.qml diff --git a/qmltermwidget b/qmltermwidget index 5c47d1f..997bdaa 160000 --- a/qmltermwidget +++ b/qmltermwidget @@ -1 +1 @@ -Subproject commit 5c47d1f49455394226e0e595f79c148f0c098006 +Subproject commit 997bdaa832609afc480e1153d458eff9692705e2