mirror of
				https://github.com/Swordfish90/cool-retro-term.git
				synced 2025-10-31 07:04:20 +00:00 
			
		
		
		
	Merge pull request #662 from Swordfish90/unstable
Migrate to QtQuick.Controls 2.x
This commit is contained in:
		| @@ -79,6 +79,9 @@ int main(int argc, char *argv[]) | ||||
|     app.setWindowIcon(QIcon(":../icons/32x32/cool-retro-term.png")); | ||||
| #endif | ||||
|  | ||||
|     app.setOrganizationName("cool-retro-term"); | ||||
|     app.setOrganizationDomain("cool-retro-term"); | ||||
|  | ||||
|     // Manage command line arguments from the cpp side | ||||
|     QStringList args = app.arguments(); | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Controls 1.1 | ||||
| import QtQuick.Controls 2.2 | ||||
| import QtQuick.Layouts 1.1 | ||||
| import QtQuick.Window 2.0 | ||||
|  | ||||
| @@ -86,24 +86,28 @@ Window{ | ||||
|     } | ||||
|     Component{ | ||||
|         id: licenseComponent | ||||
|         TextArea{ | ||||
|         ScrollView { | ||||
|             anchors.fill: parent | ||||
|             readOnly: true | ||||
|             text: "Copyright (c) 2013 Filippo Scognamiglio <flscogna@gmail.com>\n\n" + | ||||
|                   "https://github.com/Swordfish90/cool-retro-term\n\n" + | ||||
|             clip: true | ||||
|             TextArea{ | ||||
|                 readOnly: true | ||||
|                 wrapMode: TextEdit.Wrap | ||||
|                 text: "Copyright (c) 2013 Filippo Scognamiglio <flscogna@gmail.com>\n\n" + | ||||
|                       "https://github.com/Swordfish90/cool-retro-term\n\n" + | ||||
|  | ||||
|                   "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.\n\n" + | ||||
|                       "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.\n\n" + | ||||
|  | ||||
|                   "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.\n\n" + | ||||
|                       "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.\n\n" + | ||||
|  | ||||
|                   "You should have received a copy of the GNU General Public License " + | ||||
|                   "along with this program.  If not, see <http://www.gnu.org/licenses/>." | ||||
|                       "You should have received a copy of the GNU General Public License " + | ||||
|                       "along with this program.  If not, see <http://www.gnu.org/licenses/>." | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -19,7 +19,7 @@ | ||||
| *******************************************************************************/ | ||||
|  | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Controls 1.0 | ||||
| import QtQuick.Controls 2.0 | ||||
|  | ||||
| import "utils.js" as Utils | ||||
|  | ||||
| @@ -336,6 +336,7 @@ QtObject{ | ||||
|  | ||||
|         _margin = settings.margin !== undefined ? settings.margin : _margin; | ||||
|  | ||||
|  | ||||
|         handleFontChanged(); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -19,7 +19,7 @@ | ||||
| *******************************************************************************/ | ||||
|  | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Controls 1.1 | ||||
| import QtQuick.Controls 2.0 | ||||
| import QtQuick.Layouts 1.1 | ||||
|  | ||||
| import "Components" | ||||
| @@ -28,8 +28,8 @@ RowLayout { | ||||
|     property alias name: check.text | ||||
|  | ||||
|     property double value | ||||
|     property alias min_value: slider.minimumValue | ||||
|     property alias max_value: slider.maximumValue | ||||
|     property alias min_value: slider.from | ||||
|     property alias max_value: slider.to | ||||
|     property alias stepSize: slider.stepSize | ||||
|  | ||||
|     signal newValue(real newValue); | ||||
| @@ -67,7 +67,6 @@ RowLayout { | ||||
|         } | ||||
|     } | ||||
|     SizedLabel { | ||||
|         Layout.fillHeight: true | ||||
|         text: Math.round(((value - min_value) / (max_value - min_value)) * 100) + "%" | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -42,8 +42,7 @@ Item { | ||||
|         anchors.fill: parent | ||||
|         radius: 10 | ||||
|         color: rootItem.color | ||||
|         border.color: "black" | ||||
|         Glossy {} | ||||
|  | ||||
|         Rectangle { | ||||
|             anchors.fill: parent | ||||
|             anchors.margins: parent.height * 0.25 | ||||
|   | ||||
| @@ -20,16 +20,14 @@ | ||||
|  | ||||
|  | ||||
| import QtQuick 2.0 | ||||
| import QtQuick.Controls 1.0 | ||||
| import QtQuick.Controls 2.0 | ||||
| import QtQuick.Layouts 1.0 | ||||
|  | ||||
| // This component is simply a label with a predefined size. | ||||
| // Used to improve alignment. | ||||
|  | ||||
| Item { | ||||
|     property alias text: textfield.text | ||||
| Label { | ||||
|     id: textfield | ||||
|     Layout.minimumWidth: appSettings.labelWidth | ||||
|     width: appSettings.labelWidth | ||||
|     Label{ | ||||
|         id: textfield | ||||
|         anchors { right: parent.right; verticalCenter: parent.verticalCenter } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,21 +0,0 @@ | ||||
| import QtQuick 2.2 | ||||
|  | ||||
| Rectangle { | ||||
|     anchors.centerIn: parent | ||||
|     width: parent.width - parent.border.width | ||||
|     height: parent.height - parent.border.width | ||||
|     radius:parent.radius - parent.border.width/2 | ||||
|     smooth: true | ||||
|  | ||||
|     border.width: parent.border.width/2 | ||||
|     border.color: "#22FFFFFF" | ||||
|  | ||||
|     gradient: Gradient { | ||||
|         GradientStop { position: 0;    color: "#88FFFFFF" } | ||||
|         GradientStop { position: .1;   color: "#55FFFFFF" } | ||||
|         GradientStop { position: .5;   color: "#33FFFFFF" } | ||||
|         GradientStop { position: .501; color: "#11000000" } | ||||
|         GradientStop { position: .8;   color: "#11FFFFFF" } | ||||
|         GradientStop { position: 1;    color: "#55FFFFFF" } | ||||
|     } | ||||
| } | ||||
| @@ -20,7 +20,7 @@ | ||||
|  | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Window 2.0 | ||||
| import QtQuick.Controls 1.1 | ||||
| import QtQuick.Controls 2.0 | ||||
| import QtQuick.Layouts 1.1 | ||||
| import QtQuick.Dialogs 1.1 | ||||
|  | ||||
|   | ||||
| @@ -19,10 +19,11 @@ | ||||
| *******************************************************************************/ | ||||
|  | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Controls 1.1 | ||||
| import QtQuick.Controls 2.0 | ||||
|  | ||||
| import QMLTermWidget 1.0 | ||||
|  | ||||
| import "menus" | ||||
| import "utils.js" as Utils | ||||
|  | ||||
| Item{ | ||||
| @@ -156,31 +157,23 @@ Item{ | ||||
|         Component.onCompleted: { | ||||
|             appSettings.terminalFontChanged.connect(handleFontChanged); | ||||
|             appSettings.initializedSettings.connect(startSession); | ||||
|             appSettings.handleFontChanged() | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     Component { | ||||
|         id: linuxContextMenu | ||||
|         Menu{ | ||||
|             id: contextmenu | ||||
|             MenuItem { action: copyAction } | ||||
|             MenuItem { action: pasteAction } | ||||
|             MenuSeparator { visible: !appSettings.showMenubar } | ||||
|             MenuItem { action: showsettingsAction ; visible: !appSettings.showMenubar} | ||||
|             MenuSeparator { visible: !appSettings.showMenubar } | ||||
|             CRTMainMenuBar { visible: !appSettings.showMenubar } | ||||
|         } | ||||
|         id: shortContextMenu | ||||
|         ShortContextMenu { } | ||||
|     } | ||||
|  | ||||
|     Component { | ||||
|         id: osxContextMenu | ||||
|         Menu{ | ||||
|             id: contextmenu | ||||
|             MenuItem{action: copyAction} | ||||
|             MenuItem{action: pasteAction} | ||||
|         } | ||||
|         id: fullContextMenu | ||||
|         FullContextMenu { } | ||||
|     } | ||||
|  | ||||
|     Loader { | ||||
|         id: menuLoader | ||||
|         sourceComponent: (Qt.platform.os === "osx" ? osxContextMenu : linuxContextMenu) | ||||
|         sourceComponent: (Qt.platform.os === "osx" || appSettings.showMenubar ? shortContextMenu : fullContextMenu) | ||||
|     } | ||||
|     property alias contextmenu: menuLoader.item | ||||
|  | ||||
|   | ||||
| @@ -19,127 +19,128 @@ | ||||
| *******************************************************************************/ | ||||
|  | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Controls 1.1 | ||||
| import QtQuick.Controls 2.0 | ||||
| import QtQuick.Layouts 1.1 | ||||
| import QtQml 2.0 | ||||
|  | ||||
| import "Components" | ||||
|  | ||||
| Tab{ | ||||
|     ColumnLayout{ | ||||
|         anchors.fill: parent | ||||
| ColumnLayout{ | ||||
|     GroupBox{ | ||||
|         Layout.fillWidth: true | ||||
|         title: qsTr("Command") | ||||
|  | ||||
|         GroupBox{ | ||||
|             Layout.fillWidth: true | ||||
|             title: qsTr("Command") | ||||
|             ColumnLayout { | ||||
|                 anchors.fill: parent | ||||
|                 CheckBox{ | ||||
|                     id: useCustomCommand | ||||
|                     text: qsTr("Use custom command instead of shell at startup") | ||||
|                     checked: appSettings.useCustomCommand | ||||
|                     onCheckedChanged: appSettings.useCustomCommand = checked | ||||
|                 } | ||||
|                 // Workaround for QTBUG-31627 for pre 5.3.0 | ||||
|                 Binding{ | ||||
|                     target: useCustomCommand | ||||
|                     property: "checked" | ||||
|                     value: appSettings.useCustomCommand | ||||
|                 } | ||||
|                 TextField{ | ||||
|                     id: customCommand | ||||
|                     Layout.fillWidth: true | ||||
|                     text: appSettings.customCommand | ||||
|                     enabled: useCustomCommand.checked | ||||
|                     onEditingFinished: appSettings.customCommand = text | ||||
|         ColumnLayout { | ||||
|             anchors.fill: parent | ||||
|             CheckBox{ | ||||
|                 id: useCustomCommand | ||||
|                 text: qsTr("Use custom command instead of shell at startup") | ||||
|                 checked: appSettings.useCustomCommand | ||||
|                 onCheckedChanged: appSettings.useCustomCommand = checked | ||||
|             } | ||||
|             // Workaround for QTBUG-31627 for pre 5.3.0 | ||||
|             Binding{ | ||||
|                 target: useCustomCommand | ||||
|                 property: "checked" | ||||
|                 value: appSettings.useCustomCommand | ||||
|             } | ||||
|             TextField{ | ||||
|                 id: customCommand | ||||
|                 Layout.fillWidth: true | ||||
|                 text: appSettings.customCommand | ||||
|                 enabled: useCustomCommand.checked | ||||
|                 onEditingFinished: appSettings.customCommand = text | ||||
|  | ||||
|                     // Save text even if user forgets to press enter or unfocus | ||||
|                     function saveSetting() { | ||||
|                         appSettings.customCommand = text; | ||||
|                     } | ||||
|                     Component.onCompleted: settings_window.closing.connect(saveSetting) | ||||
|                 // Save text even if user forgets to press enter or unfocus | ||||
|                 function saveSetting() { | ||||
|                     appSettings.customCommand = text; | ||||
|                 } | ||||
|                 Component.onCompleted: settings_window.closing.connect(saveSetting) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|         GroupBox{ | ||||
|             title: qsTr("Performance") | ||||
|             Layout.fillWidth: true | ||||
|             GridLayout{ | ||||
|                 anchors.fill: parent | ||||
|                 rows: 2 | ||||
|                 columns: 3 | ||||
|     GroupBox{ | ||||
|         title: qsTr("Performance") | ||||
|         Layout.fillWidth: true | ||||
|         GridLayout{ | ||||
|             anchors.fill: parent | ||||
|             columns: 4 | ||||
|  | ||||
|                 Label{text: qsTr("Effects FPS")} | ||||
|                 Slider{ | ||||
|                     Layout.fillWidth: true | ||||
|                     id: fpsSlider | ||||
|                     onValueChanged: { | ||||
|                         if (enabled) { | ||||
|                             appSettings.fps = value !== 60 ? value + 1 : 0; | ||||
|                         } | ||||
|                     } | ||||
|                     stepSize: 1 | ||||
|                     enabled: false | ||||
|                     Component.onCompleted: { | ||||
|                         minimumValue = 0; | ||||
|                         maximumValue = 60; | ||||
|                         value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60; | ||||
|                         enabled = true; | ||||
|             Label{text: qsTr("Effects FPS")} | ||||
|             Slider{ | ||||
|                 Layout.fillWidth: true | ||||
|                 Layout.columnSpan: 2 | ||||
|                 id: fpsSlider | ||||
|                 onValueChanged: { | ||||
|                     if (enabled) { | ||||
|                         appSettings.fps = value !== 60 ? value + 1 : 0; | ||||
|                     } | ||||
|                 } | ||||
|                 stepSize: 1 | ||||
|                 enabled: false | ||||
|                 Component.onCompleted: { | ||||
|                     from = 0; | ||||
|                     to = 60; | ||||
|                     value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60; | ||||
|                     enabled = true; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|                 SizedLabel{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")} | ||||
|                 Label{text: qsTr("Texture Quality")} | ||||
|                 Slider{ | ||||
|                     Layout.fillWidth: true | ||||
|                     id: txtslider | ||||
|                     onValueChanged: if (enabled) appSettings.windowScaling = value; | ||||
|                     stepSize: 0.05 | ||||
|                     enabled: false | ||||
|                     Component.onCompleted: { | ||||
|                         minimumValue = 0.25 //Without this value gets set to 0.5 | ||||
|                         value = appSettings.windowScaling; | ||||
|                         enabled = true; | ||||
|                     } | ||||
|             Label{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")} | ||||
|             Label{text: qsTr("Texture Quality")} | ||||
|             Slider{ | ||||
|                 id: txtslider | ||||
|                 Layout.fillWidth: true | ||||
|                 Layout.columnSpan: 2 | ||||
|                 onValueChanged: if (enabled) appSettings.windowScaling = value; | ||||
|                 stepSize: 0.05 | ||||
|                 enabled: false | ||||
|                 Component.onCompleted: { | ||||
|                     from = 0.25 //Without this value gets set to 0.5 | ||||
|                     value = appSettings.windowScaling; | ||||
|                     enabled = true; | ||||
|                 } | ||||
|                 SizedLabel{text: Math.round(txtslider.value * 100) + "%"} | ||||
|             } | ||||
|             Label{text: Math.round(txtslider.value * 100) + "%"} | ||||
|  | ||||
|                 Label{text: qsTr("Bloom Quality")} | ||||
|                 Slider{ | ||||
|                     Layout.fillWidth: true | ||||
|                     id: bloomSlider | ||||
|                     onValueChanged: if (enabled) appSettings.bloomQuality = value; | ||||
|                     stepSize: 0.05 | ||||
|                     enabled: false | ||||
|                     Component.onCompleted: { | ||||
|                         minimumValue = 0.25 | ||||
|                         value = appSettings.bloomQuality; | ||||
|                         enabled = true; | ||||
|                     } | ||||
|             Label{text: qsTr("Bloom Quality")} | ||||
|             Slider{ | ||||
|                 Layout.fillWidth: true | ||||
|                 Layout.columnSpan: 2 | ||||
|                 id: bloomSlider | ||||
|                 onValueChanged: if (enabled) appSettings.bloomQuality = value; | ||||
|                 stepSize: 0.05 | ||||
|                 enabled: false | ||||
|                 Component.onCompleted: { | ||||
|                     from = 0.25 | ||||
|                     value = appSettings.bloomQuality; | ||||
|                     enabled = true; | ||||
|                 } | ||||
|                 SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"} | ||||
|             } | ||||
|             Label{text: Math.round(bloomSlider.value * 100) + "%"} | ||||
|  | ||||
|                 Label{text: qsTr("BurnIn Quality")} | ||||
|                 Slider{ | ||||
|                     Layout.fillWidth: true | ||||
|                     id: burnInSlider | ||||
|                     onValueChanged: if (enabled) appSettings.burnInQuality = value; | ||||
|                     stepSize: 0.05 | ||||
|                     enabled: false | ||||
|                     Component.onCompleted: { | ||||
|                         minimumValue = 0.25 | ||||
|                         value = appSettings.burnInQuality; | ||||
|                         enabled = true; | ||||
|                     } | ||||
|                 } | ||||
|                 SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"} | ||||
|                 CheckBox{ | ||||
|                     Layout.columnSpan: 2 | ||||
|                     text: qsTr("Burnin optimization (Might display timing artifacts)") | ||||
|                     checked: appSettings.useFastBurnIn | ||||
|                     onCheckedChanged: appSettings.useFastBurnIn = checked | ||||
|             Label{text: qsTr("BurnIn Quality")} | ||||
|             Slider{ | ||||
|                 Layout.fillWidth: true | ||||
|                 id: burnInSlider | ||||
|                 Layout.columnSpan: 2 | ||||
|                 onValueChanged: if (enabled) appSettings.burnInQuality = value; | ||||
|                 stepSize: 0.05 | ||||
|                 enabled: false | ||||
|                 Component.onCompleted: { | ||||
|                     from = 0.25 | ||||
|                     value = appSettings.burnInQuality; | ||||
|                     enabled = true; | ||||
|                 } | ||||
|             } | ||||
|             Label{text: Math.round(burnInSlider.value * 100) + "%"} | ||||
|             CheckBox{ | ||||
|                 Layout.columnSpan: 2 | ||||
|                 text: qsTr("Burnin optimization (Might display timing artifacts)") | ||||
|                 checked: appSettings.useFastBurnIn | ||||
|                 onCheckedChanged: appSettings.useFastBurnIn = checked | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -19,72 +19,69 @@ | ||||
| *******************************************************************************/ | ||||
|  | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Controls 1.1 | ||||
| import QtQuick.Controls 2.0 | ||||
| import QtQuick.Layouts 1.1 | ||||
|  | ||||
| Tab{ | ||||
|     ColumnLayout{ | ||||
|         anchors.fill: parent | ||||
|         spacing: 2 | ||||
| ColumnLayout{ | ||||
|     spacing: 2 | ||||
|  | ||||
|         GroupBox{ | ||||
|             title: qsTr("Effects") | ||||
|             Layout.fillWidth: true | ||||
|     GroupBox{ | ||||
|         title: qsTr("Effects") | ||||
|         Layout.fillWidth: true | ||||
|  | ||||
|             ColumnLayout { | ||||
|                 anchors.fill: parent | ||||
|         ColumnLayout { | ||||
|             anchors.fill: parent | ||||
|  | ||||
|                 CheckableSlider{ | ||||
|                     name: qsTr("Bloom") | ||||
|                     onNewValue: appSettings.bloom = newValue | ||||
|                     value: appSettings.bloom | ||||
|                 } | ||||
|                 CheckableSlider{ | ||||
|                     name: qsTr("BurnIn") | ||||
|                     onNewValue: appSettings.burnIn = newValue | ||||
|                     value: appSettings.burnIn | ||||
|                 } | ||||
|                 CheckableSlider{ | ||||
|                     name: qsTr("Static Noise") | ||||
|                     onNewValue: appSettings.staticNoise = newValue | ||||
|                     value: appSettings.staticNoise | ||||
|                 } | ||||
|                 CheckableSlider{ | ||||
|                     name: qsTr("Jitter") | ||||
|                     onNewValue: appSettings.jitter = newValue | ||||
|                     value: appSettings.jitter | ||||
|                 } | ||||
|                 CheckableSlider{ | ||||
|                     name: qsTr("Glow Line") | ||||
|                     onNewValue: appSettings.glowingLine = newValue; | ||||
|                     value: appSettings.glowingLine | ||||
|                 } | ||||
|                 CheckableSlider{ | ||||
|                     name: qsTr("Screen Curvature") | ||||
|                     onNewValue: appSettings.screenCurvature = newValue; | ||||
|                     value: appSettings.screenCurvature; | ||||
|                 } | ||||
|                 CheckableSlider{ | ||||
|                     name: qsTr("Ambient Light") | ||||
|                     onNewValue: appSettings.ambientLight = newValue; | ||||
|                     value: appSettings.ambientLight | ||||
|                     enabled: appSettings.framesIndex !== 0 | ||||
|                 } | ||||
|                 CheckableSlider{ | ||||
|                     name: qsTr("Flickering") | ||||
|                     onNewValue: appSettings.flickering = newValue; | ||||
|                     value: appSettings.flickering; | ||||
|                 } | ||||
|                 CheckableSlider{ | ||||
|                     name: qsTr("Horizontal Sync") | ||||
|                     onNewValue: appSettings.horizontalSync = newValue; | ||||
|                     value: appSettings.horizontalSync; | ||||
|                 } | ||||
|                 CheckableSlider{ | ||||
|                     name: qsTr("RGB Shift") | ||||
|                     onNewValue: appSettings.rbgShift = newValue; | ||||
|                     value: appSettings.rbgShift; | ||||
|                 } | ||||
|             CheckableSlider{ | ||||
|                 name: qsTr("Bloom") | ||||
|                 onNewValue: appSettings.bloom = newValue | ||||
|                 value: appSettings.bloom | ||||
|             } | ||||
|             CheckableSlider{ | ||||
|                 name: qsTr("BurnIn") | ||||
|                 onNewValue: appSettings.burnIn = newValue | ||||
|                 value: appSettings.burnIn | ||||
|             } | ||||
|             CheckableSlider{ | ||||
|                 name: qsTr("Static Noise") | ||||
|                 onNewValue: appSettings.staticNoise = newValue | ||||
|                 value: appSettings.staticNoise | ||||
|             } | ||||
|             CheckableSlider{ | ||||
|                 name: qsTr("Jitter") | ||||
|                 onNewValue: appSettings.jitter = newValue | ||||
|                 value: appSettings.jitter | ||||
|             } | ||||
|             CheckableSlider{ | ||||
|                 name: qsTr("Glow Line") | ||||
|                 onNewValue: appSettings.glowingLine = newValue; | ||||
|                 value: appSettings.glowingLine | ||||
|             } | ||||
|             CheckableSlider{ | ||||
|                 name: qsTr("Screen Curvature") | ||||
|                 onNewValue: appSettings.screenCurvature = newValue; | ||||
|                 value: appSettings.screenCurvature; | ||||
|             } | ||||
|             CheckableSlider{ | ||||
|                 name: qsTr("Ambient Light") | ||||
|                 onNewValue: appSettings.ambientLight = newValue; | ||||
|                 value: appSettings.ambientLight | ||||
|                 enabled: appSettings.framesIndex !== 0 | ||||
|             } | ||||
|             CheckableSlider{ | ||||
|                 name: qsTr("Flickering") | ||||
|                 onNewValue: appSettings.flickering = newValue; | ||||
|                 value: appSettings.flickering; | ||||
|             } | ||||
|             CheckableSlider{ | ||||
|                 name: qsTr("Horizontal Sync") | ||||
|                 onNewValue: appSettings.horizontalSync = newValue; | ||||
|                 value: appSettings.horizontalSync; | ||||
|             } | ||||
|             CheckableSlider{ | ||||
|                 name: qsTr("RGB Shift") | ||||
|                 onNewValue: appSettings.rbgShift = newValue; | ||||
|                 value: appSettings.rbgShift; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -19,216 +19,217 @@ | ||||
| *******************************************************************************/ | ||||
|  | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Controls 1.1 | ||||
| import QtQuick.Controls 2.4 | ||||
| import QtQuick.Layouts 1.1 | ||||
| import QtQuick.Dialogs 1.1 | ||||
|  | ||||
| Tab{ | ||||
|     ColumnLayout{ | ||||
|         anchors.fill: parent | ||||
|         GroupBox{ | ||||
|             Layout.fillWidth: true | ||||
|             Layout.fillHeight: true | ||||
|             title: qsTr("Profile") | ||||
|             RowLayout { | ||||
|                 anchors.fill: parent | ||||
|                 TableView { | ||||
|                     id: profilesView | ||||
| ColumnLayout{ | ||||
|     GroupBox{ | ||||
|         Layout.fillWidth: true | ||||
|         title: qsTr("Profile") | ||||
|         RowLayout { | ||||
|             anchors.fill: parent | ||||
|             ListView { | ||||
|                 id: profilesView | ||||
|                 Layout.fillWidth: true | ||||
|                 Layout.fillHeight: true | ||||
|                 model: appSettings.profilesList | ||||
|                 delegate: Rectangle { | ||||
|                     width: label.width | ||||
|                     height: label.height | ||||
|                     color: (index == profilesView.currentIndex) ? palette.highlight : palette.base | ||||
|                     Label { | ||||
|                         id: label | ||||
|                         text: appSettings.profilesList.get(index).text | ||||
|                         MouseArea { | ||||
|                             anchors.fill: parent | ||||
|                             onClicked: profilesView.currentIndex = index | ||||
|                             onDoubleClicked: appSettings.loadProfile(index) | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             ColumnLayout { | ||||
|                 Layout.fillHeight: true | ||||
|                 Layout.fillWidth: false | ||||
|                 Button{ | ||||
|                     Layout.fillWidth: true | ||||
|                     text: qsTr("Save") | ||||
|                     onClicked: { | ||||
|                         insertname.profileName = ""; | ||||
|                         insertname.show() | ||||
|                     } | ||||
|                 } | ||||
|                 Button{ | ||||
|                     Layout.fillWidth: true | ||||
|                     property alias currentIndex: profilesView.currentIndex | ||||
|                     enabled: currentIndex >= 0 | ||||
|                     text: qsTr("Load") | ||||
|                     onClicked: { | ||||
|                         var index = currentIndex; | ||||
|                         if (index >= 0) | ||||
|                             appSettings.loadProfile(index); | ||||
|                     } | ||||
|                 } | ||||
|                 Button{ | ||||
|                     Layout.fillWidth: true | ||||
|                     text: qsTr("Remove") | ||||
|                     property alias currentIndex: profilesView.currentIndex | ||||
|  | ||||
|                     enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin | ||||
|                     onClicked: { | ||||
|                         appSettings.profilesList.remove(currentIndex); | ||||
|                         profilesView.selection.clear(); | ||||
|  | ||||
|                         // TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2. | ||||
|                         profilesView.model = 0; | ||||
|                         profilesView.model = appSettings.profilesList; | ||||
|                     } | ||||
|                 } | ||||
|                 Item { | ||||
|                     // Spacing | ||||
|                     Layout.fillHeight: true | ||||
|                     model: appSettings.profilesList | ||||
|                     headerVisible: false | ||||
|                     TableViewColumn { | ||||
|                         title: qsTr("Profile") | ||||
|                         role: "text" | ||||
|                         width: parent.width * 0.5 | ||||
|                     } | ||||
|                     onActivated: { | ||||
|                         appSettings.loadProfile(row); | ||||
|                     } | ||||
|                 } | ||||
|                 ColumnLayout { | ||||
|                     Layout.fillHeight: true | ||||
|                     Layout.fillWidth: false | ||||
|                     Button{ | ||||
|                         Layout.fillWidth: true | ||||
|                         text: qsTr("Save") | ||||
|                         onClicked: { | ||||
|                             insertname.profileName = ""; | ||||
|                             insertname.show() | ||||
|                         } | ||||
|                 Button{ | ||||
|                     Layout.fillWidth: true | ||||
|                     text: qsTr("Import") | ||||
|                     onClicked: { | ||||
|                         fileDialog.selectExisting = true; | ||||
|                         fileDialog.callBack = function (url) {loadFile(url);}; | ||||
|                         fileDialog.open(); | ||||
|                     } | ||||
|                     Button{ | ||||
|                         Layout.fillWidth: true | ||||
|                         property alias currentIndex: profilesView.currentRow | ||||
|                         enabled: currentIndex >= 0 | ||||
|                         text: qsTr("Load") | ||||
|                         onClicked: { | ||||
|                             var index = profilesView.currentRow; | ||||
|                             if (index >= 0) | ||||
|                                 appSettings.loadProfile(index); | ||||
|                         } | ||||
|                     } | ||||
|                     Button{ | ||||
|                         Layout.fillWidth: true | ||||
|                         text: qsTr("Remove") | ||||
|                         property alias currentIndex: profilesView.currentRow | ||||
|                     function loadFile(url) { | ||||
|                         try { | ||||
|                             if (appSettings.verbose) | ||||
|                                 console.log("Loading file: " + url); | ||||
|  | ||||
|                         enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin | ||||
|                         onClicked: { | ||||
|                             appSettings.profilesList.remove(currentIndex); | ||||
|                             profilesView.selection.clear(); | ||||
|                             var profileObject = JSON.parse(fileIO.read(url)); | ||||
|                             var name = profileObject.name; | ||||
|  | ||||
|                             // TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2. | ||||
|                             profilesView.model = 0; | ||||
|                             profilesView.model = appSettings.profilesList; | ||||
|                         } | ||||
|                     } | ||||
|                     Item { | ||||
|                         // Spacing | ||||
|                         Layout.fillHeight: true | ||||
|                     } | ||||
|                     Button{ | ||||
|                         Layout.fillWidth: true | ||||
|                         text: qsTr("Import") | ||||
|                         onClicked: { | ||||
|                             fileDialog.selectExisting = true; | ||||
|                             fileDialog.callBack = function (url) {loadFile(url);}; | ||||
|                             fileDialog.open(); | ||||
|                         } | ||||
|                         function loadFile(url) { | ||||
|                             try { | ||||
|                                 if (appSettings.verbose) | ||||
|                                     console.log("Loading file: " + url); | ||||
|                             if (!name) | ||||
|                                 throw "Profile doesn't have a name"; | ||||
|  | ||||
|                                 var profileObject = JSON.parse(fileIO.read(url)); | ||||
|                                 var name = profileObject.name; | ||||
|                             var version = profileObject.version !== undefined ? profileObject.version : 1; | ||||
|                             if (version !== appSettings.profileVersion) | ||||
|                                 throw "This profile is not supported on this version of CRT."; | ||||
|  | ||||
|                                 if (!name) | ||||
|                                     throw "Profile doesn't have a name"; | ||||
|                             delete profileObject.name; | ||||
|  | ||||
|                                 var version = profileObject.version !== undefined ? profileObject.version : 1; | ||||
|                                 if (version !== appSettings.profileVersion) | ||||
|                                     throw "This profile is not supported on this version of CRT."; | ||||
|  | ||||
|                                 delete profileObject.name; | ||||
|  | ||||
|                                 appSettings.appendCustomProfile(name, JSON.stringify(profileObject)); | ||||
|                             } catch (err) { | ||||
|                                 messageDialog.text = qsTr(err) | ||||
|                                 messageDialog.open(); | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                     Button{ | ||||
|                         property alias currentIndex: profilesView.currentRow | ||||
|  | ||||
|                         Layout.fillWidth: true | ||||
|  | ||||
|                         text: qsTr("Export") | ||||
|                         enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin | ||||
|                         onClicked: { | ||||
|                             fileDialog.selectExisting = false; | ||||
|                             fileDialog.callBack = function (url) {storeFile(url);}; | ||||
|                             fileDialog.open(); | ||||
|                         } | ||||
|                         function storeFile(url) { | ||||
|                             try { | ||||
|                                 var urlString = url.toString(); | ||||
|  | ||||
|                                 // Fix the extension if it's missing. | ||||
|                                 var extension = urlString.substring(urlString.length - 5, urlString.length); | ||||
|                                 var urlTail = (extension === ".json" ? "" : ".json"); | ||||
|                                 url += urlTail; | ||||
|  | ||||
|                                 if (true) | ||||
|                                     console.log("Storing file: " + url); | ||||
|  | ||||
|                                 var profileObject = appSettings.profilesList.get(currentIndex); | ||||
|                                 var profileSettings = JSON.parse(profileObject.obj_string); | ||||
|                                 profileSettings["name"] = profileObject.text; | ||||
|                                 profileSettings["version"] = appSettings.profileVersion; | ||||
|  | ||||
|                                 var result = fileIO.write(url, JSON.stringify(profileSettings, undefined, 2)); | ||||
|                                 if (!result) | ||||
|                                     throw "The file could not be written."; | ||||
|                             } catch (err) { | ||||
|                                 console.log(err); | ||||
|                                 messageDialog.text = qsTr("There has been an error storing the file.") | ||||
|                                 messageDialog.open(); | ||||
|                             } | ||||
|                             appSettings.appendCustomProfile(name, JSON.stringify(profileObject)); | ||||
|                         } catch (err) { | ||||
|                             messageDialog.text = qsTr(err) | ||||
|                             messageDialog.open(); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|                 Button{ | ||||
|                     property alias currentIndex: profilesView.currentIndex | ||||
|  | ||||
|         GroupBox{ | ||||
|             title: qsTr("Screen") | ||||
|             Layout.fillWidth: true | ||||
|             GridLayout{ | ||||
|                 anchors.fill: parent | ||||
|                 columns: 2 | ||||
|                 Label{ text: qsTr("Brightness") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings.brightness = value | ||||
|                     value: appSettings.brightness | ||||
|                     Layout.fillWidth: true | ||||
|  | ||||
|                     text: qsTr("Export") | ||||
|                     enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin | ||||
|                     onClicked: { | ||||
|                         fileDialog.selectExisting = false; | ||||
|                         fileDialog.callBack = function (url) {storeFile(url);}; | ||||
|                         fileDialog.open(); | ||||
|                     } | ||||
|                     function storeFile(url) { | ||||
|                         try { | ||||
|                             var urlString = url.toString(); | ||||
|  | ||||
|                             // Fix the extension if it's missing. | ||||
|                             var extension = urlString.substring(urlString.length - 5, urlString.length); | ||||
|                             var urlTail = (extension === ".json" ? "" : ".json"); | ||||
|                             url += urlTail; | ||||
|  | ||||
|                             if (true) | ||||
|                                 console.log("Storing file: " + url); | ||||
|  | ||||
|                             var profileObject = appSettings.profilesList.get(currentIndex); | ||||
|                             var profileSettings = JSON.parse(profileObject.obj_string); | ||||
|                             profileSettings["name"] = profileObject.text; | ||||
|                             profileSettings["version"] = appSettings.profileVersion; | ||||
|  | ||||
|                             var result = fileIO.write(url, JSON.stringify(profileSettings, undefined, 2)); | ||||
|                             if (!result) | ||||
|                                 throw "The file could not be written."; | ||||
|                         } catch (err) { | ||||
|                             console.log(err); | ||||
|                             messageDialog.text = qsTr("There has been an error storing the file.") | ||||
|                             messageDialog.open(); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 Label{ text: qsTr("Contrast") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings.contrast = value | ||||
|                     value: appSettings.contrast | ||||
|                 } | ||||
|                 Label{ text: qsTr("Margin") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings._margin = value | ||||
|                     value: appSettings._margin | ||||
|                 } | ||||
|                 Label{ text: qsTr("Opacity") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings.windowOpacity = value | ||||
|                     value: appSettings.windowOpacity | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // DIALOGS //////////////////////////////////////////////////////////////// | ||||
|         InsertNameDialog{ | ||||
|             id: insertname | ||||
|             onNameSelected: { | ||||
|                 appSettings.appendCustomProfile(name, appSettings.composeProfileString()); | ||||
|             } | ||||
|         } | ||||
|         MessageDialog { | ||||
|             id: messageDialog | ||||
|             title: qsTr("File Error") | ||||
|             onAccepted: { | ||||
|                 messageDialog.close(); | ||||
|             } | ||||
|         } | ||||
|         Loader { | ||||
|             property var callBack | ||||
|             property bool selectExisting: false | ||||
|             id: fileDialog | ||||
|  | ||||
|             sourceComponent: FileDialog{ | ||||
|                 nameFilters: ["Json files (*.json)"] | ||||
|                 selectMultiple: false | ||||
|                 selectFolder: false | ||||
|                 selectExisting: fileDialog.selectExisting | ||||
|                 onAccepted: callBack(fileUrl); | ||||
|             } | ||||
|  | ||||
|             onSelectExistingChanged: reload() | ||||
|  | ||||
|             function open() { | ||||
|                 item.open(); | ||||
|             } | ||||
|  | ||||
|             function reload() { | ||||
|                 active = false; | ||||
|                 active = true; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     GroupBox{ | ||||
|         title: qsTr("Screen") | ||||
|         Layout.fillWidth: true | ||||
|         GridLayout{ | ||||
|             anchors.fill: parent | ||||
|             columns: 2 | ||||
|             Label{ text: qsTr("Brightness") } | ||||
|             SimpleSlider{ | ||||
|                 onValueChanged: appSettings.brightness = value | ||||
|                 value: appSettings.brightness | ||||
|             } | ||||
|             Label{ text: qsTr("Contrast") } | ||||
|             SimpleSlider{ | ||||
|                 onValueChanged: appSettings.contrast = value | ||||
|                 value: appSettings.contrast | ||||
|             } | ||||
|             Label{ text: qsTr("Margin") } | ||||
|             SimpleSlider{ | ||||
|                 onValueChanged: appSettings._margin = value | ||||
|                 value: appSettings._margin | ||||
|             } | ||||
|             Label{ text: qsTr("Opacity") } | ||||
|             SimpleSlider{ | ||||
|                 onValueChanged: appSettings.windowOpacity = value | ||||
|                 value: appSettings.windowOpacity | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // DIALOGS //////////////////////////////////////////////////////////////// | ||||
|     InsertNameDialog{ | ||||
|         id: insertname | ||||
|         onNameSelected: { | ||||
|             appSettings.appendCustomProfile(name, appSettings.composeProfileString()); | ||||
|         } | ||||
|     } | ||||
|     MessageDialog { | ||||
|         id: messageDialog | ||||
|         title: qsTr("File Error") | ||||
|         onAccepted: { | ||||
|             messageDialog.close(); | ||||
|         } | ||||
|     } | ||||
|     Loader { | ||||
|         property var callBack | ||||
|         property bool selectExisting: false | ||||
|         id: fileDialog | ||||
|  | ||||
|         sourceComponent: FileDialog{ | ||||
|             nameFilters: ["Json files (*.json)"] | ||||
|             selectMultiple: false | ||||
|             selectFolder: false | ||||
|             selectExisting: fileDialog.selectExisting | ||||
|             onAccepted: callBack(fileUrl); | ||||
|         } | ||||
|  | ||||
|         onSelectExistingChanged: reload() | ||||
|  | ||||
|         function open() { | ||||
|             item.open(); | ||||
|         } | ||||
|  | ||||
|         function reload() { | ||||
|             active = false; | ||||
|             active = true; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -19,154 +19,142 @@ | ||||
| *******************************************************************************/ | ||||
|  | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Controls 1.1 | ||||
| import QtQuick.Controls 2.1 | ||||
| import QtQuick.Layouts 1.1 | ||||
| import QtQml 2.0 | ||||
|  | ||||
| import "Components" | ||||
|  | ||||
| Tab{ | ||||
|     ColumnLayout{ | ||||
|         anchors.fill: parent | ||||
| ColumnLayout{ | ||||
|  | ||||
|         GroupBox{ | ||||
|             title: qsTr("Font") | ||||
|             Layout.fillWidth: true | ||||
|             GridLayout{ | ||||
|                 anchors.fill: parent | ||||
|                 columns: 2 | ||||
|                 Label { text: qsTr("Rasterization") } | ||||
|                 ComboBox { | ||||
|                     id: rasterizationBox | ||||
|     GroupBox{ | ||||
|         title: qsTr("Font") | ||||
|         Layout.fillWidth: true | ||||
|         GridLayout{ | ||||
|             anchors.fill: parent | ||||
|             columns: 2 | ||||
|             Label { text: qsTr("Rasterization") } | ||||
|             ComboBox { | ||||
|                 id: rasterizationBox | ||||
|  | ||||
|                     property string selectedElement: model[currentIndex] | ||||
|                 property string selectedElement: model[currentIndex] | ||||
|  | ||||
|                     Layout.fillWidth: true | ||||
|                     model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")] | ||||
|                     currentIndex: appSettings.rasterization | ||||
|                     onCurrentIndexChanged: { | ||||
|                         appSettings.rasterization = currentIndex | ||||
|                     } | ||||
|                 Layout.fillWidth: true | ||||
|                 model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")] | ||||
|                 currentIndex: appSettings.rasterization | ||||
|                 onCurrentIndexChanged: { | ||||
|                     appSettings.rasterization = currentIndex | ||||
|                 } | ||||
|                 Label{ text: qsTr("Name") } | ||||
|                 ComboBox{ | ||||
|                     id: fontChanger | ||||
|                     Layout.fillWidth: true | ||||
|                     model: appSettings.fontlist | ||||
|                     onActivated: { | ||||
|                         var name = appSettings.fontlist.get(index).name; | ||||
|                         appSettings.fontNames[appSettings.rasterization] = name; | ||||
|                         appSettings.handleFontChanged(); | ||||
|                     } | ||||
|                     function updateIndex(){ | ||||
|                         var name = appSettings.fontNames[appSettings.rasterization]; | ||||
|                         var index = appSettings.getIndexByName(name); | ||||
|                         if (index !== undefined) | ||||
|                             currentIndex = index; | ||||
|                     } | ||||
|                     Connections{ | ||||
|                         target: appSettings | ||||
|                         onTerminalFontChanged: fontChanger.updateIndex(); | ||||
|                     } | ||||
|                     Component.onCompleted: updateIndex(); | ||||
|             } | ||||
|             Label{ text: qsTr("Name") } | ||||
|             ComboBox{ | ||||
|                 id: fontChanger | ||||
|                 Layout.fillWidth: true | ||||
|                 model: appSettings.fontlist | ||||
|                 textRole: "text" | ||||
|                 onActivated: { | ||||
|                     var name = appSettings.fontlist.get(index).name; | ||||
|                     appSettings.fontNames[appSettings.rasterization] = name; | ||||
|                     appSettings.handleFontChanged(); | ||||
|                 } | ||||
|                 Label{ text: qsTr("Scaling") } | ||||
|                 RowLayout{ | ||||
|                     Layout.fillWidth: true | ||||
|                     Slider{ | ||||
|                         Layout.fillWidth: true | ||||
|                         id: fontScalingChanger | ||||
|                         onValueChanged: if(enabled) appSettings.fontScaling = value | ||||
|                         stepSize: 0.05 | ||||
|                         enabled: false // Another trick to fix initial bad behavior. | ||||
|                         Component.onCompleted: { | ||||
|                             minimumValue = appSettings.minimumFontScaling; | ||||
|                             maximumValue = appSettings.maximumFontScaling; | ||||
|                             value = appSettings.fontScaling; | ||||
|                             enabled = true; | ||||
|                         } | ||||
|                         Connections{ | ||||
|                             target: appSettings | ||||
|                             onFontScalingChanged: fontScalingChanger.value = appSettings.fontScaling; | ||||
|                         } | ||||
|                     } | ||||
|                     SizedLabel{ | ||||
|                         text: Math.round(fontScalingChanger.value * 100) + "%" | ||||
|                     } | ||||
|                 function updateIndex(){ | ||||
|                     var name = appSettings.fontNames[appSettings.rasterization]; | ||||
|                     var index = appSettings.getIndexByName(name); | ||||
|                     if (index !== undefined) | ||||
|                         currentIndex = index; | ||||
|                 } | ||||
|                 Label{ text: qsTr("Font Width") } | ||||
|                 RowLayout{ | ||||
|                 Connections{ | ||||
|                     target: appSettings | ||||
|                     onTerminalFontChanged: fontChanger.updateIndex(); | ||||
|                 } | ||||
|                 Component.onCompleted: updateIndex(); | ||||
|             } | ||||
|             Label{ text: qsTr("Scaling") } | ||||
|             RowLayout{ | ||||
|                 Layout.fillWidth: true | ||||
|                 Slider{ | ||||
|                     Layout.fillWidth: true | ||||
|                     Slider{ | ||||
|                         Layout.fillWidth: true | ||||
|                         id: widthChanger | ||||
|                         onValueChanged: appSettings.fontWidth = value; | ||||
|                         value: appSettings.fontWidth | ||||
|                         stepSize: 0.05 | ||||
|                         Component.onCompleted: { | ||||
|                             // This is needed to avoid unnecessary chnaged events. | ||||
|                             minimumValue = 0.5; | ||||
|                             maximumValue = 1.5; | ||||
|                         } | ||||
|                     } | ||||
|                     SizedLabel{ | ||||
|                         text: Math.round(widthChanger.value * 100) + "%" | ||||
|                     } | ||||
|                     id: fontScalingChanger | ||||
|                     onValueChanged: appSettings.fontScaling = value | ||||
|                     value: appSettings.fontScaling | ||||
|                     stepSize: 0.05 | ||||
|                     from: appSettings.minimumFontScaling; | ||||
|                     to: appSettings.maximumFontScaling; | ||||
|                 } | ||||
|                 SizedLabel{ | ||||
|                     text: Math.round(fontScalingChanger.value * 100) + "%" | ||||
|                 } | ||||
|             } | ||||
|             Label{ text: qsTr("Font Width") } | ||||
|             RowLayout{ | ||||
|                 Layout.fillWidth: true | ||||
|                 Slider{ | ||||
|                     Layout.fillWidth: true | ||||
|                     id: widthChanger | ||||
|                     onValueChanged: appSettings.fontWidth = value; | ||||
|                     value: appSettings.fontWidth | ||||
|                     stepSize: 0.05 | ||||
|                     from: 0.5 | ||||
|                     to: 1.5 | ||||
|                 } | ||||
|                 SizedLabel{ | ||||
|                     text: Math.round(widthChanger.value * 100) + "%" | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         GroupBox{ | ||||
|             title: qsTr("Cursor") | ||||
|             Layout.fillWidth: true | ||||
|             ColumnLayout { | ||||
|                 anchors.fill: parent | ||||
|                 CheckBox{ | ||||
|                     id: blinkingCursor | ||||
|                     text: qsTr("Blinking Cursor") | ||||
|                     checked: appSettings.blinkingCursor | ||||
|                     onCheckedChanged: appSettings.blinkingCursor = checked | ||||
|                 } | ||||
|                 Binding{ | ||||
|                     target: blinkingCursor | ||||
|                     property: "checked" | ||||
|                     value: appSettings.blinkingCursor | ||||
|                 } | ||||
|     } | ||||
|     GroupBox{ | ||||
|         title: qsTr("Cursor") | ||||
|         Layout.fillWidth: true | ||||
|         ColumnLayout { | ||||
|             anchors.fill: parent | ||||
|             CheckBox{ | ||||
|                 id: blinkingCursor | ||||
|                 text: qsTr("Blinking Cursor") | ||||
|                 checked: appSettings.blinkingCursor | ||||
|                 onCheckedChanged: appSettings.blinkingCursor = checked | ||||
|             } | ||||
|             Binding{ | ||||
|                 target: blinkingCursor | ||||
|                 property: "checked" | ||||
|                 value: appSettings.blinkingCursor | ||||
|             } | ||||
|         } | ||||
|         GroupBox{ | ||||
|             title: qsTr("Colors") | ||||
|             Layout.fillWidth: true | ||||
|     } | ||||
|     GroupBox{ | ||||
|         title: qsTr("Colors") | ||||
|         Layout.fillWidth: true | ||||
|         ColumnLayout{ | ||||
|             anchors.fill: parent | ||||
|             ColumnLayout{ | ||||
|                 anchors.fill: parent | ||||
|                 ColumnLayout{ | ||||
|                     Layout.fillWidth: true | ||||
|                     CheckableSlider{ | ||||
|                         name: qsTr("Chroma Color") | ||||
|                         onNewValue: appSettings.chromaColor = newValue | ||||
|                         value: appSettings.chromaColor | ||||
|                     } | ||||
|                     CheckableSlider{ | ||||
|                         name: qsTr("Saturation Color") | ||||
|                         onNewValue: appSettings.saturationColor = newValue | ||||
|                         value: appSettings.saturationColor | ||||
|                         enabled: appSettings.chromaColor !== 0 | ||||
|                     } | ||||
|                 Layout.fillWidth: true | ||||
|                 CheckableSlider{ | ||||
|                     name: qsTr("Chroma Color") | ||||
|                     onNewValue: appSettings.chromaColor = newValue | ||||
|                     value: appSettings.chromaColor | ||||
|                 } | ||||
|                 RowLayout{ | ||||
|                 CheckableSlider{ | ||||
|                     name: qsTr("Saturation Color") | ||||
|                     onNewValue: appSettings.saturationColor = newValue | ||||
|                     value: appSettings.saturationColor | ||||
|                     enabled: appSettings.chromaColor !== 0 | ||||
|                 } | ||||
|             } | ||||
|             RowLayout{ | ||||
|                 Layout.fillWidth: true | ||||
|                 ColorButton{ | ||||
|                     name: qsTr("Font") | ||||
|                     height: 50 | ||||
|                     Layout.fillWidth: true | ||||
|                     ColorButton{ | ||||
|                         name: qsTr("Font") | ||||
|                         height: 50 | ||||
|                         Layout.fillWidth: true | ||||
|                         onColorSelected: appSettings._fontColor = color; | ||||
|                         color: appSettings._fontColor | ||||
|                     } | ||||
|                     ColorButton{ | ||||
|                         name: qsTr("Background") | ||||
|                         height: 50 | ||||
|                         Layout.fillWidth: true | ||||
|                         onColorSelected: appSettings._backgroundColor = color; | ||||
|                         color: appSettings._backgroundColor | ||||
|                     } | ||||
|                     onColorSelected: appSettings._fontColor = color; | ||||
|                     color: appSettings._fontColor | ||||
|                 } | ||||
|                 ColorButton{ | ||||
|                     name: qsTr("Background") | ||||
|                     height: 50 | ||||
|                     Layout.fillWidth: true | ||||
|                     onColorSelected: appSettings._backgroundColor = color; | ||||
|                     color: appSettings._backgroundColor | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -19,46 +19,50 @@ | ||||
| *******************************************************************************/ | ||||
|  | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Controls 1.1 | ||||
| import QtQuick.Controls 2.1 | ||||
| import QtQuick.Window 2.1 | ||||
| import QtQuick.Layouts 1.1 | ||||
| import QtQuick.Layouts 1.3 | ||||
| import QtQuick.Dialogs 1.1 | ||||
|  | ||||
| Window { | ||||
|     id: settings_window | ||||
|     title: qsTr("Settings") | ||||
|     width: 580 | ||||
|     height: 400 | ||||
|     width: 800 | ||||
|     height: 600 | ||||
|  | ||||
|     property int tabmargins: 15 | ||||
|  | ||||
|     TabView{ | ||||
|         id: tabView | ||||
|         anchors.fill: parent | ||||
|         anchors.margins: 10 | ||||
|         SettingsGeneralTab { | ||||
|             id: generalTab | ||||
|             title: qsTr("General") | ||||
|             anchors.fill: parent | ||||
|             anchors.margins: tabmargins | ||||
|     TabBar { | ||||
|         id: bar | ||||
|         width: parent.width | ||||
|         TabButton { | ||||
|             text: qsTr("General") | ||||
|         } | ||||
|         SettingsTerminalTab { | ||||
|             id: terminalTab | ||||
|             title: qsTr("Terminal") | ||||
|             anchors.fill: parent | ||||
|             anchors.margins: tabmargins | ||||
|         TabButton { | ||||
|             text: qsTr("Terminal") | ||||
|         } | ||||
|         SettingsEffectsTab { | ||||
|             id: effectsTab | ||||
|             title: qsTr("Effects") | ||||
|             anchors.fill: parent | ||||
|             anchors.margins: tabmargins | ||||
|         TabButton { | ||||
|             text: qsTr("Effects") | ||||
|         } | ||||
|         SettingsAdvancedTab { | ||||
|             id: performanceTab | ||||
|             title: qsTr("Advanced") | ||||
|             anchors.fill: parent | ||||
|             anchors.margins: tabmargins | ||||
|         TabButton { | ||||
|             text: qsTr("Advanced") | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     StackLayout { | ||||
|         anchors { | ||||
|             top: bar.bottom | ||||
|             left: parent.left | ||||
|             right: parent.right | ||||
|             bottom: parent.bottom | ||||
|             margins: tabmargins | ||||
|         } | ||||
|  | ||||
|         currentIndex: bar.currentIndex | ||||
|  | ||||
|         SettingsGeneralTab { } | ||||
|         SettingsTerminalTab { } | ||||
|         SettingsEffectsTab { } | ||||
|         SettingsAdvancedTab { } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -19,7 +19,7 @@ | ||||
| *******************************************************************************/ | ||||
|  | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Controls 1.1 | ||||
| import QtQuick.Controls 2.0 | ||||
| import QtQuick.Layouts 1.1 | ||||
|  | ||||
| import "Components" | ||||
| @@ -27,8 +27,8 @@ import "Components" | ||||
| RowLayout { | ||||
|     property alias value: slider.value | ||||
|     property alias stepSize: slider.stepSize | ||||
|     property alias minimumValue: slider.minimumValue | ||||
|     property alias maximumValue: slider.maximumValue | ||||
|     property alias minimumValue: slider.from | ||||
|     property alias maximumValue: slider.to | ||||
|     property real maxMultiplier: 100 | ||||
|  | ||||
|     id: setting_component | ||||
|   | ||||
| @@ -20,8 +20,9 @@ | ||||
|  | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Window 2.1 | ||||
| import QtQuick.Controls 1.1 | ||||
| import QtGraphicalEffects 1.0 | ||||
| import QtQuick.Controls 2.3 | ||||
|  | ||||
| import "menus" | ||||
|  | ||||
| ApplicationWindow{ | ||||
|     id: terminalWindow | ||||
| @@ -37,8 +38,6 @@ ApplicationWindow{ | ||||
|  | ||||
|     // Load saved window geometry and show the window | ||||
|     Component.onCompleted: {         | ||||
|         appSettings.handleFontChanged(); | ||||
|  | ||||
|         x = appSettings.x | ||||
|         y = appSettings.y | ||||
|         width = appSettings.width | ||||
| @@ -55,11 +54,9 @@ ApplicationWindow{ | ||||
|     property bool fullscreen: appSettings.fullscreen | ||||
|     onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed) | ||||
|  | ||||
|     //Workaround: Without __contentItem a ugly thin border is visible. | ||||
|     menuBar: CRTMainMenuBar{ | ||||
|     menuBar: WindowMenu { | ||||
|         id: mainMenu | ||||
|         visible: (Qt.platform.os === "osx" || appSettings.showMenubar) | ||||
|         __contentItem.visible: mainMenu.visible | ||||
|     } | ||||
|  | ||||
|     property string wintitle: appSettings.wintitle | ||||
| @@ -136,7 +133,6 @@ ApplicationWindow{ | ||||
|     } | ||||
|     TerminalContainer{ | ||||
|         id: terminalContainer | ||||
|         y: appSettings.showMenubar ? 0 : -2 // Workaroud to hide the margin in the menubar. | ||||
|         width: parent.width | ||||
|         height: (parent.height + Math.abs(y)) | ||||
|     } | ||||
|   | ||||
							
								
								
									
										72
									
								
								app/qml/menus/FullContextMenu.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								app/qml/menus/FullContextMenu.qml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| /******************************************************************************* | ||||
| * 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 <http://www.gnu.org/licenses/>. | ||||
| *******************************************************************************/ | ||||
|  | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Controls 2.3 | ||||
|  | ||||
| Menu{ | ||||
|     id: contextmenu | ||||
|     MenuItem { action: copyAction } | ||||
|     MenuItem { action: pasteAction } | ||||
|     MenuItem { action: showsettingsAction } | ||||
|  | ||||
|     MenuSeparator { } | ||||
|  | ||||
|     Menu { | ||||
|         title: qsTr("File") | ||||
|         MenuItem { | ||||
|             action: quitAction | ||||
|         } | ||||
|     } | ||||
|     Menu { | ||||
|         title: qsTr("Edit") | ||||
|         MenuItem {action: copyAction} | ||||
|         MenuItem {action: pasteAction} | ||||
|         MenuSeparator { } | ||||
|         MenuItem {action: showsettingsAction} | ||||
|     } | ||||
|     Menu{ | ||||
|         title: qsTr("View") | ||||
|         MenuItem {action: fullscreenAction; visible: fullscreenAction.enabled} | ||||
|         MenuItem {action: showMenubarAction; visible: showMenubarAction.enabled} | ||||
|         MenuItem {action: zoomIn} | ||||
|         MenuItem {action: zoomOut} | ||||
|     } | ||||
|     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 {action: showAboutAction} | ||||
|     } | ||||
| } | ||||
							
								
								
									
										28
									
								
								app/qml/menus/ShortContextMenu.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								app/qml/menus/ShortContextMenu.qml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| /******************************************************************************* | ||||
| * 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 <http://www.gnu.org/licenses/>. | ||||
| *******************************************************************************/ | ||||
|  | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Controls 2.3 | ||||
|  | ||||
| Menu{ | ||||
|     id: contextmenu | ||||
|     MenuItem { action: copyAction } | ||||
|     MenuItem { action: pasteAction } | ||||
| } | ||||
| @@ -1,35 +1,51 @@ | ||||
| /******************************************************************************* | ||||
| * 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 <http://www.gnu.org/licenses/>. | ||||
| *******************************************************************************/ | ||||
| 
 | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Controls 1.1 | ||||
| import QtQuick.Controls 2.3 | ||||
| 
 | ||||
| MenuBar { | ||||
|     id: defaultMenuBar | ||||
|     property bool visible: true | ||||
|     visible: appSettings.showMenubar | ||||
| 
 | ||||
|     Menu { | ||||
|         title: qsTr("File") | ||||
|         visible: defaultMenuBar.visible | ||||
|         MenuItem {action: quitAction} | ||||
|     } | ||||
|     Menu { | ||||
|         title: qsTr("Edit") | ||||
|         visible: defaultMenuBar.visible && appSettings.showMenubar | ||||
|         MenuItem {action: copyAction} | ||||
|         MenuItem {action: pasteAction} | ||||
|         MenuSeparator{visible: Qt.platform.os !== "osx"} | ||||
|         MenuSeparator { } | ||||
|         MenuItem {action: showsettingsAction} | ||||
|     } | ||||
|     Menu{ | ||||
|         title: qsTr("View") | ||||
|         visible: defaultMenuBar.visible | ||||
|         MenuItem {action: fullscreenAction; visible: fullscreenAction.enabled} | ||||
|         MenuItem {action: showMenubarAction; visible: showMenubarAction.enabled} | ||||
|         MenuSeparator{visible: showMenubarAction.enabled} | ||||
|         MenuItem {action: zoomIn} | ||||
|         MenuItem {action: zoomOut} | ||||
|     } | ||||
|     Menu{ | ||||
|         id: profilesMenu | ||||
|         title: qsTr("Profiles") | ||||
|         visible: defaultMenuBar.visible | ||||
|         Instantiator{ | ||||
|             model: appSettings.profilesList | ||||
|             delegate: MenuItem { | ||||
| @@ -45,7 +61,6 @@ MenuBar { | ||||
|     } | ||||
|     Menu{ | ||||
|         title: qsTr("Help") | ||||
|         visible: defaultMenuBar.visible | ||||
|         MenuItem {action: showAboutAction} | ||||
|     } | ||||
| } | ||||
| @@ -12,7 +12,6 @@ | ||||
|         <file>TimeManager.qml</file> | ||||
|         <file>SimpleSlider.qml</file> | ||||
|         <file>ColorButton.qml</file> | ||||
|         <file>Glossy.qml</file> | ||||
|         <file>AboutDialog.qml</file> | ||||
|         <file>InsertNameDialog.qml</file> | ||||
|         <file>SettingsEffectsTab.qml</file> | ||||
| @@ -22,7 +21,6 @@ | ||||
|         <file>fonts/1977-apple2/PrintChar21.ttf</file> | ||||
|         <file>fonts/1971-ibm-3278/3270Medium.ttf</file> | ||||
|         <file>Storage.qml</file> | ||||
|         <file>CRTMainMenuBar.qml</file> | ||||
|         <file>SettingsAdvancedTab.qml</file> | ||||
|         <file>TerminalContainer.qml</file> | ||||
|         <file>images/crt256.png</file> | ||||
| @@ -44,5 +42,8 @@ | ||||
|         <file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file> | ||||
|         <file>NewTerminalFrame.qml</file> | ||||
|         <file>SlowBurnIn.qml</file> | ||||
|         <file>menus/WindowMenu.qml</file> | ||||
|         <file>menus/FullContextMenu.qml</file> | ||||
|         <file>menus/ShortContextMenu.qml</file> | ||||
|     </qresource> | ||||
| </RCC> | ||||
|   | ||||
 Submodule qmltermwidget updated: 59f967d5e1...5c47d1f494
									
								
							
		Reference in New Issue
	
	Block a user