diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml
index b7a3b67..1b4fd8b 100644
--- a/app/qml/ApplicationSettings.qml
+++ b/app/qml/ApplicationSettings.qml
@@ -19,13 +19,19 @@
*******************************************************************************/
import QtQuick 2.2
+import QtQuick.Controls 1.0
import "utils.js" as Utils
QtObject{
property string version: "1.0.0 RC1"
- // GENERAL SETTINGS ///////////////////////////////////////////////////
+ // STATIC CONSTANTS ////////////////////////////////////////////////////////
+
+ readonly property real minimumFontScaling: 0.25
+ readonly property real maximumFontScaling: 2.50
+
+ // GENERAL SETTINGS ///////////////////////////////////////////////////////
property bool fullscreen: false
property bool showMenubar: true
@@ -113,12 +119,12 @@ QtObject{
}
function incrementScaling(){
- fontScaling = Math.min(fontScaling + 0.05, 2.50);
+ fontScaling = Math.min(fontScaling + 0.05, maximumFontScaling);
handleFontChanged();
}
function decrementScaling(){
- fontScaling = Math.max(fontScaling - 0.05, 0.50);
+ fontScaling = Math.max(fontScaling - 0.05, minimumFontScaling);
handleFontChanged();
}
@@ -455,4 +461,11 @@ QtObject{
storeCustomProfiles();
//storage.dropSettings(); //DROPS THE SETTINGS!.. REMEMBER TO DISABLE ONCE ENABLED!!
}
+
+ // VARS ///////////////////////////////////////////////////////////////////
+
+ property Label _sampleLabel: Label {
+ text: "100%"
+ }
+ property real labelWidth: _sampleLabel.width
}
diff --git a/app/qml/CheckableSlider.qml b/app/qml/CheckableSlider.qml
index ceb9c4f..086eeb7 100644
--- a/app/qml/CheckableSlider.qml
+++ b/app/qml/CheckableSlider.qml
@@ -22,6 +22,8 @@ import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
+import "Components"
+
RowLayout {
property alias name: check.text
@@ -35,7 +37,6 @@ RowLayout {
id: setting_component
anchors.left: parent.left
anchors.right: parent.right
- spacing: 25
onValueChanged: {
check.checked = !(value == 0);
@@ -45,7 +46,7 @@ RowLayout {
CheckBox{
id: check
- implicitWidth: 150
+ implicitWidth: 160
onClicked: {
if(!checked){
checked = false;
@@ -66,16 +67,8 @@ RowLayout {
newValue(value);
}
}
- Text{
- id: textfield
- property string unformattedText: Math.round(((value - min_value) / (max_value - min_value)) * 100)
- text: formatNumber(unformattedText)
- }
- function formatNumber(num) {
- var n = "" + num;
- while (n.length < 3) {
- n = " " + n;
- }
- return n + "%";
+ SizedLabel {
+ anchors { top: parent.top; bottom: parent.bottom }
+ text: Math.round(((value - min_value) / (max_value - min_value)) * 100) + "%"
}
}
diff --git a/app/qml/Components/SizedLabel.qml b/app/qml/Components/SizedLabel.qml
new file mode 100644
index 0000000..a3dbfea
--- /dev/null
+++ b/app/qml/Components/SizedLabel.qml
@@ -0,0 +1,35 @@
+/*******************************************************************************
+* 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.0
+import QtQuick.Controls 1.0
+
+// This component is simply a label with a predifined size.
+// Used to improve alignment.
+
+Item {
+ property alias text: textfield.text
+ width: appSettings.labelWidth
+ Label{
+ id: textfield
+ anchors { right: parent.right; verticalCenter: parent.verticalCenter }
+ }
+}
diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml
index b5fcdbe..1e6d2a0 100644
--- a/app/qml/PreprocessedTerminal.qml
+++ b/app/qml/PreprocessedTerminal.qml
@@ -44,11 +44,13 @@ Item{
anchors.topMargin: frame.displacementTop * appSettings.windowScaling
anchors.bottomMargin: frame.displacementBottom * appSettings.windowScaling
- //The blur effect has to take into account the framerate
- property real mBlur: Math.sqrt(appSettings.burnIn)
- property real motionBlurCoefficient: Utils.lint(_minBlurCoefficient, _maxBlurCoefficient, mBlur)
- property real _minBlurCoefficient: 0.2
- property real _maxBlurCoefficient: 0.02
+ //Parameters for the burnIn effect.
+ property real burnIn: appSettings.burnIn
+ property real fps: appSettings.fps !== 0 ? appSettings.fps : 60
+ property real burnInFadeTime: Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn)
+ property real motionBlurCoefficient: 1.0 / (fps * burnInFadeTime)
+ property real _minBurnInFadeTime: 0.16
+ property real _maxBurnInFadeTime: 1.6
property size terminalSize: kterminal.terminalSize
property size fontMetrics: kterminal.fontMetrics
@@ -176,7 +178,7 @@ Item{
MouseArea{
acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
anchors.fill: parent
- cursorShape: Qt.IBeamCursor
+ cursorShape: kterminal.terminalUsesMouse ? Qt.ArrowCursor : Qt.IBeamCursor
onWheel:{
if(wheel.modifiers & Qt.ControlModifier){
wheel.angleDelta.y > 0 ? zoomIn.trigger() : zoomOut.trigger();
@@ -228,13 +230,15 @@ Item{
Loader{
id: blurredSourceLoader
asynchronous: true
- active: mBlur !== 0
+ active: burnIn !== 0
sourceComponent: ShaderEffectSource{
+ property bool updateBurnIn: false
+
id: _blurredSourceEffect
sourceItem: blurredTerminalLoader.item
recursive: true
- live: true
+ live: false
hideSource: true
wrapMode: kterminalSource.wrapMode
@@ -244,6 +248,13 @@ Item{
livetimer.restart();
}
+ // This updates the burnin synched with the timer.
+ Connections {
+ target: updateBurnIn ? mainShader : null
+ ignoreUnknownSignals: false
+ onTimeChanged: _blurredSourceEffect.scheduleUpdate();
+ }
+
Timer{
id: livetimer
@@ -251,14 +262,15 @@ Item{
// We multiply 1.1 to have a little bit of margin over the theoretical value.
// This solution is not extremely clean, but it's probably the best to avoid measuring fps.
- interval: (1 / motionBlurCoefficient) * 60 * 1.1
+ interval: burnInFadeTime * 1000 * 1.1
running: true
- onTriggered: _blurredSourceEffect.live = false;
+ onTriggered: _blurredSourceEffect.updateBurnIn = false;
}
Connections{
target: kterminal
onImagePainted:{
- _blurredSourceEffect.live = true;
+ _blurredSourceEffect.scheduleUpdate();
+ _blurredSourceEffect.updateBurnIn = true;
livetimer.restart();
}
}
@@ -289,7 +301,7 @@ Item{
? kterminal.height * Math.max(1, burnInScaling)
: kterminal.height * scaleTexture * appSettings.burnInQuality
- active: mBlur !== 0
+ active: burnIn !== 0
asynchronous: true
sourceComponent: ShaderEffect {
diff --git a/app/qml/SettingsPerformanceTab.qml b/app/qml/SettingsPerformanceTab.qml
index 7d938a8..bf821c0 100644
--- a/app/qml/SettingsPerformanceTab.qml
+++ b/app/qml/SettingsPerformanceTab.qml
@@ -22,6 +22,8 @@ import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
+import "Components"
+
Tab{
ColumnLayout{
anchors.fill: parent
@@ -47,10 +49,10 @@ Tab{
maximumValue: 60
minimumValue: 1
enabled: appSettings.fps !== 0
- value: appSettings.fps !== 0 ? appSettings.fps : 60
+ value: appSettings.fps !== 0 ? appSettings.fps : 24
}
- Text{text: slider.value}
- Text{text: qsTr("Texture Quality")}
+ SizedLabel { text: slider.value }
+ Label{text: qsTr("Texture Quality")}
Slider{
Layout.fillWidth: true
id: txtslider
@@ -63,7 +65,7 @@ Tab{
enabled = true;
}
}
- Text{text: Math.round(txtslider.value * 100) + "%"}
+ SizedLabel{text: Math.round(txtslider.value * 100) + "%"}
}
}
GroupBox{
@@ -74,8 +76,7 @@ Tab{
GridLayout{
id: bloomQualityContainer
anchors.fill: parent
-
- Text{text: qsTr("Bloom Quality")}
+ Label{text: qsTr("Bloom Quality")}
Slider{
Layout.fillWidth: true
id: bloomSlider
@@ -88,7 +89,7 @@ Tab{
enabled = true;
}
}
- Text{text: Math.round(bloomSlider.value * 100) + "%"}
+ SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"}
}
}
GroupBox{
@@ -100,7 +101,7 @@ Tab{
id: blurQualityContainer
anchors.fill: parent
- Text{text: qsTr("BurnIn Quality")}
+ Label{text: qsTr("BurnIn Quality")}
Slider{
Layout.fillWidth: true
id: burnInSlider
@@ -113,7 +114,7 @@ Tab{
enabled = true;
}
}
- Text{text: Math.round(burnInSlider.value * 100) + "%"}
+ SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"}
}
}
GroupBox{
diff --git a/app/qml/SettingsScreenTab.qml b/app/qml/SettingsScreenTab.qml
index 7374624..5777e65 100644
--- a/app/qml/SettingsScreenTab.qml
+++ b/app/qml/SettingsScreenTab.qml
@@ -46,17 +46,17 @@ Tab{
GridLayout{
anchors.fill: parent
columns: 2
- Text{ text: qsTr("Brightness") }
+ Label{ text: qsTr("Brightness") }
SimpleSlider{
onValueChanged: appSettings.brightness = value
value: appSettings.brightness
}
- Text{ text: qsTr("Contrast") }
+ Label{ text: qsTr("Contrast") }
SimpleSlider{
onValueChanged: appSettings.contrast = value
value: appSettings.contrast
}
- Text{ text: qsTr("Opacity") }
+ Label{ text: qsTr("Opacity") }
SimpleSlider{
onValueChanged: appSettings.windowOpacity = value
value: appSettings.windowOpacity
diff --git a/app/qml/SettingsTerminalTab.qml b/app/qml/SettingsTerminalTab.qml
index 439ee8e..32f458f 100644
--- a/app/qml/SettingsTerminalTab.qml
+++ b/app/qml/SettingsTerminalTab.qml
@@ -22,6 +22,8 @@ import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
+import "Components"
+
Tab{
ColumnLayout{
anchors.fill: parent
@@ -32,7 +34,7 @@ Tab{
GridLayout{
anchors.fill: parent
columns: 2
- Text{ text: qsTr("Name") }
+ Label{ text: qsTr("Name") }
ComboBox{
id: fontChanger
Layout.fillWidth: true
@@ -54,7 +56,7 @@ Tab{
}
Component.onCompleted: updateIndex();
}
- Text{ text: qsTr("Scaling") }
+ Label{ text: qsTr("Scaling") }
RowLayout{
Layout.fillWidth: true
Slider{
@@ -64,8 +66,8 @@ Tab{
stepSize: 0.05
enabled: false // Another trick to fix initial bad behavior.
Component.onCompleted: {
- minimumValue = 0.5;
- maximumValue = 2.5;
+ minimumValue = appSettings.minimumFontScaling;
+ maximumValue = appSettings.maximumFontScaling;
value = appSettings.fontScaling;
enabled = true;
}
@@ -74,11 +76,11 @@ Tab{
onFontScalingChanged: fontScalingChanger.value = appSettings.fontScaling;
}
}
- Text{
+ SizedLabel{
text: Math.round(fontScalingChanger.value * 100) + "%"
}
}
- Text{ text: qsTr("Font Width") }
+ Label{ text: qsTr("Font Width") }
RowLayout{
Layout.fillWidth: true
Slider{
@@ -93,7 +95,7 @@ Tab{
maximumValue = 1.5;
}
}
- Text{
+ SizedLabel{
text: Math.round(widthChanger.value * 100) + "%"
}
}
diff --git a/app/qml/ShaderTerminal.qml b/app/qml/ShaderTerminal.qml
index e9b91c3..f3478e2 100644
--- a/app/qml/ShaderTerminal.qml
+++ b/app/qml/ShaderTerminal.qml
@@ -21,13 +21,13 @@
import QtQuick 2.2
import QtGraphicalEffects 1.0
+import "utils.js" as Utils
+
ShaderEffect {
property ShaderEffectSource source
property ShaderEffectSource blurredSource
property ShaderEffectSource bloomSource
- property real liveBlur: blurredSource && blurredSource.live ? 1.0 : 0.0
-
property color fontColor: appSettings.fontColor
property color backgroundColor: appSettings.backgroundColor
property real bloom: appSettings.bloom * 2.5
@@ -58,6 +58,12 @@ ShaderEffect {
property real screen_brightness: appSettings.brightness * 1.5 + 0.5
+ // This is the average value of the abs(sin) function. Needed to avoid aliasing.
+ readonly property real absSinAvg: 0.63661828335466886
+ property size rasterizationSmooth: Qt.size(
+ Utils.clamp(2.0 * virtual_resolution.width / width, 0.0, 1.0),
+ Utils.clamp(2.0 * virtual_resolution.height / height, 0.0, 1.0))
+
property real dispX
property real dispY
property size virtual_resolution
@@ -155,6 +161,7 @@ ShaderEffect {
uniform lowp float screen_brightness;
uniform highp vec2 virtual_resolution;
+ uniform highp vec2 rasterizationSmooth;
uniform highp float dispX;
uniform highp float dispY;" +
@@ -162,8 +169,7 @@ ShaderEffect {
uniform highp sampler2D bloomSource;
uniform lowp float bloom;" : "") +
(burnIn !== 0 ? "
- uniform sampler2D blurredSource;
- uniform lowp float liveBlur;" : "") +
+ uniform sampler2D blurredSource;" : "") +
(staticNoise !== 0 ? "
uniform highp float staticNoise;" : "") +
(((staticNoise !== 0 || jitter !== 0 || rbgShift)
@@ -201,9 +207,11 @@ ShaderEffect {
highp float result = 1.0;" +
(appSettings.rasterization != appSettings.no_rasterization ?
- "result *= abs(sin(coords.y * virtual_resolution.y * "+Math.PI+"));" : "") +
+ "float val = abs(sin(coords.y * virtual_resolution.y * "+Math.PI+"));
+ result *= mix(val, " + absSinAvg + ", rasterizationSmooth.y);" : "") +
(appSettings.rasterization == appSettings.pixel_rasterization ?
- "result *= abs(sin(coords.x * virtual_resolution.x * "+Math.PI+"));" : "") + "
+ "val = abs(sin(coords.x * virtual_resolution.x * "+Math.PI+"));
+ result *= mix(val, " + absSinAvg + ", rasterizationSmooth.x);" : "") + "
return result;
}
@@ -269,7 +277,7 @@ ShaderEffect {
"vec3 txt_color = texture2D(source, txt_coords).rgb;" +
(burnIn !== 0 ? "
- vec4 txt_blur = liveBlur * texture2D(blurredSource, txt_coords);
+ vec4 txt_blur = texture2D(blurredSource, txt_coords);
txt_color = txt_color + txt_blur.rgb * txt_blur.a;"
: "") +
diff --git a/app/qml/SimpleSlider.qml b/app/qml/SimpleSlider.qml
index 7b741aa..44d3608 100644
--- a/app/qml/SimpleSlider.qml
+++ b/app/qml/SimpleSlider.qml
@@ -22,6 +22,8 @@ import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
+import "Components"
+
RowLayout {
property alias value: slider.value
property alias stepSize: slider.stepSize
@@ -36,15 +38,7 @@ RowLayout {
stepSize: parent.stepSize
Layout.fillWidth: true
}
- Text{
- id: textfield
- text: formatNumber(Math.round(value * maxMultiplier))
- }
- function formatNumber(num) {
- var n = "" + num;
- while (n.length < 3) {
- n = " " + n;
- }
- return n + "%";
+ SizedLabel{
+ text: Math.round(value * maxMultiplier) + "%"
}
}
diff --git a/app/qml/resources.qrc b/app/qml/resources.qrc
index 34d4312..6e3554a 100644
--- a/app/qml/resources.qrc
+++ b/app/qml/resources.qrc
@@ -52,5 +52,6 @@
SettingsScreenTab.qml
fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf
../icons/32x32/cool-retro-term.png
+ Components/SizedLabel.qml
diff --git a/app/qml/utils.js b/app/qml/utils.js
index b7daf2d..ba8ae04 100644
--- a/app/qml/utils.js
+++ b/app/qml/utils.js
@@ -1,5 +1,11 @@
.pragma library
-
+function clamp(x, min, max) {
+ if (x <= min)
+ return min;
+ if (x >= max)
+ return max;
+ return x;
+}
function lint(a, b, t) {
return (1 - t) * a + (t) * b;
}
diff --git a/qmltermwidget b/qmltermwidget
index 4b3fd27..dbf93d1 160000
--- a/qmltermwidget
+++ b/qmltermwidget
@@ -1 +1 @@
-Subproject commit 4b3fd2729bac10a8e292bcf027737509d10e9c74
+Subproject commit dbf93d175c66ab9d6cdbf42443569d4a1c83c5b2