diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml index 350bc41..66327bf 100644 --- a/app/qml/ApplicationSettings.qml +++ b/app/qml/ApplicationSettings.qml @@ -69,6 +69,8 @@ Item{ property real motion_blur: 0.40 property real bloom_strength: 0.65 + property real bloom_quality: 1.0 + property real chroma_color: 0.0 property real saturation_color: 0.0 @@ -85,6 +87,9 @@ Item{ property int rasterization: no_rasterization + property int scanline_quality: 3 + onScanline_qualityChanged: handleFontChanged(); + ListModel{ id: framelist ListElement{text: "No frame"; source: "./frames/NoFrame.qml"; reflections: false} @@ -116,27 +121,29 @@ Item{ onLoaded: handleFontChanged() } - signal fontScalingChanged - property var fontScalingList: [0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5] - property int fontScalingIndex: 5 + property real fontScaling: 1.0 + onFontScalingChanged: handleFontChanged(); - function setScalingIndex(newScaling){ - fontScalingIndex = newScaling; - fontScalingChanged(); + function incrementScaling(){ + fontScaling = Math.min(fontScaling + 0.05, 2.50); handleFontChanged(); } - function getScalingIndex(){ - return fontScalingIndex; + function decrementScaling(){ + fontScaling = Math.max(fontScaling - 0.05, 0.50); + handleFontChanged(); } + property real fontWidth: 1.0 + onFontWidthChanged: handleFontChanged(); + property var fontIndexes: [0,0,0] property var fontlist: fontManager.item.fontlist function handleFontChanged(){ if(!fontManager.item) return; fontManager.item.selectedFontIndex = fontIndexes[rasterization]; - fontManager.item.scaling = fontScalingList[fontScalingIndex]; + fontManager.item.scaling = fontScaling; var fontSource = fontManager.item.source; var pixelSize = fontManager.item.pixelSize; @@ -164,10 +171,12 @@ Item{ fps: fps, window_scaling: window_scaling, show_terminal_size: show_terminal_size, - fontScalingIndex: fontScalingIndex, + fontScaling: fontScaling, fontIndexes: fontIndexes, frameReflections: _frameReflections, - showMenubar: showMenubar + showMenubar: showMenubar, + scanline_quality: scanline_quality, + bloom_quality: bloom_quality } return JSON.stringify(settings); } @@ -193,7 +202,8 @@ Item{ contrast: contrast, ambient_light: ambient_light, windowOpacity: windowOpacity, - fontIndex: fontIndexes[rasterization] + fontIndex: fontIndexes[rasterization], + fontWidth: fontWidth } return JSON.stringify(settings); } @@ -231,11 +241,14 @@ Item{ window_scaling = settings.window_scaling !== undefined ? settings.window_scaling : window_scaling fontIndexes = settings.fontIndexes !== undefined ? settings.fontIndexes : fontIndexes - fontScalingIndex = settings.fontScalingIndex !== undefined ? settings.fontScalingIndex : fontScalingIndex + fontScaling = settings.fontScaling !== undefined ? settings.fontScaling : fontScaling _frameReflections = settings.frameReflections !== undefined ? settings.frameReflections : _frameReflections; showMenubar = settings.showMenubar !== undefined ? settings.showMenubar : showMenubar; + + scanline_quality = settings.scanline_quality !== undefined ? settings.scanline_quality : scanline_quality; + bloom_quality = settings.bloom_quality !== undefined ? settings.bloom_quality : bloom_quality; } function loadProfileString(profileString){ @@ -269,6 +282,7 @@ Item{ windowOpacity = settings.windowOpacity !== undefined ? settings.windowOpacity : windowOpacity; fontIndexes[rasterization] = settings.fontIndex !== undefined ? settings.fontIndex : fontIndexes[rasterization]; + fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth; } function storeCustomProfiles(){ @@ -320,47 +334,47 @@ Item{ id: profileslist ListElement{ text: "Default Amber" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.65,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#ff8100","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.08,"jitter":0.18,"motion_blur":0.4,"noise_strength":0.1,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.65,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#ff8100","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.08,"jitter":0.18,"motion_blur":0.4,"noise_strength":0.1,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } ListElement{ text: "Default Green" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#0ccc68","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.08,"jitter":0.18,"motion_blur":0.45,"noise_strength":0.1,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#0ccc68","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.08,"jitter":0.18,"motion_blur":0.45,"noise_strength":0.1,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } ListElement{ text: "Default Scanlines" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#00ff5b","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.07,"jitter":0.11,"motion_blur":0.4,"noise_strength":0.05,"rasterization":1,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#00ff5b","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.07,"jitter":0.11,"motion_blur":0.4,"noise_strength":0.05,"rasterization":1,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } ListElement{ text: "Default Pixelated" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#ff8100","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.1,"jitter":0,"motion_blur":0.45,"noise_strength":0.14,"rasterization":2,"screen_distortion":0.05,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#ff8100","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.1,"jitter":0,"motion_blur":0.45,"noise_strength":0.14,"rasterization":2,"screen_distortion":0.05,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } ListElement{ text: "Apple ][" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.5,"brightness":0.5,"brightness_flickering":0.2,"contrast":0.85,"fontIndex":2,"font_color":"#2fff91","frames_index":1,"glowing_line_strength":0.22,"horizontal_sincronization":0.08,"jitter":0.1,"motion_blur":0.65,"noise_strength":0.08,"rasterization":1,"screen_distortion":0.18,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.5,"brightness":0.5,"brightness_flickering":0.2,"contrast":0.85,"fontIndex":2,"font_color":"#2fff91","frames_index":1,"glowing_line_strength":0.22,"horizontal_sincronization":0.08,"jitter":0.1,"motion_blur":0.65,"noise_strength":0.08,"rasterization":1,"screen_distortion":0.18,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } ListElement{ text: "Vintage" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.54,"contrast":0.85,"fontIndex":0,"font_color":"#00ff3e","frames_index":2,"glowing_line_strength":0.3,"horizontal_sincronization":0.2,"jitter":0.4,"motion_blur":0.75,"noise_strength":0.2,"rasterization":1,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.54,"contrast":0.85,"fontIndex":0,"font_color":"#00ff3e","frames_index":2,"glowing_line_strength":0.3,"horizontal_sincronization":0.2,"jitter":0.4,"motion_blur":0.75,"noise_strength":0.2,"rasterization":1,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } ListElement{ text: "IBM Dos" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.07,"contrast":0.85,"fontIndex":7,"font_color":"#ffffff","frames_index":1,"glowing_line_strength":0.13,"horizontal_sincronization":0,"jitter":0.08,"motion_blur":0.3,"noise_strength":0.03,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":1,"saturation_color":0,"rgb_shift":0.5}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.07,"contrast":0.85,"fontIndex":7,"font_color":"#ffffff","frames_index":1,"glowing_line_strength":0.13,"horizontal_sincronization":0,"jitter":0.08,"motion_blur":0.3,"noise_strength":0.03,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":1,"saturation_color":0,"rgb_shift":0.5,"fontWidth":1.0}' builtin: true } ListElement{ text: "IBM 3278" - obj_string: '{"ambient_light":0.1,"background_color":"#000000","bloom_strength":0.15,"brightness":0.5,"brightness_flickering":0,"contrast":0.95,"fontIndex":8,"font_color":"#0ccc68","frames_index":1,"glowing_line_strength":0,"horizontal_sincronization":0,"jitter":0,"motion_blur":0.6,"noise_strength":0,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.1,"background_color":"#000000","bloom_strength":0.15,"brightness":0.5,"brightness_flickering":0,"contrast":0.95,"fontIndex":8,"font_color":"#0ccc68","frames_index":1,"glowing_line_strength":0,"horizontal_sincronization":0,"jitter":0,"motion_blur":0.6,"noise_strength":0,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } ListElement{ text: "Transparent Green" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4549689440993788,"brightness":0.5,"brightness_flickering":0.20341614906832298,"contrast":0.85,"fontIndex":0,"font_color":"#0ccc68","frames_index":0,"glowing_line_strength":0.15993788819875776,"horizontal_sincronization":0.05045871559633028,"jitter":0.20341614906832298,"motion_blur":0.24999999999999997,"noise_strength":0.20031055900621117,"rasterization":0,"screen_distortion":0.05045871559633028,"windowOpacity":0.5956221198156681,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4549689440993788,"brightness":0.5,"brightness_flickering":0.20341614906832298,"contrast":0.85,"fontIndex":0,"font_color":"#0ccc68","frames_index":0,"glowing_line_strength":0.15993788819875776,"horizontal_sincronization":0.05045871559633028,"jitter":0.20341614906832298,"motion_blur":0.24999999999999997,"noise_strength":0.20031055900621117,"rasterization":0,"screen_distortion":0.05045871559633028,"windowOpacity":0.5956221198156681,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } } diff --git a/app/qml/FontPixels.qml b/app/qml/FontPixels.qml index 4c0afbd..9f5143f 100644 --- a/app/qml/FontPixels.qml +++ b/app/qml/FontPixels.qml @@ -32,13 +32,6 @@ Item{ ListModel{ id: fontlist - ListElement{ - text: "Commodore PET 2Y (1977)" - source: "fonts/1977-commodore-pet/COMMODORE_PET_2y.ttf" - lineSpacing: 2 - pixelSize: 16 - baseScaling: 3.0 - } ListElement{ text: "Commodore PET (1977)" source: "fonts/1977-commodore-pet/COMMODORE_PET.ttf" diff --git a/app/qml/FontScanlines.qml b/app/qml/FontScanlines.qml index 4c0afbd..9f5143f 100644 --- a/app/qml/FontScanlines.qml +++ b/app/qml/FontScanlines.qml @@ -32,13 +32,6 @@ Item{ ListModel{ id: fontlist - ListElement{ - text: "Commodore PET 2Y (1977)" - source: "fonts/1977-commodore-pet/COMMODORE_PET_2y.ttf" - lineSpacing: 2 - pixelSize: 16 - baseScaling: 3.0 - } ListElement{ text: "Commodore PET (1977)" source: "fonts/1977-commodore-pet/COMMODORE_PET.ttf" diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index 5d6118a..0c0d033 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -77,6 +77,23 @@ Item{ kterminal.copyClipboard(); } + //When settings are updated sources need to be redrawn. + Connections{ + target: shadersettings + onFontScalingChanged: terminalContainer.updateSources(); + onFontWidthChanged: terminalContainer.updateSources(); + } + Connections{ + target: terminalContainer + onWidthChanged: terminalContainer.updateSources(); + onHeightChanged: terminalContainer.updateSources(); + } + function updateSources() { + kterminal.update(); + kterminal.updateImage(); + } + + KTerminal { id: kterminal width: parent.width @@ -84,6 +101,8 @@ Item{ colorScheme: "cool-retro-term" + smooth: false + session: KSession { id: ksession kbScheme: "xterm" @@ -93,9 +112,6 @@ Item{ } } - onWidthChanged: update(); - onHeightChanged: update(); - FontLoader{ id: fontLoader } Text{id: fontMetrics; text: "B"; visible: false} @@ -104,9 +120,17 @@ Item{ font.pixelSize = pixelSize; font.family = fontLoader.name; - width = Qt.binding(function() {return Math.floor(terminalContainer.width / screenScaling);}); + var fontWidth = 1.0 / shadersettings.fontWidth; + + width = Qt.binding(function() {return Math.floor(fontWidth * terminalContainer.width / screenScaling);}); height = Qt.binding(function() {return Math.floor(terminalContainer.height / screenScaling);}); + var scaleTexture = Math.max(Math.round(screenScaling / shadersettings.scanline_quality), 1.0); + + kterminalSource.textureSize = Qt.binding(function () { + return Qt.size(kterminal.width * scaleTexture, kterminal.height * scaleTexture); + }); + setLineSpacing(lineSpacing); update(); restartBlurredSource(); @@ -174,7 +198,6 @@ Item{ id: kterminalSource sourceItem: kterminal hideSource: true - smooth: mScanlines == shadersettings.no_rasterization wrapMode: ShaderEffectSource.ClampToEdge live: false @@ -190,6 +213,7 @@ Item{ } Loader{ id: blurredSourceLoader + asynchronous: true active: mBlur !== 0 sourceComponent: ShaderEffectSource{ @@ -200,8 +224,6 @@ Item{ hideSource: true wrapMode: kterminalSource.wrapMode - smooth: mScanlines == shadersettings.no_rasterization - function restartBlurSource(){ livetimer.restart(); } @@ -228,13 +250,19 @@ Item{ livetimer.restart(); } } + Connections{ + target: shadersettings + onScanline_qualityChanged: restartBlurredSource(); + } } } Loader{ id: blurredTerminalLoader - anchors.fill: kterminal + width: kterminalSource.textureSize.width + height: kterminalSource.textureSize.height active: mBlur !== 0 + asynchronous: true sourceComponent: ShaderEffect { property variant txt_source: kterminalSource @@ -277,23 +305,32 @@ Item{ // BLOOM //////////////////////////////////////////////////////////////// Loader{ + property real scaling: shadersettings.bloom_quality id: bloomEffectLoader active: mBloom != 0 - anchors.fill: parent + asynchronous: true + width: parent.width * scaling + height: parent.height * scaling sourceComponent: FastBlur{ - radius: 48 + radius: 48 * scaling source: kterminal transparentBorder: true - smooth: false } } Loader{ id: bloomSourceLoader active: mBloom != 0 + asynchronous: true sourceComponent: ShaderEffectSource{ + id: _bloomEffectSource sourceItem: bloomEffectLoader.item hideSource: true - smooth: false + live: false + smooth: true + Connections{ + target: kterminalSource + onSourceUpdate: _bloomEffectSource.scheduleUpdate(); + } } } diff --git a/app/qml/SettingsGeneralTab.qml b/app/qml/SettingsGeneralTab.qml index c4ea35a..8c6cb47 100644 --- a/app/qml/SettingsGeneralTab.qml +++ b/app/qml/SettingsGeneralTab.qml @@ -92,49 +92,17 @@ Tab{ } } GroupBox{ - title: qsTr("Performace") + title: qsTr("Frame") Layout.fillWidth: true - Layout.columnSpan: 2 - anchors.left: parent.left - anchors.right: parent.right - GridLayout{ + RowLayout{ anchors.fill: parent - rows: 3 - columns: 3 - CheckBox{ - Layout.columnSpan: 3 - checked: !shadersettings._frameReflections - text: qsTr("Disable reflections") - onCheckedChanged: shadersettings._frameReflections = !checked - enabled: shadersettings.reflectionsAllowed - } - CheckBox{ - property int fps: checked ? slider.value : 0 - onFpsChanged: shadersettings.fps = fps - checked: shadersettings.fps !== 0 - text: qsTr("Limit FPS") - } - Slider{ - id: slider + ComboBox{ + id: framescombobox Layout.fillWidth: true - stepSize: 1 - maximumValue: 60 - minimumValue: 1 - enabled: shadersettings.fps !== 0 - value: shadersettings.fps !== 0 ? shadersettings.fps : 60 + model: shadersettings.frames_list + currentIndex: shadersettings.frames_index + onCurrentIndexChanged: shadersettings.frames_index = currentIndex } - Text{text: slider.value} - Text{text: qsTr("Texture quality")} - Slider{ - Layout.fillWidth: true - id: txtslider - onValueChanged: shadersettings.window_scaling = value; - value: shadersettings.window_scaling - tickmarksEnabled: true - stepSize: 0.25 - Component.onCompleted: minimumValue = 0.5 //Without this value gets set to 0.5 - } - Text{text: Math.round(txtslider.value * 100) + "%"} } } } diff --git a/app/qml/SettingsPerformanceTab.qml b/app/qml/SettingsPerformanceTab.qml new file mode 100644 index 0000000..a0963b8 --- /dev/null +++ b/app/qml/SettingsPerformanceTab.qml @@ -0,0 +1,160 @@ +/******************************************************************************* +* Copyright (c) 2013 "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.2 +import QtQuick.Controls 1.1 +import QtQuick.Layouts 1.1 + +Tab{ + ColumnLayout{ + anchors.fill: parent + GroupBox{ + title: qsTr("General") + Layout.fillWidth: true + anchors.left: parent.left + anchors.right: parent.right + GridLayout{ + anchors.fill: parent + rows: 2 + columns: 3 + CheckBox{ + property int fps: checked ? slider.value : 0 + onFpsChanged: shadersettings.fps = fps + checked: shadersettings.fps !== 0 + text: qsTr("Limit FPS") + } + Slider{ + id: slider + Layout.fillWidth: true + stepSize: 1 + maximumValue: 60 + minimumValue: 1 + enabled: shadersettings.fps !== 0 + value: shadersettings.fps !== 0 ? shadersettings.fps : 60 + } + Text{text: slider.value} + Text{text: qsTr("Texture Quality")} + Slider{ + Layout.fillWidth: true + id: txtslider + onValueChanged: shadersettings.window_scaling = value; + value: shadersettings.window_scaling + tickmarksEnabled: true + stepSize: 0.25 + Component.onCompleted: minimumValue = 0.5 //Without this value gets set to 0.5 + } + Text{text: Math.round(txtslider.value * 100) + "%"} + } + } + GroupBox{ + title: qsTr("Rasterization") + Layout.fillWidth: true + anchors.left: parent.left + anchors.right: parent.right + GridLayout{ + id: scanlineQualityContainer + anchors.fill: parent + columns: 3 + property alias valsIndex: scanlineQualitySlider.value + property var vals: [4,3,2] + property var valsStrings: [ + qsTr("Low"), + qsTr("Medium"), + qsTr("High") + ] + + onValsIndexChanged: shadersettings.scanline_quality = vals[valsIndex]; + + Text{text: qsTr("Scanlines Quality")} + Slider{ + id: scanlineQualitySlider + Layout.fillWidth: true + onValueChanged: parent.valsIndex = value; + stepSize: 1 + Component.onCompleted: { + minimumValue = 0; + maximumValue = 2; + value = parent.vals.indexOf(shadersettings.scanline_quality); + } + Connections{ + target: shadersettings + onScanline_qualityChanged: + scanlineQualityContainer.valsIndex = scanlineQualityContainer.vals.indexOf(shadersettings.scanline_quality); + } + } + Text{ + text: parent.valsStrings[parent.valsIndex]; + } + } + } + GroupBox{ + title: qsTr("Bloom") + Layout.fillWidth: true + anchors.left: parent.left + anchors.right: parent.right + GridLayout{ + id: bloomQualityContainer + anchors.fill: parent + columns: 3 + property alias valsIndex: bloomQualitySlider.value + property var vals: [0.25, 0.50, 1.00] + property var valsStrings: [ + qsTr("Low"), + qsTr("Medium"), + qsTr("High") + ] + + onValsIndexChanged: shadersettings.bloom_quality = vals[valsIndex]; + + Text{text: qsTr("Bloom Quality")} + Slider{ + id: bloomQualitySlider + Layout.fillWidth: true + onValueChanged: parent.valsIndex = value; + stepSize: 1 + Component.onCompleted: { + minimumValue = 0; + maximumValue = 2; + value = parent.vals.indexOf(shadersettings.bloom_quality); + } + Connections{ + target: shadersettings + onBloom_qualityChanged: + bloomQualityContainer.valsIndex = bloomQualityContainer.vals.indexOf(shadersettings.bloom_quality); + } + } + Text{ + text: parent.valsStrings[parent.valsIndex]; + } + } + } + GroupBox{ + title: qsTr("Frame") + Layout.fillWidth: true + anchors.left: parent.left + anchors.right: parent.right + CheckBox{ + checked: shadersettings._frameReflections + text: qsTr("Frame Reflections") + onCheckedChanged: shadersettings._frameReflections = checked + } + } + } +} diff --git a/app/qml/SettingsTerminalTab.qml b/app/qml/SettingsTerminalTab.qml index 22c6084..02799dc 100644 --- a/app/qml/SettingsTerminalTab.qml +++ b/app/qml/SettingsTerminalTab.qml @@ -35,11 +35,8 @@ Tab{ model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")] currentIndex: shadersettings.rasterization onCurrentIndexChanged: { - scalingChanger.enabled = false; shadersettings.rasterization = currentIndex fontChanger.updateIndex(); - scalingChanger.updateIndex(); - scalingChanger.enabled = true; } } } @@ -67,24 +64,39 @@ Tab{ RowLayout{ Layout.fillWidth: true Slider{ - id: scalingChanger Layout.fillWidth: true - minimumValue: 0 - maximumValue: shadersettings.fontScalingList.length - 1 - stepSize: 1 - tickmarksEnabled: true - value: updateIndex() - onValueChanged: { - if(!enabled) return; //Ugly and hacky solution. Look for a better solution. - shadersettings.setScalingIndex(value); + id: fontScalingChanger + onValueChanged: if(enabled) shadersettings.fontScaling = value + stepSize: 0.05 + enabled: false // Another trick to fix initial bad behavior. + Component.onCompleted: { + minimumValue = 0.5; + maximumValue = 2.5; + value = shadersettings.fontScaling; + enabled = true; } - function updateIndex(){ - value = shadersettings.getScalingIndex(); + Connections{ + target: shadersettings + onFontScalingChanged: fontScalingChanger.value = shadersettings.fontScaling; } - Component.onCompleted: shadersettings.fontScalingChanged.connect(updateIndex); } Text{ - text: shadersettings.fontScalingList[scalingChanger.value].toFixed(2) + text: Math.round(fontScalingChanger.value * 100) + "%" + } + } + Text{ text: qsTr("Font Width") } + RowLayout{ + Layout.fillWidth: true + Slider{ + Layout.fillWidth: true + id: widthChanger + onValueChanged: shadersettings.fontWidth = value; + value: shadersettings.fontWidth + stepSize: 0.05 + Component.onCompleted: minimumValue = 0.5 //Without this value gets set to 0.5 + } + Text{ + text: Math.round(widthChanger.value * 100) + "%" } } } @@ -127,19 +139,5 @@ Tab{ } } } - GroupBox{ - title: qsTr("Frame") - Layout.fillWidth: true - RowLayout{ - anchors.fill: parent - ComboBox{ - id: framescombobox - Layout.fillWidth: true - model: shadersettings.frames_list - currentIndex: shadersettings.frames_index - onCurrentIndexChanged: shadersettings.frames_index = currentIndex - } - } - } } } diff --git a/app/qml/SettingsWindow.qml b/app/qml/SettingsWindow.qml index e7ab486..7726402 100644 --- a/app/qml/SettingsWindow.qml +++ b/app/qml/SettingsWindow.qml @@ -28,27 +28,37 @@ Window { id: settings_window title: qsTr("Settings") width: 640 - height: 450 + height: 440 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 } SettingsTerminalTab{ + id: terminalTab title: qsTr("Terminal") anchors.fill: parent anchors.margins: tabmargins } SettingsEffectsTab{ + id: effectsTab title: qsTr("Effects") anchors.fill: parent anchors.margins: tabmargins } + SettingsPerformanceTab{ + id: performanceTab + title: qsTr("Performance") + anchors.fill: parent + anchors.margins: tabmargins + } } } diff --git a/app/qml/main.qml b/app/qml/main.qml index 96bf53e..8b0089b 100644 --- a/app/qml/main.qml +++ b/app/qml/main.qml @@ -85,20 +85,13 @@ ApplicationWindow{ id: zoomIn text: qsTr("Zoom In") shortcut: "Ctrl++" - onTriggered: { - var oldScaling = shadersettings.fontScalingIndex; - var maxScalingIndex = shadersettings.fontScalingList.length - 1; - shadersettings.setScalingIndex(Math.min(oldScaling + 1, maxScalingIndex)); - } + onTriggered: shadersettings.incrementScaling(); } Action{ id: zoomOut text: qsTr("Zoom Out") shortcut: "Ctrl+-" - onTriggered: { - var oldScaling = shadersettings.fontScalingIndex; - shadersettings.setScalingIndex(Math.max(oldScaling - 1, 0)); - } + onTriggered: shadersettings.decrementScaling(); } Action{ id: showAboutAction diff --git a/app/qml/resources.qrc b/app/qml/resources.qrc index a9df1ff..dfc44ca 100644 --- a/app/qml/resources.qrc +++ b/app/qml/resources.qrc @@ -64,5 +64,6 @@ fonts/1985-ibm-pc-vga/dos437.txt Storage.qml CRTMainMenuBar.qml + SettingsPerformanceTab.qml