mirror of
https://github.com/Swordfish90/cool-retro-term.git
synced 2025-01-18 20:20:45 +00:00
Merge pull request #665 from Swordfish90/unstable
Improve rasterization and terminal frame. Some refactoring.
This commit is contained in:
commit
cfe35d7795
@ -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
|
||||||
@ -96,16 +99,21 @@ QtObject{
|
|||||||
property real rbgShift: 0.0
|
property real rbgShift: 0.0
|
||||||
|
|
||||||
property real _margin: 0.5
|
property real _margin: 0.5
|
||||||
|
property real _frameMargin: 0.5
|
||||||
|
|
||||||
property real margin: Utils.lint(1.0, 20.0, _margin)
|
property real margin: Utils.lint(1.0, 20.0, _margin)
|
||||||
|
property real frameMargin: Utils.lint(1.0, 50.0, _frameMargin)
|
||||||
|
|
||||||
|
property real totalMargin: frameMargin + margin
|
||||||
|
|
||||||
readonly property int no_rasterization: 0
|
readonly property int no_rasterization: 0
|
||||||
readonly property int scanline_rasterization: 1
|
readonly property int scanline_rasterization: 1
|
||||||
readonly property int pixel_rasterization: 2
|
readonly property int pixel_rasterization: 2
|
||||||
|
readonly property int subpixel_rasterization: 3
|
||||||
|
|
||||||
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 +127,38 @@ 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"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
when: rasterization == subpixel_rasterization
|
||||||
|
PropertyChanges {
|
||||||
|
target: fontManager
|
||||||
|
source: "FontPixels.qml"
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
onLoaded: handleFontChanged()
|
onLoaded: handleFontChanged()
|
||||||
@ -136,151 +166,159 @@ 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
|
|
||||||
}
|
}
|
||||||
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,
|
||||||
|
"blinkingCursor": blinkingCursor,
|
||||||
|
"frameMargin": _frameMargin,
|
||||||
}
|
}
|
||||||
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 +328,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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
|
_frameMargin = settings.frameMargin !== undefined ? settings.frameMargin : _frameMargin
|
||||||
|
|
||||||
|
blinkingCursor = settings.blinkingCursor !== undefined ? settings.blinkingCursor : blinkingCursor
|
||||||
|
|
||||||
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"
|
||||||
@ -407,14 +465,15 @@ QtObject{
|
|||||||
"screenCurvature": 0.3,
|
"screenCurvature": 0.3,
|
||||||
"staticNoise": 0.1198,
|
"staticNoise": 0.1198,
|
||||||
"windowOpacity": 1,
|
"windowOpacity": 1,
|
||||||
"margin": 0.5
|
"margin": 0.5,
|
||||||
|
"blinkingCursor": false,
|
||||||
|
"frameMargin": 0.1
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
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,
|
||||||
@ -435,14 +494,15 @@ QtObject{
|
|||||||
"screenCurvature": 0.3,
|
"screenCurvature": 0.3,
|
||||||
"staticNoise": 0.1198,
|
"staticNoise": 0.1198,
|
||||||
"windowOpacity": 1,
|
"windowOpacity": 1,
|
||||||
"margin": 0.5
|
"margin": 0.5,
|
||||||
|
"blinkingCursor": false,
|
||||||
|
"frameMargin": 0.1
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
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,
|
||||||
@ -463,14 +523,15 @@ QtObject{
|
|||||||
"screenCurvature": 0.3,
|
"screenCurvature": 0.3,
|
||||||
"staticNoise": 0.15,
|
"staticNoise": 0.15,
|
||||||
"windowOpacity": 1,
|
"windowOpacity": 1,
|
||||||
"margin": 0.5
|
"margin": 0.5,
|
||||||
|
"blinkingCursor": false,
|
||||||
|
"frameMargin": 0.1
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
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,
|
||||||
@ -491,14 +552,15 @@ QtObject{
|
|||||||
"screenCurvature": 0,
|
"screenCurvature": 0,
|
||||||
"staticNoise": 0.15,
|
"staticNoise": 0.15,
|
||||||
"windowOpacity": 1,
|
"windowOpacity": 1,
|
||||||
"margin": 0.5
|
"margin": 0.5,
|
||||||
|
"blinkingCursor": false,
|
||||||
|
"frameMargin": 0.1
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
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,
|
||||||
@ -519,14 +581,15 @@ QtObject{
|
|||||||
"screenCurvature": 0.5,
|
"screenCurvature": 0.5,
|
||||||
"staticNoise": 0.099,
|
"staticNoise": 0.099,
|
||||||
"windowOpacity": 1,
|
"windowOpacity": 1,
|
||||||
"margin": 0.5
|
"margin": 0.5,
|
||||||
|
"blinkingCursor": false,
|
||||||
|
"frameMargin": 0.2
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
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,
|
||||||
@ -547,14 +610,15 @@ QtObject{
|
|||||||
"screenCurvature": 0.5,
|
"screenCurvature": 0.5,
|
||||||
"staticNoise": 0.2969,
|
"staticNoise": 0.2969,
|
||||||
"windowOpacity": 1,
|
"windowOpacity": 1,
|
||||||
"margin": 0.5
|
"margin": 0.5,
|
||||||
|
"blinkingCursor": false,
|
||||||
|
"frameMargin": 0.5
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
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,
|
||||||
@ -575,14 +639,15 @@ QtObject{
|
|||||||
"screenCurvature": 0.4,
|
"screenCurvature": 0.4,
|
||||||
"staticNoise": 0.0503,
|
"staticNoise": 0.0503,
|
||||||
"windowOpacity": 1,
|
"windowOpacity": 1,
|
||||||
"margin": 0.5
|
"margin": 0.5,
|
||||||
|
"blinkingCursor": false,
|
||||||
|
"frameMargin": 0.2
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
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,
|
||||||
@ -603,14 +668,15 @@ QtObject{
|
|||||||
"screenCurvature": 0.2,
|
"screenCurvature": 0.2,
|
||||||
"staticNoise": 0,
|
"staticNoise": 0,
|
||||||
"windowOpacity": 1,
|
"windowOpacity": 1,
|
||||||
"margin": 0.5
|
"margin": 0.5,
|
||||||
|
"blinkingCursor": false,
|
||||||
|
"frameMargin": 0.1
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
text: "Futuristic"
|
text: "Futuristic"
|
||||||
obj_string:
|
obj_string: '{
|
||||||
'{
|
|
||||||
"ambientLight": 0,
|
"ambientLight": 0,
|
||||||
"backgroundColor": "#000000",
|
"backgroundColor": "#000000",
|
||||||
"bloom": 0.5017,
|
"bloom": 0.5017,
|
||||||
@ -631,7 +697,9 @@ QtObject{
|
|||||||
"screenCurvature": 0,
|
"screenCurvature": 0,
|
||||||
"staticNoise": 0.0955,
|
"staticNoise": 0.0955,
|
||||||
"windowOpacity": 0.7,
|
"windowOpacity": 0.7,
|
||||||
"margin": 0.1
|
"margin": 0.1,
|
||||||
|
"blinkingCursor": false,
|
||||||
|
"frameMargin": 0
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
@ -640,51 +708,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
|
||||||
@ -70,6 +89,10 @@ Loader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ShaderLibrary {
|
||||||
|
id: shaderLibrary
|
||||||
|
}
|
||||||
|
|
||||||
ShaderEffect {
|
ShaderEffect {
|
||||||
id: burnInShaderEffect
|
id: burnInShaderEffect
|
||||||
|
|
||||||
@ -99,9 +122,7 @@ Loader {
|
|||||||
|
|
||||||
uniform highp float prevLastUpdate;" +
|
uniform highp float prevLastUpdate;" +
|
||||||
|
|
||||||
"float rgb2grey(vec3 v){
|
shaderLibrary.rgb2grey +
|
||||||
return dot(v, vec3(0.21, 0.72, 0.04));
|
|
||||||
}" +
|
|
||||||
|
|
||||||
"void main() {
|
"void main() {
|
||||||
vec2 coords = qt_TexCoord0;
|
vec2 coords = qt_TexCoord0;
|
||||||
|
@ -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,78 +0,0 @@
|
|||||||
import QtQuick 2.0
|
|
||||||
|
|
||||||
import "utils.js" as Utils
|
|
||||||
|
|
||||||
ShaderEffect {
|
|
||||||
property color _staticFrameColor: "#ffffff"
|
|
||||||
property color _backgroundColor: appSettings.backgroundColor
|
|
||||||
property color _fontColor: appSettings.fontColor
|
|
||||||
property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2)
|
|
||||||
property real _ambientLight: Utils.lint(0.2, 0.8, appSettings.ambientLight)
|
|
||||||
|
|
||||||
property color frameColor: Utils.mix(_staticFrameColor, _lightColor, _ambientLight)
|
|
||||||
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
|
|
||||||
property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight)
|
|
||||||
|
|
||||||
property size aadelta: Qt.size(1.0 / width, 1.0 / height)
|
|
||||||
|
|
||||||
fragmentShader: "
|
|
||||||
#ifdef GL_ES
|
|
||||||
precision mediump float;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
uniform lowp float screenCurvature;
|
|
||||||
uniform lowp float shadowLength;
|
|
||||||
uniform highp float qt_Opacity;
|
|
||||||
uniform lowp vec4 frameColor;
|
|
||||||
uniform mediump vec2 aadelta;
|
|
||||||
|
|
||||||
varying highp vec2 qt_TexCoord0;
|
|
||||||
|
|
||||||
vec2 distortCoordinates(vec2 coords){
|
|
||||||
vec2 cc = (coords - vec2(0.5));
|
|
||||||
float dist = dot(cc, cc) * screenCurvature;
|
|
||||||
return (coords + cc * (1.0 + dist) * dist);
|
|
||||||
}
|
|
||||||
|
|
||||||
float max2(vec2 v) {
|
|
||||||
return max(v.x, v.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
float min2(vec2 v) {
|
|
||||||
return min(v.x, v.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
float prod2(vec2 v) {
|
|
||||||
return v.x * v.y;
|
|
||||||
}
|
|
||||||
|
|
||||||
float sum2(vec2 v) {
|
|
||||||
return v.x + v.y;
|
|
||||||
}
|
|
||||||
|
|
||||||
void main(){
|
|
||||||
vec2 staticCoords = qt_TexCoord0;
|
|
||||||
vec2 coords = distortCoordinates(staticCoords);
|
|
||||||
|
|
||||||
vec3 color = vec3(0.0);
|
|
||||||
float alpha = 0.0;
|
|
||||||
|
|
||||||
float outShadowLength = shadowLength;
|
|
||||||
float inShadowLength = shadowLength * 0.5;
|
|
||||||
|
|
||||||
float outShadow = max2(1.0 - smoothstep(vec2(-outShadowLength), vec2(0.0), coords) + smoothstep(vec2(1.0), vec2(1.0 + outShadowLength), coords));
|
|
||||||
outShadow = clamp(sqrt(outShadow), 0.0, 1.0);
|
|
||||||
color += frameColor.rgb * outShadow;
|
|
||||||
alpha = sum2(1.0 - smoothstep(vec2(0.0), aadelta, coords) + smoothstep(vec2(1.0) - aadelta, vec2(1.0), coords));
|
|
||||||
alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, outShadow);
|
|
||||||
|
|
||||||
float inShadow = 1.0 - prod2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords));
|
|
||||||
inShadow = 0.5 * inShadow * inShadow;
|
|
||||||
alpha = max(alpha, inShadow);
|
|
||||||
|
|
||||||
gl_FragColor = vec4(color * alpha, alpha);
|
|
||||||
}
|
|
||||||
"
|
|
||||||
|
|
||||||
onStatusChanged: if (log) console.log(log) //Print warning messages
|
|
||||||
}
|
|
@ -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.
|
||||||
@ -73,7 +73,7 @@ Item{
|
|||||||
id: kterminal
|
id: kterminal
|
||||||
|
|
||||||
property int textureResolutionScale: appSettings.lowResolutionFont ? devicePixelRatio : 1
|
property int textureResolutionScale: appSettings.lowResolutionFont ? devicePixelRatio : 1
|
||||||
property int margin: appSettings.margin / screenScaling
|
property int margin: appSettings.totalMargin / screenScaling
|
||||||
property int totalWidth: Math.floor(parent.width / (screenScaling * fontWidth))
|
property int totalWidth: Math.floor(parent.width / (screenScaling * fontWidth))
|
||||||
property int totalHeight: Math.floor(parent.height / screenScaling)
|
property int totalHeight: Math.floor(parent.height / screenScaling)
|
||||||
|
|
||||||
@ -178,7 +178,7 @@ Item{
|
|||||||
property alias contextmenu: menuLoader.item
|
property alias contextmenu: menuLoader.item
|
||||||
|
|
||||||
MouseArea {
|
MouseArea {
|
||||||
property real margin: appSettings.margin
|
property real margin: appSettings.totalMargin
|
||||||
|
|
||||||
acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
|
acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
@ -219,8 +219,8 @@ Item{
|
|||||||
var cc = Qt.size(0.5 - x, 0.5 - y);
|
var cc = Qt.size(0.5 - x, 0.5 - y);
|
||||||
var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize;
|
var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize;
|
||||||
|
|
||||||
return Qt.point((x - cc.width * (1+distortion) * distortion) * kterminal.totalWidth,
|
return Qt.point((x - cc.width * (1+distortion) * distortion) * (kterminal.totalWidth),
|
||||||
(y - cc.height * (1+distortion) * distortion) * kterminal.totalHeight)
|
(y - cc.height * (1+distortion) * distortion) * (kterminal.totalHeight))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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.
|
||||||
@ -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,37 @@ 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("Frame size")
|
||||||
|
}
|
||||||
|
SimpleSlider {
|
||||||
|
onValueChanged: appSettings._frameMargin = value
|
||||||
|
value: appSettings._frameMargin
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
text: qsTr("Opacity")
|
||||||
|
}
|
||||||
SimpleSlider {
|
SimpleSlider {
|
||||||
onValueChanged: appSettings.windowOpacity = value
|
onValueChanged: appSettings.windowOpacity = value
|
||||||
value: appSettings.windowOpacity
|
value: appSettings.windowOpacity
|
||||||
@ -198,14 +227,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 +248,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,43 +32,49 @@ 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
|
||||||
|
|
||||||
property string selectedElement: model[currentIndex]
|
property string selectedElement: model[currentIndex]
|
||||||
|
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")]
|
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels"), qsTr("Sub-Pixels")]
|
||||||
currentIndex: appSettings.rasterization
|
currentIndex: appSettings.rasterization
|
||||||
onCurrentIndexChanged: {
|
onCurrentIndexChanged: {
|
||||||
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.
|
||||||
|
91
app/qml/ShaderLibrary.qml
Normal file
91
app/qml/ShaderLibrary.qml
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
import QtQuick 2.0
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
property string rasterizationShader:
|
||||||
|
(appSettings.rasterization === appSettings.no_rasterization ? "
|
||||||
|
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
|
||||||
|
return texel;
|
||||||
|
}" : "") +
|
||||||
|
|
||||||
|
(appSettings.rasterization === appSettings.scanline_rasterization ? "
|
||||||
|
#define INTENSITY 0.30
|
||||||
|
#define BRIGHTBOOST 0.30
|
||||||
|
|
||||||
|
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
|
||||||
|
lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel;
|
||||||
|
lowp vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * texel)) * texel;
|
||||||
|
|
||||||
|
vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0);
|
||||||
|
lowp float mask = 1.0 - abs(coords.y);
|
||||||
|
|
||||||
|
lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask);
|
||||||
|
return mix(texel, rasterizationColor, intensity);
|
||||||
|
}" : "") +
|
||||||
|
|
||||||
|
(appSettings.rasterization === appSettings.pixel_rasterization ? "
|
||||||
|
#define INTENSITY 0.30
|
||||||
|
#define BRIGHTBOOST 0.30
|
||||||
|
|
||||||
|
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
|
||||||
|
lowp vec3 result = texel;
|
||||||
|
|
||||||
|
lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel;
|
||||||
|
lowp vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * texel)) * texel;
|
||||||
|
|
||||||
|
vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0);
|
||||||
|
coords = coords * coords;
|
||||||
|
lowp float mask = 1.0 - coords.x - coords.y;
|
||||||
|
|
||||||
|
lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask);
|
||||||
|
return mix(texel, rasterizationColor, intensity);
|
||||||
|
}" : "") +
|
||||||
|
|
||||||
|
(appSettings.rasterization === appSettings.subpixel_rasterization ? "
|
||||||
|
#define INTENSITY 0.30
|
||||||
|
#define BRIGHTBOOST 0.30
|
||||||
|
#define SUBPIXELS 3.0
|
||||||
|
const vec3 offsets = vec3(3.141592654) * vec3(1.0/2.0,1.0/2.0 - 2.0/3.0,1.0/2.0-4.0/3.0);
|
||||||
|
|
||||||
|
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
|
||||||
|
vec2 omega = vec2(3.141592654) * vec2(2.0) * virtualResolution;
|
||||||
|
vec2 angle = screenCoords * omega;
|
||||||
|
vec3 xfactors = (SUBPIXELS + sin(angle.x + offsets)) / (SUBPIXELS + 1.0);
|
||||||
|
|
||||||
|
lowp vec3 result = texel * xfactors;
|
||||||
|
lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * result)) * result;
|
||||||
|
lowp vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * result)) * result;
|
||||||
|
|
||||||
|
vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0);
|
||||||
|
lowp float mask = 1.0 - abs(coords.y);
|
||||||
|
|
||||||
|
lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask);
|
||||||
|
return mix(texel, rasterizationColor, intensity);
|
||||||
|
}" : "") +
|
||||||
|
|
||||||
|
"\n\n"
|
||||||
|
|
||||||
|
property string min2: "
|
||||||
|
float min2(vec2 v) {
|
||||||
|
return min(v.x, v.y);
|
||||||
|
}\n\n"
|
||||||
|
|
||||||
|
property string rgb2grey: "
|
||||||
|
float rgb2grey(vec3 v) {
|
||||||
|
return dot(v, vec3(0.21, 0.72, 0.04));
|
||||||
|
}\n\n"
|
||||||
|
|
||||||
|
property string max2: "
|
||||||
|
float max2(vec2 v) {
|
||||||
|
return max(v.x, v.y);
|
||||||
|
}\n\n"
|
||||||
|
|
||||||
|
property string prod2: "
|
||||||
|
float prod2(vec2 v) {
|
||||||
|
return v.x * v.y;
|
||||||
|
}\n\n"
|
||||||
|
|
||||||
|
property string sum2: "
|
||||||
|
float sum2(vec2 v) {
|
||||||
|
return v.x + v.y;
|
||||||
|
}\n\n"
|
||||||
|
}
|
@ -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.
|
||||||
@ -38,11 +38,19 @@ Item {
|
|||||||
|
|
||||||
property real ambientLight: appSettings.ambientLight * 0.2
|
property real ambientLight: appSettings.ambientLight * 0.2
|
||||||
|
|
||||||
property size virtual_resolution
|
property size virtualResolution
|
||||||
|
property size screenResolution
|
||||||
|
|
||||||
|
property real _screenDensity: Math.min(
|
||||||
|
screenResolution.width / virtualResolution.width,
|
||||||
|
screenResolution.height / virtualResolution.height
|
||||||
|
)
|
||||||
|
|
||||||
ShaderEffect {
|
ShaderEffect {
|
||||||
id: dynamicShader
|
id: dynamicShader
|
||||||
|
|
||||||
|
property ShaderLibrary shaderLibrary: ShaderLibrary { }
|
||||||
|
|
||||||
property ShaderEffectSource screenBuffer: frameBuffer
|
property ShaderEffectSource screenBuffer: frameBuffer
|
||||||
property ShaderEffectSource burnInSource: burnInEffect.source
|
property ShaderEffectSource burnInSource: burnInEffect.source
|
||||||
property ShaderEffectSource frameSource: terminalFrameLoader.item
|
property ShaderEffectSource frameSource: terminalFrameLoader.item
|
||||||
@ -71,10 +79,16 @@ Item {
|
|||||||
property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter)
|
property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter)
|
||||||
property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight)
|
property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight)
|
||||||
property real staticNoise: appSettings.staticNoise
|
property real staticNoise: appSettings.staticNoise
|
||||||
property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
|
property size scaleNoiseSize: Qt.size((width * 0.75) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
|
||||||
(height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
|
(height * 0.75) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
|
||||||
|
|
||||||
property size virtual_resolution: parent.virtual_resolution
|
property size virtualResolution: parent.virtualResolution
|
||||||
|
|
||||||
|
// Rasterization might display oversamping issues if virtual resolution is close to physical display resolution.
|
||||||
|
// We progressively disable rasterization from 4x up to 2x resolution.
|
||||||
|
property real rasterizationIntensity: Utils.smoothstep(2.0, 4.0, _screenDensity)
|
||||||
|
|
||||||
|
property real displayTerminalFrame: appSettings._frameMargin > 0 || appSettings.screenCurvature > 0
|
||||||
|
|
||||||
property real time: timeManager.time
|
property real time: timeManager.time
|
||||||
property ShaderEffectSource noiseSource: noiseShaderSource
|
property ShaderEffectSource noiseSource: noiseShaderSource
|
||||||
@ -164,7 +178,8 @@ Item {
|
|||||||
uniform highp vec4 backgroundColor;
|
uniform highp vec4 backgroundColor;
|
||||||
uniform lowp float shadowLength;
|
uniform lowp float shadowLength;
|
||||||
|
|
||||||
uniform highp vec2 virtual_resolution;" +
|
uniform highp vec2 virtualResolution;
|
||||||
|
uniform lowp float rasterizationIntensity;\n" +
|
||||||
|
|
||||||
(burnIn !== 0 ? "
|
(burnIn !== 0 ? "
|
||||||
uniform sampler2D burnInSource;
|
uniform sampler2D burnInSource;
|
||||||
@ -174,13 +189,13 @@ Item {
|
|||||||
uniform sampler2D slowBurnInSource;" : "") +
|
uniform sampler2D slowBurnInSource;" : "") +
|
||||||
(staticNoise !== 0 ? "
|
(staticNoise !== 0 ? "
|
||||||
uniform highp float staticNoise;" : "") +
|
uniform highp float staticNoise;" : "") +
|
||||||
(((staticNoise !== 0 || jitter !== 0)
|
(((staticNoise !== 0 || jitter !== 0) ||(fallBack && (flickering || horizontalSync))) ? "
|
||||||
||(fallBack && (flickering || horizontalSync))) ? "
|
|
||||||
uniform lowp sampler2D noiseSource;
|
uniform lowp sampler2D noiseSource;
|
||||||
uniform highp vec2 scaleNoiseSize;" : "") +
|
uniform highp vec2 scaleNoiseSize;" : "") +
|
||||||
(screenCurvature !== 0 ? "
|
(displayTerminalFrame ? "
|
||||||
uniform highp float screenCurvature;
|
|
||||||
uniform lowp sampler2D frameSource;" : "") +
|
uniform lowp sampler2D frameSource;" : "") +
|
||||||
|
(screenCurvature !== 0 ? "
|
||||||
|
uniform highp float screenCurvature;" : "") +
|
||||||
(glowingLine !== 0 ? "
|
(glowingLine !== 0 ? "
|
||||||
uniform highp float glowingLine;" : "") +
|
uniform highp float glowingLine;" : "") +
|
||||||
(chromaColor !== 0 ? "
|
(chromaColor !== 0 ? "
|
||||||
@ -203,17 +218,14 @@ Item {
|
|||||||
|
|
||||||
(glowingLine !== 0 ? "
|
(glowingLine !== 0 ? "
|
||||||
float randomPass(vec2 coords){
|
float randomPass(vec2 coords){
|
||||||
return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015)));
|
return fract(smoothstep(-120.0, 0.0, coords.y - (virtualResolution.y + 120.0) * fract(time * 0.00015)));
|
||||||
}" : "") +
|
}" : "") +
|
||||||
|
|
||||||
"float min2(vec2 v) {
|
shaderLibrary.min2 +
|
||||||
return min(v.x, v.y);
|
shaderLibrary.rgb2grey +
|
||||||
}
|
shaderLibrary.rasterizationShader +
|
||||||
|
|
||||||
float rgb2grey(vec3 v){
|
|
||||||
return dot(v, vec3(0.21, 0.72, 0.04));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
"
|
||||||
float isInScreen(vec2 v) {
|
float isInScreen(vec2 v) {
|
||||||
return min2(step(0.0, v) - step(1.0, v));
|
return min2(step(0.0, v) - step(1.0, v));
|
||||||
}
|
}
|
||||||
@ -291,7 +303,7 @@ Item {
|
|||||||
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
|
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
|
||||||
|
|
||||||
(glowingLine !== 0 ? "
|
(glowingLine !== 0 ? "
|
||||||
color += randomPass(coords * virtual_resolution) * glowingLine;" : "") +
|
color += randomPass(coords * virtualResolution) * glowingLine;" : "") +
|
||||||
|
|
||||||
"vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" +
|
"vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" +
|
||||||
|
|
||||||
@ -309,6 +321,8 @@ Item {
|
|||||||
|
|
||||||
"txt_color += fontColor.rgb * vec3(color);" +
|
"txt_color += fontColor.rgb * vec3(color);" +
|
||||||
|
|
||||||
|
"txt_color = applyRasterization(staticCoords, txt_color, virtualResolution, rasterizationIntensity);\n" +
|
||||||
|
|
||||||
"vec3 finalColor = txt_color;" +
|
"vec3 finalColor = txt_color;" +
|
||||||
|
|
||||||
(flickering !== 0 ? "
|
(flickering !== 0 ? "
|
||||||
@ -317,7 +331,7 @@ Item {
|
|||||||
(ambientLight !== 0 ? "
|
(ambientLight !== 0 ? "
|
||||||
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
|
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
|
||||||
|
|
||||||
(screenCurvature !== 0 ?
|
(displayTerminalFrame ?
|
||||||
"vec4 frameColor = texture2D(frameSource, qt_TexCoord0);
|
"vec4 frameColor = texture2D(frameSource, qt_TexCoord0);
|
||||||
finalColor = mix(finalColor, frameColor.rgb, frameColor.a);"
|
finalColor = mix(finalColor, frameColor.rgb, frameColor.a);"
|
||||||
: "") +
|
: "") +
|
||||||
@ -340,7 +354,7 @@ Item {
|
|||||||
Loader {
|
Loader {
|
||||||
id: terminalFrameLoader
|
id: terminalFrameLoader
|
||||||
|
|
||||||
active: screenCurvature !== 0
|
active: dynamicShader.displayTerminalFrame
|
||||||
|
|
||||||
width: staticShader.width
|
width: staticShader.width
|
||||||
height: staticShader.height
|
height: staticShader.height
|
||||||
@ -352,7 +366,7 @@ Item {
|
|||||||
visible: false
|
visible: false
|
||||||
format: ShaderEffectSource.RGBA
|
format: ShaderEffectSource.RGBA
|
||||||
|
|
||||||
NewTerminalFrame {
|
TerminalFrame {
|
||||||
id: terminalFrame
|
id: terminalFrame
|
||||||
blending: false
|
blending: false
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
@ -360,6 +374,10 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ShaderLibrary {
|
||||||
|
id: shaderLibrary
|
||||||
|
}
|
||||||
|
|
||||||
ShaderEffect {
|
ShaderEffect {
|
||||||
id: staticShader
|
id: staticShader
|
||||||
|
|
||||||
@ -385,7 +403,7 @@ Item {
|
|||||||
|
|
||||||
property real ambientLight: parent.ambientLight
|
property real ambientLight: parent.ambientLight
|
||||||
|
|
||||||
property size virtual_resolution: parent.virtual_resolution
|
property size virtualResolution: parent.virtualResolution
|
||||||
|
|
||||||
blending: false
|
blending: false
|
||||||
visible: false
|
visible: false
|
||||||
@ -408,7 +426,7 @@ Item {
|
|||||||
uniform highp vec4 backgroundColor;
|
uniform highp vec4 backgroundColor;
|
||||||
uniform lowp float screen_brightness;
|
uniform lowp float screen_brightness;
|
||||||
|
|
||||||
uniform highp vec2 virtual_resolution;" +
|
uniform highp vec2 virtualResolution;" +
|
||||||
|
|
||||||
(bloom !== 0 ? "
|
(bloom !== 0 ? "
|
||||||
uniform highp sampler2D bloomSource;
|
uniform highp sampler2D bloomSource;
|
||||||
@ -426,36 +444,9 @@ Item {
|
|||||||
(ambientLight !== 0 ? "
|
(ambientLight !== 0 ? "
|
||||||
uniform lowp float ambientLight;" : "") +
|
uniform lowp float ambientLight;" : "") +
|
||||||
|
|
||||||
"highp float getScanlineIntensity(vec2 coords) {
|
shaderLibrary.min2 +
|
||||||
float result = 1.0;" +
|
shaderLibrary.sum2 +
|
||||||
|
shaderLibrary.rgb2grey +
|
||||||
(appSettings.rasterization != appSettings.no_rasterization ?
|
|
||||||
"float val = 0.0;
|
|
||||||
vec2 rasterizationCoords = fract(coords * virtual_resolution);
|
|
||||||
val += smoothstep(0.0, 0.5, rasterizationCoords.y);
|
|
||||||
val -= smoothstep(0.5, 1.0, rasterizationCoords.y);
|
|
||||||
result *= mix(0.5, 1.0, val);" : "") +
|
|
||||||
|
|
||||||
(appSettings.rasterization == appSettings.pixel_rasterization ?
|
|
||||||
"val = 0.0;
|
|
||||||
val += smoothstep(0.0, 0.5, rasterizationCoords.x);
|
|
||||||
val -= smoothstep(0.5, 1.0, rasterizationCoords.x);
|
|
||||||
result *= mix(0.5, 1.0, val);" : "") + "
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
float min2(vec2 v) {
|
|
||||||
return min(v.x, v.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
float sum2(vec2 v) {
|
|
||||||
return v.x + v.y;
|
|
||||||
}
|
|
||||||
|
|
||||||
float rgb2grey(vec3 v){
|
|
||||||
return dot(v, vec3(0.21, 0.72, 0.04));
|
|
||||||
}" +
|
|
||||||
|
|
||||||
"vec3 convertWithChroma(vec3 inColor) {
|
"vec3 convertWithChroma(vec3 inColor) {
|
||||||
vec3 outColor = inColor;" +
|
vec3 outColor = inColor;" +
|
||||||
@ -468,6 +459,7 @@ Item {
|
|||||||
" return outColor;
|
" return outColor;
|
||||||
}" +
|
}" +
|
||||||
|
|
||||||
|
shaderLibrary.rasterizationShader +
|
||||||
|
|
||||||
"void main() {" +
|
"void main() {" +
|
||||||
"vec2 cc = vec2(0.5) - qt_TexCoord0;" +
|
"vec2 cc = vec2(0.5) - qt_TexCoord0;" +
|
||||||
@ -490,8 +482,6 @@ Item {
|
|||||||
txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60;
|
txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60;
|
||||||
" : "") +
|
" : "") +
|
||||||
|
|
||||||
"txt_color *= getScanlineIntensity(txt_coords);" +
|
|
||||||
|
|
||||||
"txt_color += vec3(0.0001);" +
|
"txt_color += vec3(0.0001);" +
|
||||||
"float greyscale_color = rgb2grey(txt_color);" +
|
"float greyscale_color = rgb2grey(txt_color);" +
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
@ -7,13 +26,19 @@ ShaderTerminal {
|
|||||||
property alias title: terminal.title
|
property alias title: terminal.title
|
||||||
property alias terminalSize: terminal.terminalSize
|
property alias terminalSize: terminal.terminalSize
|
||||||
|
|
||||||
|
property real devicePixelRatio: terminalWindow.screen.devicePixelRatio
|
||||||
|
|
||||||
id: mainShader
|
id: mainShader
|
||||||
opacity: appSettings.windowOpacity * 0.3 + 0.7
|
opacity: appSettings.windowOpacity * 0.3 + 0.7
|
||||||
|
|
||||||
source: terminal.mainSource
|
source: terminal.mainSource
|
||||||
burnInEffect: terminal.burnInEffect
|
burnInEffect: terminal.burnInEffect
|
||||||
slowBurnInEffect: terminal.slowBurnInEffect
|
slowBurnInEffect: terminal.slowBurnInEffect
|
||||||
virtual_resolution: terminal.virtualResolution
|
virtualResolution: terminal.virtualResolution
|
||||||
|
screenResolution: Qt.size(
|
||||||
|
terminalWindow.width * devicePixelRatio * appSettings.windowScaling,
|
||||||
|
terminalWindow.height * devicePixelRatio * appSettings.windowScaling
|
||||||
|
)
|
||||||
|
|
||||||
TimeManager {
|
TimeManager {
|
||||||
id: timeManager
|
id: timeManager
|
||||||
@ -26,7 +51,6 @@ ShaderTerminal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// EFFECTS ////////////////////////////////////////////////////////////////
|
// EFFECTS ////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
Loader {
|
Loader {
|
||||||
id: bloomEffectLoader
|
id: bloomEffectLoader
|
||||||
active: appSettings.bloom
|
active: appSettings.bloom
|
||||||
@ -35,7 +59,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 +78,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
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
104
app/qml/TerminalFrame.qml
Normal file
104
app/qml/TerminalFrame.qml
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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 "utils.js" as Utils
|
||||||
|
|
||||||
|
ShaderEffect {
|
||||||
|
property color _staticFrameColor: "#fff"
|
||||||
|
property color _backgroundColor: appSettings.backgroundColor
|
||||||
|
property color _fontColor: appSettings.fontColor
|
||||||
|
property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2)
|
||||||
|
property real _ambientLight: Utils.lint(0.2, 0.8, appSettings.ambientLight)
|
||||||
|
|
||||||
|
property color frameColor: Utils.mix(_staticFrameColor, _lightColor, _ambientLight)
|
||||||
|
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
|
||||||
|
|
||||||
|
// Coefficient of the log curve used to approximate shadowing
|
||||||
|
property real screenShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight)
|
||||||
|
property real frameShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight)
|
||||||
|
|
||||||
|
property size margin: Qt.size(
|
||||||
|
appSettings.frameMargin / width * appSettings.windowScaling,
|
||||||
|
appSettings.frameMargin / height * appSettings.windowScaling
|
||||||
|
)
|
||||||
|
|
||||||
|
ShaderLibrary {
|
||||||
|
id: shaderLibrary
|
||||||
|
}
|
||||||
|
|
||||||
|
fragmentShader: "
|
||||||
|
#ifdef GL_ES
|
||||||
|
precision mediump float;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uniform lowp float screenCurvature;
|
||||||
|
uniform lowp float screenShadowCoeff;
|
||||||
|
uniform lowp float frameShadowCoeff;
|
||||||
|
uniform highp float qt_Opacity;
|
||||||
|
uniform lowp vec4 frameColor;
|
||||||
|
uniform mediump vec2 margin;
|
||||||
|
|
||||||
|
varying highp vec2 qt_TexCoord0;
|
||||||
|
|
||||||
|
vec2 distortCoordinates(vec2 coords){
|
||||||
|
vec2 cc = (coords - vec2(0.5));
|
||||||
|
float dist = dot(cc, cc) * screenCurvature;
|
||||||
|
return (coords + cc * (1.0 + dist) * dist);
|
||||||
|
}
|
||||||
|
" +
|
||||||
|
|
||||||
|
shaderLibrary.max2 +
|
||||||
|
shaderLibrary.min2 +
|
||||||
|
shaderLibrary.prod2 +
|
||||||
|
shaderLibrary.sum2 +
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
vec2 positiveLog(vec2 x) {
|
||||||
|
return clamp(log(x), vec2(0.0), vec2(100.0));
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 staticCoords = qt_TexCoord0;
|
||||||
|
vec2 coords = distortCoordinates(staticCoords) * (vec2(1.0) + margin * 2.0) - margin;
|
||||||
|
|
||||||
|
vec2 vignetteCoords = staticCoords * (1.0 - staticCoords.yx);
|
||||||
|
float vignette = pow(prod2(vignetteCoords) * 15.0, 0.25);
|
||||||
|
|
||||||
|
vec3 color = frameColor.rgb * vec3(1.0 - vignette);
|
||||||
|
float alpha = 0.0;
|
||||||
|
|
||||||
|
float frameShadow = max2(positiveLog(-coords * frameShadowCoeff + vec2(1.0)) + positiveLog(coords * frameShadowCoeff - (vec2(frameShadowCoeff) - vec2(1.0))));
|
||||||
|
frameShadow = max(sqrt(frameShadow), 0.0);
|
||||||
|
color *= frameShadow;
|
||||||
|
alpha = sum2(1.0 - step(vec2(0.0), coords) + step(vec2(1.0), coords));
|
||||||
|
alpha = clamp(alpha, 0.0, 1.0);
|
||||||
|
alpha *= mix(1.0, 0.9, frameShadow);
|
||||||
|
|
||||||
|
float screenShadow = 1.0 - prod2(positiveLog(coords * screenShadowCoeff + vec2(1.0)) * positiveLog(-coords * screenShadowCoeff + vec2(screenShadowCoeff + 1.0)));
|
||||||
|
alpha = max(0.8 * screenShadow, alpha);
|
||||||
|
|
||||||
|
gl_FragColor = vec4(color * alpha, alpha);
|
||||||
|
}
|
||||||
|
"
|
||||||
|
|
||||||
|
onStatusChanged: if (log) console.log(log) //Print warning messages
|
||||||
|
}
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,10 +40,11 @@
|
|||||||
<file>fonts/1977-commodore-pet/PetMe.ttf</file>
|
<file>fonts/1977-commodore-pet/PetMe.ttf</file>
|
||||||
<file>BurnInEffect.qml</file>
|
<file>BurnInEffect.qml</file>
|
||||||
<file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file>
|
<file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file>
|
||||||
<file>NewTerminalFrame.qml</file>
|
<file>TerminalFrame.qml</file>
|
||||||
<file>SlowBurnIn.qml</file>
|
<file>SlowBurnIn.qml</file>
|
||||||
<file>menus/WindowMenu.qml</file>
|
<file>menus/WindowMenu.qml</file>
|
||||||
<file>menus/FullContextMenu.qml</file>
|
<file>menus/FullContextMenu.qml</file>
|
||||||
<file>menus/ShortContextMenu.qml</file>
|
<file>menus/ShortContextMenu.qml</file>
|
||||||
|
<file>ShaderLibrary.qml</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
@ -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,23 @@ 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 smoothstep(min, max, value) {
|
||||||
|
let x = Math.max(0, Math.min(1, (value - min) / (max - min)));
|
||||||
|
return x * x * (3 - 2 * x);
|
||||||
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user