mirror of
				https://github.com/Swordfish90/cool-retro-term.git
				synced 2025-11-04 09:02:14 +00:00 
			
		
		
		
	Improve QML syntax and update license headers.
This commit is contained in:
		@@ -1,3 +1,22 @@
 | 
				
			|||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					* 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 2.2
 | 
				
			||||||
import QtQuick.Controls 2.2
 | 
					import QtQuick.Controls 2.2
 | 
				
			||||||
import QtQuick.Layouts 1.1
 | 
					import QtQuick.Layouts 1.1
 | 
				
			||||||
@@ -18,7 +37,10 @@ Window{
 | 
				
			|||||||
        Text {
 | 
					        Text {
 | 
				
			||||||
            Layout.alignment: Qt.AlignHCenter
 | 
					            Layout.alignment: Qt.AlignHCenter
 | 
				
			||||||
            text: "cool-retro-term"
 | 
					            text: "cool-retro-term"
 | 
				
			||||||
            font {bold: true; pointSize: 18}
 | 
					            font {
 | 
				
			||||||
 | 
					                bold: true
 | 
				
			||||||
 | 
					                pointSize: 18
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Loader {
 | 
					        Loader {
 | 
				
			||||||
            id: mainContent
 | 
					            id: mainContent
 | 
				
			||||||
@@ -41,7 +63,7 @@ Window{
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            ]
 | 
					            ]
 | 
				
			||||||
            Component.onCompleted: mainContent.state = "Default";
 | 
					            Component.onCompleted: mainContent.state = "Default"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Item {
 | 
					        Item {
 | 
				
			||||||
            Layout.fillWidth: true
 | 
					            Layout.fillWidth: true
 | 
				
			||||||
@@ -50,13 +72,14 @@ Window{
 | 
				
			|||||||
                anchors.left: parent.left
 | 
					                anchors.left: parent.left
 | 
				
			||||||
                text: qsTr("License")
 | 
					                text: qsTr("License")
 | 
				
			||||||
                onClicked: {
 | 
					                onClicked: {
 | 
				
			||||||
                    mainContent.state == "Default" ? mainContent.state = "License" : mainContent.state = "Default"
 | 
					                    mainContent.state == "Default" ? mainContent.state
 | 
				
			||||||
 | 
					                                                     = "License" : mainContent.state = "Default"
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Button {
 | 
					            Button {
 | 
				
			||||||
                anchors.right: parent.right
 | 
					                anchors.right: parent.right
 | 
				
			||||||
                text: qsTr("Close")
 | 
					                text: qsTr("Close")
 | 
				
			||||||
                onClicked: dialogwindow.close();
 | 
					                onClicked: dialogwindow.close()
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -77,10 +100,10 @@ Window{
 | 
				
			|||||||
            Text {
 | 
					            Text {
 | 
				
			||||||
                Layout.alignment: Qt.AlignCenter
 | 
					                Layout.alignment: Qt.AlignCenter
 | 
				
			||||||
                horizontalAlignment: Text.AlignHCenter
 | 
					                horizontalAlignment: Text.AlignHCenter
 | 
				
			||||||
                text: appSettings.version + "\n" +
 | 
					                text: appSettings.version + "\n" + qsTr(
 | 
				
			||||||
                      qsTr("Author: ") + "Filippo Scognamiglio\n" +
 | 
					                          "Author: ") + "Filippo Scognamiglio\n" + qsTr(
 | 
				
			||||||
                      qsTr("Email: ")  + "flscogna@gmail.com\n" +
 | 
					                          "Email: ") + "flscogna@gmail.com\n" + qsTr(
 | 
				
			||||||
                      qsTr("Source: ") + "https://github.com/Swordfish90/cool-retro-term\n"
 | 
					                          "Source: ") + "https://github.com/Swordfish90/cool-retro-term\n"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -92,21 +115,18 @@ Window{
 | 
				
			|||||||
            TextArea {
 | 
					            TextArea {
 | 
				
			||||||
                readOnly: true
 | 
					                readOnly: true
 | 
				
			||||||
                wrapMode: TextEdit.Wrap
 | 
					                wrapMode: TextEdit.Wrap
 | 
				
			||||||
                text: "Copyright (c) 2013 Filippo Scognamiglio <flscogna@gmail.com>\n\n" +
 | 
					                text: "Copyright (c) 2013-2021 Filippo Scognamiglio <flscogna@gmail.com>\n\n"
 | 
				
			||||||
                      "https://github.com/Swordfish90/cool-retro-term\n\n" +
 | 
					                      + "https://github.com/Swordfish90/cool-retro-term\n\n" +
 | 
				
			||||||
 | 
					                      "cool-retro-term is free software: you can redistribute it and/or modify "
 | 
				
			||||||
                      "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 "
 | 
				
			||||||
                      "it under the terms of the GNU General Public License as published by " +
 | 
					                      + "the Free Software Foundation, either version 3 of the License, or "
 | 
				
			||||||
                      "the Free Software Foundation, either version 3 of the License, or " +
 | 
					                      + "(at your option) any later version.\n\n" +
 | 
				
			||||||
                      "(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 "
 | 
				
			||||||
                      "This program is distributed in the hope that it will be useful, " +
 | 
					                      + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the "
 | 
				
			||||||
                      "but WITHOUT ANY WARRANTY; without even the implied warranty of " +
 | 
					                      + "GNU General Public License for more details.\n\n" +
 | 
				
			||||||
                      "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the " +
 | 
					                      "You should have received a copy of the GNU General Public License "
 | 
				
			||||||
                      "GNU General Public License for more details.\n\n" +
 | 
					                      + "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/>."
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 2.0
 | 
					import QtQuick.Controls 2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -28,7 +27,6 @@ QtObject{
 | 
				
			|||||||
    readonly property int profileVersion: 2
 | 
					    readonly property int profileVersion: 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // STATIC CONSTANTS ////////////////////////////////////////////////////////
 | 
					    // STATIC CONSTANTS ////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					 | 
				
			||||||
    readonly property real screenCurvatureSize: 0.4
 | 
					    readonly property real screenCurvatureSize: 0.4
 | 
				
			||||||
    readonly property real minimumFontScaling: 0.25
 | 
					    readonly property real minimumFontScaling: 0.25
 | 
				
			||||||
    readonly property real maximumFontScaling: 2.50
 | 
					    readonly property real maximumFontScaling: 2.50
 | 
				
			||||||
@@ -37,7 +35,6 @@ QtObject{
 | 
				
			|||||||
    readonly property real maxBurnInFadeTime: 1600
 | 
					    readonly property real maxBurnInFadeTime: 1600
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // GENERAL SETTINGS ///////////////////////////////////////////////////////
 | 
					    // GENERAL SETTINGS ///////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					 | 
				
			||||||
    property int x: 100
 | 
					    property int x: 100
 | 
				
			||||||
    property int y: 100
 | 
					    property int y: 100
 | 
				
			||||||
    property int width: 1024
 | 
					    property int width: 1024
 | 
				
			||||||
@@ -61,10 +58,9 @@ QtObject{
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    property bool blinkingCursor: false
 | 
					    property bool blinkingCursor: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    onWindowScalingChanged: handleFontChanged();
 | 
					    onWindowScalingChanged: handleFontChanged()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // PROFILE SETTINGS ///////////////////////////////////////////////////////
 | 
					    // PROFILE SETTINGS ///////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					 | 
				
			||||||
    property real windowOpacity: 1.0
 | 
					    property real windowOpacity: 1.0
 | 
				
			||||||
    property real ambientLight: 0.2
 | 
					    property real ambientLight: 0.2
 | 
				
			||||||
    property real contrast: 0.80
 | 
					    property real contrast: 0.80
 | 
				
			||||||
@@ -75,9 +71,16 @@ QtObject{
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    property string _backgroundColor: "#000000"
 | 
					    property string _backgroundColor: "#000000"
 | 
				
			||||||
    property string _fontColor: "#ff8100"
 | 
					    property string _fontColor: "#ff8100"
 | 
				
			||||||
    property string saturatedColor: Utils.mix(Utils.strToColor("#FFFFFF"), Utils.strToColor(_fontColor), saturationColor * 0.5)
 | 
					    property string saturatedColor: Utils.mix(Utils.strToColor("#FFFFFF"),
 | 
				
			||||||
    property color fontColor: Utils.mix(Utils.strToColor(saturatedColor), Utils.strToColor(_backgroundColor), 0.7 + (contrast * 0.3))
 | 
					                                              Utils.strToColor(_fontColor),
 | 
				
			||||||
    property color backgroundColor: Utils.mix(Utils.strToColor(_backgroundColor), Utils.strToColor(saturatedColor), 0.7 + (contrast * 0.3))
 | 
					                                              saturationColor * 0.5)
 | 
				
			||||||
 | 
					    property color fontColor: Utils.mix(Utils.strToColor(saturatedColor),
 | 
				
			||||||
 | 
					                                        Utils.strToColor(_backgroundColor),
 | 
				
			||||||
 | 
					                                        0.7 + (contrast * 0.3))
 | 
				
			||||||
 | 
					    property color backgroundColor: Utils.mix(Utils.strToColor(
 | 
				
			||||||
 | 
					                                                  _backgroundColor),
 | 
				
			||||||
 | 
					                                              Utils.strToColor(saturatedColor),
 | 
				
			||||||
 | 
					                                              0.7 + (contrast * 0.3))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property real staticNoise: 0.12
 | 
					    property real staticNoise: 0.12
 | 
				
			||||||
    property real screenCurvature: 0.3
 | 
					    property real screenCurvature: 0.3
 | 
				
			||||||
@@ -105,7 +108,6 @@ QtObject{
 | 
				
			|||||||
    property int rasterization: no_rasterization
 | 
					    property int rasterization: no_rasterization
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // FONTS //////////////////////////////////////////////////////////////////
 | 
					    // FONTS //////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					 | 
				
			||||||
    readonly property real baseFontScaling: 0.75
 | 
					    readonly property real baseFontScaling: 0.75
 | 
				
			||||||
    property real fontScaling: 1.0
 | 
					    property real fontScaling: 1.0
 | 
				
			||||||
    property real totalFontScaling: baseFontScaling * fontScaling
 | 
					    property real totalFontScaling: baseFontScaling * fontScaling
 | 
				
			||||||
@@ -119,16 +121,31 @@ QtObject{
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    signal terminalFontChanged(string fontFamily, int pixelSize, int lineSpacing, real screenScaling, real fontWidth)
 | 
					    signal terminalFontChanged(string fontFamily, int pixelSize, int lineSpacing, real screenScaling, real fontWidth)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    signal initializedSettings()
 | 
					    signal initializedSettings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property Loader fontManager: Loader {
 | 
					    property Loader fontManager: Loader {
 | 
				
			||||||
        states: [
 | 
					        states: [
 | 
				
			||||||
            State { when: rasterization == no_rasterization
 | 
					            State {
 | 
				
			||||||
                PropertyChanges {target: fontManager; source: "Fonts.qml" } },
 | 
					                when: rasterization == no_rasterization
 | 
				
			||||||
            State { when: rasterization == scanline_rasterization
 | 
					                PropertyChanges {
 | 
				
			||||||
                PropertyChanges {target: fontManager; source: "FontScanlines.qml" } },
 | 
					                    target: fontManager
 | 
				
			||||||
            State { when: rasterization == pixel_rasterization;
 | 
					                    source: "Fonts.qml"
 | 
				
			||||||
                PropertyChanges {target: fontManager; source: "FontPixels.qml" } }
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            State {
 | 
				
			||||||
 | 
					                when: rasterization == scanline_rasterization
 | 
				
			||||||
 | 
					                PropertyChanges {
 | 
				
			||||||
 | 
					                    target: fontManager
 | 
				
			||||||
 | 
					                    source: "FontScanlines.qml"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            State {
 | 
				
			||||||
 | 
					                when: rasterization == pixel_rasterization
 | 
				
			||||||
 | 
					                PropertyChanges {
 | 
				
			||||||
 | 
					                    target: fontManager
 | 
				
			||||||
 | 
					                    source: "FontPixels.qml"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        onLoaded: handleFontChanged()
 | 
					        onLoaded: handleFontChanged()
 | 
				
			||||||
@@ -136,151 +153,158 @@ QtObject{
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    property FontLoader fontLoader: FontLoader {}
 | 
					    property FontLoader fontLoader: FontLoader {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    onTotalFontScalingChanged: handleFontChanged();
 | 
					    onTotalFontScalingChanged: handleFontChanged()
 | 
				
			||||||
    onFontWidthChanged: handleFontChanged();
 | 
					    onFontWidthChanged: handleFontChanged()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function getIndexByName(name) {
 | 
					    function getIndexByName(name) {
 | 
				
			||||||
        for (var i = 0; i < fontlist.count; i++) {
 | 
					        for (var i = 0; i < fontlist.count; i++) {
 | 
				
			||||||
            var requestedName = fontlist.get(i).name;
 | 
					            var requestedName = fontlist.get(i).name
 | 
				
			||||||
            if (name === requestedName)
 | 
					            if (name === requestedName)
 | 
				
			||||||
                return i;
 | 
					                return i
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return 0; // If the font is not available default to 0.
 | 
					        return 0 // If the font is not available default to 0.
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function incrementScaling() {
 | 
					    function incrementScaling() {
 | 
				
			||||||
        fontScaling = Math.min(fontScaling + 0.05, maximumFontScaling);
 | 
					        fontScaling = Math.min(fontScaling + 0.05, maximumFontScaling)
 | 
				
			||||||
        handleFontChanged();
 | 
					        handleFontChanged()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function decrementScaling() {
 | 
					    function decrementScaling() {
 | 
				
			||||||
        fontScaling = Math.max(fontScaling - 0.05, minimumFontScaling);
 | 
					        fontScaling = Math.max(fontScaling - 0.05, minimumFontScaling)
 | 
				
			||||||
        handleFontChanged();
 | 
					        handleFontChanged()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function handleFontChanged() {
 | 
					    function handleFontChanged() {
 | 
				
			||||||
        if (!fontManager.item) return;
 | 
					        if (!fontManager.item)
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var index = getIndexByName(fontNames[rasterization]);
 | 
					        var index = getIndexByName(fontNames[rasterization])
 | 
				
			||||||
        if (index === undefined) return;
 | 
					        if (index === undefined)
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        fontManager.item.selectedFontIndex = index;
 | 
					        fontManager.item.selectedFontIndex = index
 | 
				
			||||||
        fontManager.item.scaling = totalFontScaling;
 | 
					        fontManager.item.scaling = totalFontScaling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var fontSource = fontManager.item.source;
 | 
					        var fontSource = fontManager.item.source
 | 
				
			||||||
        var pixelSize = fontManager.item.pixelSize;
 | 
					        var pixelSize = fontManager.item.pixelSize
 | 
				
			||||||
        var lineSpacing = fontManager.item.lineSpacing;
 | 
					        var lineSpacing = fontManager.item.lineSpacing
 | 
				
			||||||
        var screenScaling = fontManager.item.screenScaling;
 | 
					        var screenScaling = fontManager.item.screenScaling
 | 
				
			||||||
        var fontWidth = fontManager.item.defaultFontWidth * appSettings.fontWidth;
 | 
					        var fontWidth = fontManager.item.defaultFontWidth * appSettings.fontWidth
 | 
				
			||||||
        var fontFamily = fontManager.item.family;
 | 
					        var fontFamily = fontManager.item.family
 | 
				
			||||||
        var isSystemFont = fontManager.item.isSystemFont;
 | 
					        var isSystemFont = fontManager.item.isSystemFont
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        lowResolutionFont = fontManager.item.lowResolutionFont;
 | 
					        lowResolutionFont = fontManager.item.lowResolutionFont
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!isSystemFont) {
 | 
					        if (!isSystemFont) {
 | 
				
			||||||
            fontLoader.source = fontSource;
 | 
					            fontLoader.source = fontSource
 | 
				
			||||||
            fontFamily = fontLoader.name;
 | 
					            fontFamily = fontLoader.name
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        terminalFontChanged(fontFamily, pixelSize, lineSpacing, screenScaling, fontWidth);
 | 
					        terminalFontChanged(fontFamily, pixelSize, lineSpacing, screenScaling,
 | 
				
			||||||
 | 
					                            fontWidth)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property Storage storage: Storage {}
 | 
					    property Storage storage: Storage {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function stringify(obj) {
 | 
					    function stringify(obj) {
 | 
				
			||||||
        var replacer = function (key, val) {
 | 
					        var replacer = function (key, val) {
 | 
				
			||||||
            return val.toFixed ? Number(val.toFixed(4)) : val;
 | 
					            return val.toFixed ? Number(val.toFixed(4)) : val
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return JSON.stringify(obj, replacer, 2);
 | 
					        return JSON.stringify(obj, replacer, 2)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function composeSettingsString() {
 | 
					    function composeSettingsString() {
 | 
				
			||||||
        var settings = {
 | 
					        var settings = {
 | 
				
			||||||
            fps: fps,
 | 
					            "fps": fps,
 | 
				
			||||||
            x: x,
 | 
					            "x": x,
 | 
				
			||||||
            y: y,
 | 
					            "y": y,
 | 
				
			||||||
            width: width,
 | 
					            "width": width,
 | 
				
			||||||
            height: height,
 | 
					            "height": height,
 | 
				
			||||||
            windowScaling: windowScaling,
 | 
					            "windowScaling": windowScaling,
 | 
				
			||||||
            showTerminalSize: showTerminalSize,
 | 
					            "showTerminalSize": showTerminalSize,
 | 
				
			||||||
            fontScaling: fontScaling,
 | 
					            "fontScaling": fontScaling,
 | 
				
			||||||
            fontNames: fontNames,
 | 
					            "fontNames": fontNames,
 | 
				
			||||||
            showMenubar: showMenubar,
 | 
					            "showMenubar": showMenubar,
 | 
				
			||||||
            bloomQuality: bloomQuality,
 | 
					            "bloomQuality": bloomQuality,
 | 
				
			||||||
            burnInQuality: burnInQuality,
 | 
					            "burnInQuality": burnInQuality,
 | 
				
			||||||
            useCustomCommand: useCustomCommand,
 | 
					            "useCustomCommand": useCustomCommand,
 | 
				
			||||||
            customCommand: customCommand,
 | 
					            "customCommand": customCommand,
 | 
				
			||||||
            useFastBurnIn: useFastBurnIn,
 | 
					            "useFastBurnIn": useFastBurnIn,
 | 
				
			||||||
            blinkingCursor: blinkingCursor
 | 
					            "blinkingCursor": blinkingCursor
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return stringify(settings);
 | 
					        return stringify(settings)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function composeProfileObject() {
 | 
					    function composeProfileObject() {
 | 
				
			||||||
        var settings = {
 | 
					        var settings = {
 | 
				
			||||||
            backgroundColor: _backgroundColor,
 | 
					            "backgroundColor": _backgroundColor,
 | 
				
			||||||
            fontColor: _fontColor,
 | 
					            "fontColor": _fontColor,
 | 
				
			||||||
            flickering: flickering,
 | 
					            "flickering": flickering,
 | 
				
			||||||
            horizontalSync: horizontalSync,
 | 
					            "horizontalSync": horizontalSync,
 | 
				
			||||||
            staticNoise: staticNoise,
 | 
					            "staticNoise": staticNoise,
 | 
				
			||||||
            chromaColor: chromaColor,
 | 
					            "chromaColor": chromaColor,
 | 
				
			||||||
            saturationColor: saturationColor,
 | 
					            "saturationColor": saturationColor,
 | 
				
			||||||
            screenCurvature: screenCurvature,
 | 
					            "screenCurvature": screenCurvature,
 | 
				
			||||||
            glowingLine: glowingLine,
 | 
					            "glowingLine": glowingLine,
 | 
				
			||||||
            burnIn: burnIn,
 | 
					            "burnIn": burnIn,
 | 
				
			||||||
            bloom: bloom,
 | 
					            "bloom": bloom,
 | 
				
			||||||
            rasterization: rasterization,
 | 
					            "rasterization": rasterization,
 | 
				
			||||||
            jitter: jitter,
 | 
					            "jitter": jitter,
 | 
				
			||||||
            rbgShift: rbgShift,
 | 
					            "rbgShift": rbgShift,
 | 
				
			||||||
            brightness: brightness,
 | 
					            "brightness": brightness,
 | 
				
			||||||
            contrast: contrast,
 | 
					            "contrast": contrast,
 | 
				
			||||||
            ambientLight: ambientLight,
 | 
					            "ambientLight": ambientLight,
 | 
				
			||||||
            windowOpacity: windowOpacity,
 | 
					            "windowOpacity": windowOpacity,
 | 
				
			||||||
            fontName: fontNames[rasterization],
 | 
					            "fontName": fontNames[rasterization],
 | 
				
			||||||
            fontWidth: fontWidth,
 | 
					            "fontWidth": fontWidth,
 | 
				
			||||||
            margin: _margin
 | 
					            "margin": _margin
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return settings;
 | 
					        return settings
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function composeProfileString() {
 | 
					    function composeProfileString() {
 | 
				
			||||||
        return stringify(composeProfileObject());
 | 
					        return stringify(composeProfileObject())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function loadSettings() {
 | 
					    function loadSettings() {
 | 
				
			||||||
        var settingsString = storage.getSetting("_CURRENT_SETTINGS");
 | 
					        var settingsString = storage.getSetting("_CURRENT_SETTINGS")
 | 
				
			||||||
        var profileString = storage.getSetting("_CURRENT_PROFILE");
 | 
					        var profileString = storage.getSetting("_CURRENT_PROFILE")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(!settingsString) return;
 | 
					        if (!settingsString)
 | 
				
			||||||
        if(!profileString) return;
 | 
					            return
 | 
				
			||||||
 | 
					        if (!profileString)
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        loadSettingsString(settingsString);
 | 
					        loadSettingsString(settingsString)
 | 
				
			||||||
        loadProfileString(profileString);
 | 
					        loadProfileString(profileString)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (verbose)
 | 
					        if (verbose)
 | 
				
			||||||
            console.log("Loading settings: " + settingsString + profileString);
 | 
					            console.log("Loading settings: " + settingsString + profileString)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function storeSettings() {
 | 
					    function storeSettings() {
 | 
				
			||||||
        var settingsString = composeSettingsString();
 | 
					        var settingsString = composeSettingsString()
 | 
				
			||||||
        var profileString = composeProfileString();
 | 
					        var profileString = composeProfileString()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        storage.setSetting("_CURRENT_SETTINGS", settingsString);
 | 
					        storage.setSetting("_CURRENT_SETTINGS", settingsString)
 | 
				
			||||||
        storage.setSetting("_CURRENT_PROFILE", profileString);
 | 
					        storage.setSetting("_CURRENT_PROFILE", profileString)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (verbose) {
 | 
					        if (verbose) {
 | 
				
			||||||
            console.log("Storing settings: " + settingsString);
 | 
					            console.log("Storing settings: " + settingsString)
 | 
				
			||||||
            console.log("Storing profile: " + profileString);
 | 
					            console.log("Storing profile: " + profileString)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function loadSettingsString(settingsString) {
 | 
					    function loadSettingsString(settingsString) {
 | 
				
			||||||
        var settings = JSON.parse(settingsString);
 | 
					        var settings = JSON.parse(settingsString)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        showTerminalSize = settings.showTerminalSize !== undefined ? settings.showTerminalSize : showTerminalSize
 | 
					        showTerminalSize = settings.showTerminalSize
 | 
				
			||||||
 | 
					                !== undefined ? settings.showTerminalSize : showTerminalSize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        fps = settings.fps !== undefined ? settings.fps : fps
 | 
					        fps = settings.fps !== undefined ? settings.fps : fps
 | 
				
			||||||
        windowScaling = settings.windowScaling !== undefined ? settings.windowScaling : windowScaling
 | 
					        windowScaling = settings.windowScaling
 | 
				
			||||||
 | 
					                !== undefined ? settings.windowScaling : windowScaling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        x = settings.x !== undefined ? settings.x : x
 | 
					        x = settings.x !== undefined ? settings.x : x
 | 
				
			||||||
        y = settings.y !== undefined ? settings.y : y
 | 
					        y = settings.y !== undefined ? settings.y : y
 | 
				
			||||||
@@ -290,99 +314,119 @@ QtObject{
 | 
				
			|||||||
        fontNames = settings.fontNames !== undefined ? settings.fontNames : fontNames
 | 
					        fontNames = settings.fontNames !== undefined ? settings.fontNames : fontNames
 | 
				
			||||||
        fontScaling = settings.fontScaling !== undefined ? settings.fontScaling : fontScaling
 | 
					        fontScaling = settings.fontScaling !== undefined ? settings.fontScaling : fontScaling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        showMenubar = settings.showMenubar !== undefined ? settings.showMenubar : showMenubar;
 | 
					        showMenubar = settings.showMenubar !== undefined ? settings.showMenubar : showMenubar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        bloomQuality = settings.bloomQuality !== undefined ? settings.bloomQuality : bloomQuality;
 | 
					        bloomQuality = settings.bloomQuality !== undefined ? settings.bloomQuality : bloomQuality
 | 
				
			||||||
        burnInQuality = settings.burnInQuality !== undefined ? settings.burnInQuality : burnInQuality;
 | 
					        burnInQuality = settings.burnInQuality
 | 
				
			||||||
 | 
					                !== undefined ? settings.burnInQuality : burnInQuality
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        useCustomCommand = settings.useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand
 | 
					        useCustomCommand = settings.useCustomCommand
 | 
				
			||||||
        customCommand = settings.customCommand !== undefined ? settings.customCommand : customCommand
 | 
					                !== undefined ? settings.useCustomCommand : useCustomCommand
 | 
				
			||||||
 | 
					        customCommand = settings.customCommand
 | 
				
			||||||
 | 
					                !== undefined ? settings.customCommand : customCommand
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        useFastBurnIn = settings.useFastBurnIn !== undefined ? settings.useFastBurnIn : useFastBurnIn;
 | 
					        useFastBurnIn = settings.useFastBurnIn
 | 
				
			||||||
 | 
					                !== undefined ? settings.useFastBurnIn : useFastBurnIn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        blinkingCursor = settings.blinkingCursor !== undefined ? settings.blinkingCursor : blinkingCursor
 | 
					        blinkingCursor = settings.blinkingCursor
 | 
				
			||||||
 | 
					                !== undefined ? settings.blinkingCursor : blinkingCursor
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function loadProfileString(profileString) {
 | 
					    function loadProfileString(profileString) {
 | 
				
			||||||
        var settings = JSON.parse(profileString);
 | 
					        var settings = JSON.parse(profileString)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _backgroundColor = settings.backgroundColor !== undefined ? settings.backgroundColor : _backgroundColor;
 | 
					        _backgroundColor = settings.backgroundColor
 | 
				
			||||||
        _fontColor = settings.fontColor !== undefined ? settings.fontColor : _fontColor;
 | 
					                !== undefined ? settings.backgroundColor : _backgroundColor
 | 
				
			||||||
 | 
					        _fontColor = settings.fontColor !== undefined ? settings.fontColor : _fontColor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        horizontalSync = settings.horizontalSync !== undefined ? settings.horizontalSync : horizontalSync
 | 
					        horizontalSync = settings.horizontalSync
 | 
				
			||||||
        flickering = settings.flickering !== undefined ? settings.flickering : flickering;
 | 
					                !== undefined ? settings.horizontalSync : horizontalSync
 | 
				
			||||||
        staticNoise = settings.staticNoise !== undefined ? settings.staticNoise : staticNoise;
 | 
					        flickering = settings.flickering !== undefined ? settings.flickering : flickering
 | 
				
			||||||
        chromaColor = settings.chromaColor !== undefined ? settings.chromaColor : chromaColor;
 | 
					        staticNoise = settings.staticNoise !== undefined ? settings.staticNoise : staticNoise
 | 
				
			||||||
        saturationColor = settings.saturationColor !== undefined ? settings.saturationColor : saturationColor;
 | 
					        chromaColor = settings.chromaColor !== undefined ? settings.chromaColor : chromaColor
 | 
				
			||||||
        screenCurvature = settings.screenCurvature !== undefined ? settings.screenCurvature : screenCurvature;
 | 
					        saturationColor = settings.saturationColor
 | 
				
			||||||
        glowingLine = settings.glowingLine !== undefined ? settings.glowingLine : glowingLine;
 | 
					                !== undefined ? settings.saturationColor : saturationColor
 | 
				
			||||||
 | 
					        screenCurvature = settings.screenCurvature
 | 
				
			||||||
 | 
					                !== undefined ? settings.screenCurvature : screenCurvature
 | 
				
			||||||
 | 
					        glowingLine = settings.glowingLine !== undefined ? settings.glowingLine : glowingLine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        burnIn = settings.burnIn !== undefined ? settings.burnIn : burnIn
 | 
					        burnIn = settings.burnIn !== undefined ? settings.burnIn : burnIn
 | 
				
			||||||
        bloom = settings.bloom !== undefined ? settings.bloom : bloom
 | 
					        bloom = settings.bloom !== undefined ? settings.bloom : bloom
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        rasterization = settings.rasterization !== undefined ? settings.rasterization : rasterization;
 | 
					        rasterization = settings.rasterization
 | 
				
			||||||
 | 
					                !== undefined ? settings.rasterization : rasterization
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        jitter = settings.jitter !== undefined ? settings.jitter : jitter;
 | 
					        jitter = settings.jitter !== undefined ? settings.jitter : jitter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        rbgShift = settings.rbgShift !== undefined ? settings.rbgShift : rbgShift;
 | 
					        rbgShift = settings.rbgShift !== undefined ? settings.rbgShift : rbgShift
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ambientLight = settings.ambientLight !== undefined ? settings.ambientLight : ambientLight;
 | 
					        ambientLight = settings.ambientLight !== undefined ? settings.ambientLight : ambientLight
 | 
				
			||||||
        contrast = settings.contrast !== undefined ? settings.contrast : contrast;
 | 
					        contrast = settings.contrast !== undefined ? settings.contrast : contrast
 | 
				
			||||||
        brightness = settings.brightness !== undefined ? settings.brightness : brightness;
 | 
					        brightness = settings.brightness !== undefined ? settings.brightness : brightness
 | 
				
			||||||
        windowOpacity = settings.windowOpacity !== undefined ? settings.windowOpacity : windowOpacity;
 | 
					        windowOpacity = settings.windowOpacity
 | 
				
			||||||
 | 
					                !== undefined ? settings.windowOpacity : windowOpacity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        fontNames[rasterization] = settings.fontName !== undefined ? settings.fontName : fontNames[rasterization];
 | 
					        fontNames[rasterization] = settings.fontName
 | 
				
			||||||
        fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth;
 | 
					                !== undefined ? settings.fontName : fontNames[rasterization]
 | 
				
			||||||
 | 
					        fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _margin = settings.margin !== undefined ? settings.margin : _margin;
 | 
					        _margin = settings.margin !== undefined ? settings.margin : _margin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        handleFontChanged()
 | 
				
			||||||
        handleFontChanged();
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function storeCustomProfiles() {
 | 
					    function storeCustomProfiles() {
 | 
				
			||||||
        storage.setSetting("_CUSTOM_PROFILES", composeCustomProfilesString());
 | 
					        storage.setSetting("_CUSTOM_PROFILES", composeCustomProfilesString())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function loadCustomProfiles() {
 | 
					    function loadCustomProfiles() {
 | 
				
			||||||
        var customProfileString = storage.getSetting("_CUSTOM_PROFILES");
 | 
					        var customProfileString = storage.getSetting("_CUSTOM_PROFILES")
 | 
				
			||||||
        if(customProfileString === undefined) customProfileString = "[]";
 | 
					        if (customProfileString === undefined)
 | 
				
			||||||
        loadCustomProfilesString(customProfileString);
 | 
					            customProfileString = "[]"
 | 
				
			||||||
 | 
					        loadCustomProfilesString(customProfileString)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function loadCustomProfilesString(customProfilesString) {
 | 
					    function loadCustomProfilesString(customProfilesString) {
 | 
				
			||||||
        var customProfiles = JSON.parse(customProfilesString);
 | 
					        var customProfiles = JSON.parse(customProfilesString)
 | 
				
			||||||
        for (var i = 0; i < customProfiles.length; i++) {
 | 
					        for (var i = 0; i < customProfiles.length; i++) {
 | 
				
			||||||
            var profile = customProfiles[i];
 | 
					            var profile = customProfiles[i]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (verbose)
 | 
					            if (verbose)
 | 
				
			||||||
                console.log("Loading custom profile: " + stringify(profile));
 | 
					                console.log("Loading custom profile: " + stringify(profile))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            profilesList.append(profile);
 | 
					            profilesList.append(profile)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function composeCustomProfilesString() {
 | 
					    function composeCustomProfilesString() {
 | 
				
			||||||
        var customProfiles = []
 | 
					        var customProfiles = []
 | 
				
			||||||
        for (var i = 0; i < profilesList.count; i++) {
 | 
					        for (var i = 0; i < profilesList.count; i++) {
 | 
				
			||||||
            var profile = profilesList.get(i);
 | 
					            var profile = profilesList.get(i)
 | 
				
			||||||
            if(profile.builtin) continue;
 | 
					            if (profile.builtin)
 | 
				
			||||||
            customProfiles.push({text: profile.text, obj_string: profile.obj_string, builtin: false})
 | 
					                continue
 | 
				
			||||||
 | 
					            customProfiles.push({
 | 
				
			||||||
 | 
					                                    "text": profile.text,
 | 
				
			||||||
 | 
					                                    "obj_string": profile.obj_string,
 | 
				
			||||||
 | 
					                                    "builtin": false
 | 
				
			||||||
 | 
					                                })
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return stringify(customProfiles);
 | 
					        return stringify(customProfiles)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function loadProfile(index) {
 | 
					    function loadProfile(index) {
 | 
				
			||||||
        var profile = profilesList.get(index);
 | 
					        var profile = profilesList.get(index)
 | 
				
			||||||
        loadProfileString(profile.obj_string);
 | 
					        loadProfileString(profile.obj_string)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function appendCustomProfile(name, profileString) {
 | 
					    function appendCustomProfile(name, profileString) {
 | 
				
			||||||
        profilesList.append({text: name, obj_string: profileString, builtin: false});
 | 
					        profilesList.append({
 | 
				
			||||||
 | 
					                                "text": name,
 | 
				
			||||||
 | 
					                                "obj_string": profileString,
 | 
				
			||||||
 | 
					                                "builtin": false
 | 
				
			||||||
 | 
					                            })
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // PROFILES ///////////////////////////////////////////////////////////////
 | 
					    // PROFILES ///////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					 | 
				
			||||||
    property ListModel profilesList: ListModel {
 | 
					    property ListModel profilesList: ListModel {
 | 
				
			||||||
        ListElement {
 | 
					        ListElement {
 | 
				
			||||||
            text: "Default Amber"
 | 
					            text: "Default Amber"
 | 
				
			||||||
@@ -413,8 +457,7 @@ QtObject{
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement {
 | 
					        ListElement {
 | 
				
			||||||
            text: "Monochrome Green"
 | 
					            text: "Monochrome Green"
 | 
				
			||||||
            obj_string: '
 | 
					            obj_string: '{
 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                "ambientLight": 0.2,
 | 
					                "ambientLight": 0.2,
 | 
				
			||||||
                "backgroundColor": "#000000",
 | 
					                "backgroundColor": "#000000",
 | 
				
			||||||
                "bloom": 0.5538,
 | 
					                "bloom": 0.5538,
 | 
				
			||||||
@@ -441,8 +484,7 @@ QtObject{
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement {
 | 
					        ListElement {
 | 
				
			||||||
            text: "Green Scanlines"
 | 
					            text: "Green Scanlines"
 | 
				
			||||||
            obj_string: '
 | 
					            obj_string: '{
 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                "ambientLight": 0,
 | 
					                "ambientLight": 0,
 | 
				
			||||||
                "backgroundColor": "#000000",
 | 
					                "backgroundColor": "#000000",
 | 
				
			||||||
                "bloom": 0.6,
 | 
					                "bloom": 0.6,
 | 
				
			||||||
@@ -469,8 +511,7 @@ QtObject{
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement {
 | 
					        ListElement {
 | 
				
			||||||
            text: "Default Pixelated"
 | 
					            text: "Default Pixelated"
 | 
				
			||||||
            obj_string: '
 | 
					            obj_string: '{
 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                "ambientLight": 0,
 | 
					                "ambientLight": 0,
 | 
				
			||||||
                "backgroundColor": "#000000",
 | 
					                "backgroundColor": "#000000",
 | 
				
			||||||
                "bloom": 0.4045,
 | 
					                "bloom": 0.4045,
 | 
				
			||||||
@@ -497,8 +538,7 @@ QtObject{
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement {
 | 
					        ListElement {
 | 
				
			||||||
            text: "Apple ]["
 | 
					            text: "Apple ]["
 | 
				
			||||||
            obj_string:
 | 
					            obj_string: '{
 | 
				
			||||||
                '{
 | 
					 | 
				
			||||||
                "ambientLight": 0.3038,
 | 
					                "ambientLight": 0.3038,
 | 
				
			||||||
                "backgroundColor": "#000000",
 | 
					                "backgroundColor": "#000000",
 | 
				
			||||||
                "bloom": 0.5,
 | 
					                "bloom": 0.5,
 | 
				
			||||||
@@ -525,8 +565,7 @@ QtObject{
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement {
 | 
					        ListElement {
 | 
				
			||||||
            text: "Vintage"
 | 
					            text: "Vintage"
 | 
				
			||||||
            obj_string: '
 | 
					            obj_string: '{
 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                "ambientLight": 0.5,
 | 
					                "ambientLight": 0.5,
 | 
				
			||||||
                "backgroundColor": "#000000",
 | 
					                "backgroundColor": "#000000",
 | 
				
			||||||
                "bloom": 0.4983,
 | 
					                "bloom": 0.4983,
 | 
				
			||||||
@@ -553,8 +592,7 @@ QtObject{
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement {
 | 
					        ListElement {
 | 
				
			||||||
            text: "IBM Dos"
 | 
					            text: "IBM Dos"
 | 
				
			||||||
            obj_string:
 | 
					            obj_string: '{
 | 
				
			||||||
                '{
 | 
					 | 
				
			||||||
                "ambientLight": 0.151,
 | 
					                "ambientLight": 0.151,
 | 
				
			||||||
                "backgroundColor": "#000000",
 | 
					                "backgroundColor": "#000000",
 | 
				
			||||||
                "bloom": 0.2969,
 | 
					                "bloom": 0.2969,
 | 
				
			||||||
@@ -581,8 +619,7 @@ QtObject{
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement {
 | 
					        ListElement {
 | 
				
			||||||
            text: "IBM 3278"
 | 
					            text: "IBM 3278"
 | 
				
			||||||
            obj_string:
 | 
					            obj_string: '{
 | 
				
			||||||
                '{
 | 
					 | 
				
			||||||
                "ambientLight": 0.1,
 | 
					                "ambientLight": 0.1,
 | 
				
			||||||
                "backgroundColor": "#000000",
 | 
					                "backgroundColor": "#000000",
 | 
				
			||||||
                "bloom": 0.2969,
 | 
					                "bloom": 0.2969,
 | 
				
			||||||
@@ -609,8 +646,7 @@ QtObject{
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement {
 | 
					        ListElement {
 | 
				
			||||||
            text: "Futuristic"
 | 
					            text: "Futuristic"
 | 
				
			||||||
            obj_string:
 | 
					            obj_string: '{
 | 
				
			||||||
                '{
 | 
					 | 
				
			||||||
                "ambientLight": 0,
 | 
					                "ambientLight": 0,
 | 
				
			||||||
                "backgroundColor": "#000000",
 | 
					                "backgroundColor": "#000000",
 | 
				
			||||||
                "bloom": 0.5017,
 | 
					                "bloom": 0.5017,
 | 
				
			||||||
@@ -640,51 +676,51 @@ QtObject{
 | 
				
			|||||||
    function getProfileIndexByName(name) {
 | 
					    function getProfileIndexByName(name) {
 | 
				
			||||||
        for (var i = 0; i < profilesList.count; i++) {
 | 
					        for (var i = 0; i < profilesList.count; i++) {
 | 
				
			||||||
            if (profilesList.get(i).text === name)
 | 
					            if (profilesList.get(i).text === name)
 | 
				
			||||||
                return i;
 | 
					                return i
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return -1;
 | 
					        return -1
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Component.onCompleted: {
 | 
					    Component.onCompleted: {
 | 
				
			||||||
        // Manage the arguments from the QML side.
 | 
					        // Manage the arguments from the QML side.
 | 
				
			||||||
        var args = Qt.application.arguments;
 | 
					        var args = Qt.application.arguments
 | 
				
			||||||
        if (args.indexOf("--verbose") !== -1) {
 | 
					        if (args.indexOf("--verbose") !== -1) {
 | 
				
			||||||
            verbose = true;
 | 
					            verbose = true
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (args.indexOf("--default-settings") === -1) {
 | 
					        if (args.indexOf("--default-settings") === -1) {
 | 
				
			||||||
            loadSettings();
 | 
					            loadSettings()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        loadCustomProfiles();
 | 
					        loadCustomProfiles()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var profileArgPosition = args.indexOf("--profile");
 | 
					        var profileArgPosition = args.indexOf("--profile")
 | 
				
			||||||
        if (profileArgPosition !== -1) {
 | 
					        if (profileArgPosition !== -1) {
 | 
				
			||||||
            var profileIndex = getProfileIndexByName(args[profileArgPosition + 1]);
 | 
					            var profileIndex = getProfileIndexByName(
 | 
				
			||||||
 | 
					                        args[profileArgPosition + 1])
 | 
				
			||||||
            if (profileIndex !== -1)
 | 
					            if (profileIndex !== -1)
 | 
				
			||||||
                loadProfile(profileIndex);
 | 
					                loadProfile(profileIndex)
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
                console.log("Warning: selected profile is not valid; ignoring it");
 | 
					                console.log("Warning: selected profile is not valid; ignoring it")
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (args.indexOf("--fullscreen") !== -1) {
 | 
					        if (args.indexOf("--fullscreen") !== -1) {
 | 
				
			||||||
            fullscreen = true;
 | 
					            fullscreen = true
 | 
				
			||||||
            showMenubar = false;
 | 
					            showMenubar = false
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (args.indexOf("-T") !== -1) {
 | 
					        if (args.indexOf("-T") !== -1) {
 | 
				
			||||||
            wintitle = args[args.indexOf("-T") + 1]
 | 
					            wintitle = args[args.indexOf("-T") + 1]
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        initializedSettings();
 | 
					        initializedSettings()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Component.onDestruction: {
 | 
					    Component.onDestruction: {
 | 
				
			||||||
        storeSettings();
 | 
					        storeSettings()
 | 
				
			||||||
        storeCustomProfiles();
 | 
					        storeCustomProfiles()
 | 
				
			||||||
        //        storage.dropSettings(); //DROPS THE SETTINGS!.. REMEMBER TO DISABLE ONCE ENABLED!!
 | 
					        //        storage.dropSettings(); //DROPS THE SETTINGS!.. REMEMBER TO DISABLE ONCE ENABLED!!
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // VARS ///////////////////////////////////////////////////////////////////
 | 
					    // VARS ///////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					 | 
				
			||||||
    property Label _sampleLabel: Label {
 | 
					    property Label _sampleLabel: Label {
 | 
				
			||||||
        text: "100%"
 | 
					        text: "100%"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,22 @@
 | 
				
			|||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					* 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.0
 | 
					import QtQuick 2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "utils.js" as Utils
 | 
					import "utils.js" as Utils
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 2.0
 | 
					import QtQuick.Controls 2.0
 | 
				
			||||||
import QtQuick.Layouts 1.1
 | 
					import QtQuick.Layouts 1.1
 | 
				
			||||||
@@ -32,15 +31,15 @@ RowLayout {
 | 
				
			|||||||
    property alias max_value: slider.to
 | 
					    property alias max_value: slider.to
 | 
				
			||||||
    property alias stepSize: slider.stepSize
 | 
					    property alias stepSize: slider.stepSize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    signal newValue(real newValue);
 | 
					    signal newValue(real newValue)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    id: setting_component
 | 
					    id: setting_component
 | 
				
			||||||
    Layout.fillWidth: true
 | 
					    Layout.fillWidth: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    onValueChanged: {
 | 
					    onValueChanged: {
 | 
				
			||||||
        check.checked = !(value == 0);
 | 
					        check.checked = !(value == 0)
 | 
				
			||||||
        if (check.checked)
 | 
					        if (check.checked)
 | 
				
			||||||
            slider.value = value;
 | 
					            slider.value = value
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    CheckBox {
 | 
					    CheckBox {
 | 
				
			||||||
@@ -48,13 +47,13 @@ RowLayout {
 | 
				
			|||||||
        implicitWidth: 160
 | 
					        implicitWidth: 160
 | 
				
			||||||
        onClicked: {
 | 
					        onClicked: {
 | 
				
			||||||
            if (!checked) {
 | 
					            if (!checked) {
 | 
				
			||||||
                checked = false;
 | 
					                checked = false
 | 
				
			||||||
                slider.enabled = false;
 | 
					                slider.enabled = false
 | 
				
			||||||
                newValue(0);
 | 
					                newValue(0)
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                checked = true;
 | 
					                checked = true
 | 
				
			||||||
                newValue(slider.value);
 | 
					                newValue(slider.value)
 | 
				
			||||||
                slider.enabled = true;
 | 
					                slider.enabled = true
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -63,10 +62,11 @@ RowLayout {
 | 
				
			|||||||
        stepSize: parent.stepSize
 | 
					        stepSize: parent.stepSize
 | 
				
			||||||
        Layout.fillWidth: true
 | 
					        Layout.fillWidth: true
 | 
				
			||||||
        onValueChanged: {
 | 
					        onValueChanged: {
 | 
				
			||||||
            newValue(value);
 | 
					            newValue(value)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    SizedLabel {
 | 
					    SizedLabel {
 | 
				
			||||||
        text: Math.round(((value - min_value) / (max_value - min_value)) * 100) + "%"
 | 
					        text: Math.round(
 | 
				
			||||||
 | 
					                  ((value - min_value) / (max_value - min_value)) * 100) + "%"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Dialogs 1.1
 | 
					import QtQuick.Dialogs 1.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -35,8 +34,10 @@ Item {
 | 
				
			|||||||
        visible: false
 | 
					        visible: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //This is a workaround to a Qt 5.2 bug.
 | 
					        //This is a workaround to a Qt 5.2 bug.
 | 
				
			||||||
        onColorChanged: if (Qt.platform.os !== "osx") colorSelected(color)
 | 
					        onColorChanged: if (Qt.platform.os !== "osx")
 | 
				
			||||||
        onAccepted: if (Qt.platform.os === "osx") colorSelected(color)
 | 
					                            colorSelected(color)
 | 
				
			||||||
 | 
					        onAccepted: if (Qt.platform.os === "osx")
 | 
				
			||||||
 | 
					                        colorSelected(color)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Rectangle {
 | 
					    Rectangle {
 | 
				
			||||||
        anchors.fill: parent
 | 
					        anchors.fill: parent
 | 
				
			||||||
@@ -58,6 +59,6 @@ Item {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    MouseArea {
 | 
					    MouseArea {
 | 
				
			||||||
        anchors.fill: parent
 | 
					        anchors.fill: parent
 | 
				
			||||||
        onClicked: colorDialog.visible = true;
 | 
					        onClicked: colorDialog.visible = true
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,15 +19,12 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.0
 | 
					import QtQuick 2.0
 | 
				
			||||||
import QtQuick.Controls 2.0
 | 
					import QtQuick.Controls 2.0
 | 
				
			||||||
import QtQuick.Layouts 1.0
 | 
					import QtQuick.Layouts 1.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This component is simply a label with a predefined size.
 | 
					// This component is simply a label with a predefined size.
 | 
				
			||||||
// Used to improve alignment.
 | 
					// Used to improve alignment.
 | 
				
			||||||
 | 
					 | 
				
			||||||
Label {
 | 
					Label {
 | 
				
			||||||
    id: textfield
 | 
					    id: textfield
 | 
				
			||||||
    Layout.minimumWidth: appSettings.labelWidth
 | 
					    Layout.minimumWidth: appSettings.labelWidth
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QtObject {
 | 
					QtObject {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QtObject {
 | 
					QtObject {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QtObject {
 | 
					QtObject {
 | 
				
			||||||
@@ -27,17 +26,11 @@ QtObject{
 | 
				
			|||||||
    property var _font: fontlist.get(selectedFontIndex)
 | 
					    property var _font: fontlist.get(selectedFontIndex)
 | 
				
			||||||
    property bool lowResolutionFont: _font.lowResolutionFont
 | 
					    property bool lowResolutionFont: _font.lowResolutionFont
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property int pixelSize: lowResolutionFont
 | 
					    property int pixelSize: lowResolutionFont ? _font.pixelSize : _font.pixelSize * scaling
 | 
				
			||||||
                                 ? _font.pixelSize
 | 
					 | 
				
			||||||
                                 : _font.pixelSize * scaling
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property int lineSpacing: lowResolutionFont
 | 
					    property int lineSpacing: lowResolutionFont ? _font.lineSpacing : pixelSize * _font.lineSpacing
 | 
				
			||||||
                                  ? _font.lineSpacing
 | 
					 | 
				
			||||||
                                  : pixelSize * _font.lineSpacing
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property real screenScaling: lowResolutionFont
 | 
					    property real screenScaling: lowResolutionFont ? _font.baseScaling * scaling : 1.0
 | 
				
			||||||
                                     ? _font.baseScaling * scaling
 | 
					 | 
				
			||||||
                                     : 1.0
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
 | 
					    property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -52,7 +45,6 @@ QtObject{
 | 
				
			|||||||
    // High resolution fonts are instead drawn on a texture which has the
 | 
					    // High resolution fonts are instead drawn on a texture which has the
 | 
				
			||||||
    // size of the screen, and the scaling directly controls their pixels size.
 | 
					    // size of the screen, and the scaling directly controls their pixels size.
 | 
				
			||||||
    // Those are slower to render but are not pixelated.
 | 
					    // Those are slower to render but are not pixelated.
 | 
				
			||||||
 | 
					 | 
				
			||||||
    property ListModel fontlist: ListModel {
 | 
					    property ListModel fontlist: ListModel {
 | 
				
			||||||
        ListElement {
 | 
					        ListElement {
 | 
				
			||||||
            name: "TERMINUS_SCALED"
 | 
					            name: "TERMINUS_SCALED"
 | 
				
			||||||
@@ -234,7 +226,7 @@ QtObject{
 | 
				
			|||||||
    Component.onCompleted: addSystemFonts()
 | 
					    Component.onCompleted: addSystemFonts()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function addSystemFonts() {
 | 
					    function addSystemFonts() {
 | 
				
			||||||
        var families = monospaceSystemFonts;
 | 
					        var families = monospaceSystemFonts
 | 
				
			||||||
        for (var i = 0; i < families.length; i++) {
 | 
					        for (var i = 0; i < families.length; i++) {
 | 
				
			||||||
            if (verbose) {
 | 
					            if (verbose) {
 | 
				
			||||||
                console.log("Adding system font: ", families[i])
 | 
					                console.log("Adding system font: ", families[i])
 | 
				
			||||||
@@ -245,16 +237,16 @@ QtObject{
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    function convertToListElement(family) {
 | 
					    function convertToListElement(family) {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            name: "System: " + family,
 | 
					            "name": "System: " + family,
 | 
				
			||||||
            text: qsTr("System: ") + family,
 | 
					            "text": qsTr("System: ") + family,
 | 
				
			||||||
            source: "",
 | 
					            "source": "",
 | 
				
			||||||
            lineSpacing: 0.1,
 | 
					            "lineSpacing": 0.1,
 | 
				
			||||||
            pixelSize: 30,
 | 
					            "pixelSize": 30,
 | 
				
			||||||
            fontWidth: 1.0,
 | 
					            "fontWidth": 1.0,
 | 
				
			||||||
            baseScaling: 1.0,
 | 
					            "baseScaling": 1.0,
 | 
				
			||||||
            lowResolutionFont: false,
 | 
					            "lowResolutionFont": false,
 | 
				
			||||||
            isSystemFont: true,
 | 
					            "isSystemFont": true,
 | 
				
			||||||
            family: family
 | 
					            "family": family
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Window 2.0
 | 
					import QtQuick.Window 2.0
 | 
				
			||||||
import QtQuick.Controls 2.0
 | 
					import QtQuick.Controls 2.0
 | 
				
			||||||
@@ -40,23 +39,25 @@ Window{
 | 
				
			|||||||
        visible: false
 | 
					        visible: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function showError(message) {
 | 
					        function showError(message) {
 | 
				
			||||||
            text = message;
 | 
					            text = message
 | 
				
			||||||
            open();
 | 
					            open()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function validateName(name) {
 | 
					    function validateName(name) {
 | 
				
			||||||
        var profile_list = appSettings.profilesList;
 | 
					        var profile_list = appSettings.profilesList
 | 
				
			||||||
        if (name === "")
 | 
					        if (name === "")
 | 
				
			||||||
            return 1;
 | 
					            return 1
 | 
				
			||||||
        return 0;
 | 
					        return 0
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ColumnLayout {
 | 
					    ColumnLayout {
 | 
				
			||||||
        anchors.margins: 10
 | 
					        anchors.margins: 10
 | 
				
			||||||
        anchors.fill: parent
 | 
					        anchors.fill: parent
 | 
				
			||||||
        RowLayout {
 | 
					        RowLayout {
 | 
				
			||||||
            Label{text: qsTr("Name")}
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Name")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            TextField {
 | 
					            TextField {
 | 
				
			||||||
                id: namefield
 | 
					                id: namefield
 | 
				
			||||||
                Layout.fillWidth: true
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
@@ -71,14 +72,15 @@ Window{
 | 
				
			|||||||
                text: qsTr("OK")
 | 
					                text: qsTr("OK")
 | 
				
			||||||
                onClicked: clickAction()
 | 
					                onClicked: clickAction()
 | 
				
			||||||
                function clickAction() {
 | 
					                function clickAction() {
 | 
				
			||||||
                    var name = namefield.text;
 | 
					                    var name = namefield.text
 | 
				
			||||||
                    switch (validateName(name)) {
 | 
					                    switch (validateName(name)) {
 | 
				
			||||||
                    case 1:
 | 
					                    case 1:
 | 
				
			||||||
                        errorDialog.showError(qsTr("The name you inserted is empty. Please choose a different one."));
 | 
					                        errorDialog.showError(
 | 
				
			||||||
                        break;
 | 
					                                    qsTr("The name you inserted is empty. Please choose a different one."))
 | 
				
			||||||
 | 
					                        break
 | 
				
			||||||
                    default:
 | 
					                    default:
 | 
				
			||||||
                        nameSelected(name);
 | 
					                        nameSelected(name)
 | 
				
			||||||
                        close();
 | 
					                        close()
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,22 @@
 | 
				
			|||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					* 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.0
 | 
					import QtQuick 2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "utils.js" as Utils
 | 
					import "utils.js" as Utils
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 2.0
 | 
					import QtQuick.Controls 2.0
 | 
				
			||||||
import QtQuick.Layouts 1.1
 | 
					import QtQuick.Layouts 1.1
 | 
				
			||||||
@@ -53,9 +52,10 @@ ColumnLayout{
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                // Save text even if user forgets to press enter or unfocus
 | 
					                // Save text even if user forgets to press enter or unfocus
 | 
				
			||||||
                function saveSetting() {
 | 
					                function saveSetting() {
 | 
				
			||||||
                    appSettings.customCommand = text;
 | 
					                    appSettings.customCommand = text
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                Component.onCompleted: settings_window.closing.connect(saveSetting)
 | 
					                Component.onCompleted: settings_window.closing.connect(
 | 
				
			||||||
 | 
					                                           saveSetting)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -67,74 +67,93 @@ ColumnLayout{
 | 
				
			|||||||
            anchors.fill: parent
 | 
					            anchors.fill: parent
 | 
				
			||||||
            columns: 4
 | 
					            columns: 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Label{text: qsTr("Effects FPS")}
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Effects FPS")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            Slider {
 | 
					            Slider {
 | 
				
			||||||
                Layout.fillWidth: true
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
                Layout.columnSpan: 2
 | 
					                Layout.columnSpan: 2
 | 
				
			||||||
                id: fpsSlider
 | 
					                id: fpsSlider
 | 
				
			||||||
                onValueChanged: {
 | 
					                onValueChanged: {
 | 
				
			||||||
                    if (enabled) {
 | 
					                    if (enabled) {
 | 
				
			||||||
                        appSettings.fps = value !== 60 ? value + 1 : 0;
 | 
					                        appSettings.fps = value !== 60 ? value + 1 : 0
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                stepSize: 1
 | 
					                stepSize: 1
 | 
				
			||||||
                enabled: false
 | 
					                enabled: false
 | 
				
			||||||
                Component.onCompleted: {
 | 
					                Component.onCompleted: {
 | 
				
			||||||
                    from = 0;
 | 
					                    from = 0
 | 
				
			||||||
                    to = 60;
 | 
					                    to = 60
 | 
				
			||||||
                    value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60;
 | 
					                    value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60
 | 
				
			||||||
                    enabled = true;
 | 
					                    enabled = true
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Label{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")}
 | 
					            Label {
 | 
				
			||||||
            Label{text: qsTr("Texture Quality")}
 | 
					                text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Texture Quality")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            Slider {
 | 
					            Slider {
 | 
				
			||||||
                id: txtslider
 | 
					                id: txtslider
 | 
				
			||||||
                Layout.fillWidth: true
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
                Layout.columnSpan: 2
 | 
					                Layout.columnSpan: 2
 | 
				
			||||||
                onValueChanged: if (enabled) appSettings.windowScaling = value;
 | 
					                onValueChanged: if (enabled)
 | 
				
			||||||
 | 
					                                    appSettings.windowScaling = value
 | 
				
			||||||
                stepSize: 0.05
 | 
					                stepSize: 0.05
 | 
				
			||||||
                enabled: false
 | 
					                enabled: false
 | 
				
			||||||
                Component.onCompleted: {
 | 
					                Component.onCompleted: {
 | 
				
			||||||
                    from = 0.25 //Without this value gets set to 0.5
 | 
					                    from = 0.25 //Without this value gets set to 0.5
 | 
				
			||||||
                    value = appSettings.windowScaling;
 | 
					                    value = appSettings.windowScaling
 | 
				
			||||||
                    enabled = true;
 | 
					                    enabled = true
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Label{text: Math.round(txtslider.value * 100) + "%"}
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: Math.round(txtslider.value * 100) + "%"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Label{text: qsTr("Bloom Quality")}
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Bloom Quality")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            Slider {
 | 
					            Slider {
 | 
				
			||||||
                Layout.fillWidth: true
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
                Layout.columnSpan: 2
 | 
					                Layout.columnSpan: 2
 | 
				
			||||||
                id: bloomSlider
 | 
					                id: bloomSlider
 | 
				
			||||||
                onValueChanged: if (enabled) appSettings.bloomQuality = value;
 | 
					                onValueChanged: if (enabled)
 | 
				
			||||||
 | 
					                                    appSettings.bloomQuality = value
 | 
				
			||||||
                stepSize: 0.05
 | 
					                stepSize: 0.05
 | 
				
			||||||
                enabled: false
 | 
					                enabled: false
 | 
				
			||||||
                Component.onCompleted: {
 | 
					                Component.onCompleted: {
 | 
				
			||||||
                    from = 0.25
 | 
					                    from = 0.25
 | 
				
			||||||
                    value = appSettings.bloomQuality;
 | 
					                    value = appSettings.bloomQuality
 | 
				
			||||||
                    enabled = true;
 | 
					                    enabled = true
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Label{text: Math.round(bloomSlider.value * 100) + "%"}
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: Math.round(bloomSlider.value * 100) + "%"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Label{text: qsTr("BurnIn Quality")}
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("BurnIn Quality")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            Slider {
 | 
					            Slider {
 | 
				
			||||||
                Layout.fillWidth: true
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
                id: burnInSlider
 | 
					                id: burnInSlider
 | 
				
			||||||
                Layout.columnSpan: 2
 | 
					                Layout.columnSpan: 2
 | 
				
			||||||
                onValueChanged: if (enabled) appSettings.burnInQuality = value;
 | 
					                onValueChanged: if (enabled)
 | 
				
			||||||
 | 
					                                    appSettings.burnInQuality = value
 | 
				
			||||||
                stepSize: 0.05
 | 
					                stepSize: 0.05
 | 
				
			||||||
                enabled: false
 | 
					                enabled: false
 | 
				
			||||||
                Component.onCompleted: {
 | 
					                Component.onCompleted: {
 | 
				
			||||||
                    from = 0.25
 | 
					                    from = 0.25
 | 
				
			||||||
                    value = appSettings.burnInQuality;
 | 
					                    value = appSettings.burnInQuality
 | 
				
			||||||
                    enabled = true;
 | 
					                    enabled = true
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Label{text: Math.round(burnInSlider.value * 100) + "%"}
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: Math.round(burnInSlider.value * 100) + "%"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            CheckBox {
 | 
					            CheckBox {
 | 
				
			||||||
                Layout.columnSpan: 2
 | 
					                Layout.columnSpan: 2
 | 
				
			||||||
                text: qsTr("Burnin optimization (Might display timing artifacts)")
 | 
					                text: qsTr("Burnin optimization (Might display timing artifacts)")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 2.0
 | 
					import QtQuick.Controls 2.0
 | 
				
			||||||
import QtQuick.Layouts 1.1
 | 
					import QtQuick.Layouts 1.1
 | 
				
			||||||
@@ -54,34 +53,34 @@ ColumnLayout{
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            CheckableSlider {
 | 
					            CheckableSlider {
 | 
				
			||||||
                name: qsTr("Glow Line")
 | 
					                name: qsTr("Glow Line")
 | 
				
			||||||
                onNewValue: appSettings.glowingLine = newValue;
 | 
					                onNewValue: appSettings.glowingLine = newValue
 | 
				
			||||||
                value: appSettings.glowingLine
 | 
					                value: appSettings.glowingLine
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            CheckableSlider {
 | 
					            CheckableSlider {
 | 
				
			||||||
                name: qsTr("Screen Curvature")
 | 
					                name: qsTr("Screen Curvature")
 | 
				
			||||||
                onNewValue: appSettings.screenCurvature = newValue;
 | 
					                onNewValue: appSettings.screenCurvature = newValue
 | 
				
			||||||
                value: appSettings.screenCurvature;
 | 
					                value: appSettings.screenCurvature
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            CheckableSlider {
 | 
					            CheckableSlider {
 | 
				
			||||||
                name: qsTr("Ambient Light")
 | 
					                name: qsTr("Ambient Light")
 | 
				
			||||||
                onNewValue: appSettings.ambientLight = newValue;
 | 
					                onNewValue: appSettings.ambientLight = newValue
 | 
				
			||||||
                value: appSettings.ambientLight
 | 
					                value: appSettings.ambientLight
 | 
				
			||||||
                enabled: appSettings.framesIndex !== 0
 | 
					                enabled: appSettings.framesIndex !== 0
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            CheckableSlider {
 | 
					            CheckableSlider {
 | 
				
			||||||
                name: qsTr("Flickering")
 | 
					                name: qsTr("Flickering")
 | 
				
			||||||
                onNewValue: appSettings.flickering = newValue;
 | 
					                onNewValue: appSettings.flickering = newValue
 | 
				
			||||||
                value: appSettings.flickering;
 | 
					                value: appSettings.flickering
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            CheckableSlider {
 | 
					            CheckableSlider {
 | 
				
			||||||
                name: qsTr("Horizontal Sync")
 | 
					                name: qsTr("Horizontal Sync")
 | 
				
			||||||
                onNewValue: appSettings.horizontalSync = newValue;
 | 
					                onNewValue: appSettings.horizontalSync = newValue
 | 
				
			||||||
                value: appSettings.horizontalSync;
 | 
					                value: appSettings.horizontalSync
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            CheckableSlider {
 | 
					            CheckableSlider {
 | 
				
			||||||
                name: qsTr("RGB Shift")
 | 
					                name: qsTr("RGB Shift")
 | 
				
			||||||
                onNewValue: appSettings.rbgShift = newValue;
 | 
					                onNewValue: appSettings.rbgShift = newValue
 | 
				
			||||||
                value: appSettings.rbgShift;
 | 
					                value: appSettings.rbgShift
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 2.4
 | 
					import QtQuick.Controls 2.4
 | 
				
			||||||
import QtQuick.Layouts 1.1
 | 
					import QtQuick.Layouts 1.1
 | 
				
			||||||
@@ -56,7 +55,7 @@ ColumnLayout{
 | 
				
			|||||||
                    Layout.fillWidth: true
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
                    text: qsTr("Save")
 | 
					                    text: qsTr("Save")
 | 
				
			||||||
                    onClicked: {
 | 
					                    onClicked: {
 | 
				
			||||||
                        insertname.profileName = "";
 | 
					                        insertname.profileName = ""
 | 
				
			||||||
                        insertname.show()
 | 
					                        insertname.show()
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -66,9 +65,9 @@ ColumnLayout{
 | 
				
			|||||||
                    enabled: currentIndex >= 0
 | 
					                    enabled: currentIndex >= 0
 | 
				
			||||||
                    text: qsTr("Load")
 | 
					                    text: qsTr("Load")
 | 
				
			||||||
                    onClicked: {
 | 
					                    onClicked: {
 | 
				
			||||||
                        var index = currentIndex;
 | 
					                        var index = currentIndex
 | 
				
			||||||
                        if (index >= 0)
 | 
					                        if (index >= 0)
 | 
				
			||||||
                            appSettings.loadProfile(index);
 | 
					                            appSettings.loadProfile(index)
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                Button {
 | 
					                Button {
 | 
				
			||||||
@@ -76,14 +75,15 @@ ColumnLayout{
 | 
				
			|||||||
                    text: qsTr("Remove")
 | 
					                    text: qsTr("Remove")
 | 
				
			||||||
                    property alias currentIndex: profilesView.currentIndex
 | 
					                    property alias currentIndex: profilesView.currentIndex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin
 | 
					                    enabled: currentIndex >= 0 && !appSettings.profilesList.get(
 | 
				
			||||||
 | 
					                                 currentIndex).builtin
 | 
				
			||||||
                    onClicked: {
 | 
					                    onClicked: {
 | 
				
			||||||
                        appSettings.profilesList.remove(currentIndex);
 | 
					                        appSettings.profilesList.remove(currentIndex)
 | 
				
			||||||
                        profilesView.selection.clear();
 | 
					                        profilesView.selection.clear()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        // TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2.
 | 
					                        // TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2.
 | 
				
			||||||
                        profilesView.model = 0;
 | 
					                        profilesView.model = 0
 | 
				
			||||||
                        profilesView.model = appSettings.profilesList;
 | 
					                        profilesView.model = appSettings.profilesList
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                Item {
 | 
					                Item {
 | 
				
			||||||
@@ -94,31 +94,36 @@ ColumnLayout{
 | 
				
			|||||||
                    Layout.fillWidth: true
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
                    text: qsTr("Import")
 | 
					                    text: qsTr("Import")
 | 
				
			||||||
                    onClicked: {
 | 
					                    onClicked: {
 | 
				
			||||||
                        fileDialog.selectExisting = true;
 | 
					                        fileDialog.selectExisting = true
 | 
				
			||||||
                        fileDialog.callBack = function (url) {loadFile(url);};
 | 
					                        fileDialog.callBack = function (url) {
 | 
				
			||||||
                        fileDialog.open();
 | 
					                            loadFile(url)
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        fileDialog.open()
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    function loadFile(url) {
 | 
					                    function loadFile(url) {
 | 
				
			||||||
                        try {
 | 
					                        try {
 | 
				
			||||||
                            if (appSettings.verbose)
 | 
					                            if (appSettings.verbose)
 | 
				
			||||||
                                console.log("Loading file: " + url);
 | 
					                                console.log("Loading file: " + url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            var profileObject = JSON.parse(fileIO.read(url));
 | 
					                            var profileObject = JSON.parse(fileIO.read(url))
 | 
				
			||||||
                            var name = profileObject.name;
 | 
					                            var name = profileObject.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            if (!name)
 | 
					                            if (!name)
 | 
				
			||||||
                                throw "Profile doesn't have a name";
 | 
					                                throw "Profile doesn't have a name"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            var version = profileObject.version !== undefined ? profileObject.version : 1;
 | 
					                            var version = profileObject.version
 | 
				
			||||||
 | 
					                                    !== undefined ? profileObject.version : 1
 | 
				
			||||||
                            if (version !== appSettings.profileVersion)
 | 
					                            if (version !== appSettings.profileVersion)
 | 
				
			||||||
                                throw "This profile is not supported on this version of CRT.";
 | 
					                                throw "This profile is not supported on this version of CRT."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            delete profileObject.name;
 | 
					                            delete profileObject.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            appSettings.appendCustomProfile(name, JSON.stringify(profileObject));
 | 
					                            appSettings.appendCustomProfile(name,
 | 
				
			||||||
 | 
					                                                            JSON.stringify(
 | 
				
			||||||
 | 
					                                                                profileObject))
 | 
				
			||||||
                        } catch (err) {
 | 
					                        } catch (err) {
 | 
				
			||||||
                            messageDialog.text = qsTr(err)
 | 
					                            messageDialog.text = qsTr(err)
 | 
				
			||||||
                            messageDialog.open();
 | 
					                            messageDialog.open()
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -128,36 +133,45 @@ ColumnLayout{
 | 
				
			|||||||
                    Layout.fillWidth: true
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    text: qsTr("Export")
 | 
					                    text: qsTr("Export")
 | 
				
			||||||
                    enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin
 | 
					                    enabled: currentIndex >= 0 && !appSettings.profilesList.get(
 | 
				
			||||||
 | 
					                                 currentIndex).builtin
 | 
				
			||||||
                    onClicked: {
 | 
					                    onClicked: {
 | 
				
			||||||
                        fileDialog.selectExisting = false;
 | 
					                        fileDialog.selectExisting = false
 | 
				
			||||||
                        fileDialog.callBack = function (url) {storeFile(url);};
 | 
					                        fileDialog.callBack = function (url) {
 | 
				
			||||||
                        fileDialog.open();
 | 
					                            storeFile(url)
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        fileDialog.open()
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    function storeFile(url) {
 | 
					                    function storeFile(url) {
 | 
				
			||||||
                        try {
 | 
					                        try {
 | 
				
			||||||
                            var urlString = url.toString();
 | 
					                            var urlString = url.toString()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            // Fix the extension if it's missing.
 | 
					                            // Fix the extension if it's missing.
 | 
				
			||||||
                            var extension = urlString.substring(urlString.length - 5, urlString.length);
 | 
					                            var extension = urlString.substring(
 | 
				
			||||||
                            var urlTail = (extension === ".json" ? "" : ".json");
 | 
					                                        urlString.length - 5, urlString.length)
 | 
				
			||||||
                            url += urlTail;
 | 
					                            var urlTail = (extension === ".json" ? "" : ".json")
 | 
				
			||||||
 | 
					                            url += urlTail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            if (true)
 | 
					                            if (true)
 | 
				
			||||||
                                console.log("Storing file: " + url);
 | 
					                                console.log("Storing file: " + url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            var profileObject = appSettings.profilesList.get(currentIndex);
 | 
					                            var profileObject = appSettings.profilesList.get(
 | 
				
			||||||
                            var profileSettings = JSON.parse(profileObject.obj_string);
 | 
					                                        currentIndex)
 | 
				
			||||||
                            profileSettings["name"] = profileObject.text;
 | 
					                            var profileSettings = JSON.parse(
 | 
				
			||||||
                            profileSettings["version"] = appSettings.profileVersion;
 | 
					                                        profileObject.obj_string)
 | 
				
			||||||
 | 
					                            profileSettings["name"] = profileObject.text
 | 
				
			||||||
 | 
					                            profileSettings["version"] = appSettings.profileVersion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            var result = fileIO.write(url, JSON.stringify(profileSettings, undefined, 2));
 | 
					                            var result = fileIO.write(url, JSON.stringify(
 | 
				
			||||||
 | 
					                                                          profileSettings,
 | 
				
			||||||
 | 
					                                                          undefined, 2))
 | 
				
			||||||
                            if (!result)
 | 
					                            if (!result)
 | 
				
			||||||
                                throw "The file could not be written.";
 | 
					                                throw "The file could not be written."
 | 
				
			||||||
                        } catch (err) {
 | 
					                        } catch (err) {
 | 
				
			||||||
                            console.log(err);
 | 
					                            console.log(err)
 | 
				
			||||||
                            messageDialog.text = qsTr("There has been an error storing the file.")
 | 
					                            messageDialog.text = qsTr(
 | 
				
			||||||
                            messageDialog.open();
 | 
					                                        "There has been an error storing the file.")
 | 
				
			||||||
 | 
					                            messageDialog.open()
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -171,22 +185,30 @@ ColumnLayout{
 | 
				
			|||||||
        GridLayout {
 | 
					        GridLayout {
 | 
				
			||||||
            anchors.fill: parent
 | 
					            anchors.fill: parent
 | 
				
			||||||
            columns: 2
 | 
					            columns: 2
 | 
				
			||||||
            Label{ text: qsTr("Brightness") }
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Brightness")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            SimpleSlider {
 | 
					            SimpleSlider {
 | 
				
			||||||
                onValueChanged: appSettings.brightness = value
 | 
					                onValueChanged: appSettings.brightness = value
 | 
				
			||||||
                value: appSettings.brightness
 | 
					                value: appSettings.brightness
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Label{ text: qsTr("Contrast") }
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Contrast")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            SimpleSlider {
 | 
					            SimpleSlider {
 | 
				
			||||||
                onValueChanged: appSettings.contrast = value
 | 
					                onValueChanged: appSettings.contrast = value
 | 
				
			||||||
                value: appSettings.contrast
 | 
					                value: appSettings.contrast
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Label{ text: qsTr("Margin") }
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Margin")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            SimpleSlider {
 | 
					            SimpleSlider {
 | 
				
			||||||
                onValueChanged: appSettings._margin = value
 | 
					                onValueChanged: appSettings._margin = value
 | 
				
			||||||
                value: appSettings._margin
 | 
					                value: appSettings._margin
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Label{ text: qsTr("Opacity") }
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Opacity")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            SimpleSlider {
 | 
					            SimpleSlider {
 | 
				
			||||||
                onValueChanged: appSettings.windowOpacity = value
 | 
					                onValueChanged: appSettings.windowOpacity = value
 | 
				
			||||||
                value: appSettings.windowOpacity
 | 
					                value: appSettings.windowOpacity
 | 
				
			||||||
@@ -198,14 +220,15 @@ ColumnLayout{
 | 
				
			|||||||
    InsertNameDialog {
 | 
					    InsertNameDialog {
 | 
				
			||||||
        id: insertname
 | 
					        id: insertname
 | 
				
			||||||
        onNameSelected: {
 | 
					        onNameSelected: {
 | 
				
			||||||
            appSettings.appendCustomProfile(name, appSettings.composeProfileString());
 | 
					            appSettings.appendCustomProfile(name,
 | 
				
			||||||
 | 
					                                            appSettings.composeProfileString())
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    MessageDialog {
 | 
					    MessageDialog {
 | 
				
			||||||
        id: messageDialog
 | 
					        id: messageDialog
 | 
				
			||||||
        title: qsTr("File Error")
 | 
					        title: qsTr("File Error")
 | 
				
			||||||
        onAccepted: {
 | 
					        onAccepted: {
 | 
				
			||||||
            messageDialog.close();
 | 
					            messageDialog.close()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Loader {
 | 
					    Loader {
 | 
				
			||||||
@@ -218,18 +241,18 @@ ColumnLayout{
 | 
				
			|||||||
            selectMultiple: false
 | 
					            selectMultiple: false
 | 
				
			||||||
            selectFolder: false
 | 
					            selectFolder: false
 | 
				
			||||||
            selectExisting: fileDialog.selectExisting
 | 
					            selectExisting: fileDialog.selectExisting
 | 
				
			||||||
            onAccepted: callBack(fileUrl);
 | 
					            onAccepted: callBack(fileUrl)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        onSelectExistingChanged: reload()
 | 
					        onSelectExistingChanged: reload()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function open() {
 | 
					        function open() {
 | 
				
			||||||
            item.open();
 | 
					            item.open()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function reload() {
 | 
					        function reload() {
 | 
				
			||||||
            active = false;
 | 
					            active = false
 | 
				
			||||||
            active = true;
 | 
					            active = true
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 2.1
 | 
					import QtQuick.Controls 2.1
 | 
				
			||||||
import QtQuick.Layouts 1.1
 | 
					import QtQuick.Layouts 1.1
 | 
				
			||||||
@@ -33,7 +32,9 @@ ColumnLayout{
 | 
				
			|||||||
        GridLayout {
 | 
					        GridLayout {
 | 
				
			||||||
            anchors.fill: parent
 | 
					            anchors.fill: parent
 | 
				
			||||||
            columns: 2
 | 
					            columns: 2
 | 
				
			||||||
            Label { text: qsTr("Rasterization") }
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Rasterization")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            ComboBox {
 | 
					            ComboBox {
 | 
				
			||||||
                id: rasterizationBox
 | 
					                id: rasterizationBox
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -46,30 +47,34 @@ ColumnLayout{
 | 
				
			|||||||
                    appSettings.rasterization = currentIndex
 | 
					                    appSettings.rasterization = currentIndex
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Label{ text: qsTr("Name") }
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Name")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            ComboBox {
 | 
					            ComboBox {
 | 
				
			||||||
                id: fontChanger
 | 
					                id: fontChanger
 | 
				
			||||||
                Layout.fillWidth: true
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
                model: appSettings.fontlist
 | 
					                model: appSettings.fontlist
 | 
				
			||||||
                textRole: "text"
 | 
					                textRole: "text"
 | 
				
			||||||
                onActivated: {
 | 
					                onActivated: {
 | 
				
			||||||
                    var name = appSettings.fontlist.get(index).name;
 | 
					                    var name = appSettings.fontlist.get(index).name
 | 
				
			||||||
                    appSettings.fontNames[appSettings.rasterization] = name;
 | 
					                    appSettings.fontNames[appSettings.rasterization] = name
 | 
				
			||||||
                    appSettings.handleFontChanged();
 | 
					                    appSettings.handleFontChanged()
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                function updateIndex() {
 | 
					                function updateIndex() {
 | 
				
			||||||
                    var name = appSettings.fontNames[appSettings.rasterization];
 | 
					                    var name = appSettings.fontNames[appSettings.rasterization]
 | 
				
			||||||
                    var index = appSettings.getIndexByName(name);
 | 
					                    var index = appSettings.getIndexByName(name)
 | 
				
			||||||
                    if (index !== undefined)
 | 
					                    if (index !== undefined)
 | 
				
			||||||
                        currentIndex = index;
 | 
					                        currentIndex = index
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                Connections {
 | 
					                Connections {
 | 
				
			||||||
                    target: appSettings
 | 
					                    target: appSettings
 | 
				
			||||||
                    onTerminalFontChanged: fontChanger.updateIndex();
 | 
					                    onTerminalFontChanged: fontChanger.updateIndex()
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                Component.onCompleted: updateIndex();
 | 
					                Component.onCompleted: updateIndex()
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Scaling")
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Label{ text: qsTr("Scaling") }
 | 
					 | 
				
			||||||
            RowLayout {
 | 
					            RowLayout {
 | 
				
			||||||
                Layout.fillWidth: true
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
                Slider {
 | 
					                Slider {
 | 
				
			||||||
@@ -78,20 +83,22 @@ ColumnLayout{
 | 
				
			|||||||
                    onValueChanged: appSettings.fontScaling = value
 | 
					                    onValueChanged: appSettings.fontScaling = value
 | 
				
			||||||
                    value: appSettings.fontScaling
 | 
					                    value: appSettings.fontScaling
 | 
				
			||||||
                    stepSize: 0.05
 | 
					                    stepSize: 0.05
 | 
				
			||||||
                    from: appSettings.minimumFontScaling;
 | 
					                    from: appSettings.minimumFontScaling
 | 
				
			||||||
                    to: appSettings.maximumFontScaling;
 | 
					                    to: appSettings.maximumFontScaling
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                SizedLabel {
 | 
					                SizedLabel {
 | 
				
			||||||
                    text: Math.round(fontScalingChanger.value * 100) + "%"
 | 
					                    text: Math.round(fontScalingChanger.value * 100) + "%"
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Label{ text: qsTr("Font Width") }
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Font Width")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            RowLayout {
 | 
					            RowLayout {
 | 
				
			||||||
                Layout.fillWidth: true
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
                Slider {
 | 
					                Slider {
 | 
				
			||||||
                    Layout.fillWidth: true
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
                    id: widthChanger
 | 
					                    id: widthChanger
 | 
				
			||||||
                    onValueChanged: appSettings.fontWidth = value;
 | 
					                    onValueChanged: appSettings.fontWidth = value
 | 
				
			||||||
                    value: appSettings.fontWidth
 | 
					                    value: appSettings.fontWidth
 | 
				
			||||||
                    stepSize: 0.05
 | 
					                    stepSize: 0.05
 | 
				
			||||||
                    from: 0.5
 | 
					                    from: 0.5
 | 
				
			||||||
@@ -146,14 +153,14 @@ ColumnLayout{
 | 
				
			|||||||
                    name: qsTr("Font")
 | 
					                    name: qsTr("Font")
 | 
				
			||||||
                    height: 50
 | 
					                    height: 50
 | 
				
			||||||
                    Layout.fillWidth: true
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
                    onColorSelected: appSettings._fontColor = color;
 | 
					                    onColorSelected: appSettings._fontColor = color
 | 
				
			||||||
                    color: appSettings._fontColor
 | 
					                    color: appSettings._fontColor
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                ColorButton {
 | 
					                ColorButton {
 | 
				
			||||||
                    name: qsTr("Background")
 | 
					                    name: qsTr("Background")
 | 
				
			||||||
                    height: 50
 | 
					                    height: 50
 | 
				
			||||||
                    Layout.fillWidth: true
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
                    onColorSelected: appSettings._backgroundColor = color;
 | 
					                    onColorSelected: appSettings._backgroundColor = color
 | 
				
			||||||
                    color: appSettings._backgroundColor
 | 
					                    color: appSettings._backgroundColor
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 2.0
 | 
					import QtQuick.Controls 2.0
 | 
				
			||||||
import QtQuick.Layouts 1.1
 | 
					import QtQuick.Layouts 1.1
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,12 +17,12 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Rectangle {
 | 
					Rectangle {
 | 
				
			||||||
    property size terminalSize
 | 
					    property size terminalSize
 | 
				
			||||||
    property real topOpacity: 0.6
 | 
					    property real topOpacity: 0.6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    width: textSize.width * 2
 | 
					    width: textSize.width * 2
 | 
				
			||||||
    height: textSize.height * 2
 | 
					    height: textSize.height * 2
 | 
				
			||||||
    radius: 5
 | 
					    radius: 5
 | 
				
			||||||
@@ -31,7 +31,11 @@ Rectangle{
 | 
				
			|||||||
    color: "black"
 | 
					    color: "black"
 | 
				
			||||||
    opacity: sizetimer.running ? 0.6 : 0.0
 | 
					    opacity: sizetimer.running ? 0.6 : 0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Behavior on opacity{NumberAnimation{duration: 200}}
 | 
					    Behavior on opacity {
 | 
				
			||||||
 | 
					        NumberAnimation {
 | 
				
			||||||
 | 
					            duration: 200
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    onTerminalSizeChanged: sizetimer.restart()
 | 
					    onTerminalSizeChanged: sizetimer.restart()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,23 @@
 | 
				
			|||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					* 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.0
 | 
					import QtQuick 2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "utils.js" as Utils
 | 
					import "utils.js" as Utils
 | 
				
			||||||
@@ -6,12 +26,10 @@ Loader {
 | 
				
			|||||||
    property ShaderEffectSource source: item ? item.source : null
 | 
					    property ShaderEffectSource source: item ? item.source : null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    active: !appSettings.useFastBurnIn && appSettings.burnIn !== 0
 | 
					    active: !appSettings.useFastBurnIn && appSettings.burnIn !== 0
 | 
				
			||||||
 | 
					 | 
				
			||||||
    anchors.fill: parent
 | 
					    anchors.fill: parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sourceComponent: Item {
 | 
					    sourceComponent: Item {
 | 
				
			||||||
        property alias source: burnInSourceEffect
 | 
					        property alias source: burnInSourceEffect
 | 
				
			||||||
 | 
					 | 
				
			||||||
        property int burnInScaling: scaleTexture * appSettings.burnInQuality
 | 
					        property int burnInScaling: scaleTexture * appSettings.burnInQuality
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ShaderEffectSource {
 | 
					        ShaderEffectSource {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -27,7 +27,7 @@ QtObject {
 | 
				
			|||||||
    property bool initialized: false
 | 
					    property bool initialized: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function getDatabase() {
 | 
					    function getDatabase() {
 | 
				
			||||||
         return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000);
 | 
					         return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function initialize() {
 | 
					    function initialize() {
 | 
				
			||||||
@@ -35,9 +35,10 @@ QtObject {
 | 
				
			|||||||
        db.transaction(
 | 
					        db.transaction(
 | 
				
			||||||
            function(tx) {
 | 
					            function(tx) {
 | 
				
			||||||
                tx.executeSql('CREATE TABLE IF NOT EXISTS settings(setting TEXT UNIQUE, value TEXT)');
 | 
					                tx.executeSql('CREATE TABLE IF NOT EXISTS settings(setting TEXT UNIQUE, value TEXT)');
 | 
				
			||||||
          });
 | 
					            }
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        initialized = true;
 | 
					        initialized = true
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function setSetting(setting, value) {
 | 
					    function setSetting(setting, value) {
 | 
				
			||||||
@@ -45,7 +46,8 @@ QtObject {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        var db = getDatabase();
 | 
					        var db = getDatabase();
 | 
				
			||||||
        var res = "";
 | 
					        var res = "";
 | 
				
			||||||
       db.transaction(function(tx) {
 | 
					        db.transaction(
 | 
				
			||||||
 | 
					            function(tx) {
 | 
				
			||||||
                var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]);
 | 
					                var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]);
 | 
				
			||||||
                //console.log(rs.rowsAffected)
 | 
					                //console.log(rs.rowsAffected)
 | 
				
			||||||
                if (rs.rowsAffected > 0) {
 | 
					                if (rs.rowsAffected > 0) {
 | 
				
			||||||
@@ -54,23 +56,25 @@ QtObject {
 | 
				
			|||||||
                    res = "Error";
 | 
					                    res = "Error";
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
           }
 | 
					           }
 | 
				
			||||||
      );
 | 
					      )
 | 
				
			||||||
      // The function returns “OK” if it was successful, or “Error” if it wasn't
 | 
					      // The function returns “OK” if it was successful, or “Error” if it wasn't
 | 
				
			||||||
      return res;
 | 
					      return res
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function getSetting(setting) {
 | 
					    function getSetting(setting) {
 | 
				
			||||||
        if(!initialized) initialize();
 | 
					        if(!initialized) initialize();
 | 
				
			||||||
        var db = getDatabase();
 | 
					        var db = getDatabase();
 | 
				
			||||||
        var res = "";
 | 
					        var res = "";
 | 
				
			||||||
       db.transaction(function(tx) {
 | 
					        db.transaction(
 | 
				
			||||||
 | 
					            function(tx) {
 | 
				
			||||||
                var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]);
 | 
					                var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]);
 | 
				
			||||||
                if (rs.rows.length > 0) {
 | 
					                if (rs.rows.length > 0) {
 | 
				
			||||||
                res = rs.rows.item(0).value;
 | 
					                res = rs.rows.item(0).value;
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                res = undefined;
 | 
					                res = undefined;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
      })
 | 
					            }
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
        return res
 | 
					        return res
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -79,6 +83,7 @@ QtObject {
 | 
				
			|||||||
        db.transaction(
 | 
					        db.transaction(
 | 
				
			||||||
            function(tx) {
 | 
					            function(tx) {
 | 
				
			||||||
                tx.executeSql('DROP TABLE settings');
 | 
					                tx.executeSql('DROP TABLE settings');
 | 
				
			||||||
          });
 | 
					            }
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,22 @@
 | 
				
			|||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					* 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 2.2
 | 
				
			||||||
import QtGraphicalEffects 1.0
 | 
					import QtGraphicalEffects 1.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -26,7 +45,6 @@ ShaderTerminal {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //  EFFECTS  ////////////////////////////////////////////////////////////////
 | 
					    //  EFFECTS  ////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					 | 
				
			||||||
    Loader {
 | 
					    Loader {
 | 
				
			||||||
        id: bloomEffectLoader
 | 
					        id: bloomEffectLoader
 | 
				
			||||||
        active: appSettings.bloom
 | 
					        active: appSettings.bloom
 | 
				
			||||||
@@ -35,7 +53,7 @@ ShaderTerminal {
 | 
				
			|||||||
        height: parent.height * appSettings.bloomQuality
 | 
					        height: parent.height * appSettings.bloomQuality
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        sourceComponent: FastBlur {
 | 
					        sourceComponent: FastBlur {
 | 
				
			||||||
            radius: Utils.lint(16, 64, appSettings.bloomQuality);
 | 
					            radius: Utils.lint(16, 64, appSettings.bloomQuality)
 | 
				
			||||||
            source: terminal.mainSource
 | 
					            source: terminal.mainSource
 | 
				
			||||||
            transparentBorder: true
 | 
					            transparentBorder: true
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -54,71 +72,4 @@ ShaderTerminal {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bloomSource: bloomSourceLoader.item
 | 
					    bloomSource: bloomSourceLoader.item
 | 
				
			||||||
 | 
					 | 
				
			||||||
//    NewTerminalFrame {
 | 
					 | 
				
			||||||
//        id: terminalFrame
 | 
					 | 
				
			||||||
//        anchors.fill: parent
 | 
					 | 
				
			||||||
//        blending: true
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // This shader might be useful in the future. Since we used it only for a couple
 | 
					 | 
				
			||||||
    // of calculations is probably best to move those in the main shader. If in the future
 | 
					 | 
				
			||||||
    // we need to store another fullScreen channel this might be handy.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//    ShaderEffect {
 | 
					 | 
				
			||||||
//        id: rasterizationEffect
 | 
					 | 
				
			||||||
//        width: parent.width
 | 
					 | 
				
			||||||
//        height: parent.height
 | 
					 | 
				
			||||||
//        property real outColor: 0.0
 | 
					 | 
				
			||||||
//        property real dispX: (5 / width) * appSettings.windowScaling
 | 
					 | 
				
			||||||
//        property real dispY: (5 / height) * appSettings.windowScaling
 | 
					 | 
				
			||||||
//        property size virtual_resolution: terminal.virtualResolution
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//        blending: false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//        fragmentShader:
 | 
					 | 
				
			||||||
//            "uniform lowp float qt_Opacity;" +
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//            "varying highp vec2 qt_TexCoord0;
 | 
					 | 
				
			||||||
//             uniform highp vec2 virtual_resolution;
 | 
					 | 
				
			||||||
//             uniform highp float dispX;
 | 
					 | 
				
			||||||
//             uniform highp float dispY;
 | 
					 | 
				
			||||||
//             uniform mediump float outColor;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//             highp float getScanlineIntensity(vec2 coords) {
 | 
					 | 
				
			||||||
//                 highp float result = 1.0;" +
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//                (appSettings.rasterization != appSettings.no_rasterization ?
 | 
					 | 
				
			||||||
//                    "result *= abs(sin(coords.y * virtual_resolution.y * "+Math.PI+"));" : "") +
 | 
					 | 
				
			||||||
//                (appSettings.rasterization == appSettings.pixel_rasterization ?
 | 
					 | 
				
			||||||
//                    "result *= abs(sin(coords.x * virtual_resolution.x * "+Math.PI+"));" : "") + "
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//                return result;
 | 
					 | 
				
			||||||
//             }" +
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//            "void main() {" +
 | 
					 | 
				
			||||||
//                "highp float color = getScanlineIntensity(qt_TexCoord0);" +
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//                "float distance = length(vec2(0.5) - qt_TexCoord0);" +
 | 
					 | 
				
			||||||
//                "color = mix(color, 0.0, 1.2 * distance * distance);" +
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//                "color *= outColor + smoothstep(0.00, dispX, qt_TexCoord0.x) * (1.0 - outColor);" +
 | 
					 | 
				
			||||||
//                "color *= outColor + smoothstep(0.00, dispY, qt_TexCoord0.y) * (1.0 - outColor);" +
 | 
					 | 
				
			||||||
//                "color *= outColor + (1.0 - smoothstep(1.00 - dispX, 1.00, qt_TexCoord0.x)) * (1.0 - outColor);" +
 | 
					 | 
				
			||||||
//                "color *= outColor + (1.0 - smoothstep(1.00 - dispY, 1.00, qt_TexCoord0.y)) * (1.0 - outColor);" +
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//                "gl_FragColor.a = color;" +
 | 
					 | 
				
			||||||
//            "}"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//        onStatusChanged: if (log) console.log(log) //Print warning messages
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//    rasterizationSource: ShaderEffectSource{
 | 
					 | 
				
			||||||
//        id: rasterizationEffectSource
 | 
					 | 
				
			||||||
//        sourceItem: rasterizationEffect
 | 
					 | 
				
			||||||
//        hideSource: true
 | 
					 | 
				
			||||||
//        smooth: true
 | 
					 | 
				
			||||||
//        wrapMode: ShaderEffectSource.ClampToEdge
 | 
					 | 
				
			||||||
//        visible: false
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Timer {
 | 
					Timer {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Window 2.1
 | 
					import QtQuick.Window 2.1
 | 
				
			||||||
import QtQuick.Controls 2.3
 | 
					import QtQuick.Controls 2.3
 | 
				
			||||||
@@ -78,7 +77,7 @@ ApplicationWindow{
 | 
				
			|||||||
        text: qsTr("Fullscreen")
 | 
					        text: qsTr("Fullscreen")
 | 
				
			||||||
        enabled: Qt.platform.os !== "osx"
 | 
					        enabled: Qt.platform.os !== "osx"
 | 
				
			||||||
        shortcut: "Alt+F11"
 | 
					        shortcut: "Alt+F11"
 | 
				
			||||||
        onTriggered: appSettings.fullscreen = !appSettings.fullscreen;
 | 
					        onTriggered: appSettings.fullscreen = !appSettings.fullscreen
 | 
				
			||||||
        checkable: true
 | 
					        checkable: true
 | 
				
			||||||
        checked: appSettings.fullscreen
 | 
					        checked: appSettings.fullscreen
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -86,15 +85,15 @@ ApplicationWindow{
 | 
				
			|||||||
        id: quitAction
 | 
					        id: quitAction
 | 
				
			||||||
        text: qsTr("Quit")
 | 
					        text: qsTr("Quit")
 | 
				
			||||||
        shortcut: "Ctrl+Shift+Q"
 | 
					        shortcut: "Ctrl+Shift+Q"
 | 
				
			||||||
        onTriggered: Qt.quit();
 | 
					        onTriggered: Qt.quit()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Action {
 | 
					    Action {
 | 
				
			||||||
        id: showsettingsAction
 | 
					        id: showsettingsAction
 | 
				
			||||||
        text: qsTr("Settings")
 | 
					        text: qsTr("Settings")
 | 
				
			||||||
        onTriggered: {
 | 
					        onTriggered: {
 | 
				
			||||||
            settingswindow.show();
 | 
					            settingswindow.show()
 | 
				
			||||||
            settingswindow.requestActivate();
 | 
					            settingswindow.requestActivate()
 | 
				
			||||||
            settingswindow.raise();
 | 
					            settingswindow.raise()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Action {
 | 
					    Action {
 | 
				
			||||||
@@ -111,21 +110,21 @@ ApplicationWindow{
 | 
				
			|||||||
        id: zoomIn
 | 
					        id: zoomIn
 | 
				
			||||||
        text: qsTr("Zoom In")
 | 
					        text: qsTr("Zoom In")
 | 
				
			||||||
        shortcut: "Ctrl++"
 | 
					        shortcut: "Ctrl++"
 | 
				
			||||||
        onTriggered: appSettings.incrementScaling();
 | 
					        onTriggered: appSettings.incrementScaling()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Action {
 | 
					    Action {
 | 
				
			||||||
        id: zoomOut
 | 
					        id: zoomOut
 | 
				
			||||||
        text: qsTr("Zoom Out")
 | 
					        text: qsTr("Zoom Out")
 | 
				
			||||||
        shortcut: "Ctrl+-"
 | 
					        shortcut: "Ctrl+-"
 | 
				
			||||||
        onTriggered: appSettings.decrementScaling();
 | 
					        onTriggered: appSettings.decrementScaling()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Action {
 | 
					    Action {
 | 
				
			||||||
        id: showAboutAction
 | 
					        id: showAboutAction
 | 
				
			||||||
        text: qsTr("About")
 | 
					        text: qsTr("About")
 | 
				
			||||||
        onTriggered: {
 | 
					        onTriggered: {
 | 
				
			||||||
            aboutDialog.show();
 | 
					            aboutDialog.show()
 | 
				
			||||||
            aboutDialog.requestActivate();
 | 
					            aboutDialog.requestActivate()
 | 
				
			||||||
            aboutDialog.raise();
 | 
					            aboutDialog.raise()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ApplicationSettings {
 | 
					    ApplicationSettings {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,15 +17,20 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 2.3
 | 
					import QtQuick.Controls 2.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Menu {
 | 
					Menu {
 | 
				
			||||||
    id: contextmenu
 | 
					    id: contextmenu
 | 
				
			||||||
    MenuItem { action: copyAction }
 | 
					    MenuItem {
 | 
				
			||||||
    MenuItem { action: pasteAction }
 | 
					        action: copyAction
 | 
				
			||||||
    MenuItem { action: showsettingsAction }
 | 
					    }
 | 
				
			||||||
 | 
					    MenuItem {
 | 
				
			||||||
 | 
					        action: pasteAction
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    MenuItem {
 | 
				
			||||||
 | 
					        action: showsettingsAction
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    MenuSeparator {}
 | 
					    MenuSeparator {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -37,17 +42,33 @@ Menu{
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    Menu {
 | 
					    Menu {
 | 
				
			||||||
        title: qsTr("Edit")
 | 
					        title: qsTr("Edit")
 | 
				
			||||||
        MenuItem {action: copyAction}
 | 
					        MenuItem {
 | 
				
			||||||
        MenuItem {action: pasteAction}
 | 
					            action: copyAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: pasteAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        MenuSeparator {}
 | 
					        MenuSeparator {}
 | 
				
			||||||
        MenuItem {action: showsettingsAction}
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: showsettingsAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Menu {
 | 
					    Menu {
 | 
				
			||||||
        title: qsTr("View")
 | 
					        title: qsTr("View")
 | 
				
			||||||
        MenuItem {action: fullscreenAction; visible: fullscreenAction.enabled}
 | 
					        MenuItem {
 | 
				
			||||||
        MenuItem {action: showMenubarAction; visible: showMenubarAction.enabled}
 | 
					            action: fullscreenAction
 | 
				
			||||||
        MenuItem {action: zoomIn}
 | 
					            visible: fullscreenAction.enabled
 | 
				
			||||||
        MenuItem {action: zoomOut}
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: showMenubarAction
 | 
				
			||||||
 | 
					            visible: showMenubarAction.enabled
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: zoomIn
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: zoomOut
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Menu {
 | 
					    Menu {
 | 
				
			||||||
        id: profilesMenu
 | 
					        id: profilesMenu
 | 
				
			||||||
@@ -57,8 +78,8 @@ Menu{
 | 
				
			|||||||
            delegate: MenuItem {
 | 
					            delegate: MenuItem {
 | 
				
			||||||
                text: model.text
 | 
					                text: model.text
 | 
				
			||||||
                onTriggered: {
 | 
					                onTriggered: {
 | 
				
			||||||
                    appSettings.loadProfileString(obj_string);
 | 
					                    appSettings.loadProfileString(obj_string)
 | 
				
			||||||
                    appSettings.handleFontChanged();
 | 
					                    appSettings.handleFontChanged()
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            onObjectAdded: profilesMenu.insertItem(index, object)
 | 
					            onObjectAdded: profilesMenu.insertItem(index, object)
 | 
				
			||||||
@@ -67,6 +88,8 @@ Menu{
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    Menu {
 | 
					    Menu {
 | 
				
			||||||
        title: qsTr("Help")
 | 
					        title: qsTr("Help")
 | 
				
			||||||
        MenuItem {action: showAboutAction}
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: showAboutAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,12 +17,15 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 2.3
 | 
					import QtQuick.Controls 2.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Menu {
 | 
					Menu {
 | 
				
			||||||
    id: contextmenu
 | 
					    id: contextmenu
 | 
				
			||||||
    MenuItem { action: copyAction }
 | 
					    MenuItem {
 | 
				
			||||||
    MenuItem { action: pasteAction }
 | 
					        action: copyAction
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    MenuItem {
 | 
				
			||||||
 | 
					        action: pasteAction
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 2.3
 | 
					import QtQuick.Controls 2.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -27,21 +26,39 @@ MenuBar {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    Menu {
 | 
					    Menu {
 | 
				
			||||||
        title: qsTr("File")
 | 
					        title: qsTr("File")
 | 
				
			||||||
        MenuItem {action: quitAction}
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: quitAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Menu {
 | 
					    Menu {
 | 
				
			||||||
        title: qsTr("Edit")
 | 
					        title: qsTr("Edit")
 | 
				
			||||||
        MenuItem {action: copyAction}
 | 
					        MenuItem {
 | 
				
			||||||
        MenuItem {action: pasteAction}
 | 
					            action: copyAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: pasteAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        MenuSeparator {}
 | 
					        MenuSeparator {}
 | 
				
			||||||
        MenuItem {action: showsettingsAction}
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: showsettingsAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Menu {
 | 
					    Menu {
 | 
				
			||||||
        title: qsTr("View")
 | 
					        title: qsTr("View")
 | 
				
			||||||
        MenuItem {action: fullscreenAction; visible: fullscreenAction.enabled}
 | 
					        MenuItem {
 | 
				
			||||||
        MenuItem {action: showMenubarAction; visible: showMenubarAction.enabled}
 | 
					            action: fullscreenAction
 | 
				
			||||||
        MenuItem {action: zoomIn}
 | 
					            visible: fullscreenAction.enabled
 | 
				
			||||||
        MenuItem {action: zoomOut}
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: showMenubarAction
 | 
				
			||||||
 | 
					            visible: showMenubarAction.enabled
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: zoomIn
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: zoomOut
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Menu {
 | 
					    Menu {
 | 
				
			||||||
        id: profilesMenu
 | 
					        id: profilesMenu
 | 
				
			||||||
@@ -51,8 +68,8 @@ MenuBar {
 | 
				
			|||||||
            delegate: MenuItem {
 | 
					            delegate: MenuItem {
 | 
				
			||||||
                text: model.text
 | 
					                text: model.text
 | 
				
			||||||
                onTriggered: {
 | 
					                onTriggered: {
 | 
				
			||||||
                    appSettings.loadProfileString(obj_string);
 | 
					                    appSettings.loadProfileString(obj_string)
 | 
				
			||||||
                    appSettings.handleFontChanged();
 | 
					                    appSettings.handleFontChanged()
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            onObjectAdded: profilesMenu.insertItem(index, object)
 | 
					            onObjectAdded: profilesMenu.insertItem(index, object)
 | 
				
			||||||
@@ -61,6 +78,8 @@ MenuBar {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    Menu {
 | 
					    Menu {
 | 
				
			||||||
        title: qsTr("Help")
 | 
					        title: qsTr("Help")
 | 
				
			||||||
        MenuItem {action: showAboutAction}
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: showAboutAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,23 @@
 | 
				
			|||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					* 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/>.
 | 
				
			||||||
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.pragma library
 | 
					.pragma library
 | 
				
			||||||
function clamp(x, min, max) {
 | 
					function clamp(x, min, max) {
 | 
				
			||||||
    if (x <= min)
 | 
					    if (x <= min)
 | 
				
			||||||
@@ -6,15 +26,18 @@ function clamp(x, min, max) {
 | 
				
			|||||||
        return max;
 | 
					        return max;
 | 
				
			||||||
    return x;
 | 
					    return x;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function lint(a, b, t) {
 | 
					function lint(a, b, t) {
 | 
				
			||||||
    return (1 - t) * a + (t) * b;
 | 
					    return (1 - t) * a + (t) * b;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function mix(c1, c2, alpha){
 | 
					function mix(c1, c2, alpha){
 | 
				
			||||||
    return Qt.rgba(c1.r * alpha + c2.r * (1-alpha),
 | 
					    return Qt.rgba(c1.r * alpha + c2.r * (1-alpha),
 | 
				
			||||||
                   c1.g * alpha + c2.g * (1-alpha),
 | 
					                   c1.g * alpha + c2.g * (1-alpha),
 | 
				
			||||||
                   c1.b * alpha + c2.b * (1-alpha),
 | 
					                   c1.b * alpha + c2.b * (1-alpha),
 | 
				
			||||||
                   c1.a * alpha + c2.a * (1-alpha))
 | 
					                   c1.a * alpha + c2.a * (1-alpha))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function strToColor(s){
 | 
					function strToColor(s){
 | 
				
			||||||
    var r = parseInt(s.substring(1,3), 16) / 256;
 | 
					    var r = parseInt(s.substring(1,3), 16) / 256;
 | 
				
			||||||
    var g = parseInt(s.substring(3,5), 16) / 256;
 | 
					    var g = parseInt(s.substring(3,5), 16) / 256;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user