7 Commits

Author SHA1 Message Date
Filippo Scognamiglio
3d99b1d29c Move constants to a separate qml file. 2021-07-19 08:40:30 +02:00
Filippo Scognamiglio
4abbe332db Improve terminal frame and expose frame size setting. 2021-07-15 23:20:42 +02:00
Filippo Scognamiglio
3104abd4ad Add subpixel rasterization. 2021-07-07 00:09:10 +02:00
Filippo Scognamiglio
7714f7b503 Improve rasterization rendering and add LCD rasterization (with subpixels). 2021-07-03 16:14:02 +02:00
Filippo Scognamiglio
701cb540e5 Improve QML syntax and update license headers. 2021-06-30 22:49:03 +02:00
Filippo Scognamiglio
205a152350 Merge pull request #662 from Swordfish90/unstable
Migrate to QtQuick.Controls 2.x
2021-06-30 08:45:24 +02:00
Filippo Scognamiglio
dae1a56691 Migrate from QtQuick.Controls 1.x to QtQuick.Controls 2.x. Updated QMLTermWidget submodule. 2021-06-30 08:33:31 +02:00
40 changed files with 1980 additions and 1589 deletions

View File

@@ -79,6 +79,9 @@ int main(int argc, char *argv[])
app.setWindowIcon(QIcon(":../icons/32x32/cool-retro-term.png"));
#endif
app.setOrganizationName("cool-retro-term");
app.setOrganizationDomain("cool-retro-term");
// Manage command line arguments from the cpp side
QStringList args = app.arguments();

View File

@@ -1,9 +1,28 @@
/*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
*
* cool-retro-term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.1
import QtQuick.Window 2.0
Window{
Window {
id: dialogwindow
title: qsTr("About")
width: 600
@@ -11,16 +30,19 @@ Window{
modality: Qt.ApplicationModal
ColumnLayout{
ColumnLayout {
anchors.fill: parent
anchors.margins: 15
spacing: 15
Text {
Layout.alignment: Qt.AlignHCenter
text: "cool-retro-term"
font {bold: true; pointSize: 18}
font {
bold: true
pointSize: 18
}
Loader{
}
Loader {
id: mainContent
Layout.fillHeight: true
Layout.fillWidth: true
@@ -41,32 +63,33 @@ Window{
}
}
]
Component.onCompleted: mainContent.state = "Default";
Component.onCompleted: mainContent.state = "Default"
}
Item{
Item {
Layout.fillWidth: true
height: childrenRect.height
Button{
Button {
anchors.left: parent.left
text: qsTr("License")
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
text: qsTr("Close")
onClicked: dialogwindow.close();
onClicked: dialogwindow.close()
}
}
}
// MAIN COMPONENTS ////////////////////////////////////////////////////////
Component{
Component {
id: defaultComponent
ColumnLayout{
ColumnLayout {
anchors.fill: parent
spacing: 10
Image{
Image {
Layout.fillWidth: true
Layout.fillHeight: true
Layout.alignment: Qt.AlignHCenter
@@ -74,36 +97,37 @@ Window{
source: "images/crt256.png"
smooth: true
}
Text{
Text {
Layout.alignment: Qt.AlignCenter
horizontalAlignment: Text.AlignHCenter
text: appSettings.version + "\n" +
qsTr("Author: ") + "Filippo Scognamiglio\n" +
qsTr("Email: ") + "flscogna@gmail.com\n" +
qsTr("Source: ") + "https://github.com/Swordfish90/cool-retro-term\n"
text: appSettings.version + "\n" + qsTr(
"Author: ") + "Filippo Scognamiglio\n" + qsTr(
"Email: ") + "flscogna@gmail.com\n" + qsTr(
"Source: ") + "https://github.com/Swordfish90/cool-retro-term\n"
}
}
}
Component{
Component {
id: licenseComponent
TextArea{
ScrollView {
anchors.fill: parent
clip: true
TextArea {
readOnly: true
text: "Copyright (c) 2013 Filippo Scognamiglio <flscogna@gmail.com>\n\n" +
"https://github.com/Swordfish90/cool-retro-term\n\n" +
"cool-retro-term is free software: you can redistribute it and/or modify " +
"it under the terms of the GNU General Public License as published by " +
"the Free Software Foundation, either version 3 of the License, or " +
"(at your option) any later version.\n\n" +
"This program is distributed in the hope that it will be useful, " +
"but WITHOUT ANY WARRANTY; without even the implied warranty of " +
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " +
"GNU General Public License for more details.\n\n" +
"You should have received a copy of the GNU General Public License " +
"along with this program. If not, see <http://www.gnu.org/licenses/>."
wrapMode: TextEdit.Wrap
text: "Copyright (c) 2013-2021 Filippo Scognamiglio <flscogna@gmail.com>\n\n"
+ "https://github.com/Swordfish90/cool-retro-term\n\n" +
"cool-retro-term is free software: you can redistribute it and/or modify "
+ "it under the terms of the GNU General Public License as published by "
+ "the Free Software Foundation, either version 3 of the License, or "
+ "(at your option) any later version.\n\n" +
"This program is distributed in the hope that it will be useful, "
+ "but WITHOUT ANY WARRANTY; without even the implied warranty of "
+ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the "
+ "GNU General Public License for more details.\n\n" +
"You should have received a copy of the GNU General Public License "
+ "along with this program. If not, see <http://www.gnu.org/licenses/>."
}
}
}
}

View File

@@ -0,0 +1,39 @@
/*******************************************************************************
* 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
QtObject {
readonly property string version: appVersion
readonly property int profileVersion: 2
readonly property real screenCurvatureSize: 0.4
readonly property real minimumFontScaling: 0.25
readonly property real maximumFontScaling: 2.50
readonly property real minBurnInFadeTime: 160
readonly property real maxBurnInFadeTime: 1600
readonly property int no_rasterization: 0
readonly property int scanline_rasterization: 1
readonly property int pixel_rasterization: 2
readonly property int subpixel_rasterization: 3
readonly property real baseFontScaling: 0.75
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -17,27 +17,14 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 1.0
import QtQuick.Controls 2.0
import "utils.js" as Utils
QtObject{
readonly property string version: appVersion
readonly property int profileVersion: 2
// STATIC CONSTANTS ////////////////////////////////////////////////////////
readonly property real screenCurvatureSize: 0.4
readonly property real minimumFontScaling: 0.25
readonly property real maximumFontScaling: 2.50
readonly property real minBurnInFadeTime: 160
readonly property real maxBurnInFadeTime: 1600
// GENERAL SETTINGS ///////////////////////////////////////////////////////
QtObject {
// APPLICATION SETTINGS ///////////////////////////////////////////////////////
property int x: 100
property int y: 100
property int width: 1024
@@ -59,12 +46,9 @@ QtObject{
property real burnInQuality: 0.5
property bool useFastBurnIn: Qt.platform.os === "osx" ? false : true
property bool blinkingCursor: false
onWindowScalingChanged: handleFontChanged();
onWindowScalingChanged: handleFontChanged()
// PROFILE SETTINGS ///////////////////////////////////////////////////////
property real windowOpacity: 1.0
property real ambientLight: 0.2
property real contrast: 0.80
@@ -75,9 +59,16 @@ QtObject{
property string _backgroundColor: "#000000"
property string _fontColor: "#ff8100"
property string saturatedColor: Utils.mix(Utils.strToColor("#FFFFFF"), Utils.strToColor(_fontColor), 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 string saturatedColor: Utils.mix(Utils.strToColor("#FFFFFF"),
Utils.strToColor(_fontColor),
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 screenCurvature: 0.3
@@ -96,19 +87,20 @@ QtObject{
property real rbgShift: 0.0
property real _margin: 0.5
property real margin: Utils.lint(1.0, 20.0, _margin)
property real _frameMargin: 0.5
readonly property int no_rasterization: 0
readonly property int scanline_rasterization: 1
readonly property int pixel_rasterization: 2
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
property int rasterization: no_rasterization
// FONTS //////////////////////////////////////////////////////////////////
property bool blinkingCursor: false
readonly property real baseFontScaling: 0.75
// FONTS //////////////////////////////////////////////////////////////////
property real fontScaling: 1.0
property real totalFontScaling: baseFontScaling * fontScaling
property real totalFontScaling: appConstants.baseFontScaling * fontScaling
property real fontWidth: 1.0
@@ -119,168 +111,198 @@ QtObject{
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: [
State { when: rasterization == no_rasterization
PropertyChanges {target: fontManager; source: "Fonts.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 == appConstants.no_rasterization
PropertyChanges {
target: fontManager
source: "Fonts.qml"
}
},
State {
when: rasterization == appConstants.scanline_rasterization
PropertyChanges {
target: fontManager
source: "FontScanlines.qml"
}
},
State {
when: rasterization == appConstants.pixel_rasterization
PropertyChanges {
target: fontManager
source: "FontPixels.qml"
}
},
State {
when: rasterization == appConstants.subpixel_rasterization
PropertyChanges {
target: fontManager
source: "FontPixels.qml"
}
}
]
onLoaded: handleFontChanged()
}
property FontLoader fontLoader: FontLoader { }
property FontLoader fontLoader: FontLoader {}
onTotalFontScalingChanged: handleFontChanged();
onFontWidthChanged: handleFontChanged();
onTotalFontScalingChanged: handleFontChanged()
onFontWidthChanged: handleFontChanged()
function getIndexByName(name) {
for (var i = 0; i < fontlist.count; i++) {
var requestedName = fontlist.get(i).name;
var requestedName = fontlist.get(i).name
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(){
fontScaling = Math.min(fontScaling + 0.05, maximumFontScaling);
handleFontChanged();
function incrementScaling() {
fontScaling = Math.min(fontScaling + 0.05, appConstants.maximumFontScaling)
handleFontChanged()
}
function decrementScaling(){
fontScaling = Math.max(fontScaling - 0.05, minimumFontScaling);
handleFontChanged();
function decrementScaling() {
fontScaling = Math.max(fontScaling - 0.05, appConstants.minimumFontScaling)
handleFontChanged()
}
function handleFontChanged(){
if (!fontManager.item) return;
function handleFontChanged() {
if (!fontManager.item)
return
var index = getIndexByName(fontNames[rasterization]);
if (index === undefined) return;
var index = getIndexByName(fontNames[rasterization])
if (index === undefined)
return
fontManager.item.selectedFontIndex = index;
fontManager.item.scaling = totalFontScaling;
fontManager.item.selectedFontIndex = index
fontManager.item.scaling = totalFontScaling
var fontSource = fontManager.item.source;
var pixelSize = fontManager.item.pixelSize;
var lineSpacing = fontManager.item.lineSpacing;
var screenScaling = fontManager.item.screenScaling;
var fontWidth = fontManager.item.defaultFontWidth * appSettings.fontWidth;
var fontFamily = fontManager.item.family;
var isSystemFont = fontManager.item.isSystemFont;
var fontSource = fontManager.item.source
var pixelSize = fontManager.item.pixelSize
var lineSpacing = fontManager.item.lineSpacing
var screenScaling = fontManager.item.screenScaling
var fontWidth = fontManager.item.defaultFontWidth * appSettings.fontWidth
var fontFamily = fontManager.item.family
var isSystemFont = fontManager.item.isSystemFont
lowResolutionFont = fontManager.item.lowResolutionFont;
lowResolutionFont = fontManager.item.lowResolutionFont
if (!isSystemFont) {
fontLoader.source = fontSource;
fontFamily = fontLoader.name;
fontLoader.source = fontSource
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) {
var replacer = function(key, val) {
return val.toFixed ? Number(val.toFixed(4)) : val;
var replacer = function (key, 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 = {
fps: fps,
x: x,
y: y,
width: width,
height: height,
windowScaling: windowScaling,
showTerminalSize: showTerminalSize,
fontScaling: fontScaling,
fontNames: fontNames,
showMenubar: showMenubar,
bloomQuality: bloomQuality,
burnInQuality: burnInQuality,
useCustomCommand: useCustomCommand,
customCommand: customCommand,
useFastBurnIn: useFastBurnIn,
blinkingCursor: blinkingCursor
"fps": fps,
"x": x,
"y": y,
"width": width,
"height": height,
"windowScaling": windowScaling,
"showTerminalSize": showTerminalSize,
"fontScaling": fontScaling,
"fontNames": fontNames,
"showMenubar": showMenubar,
"bloomQuality": bloomQuality,
"burnInQuality": burnInQuality,
"useCustomCommand": useCustomCommand,
"customCommand": customCommand,
"useFastBurnIn": useFastBurnIn
}
return stringify(settings);
return stringify(settings)
}
function composeProfileObject(){
function composeProfileObject() {
var settings = {
backgroundColor: _backgroundColor,
fontColor: _fontColor,
flickering: flickering,
horizontalSync: horizontalSync,
staticNoise: staticNoise,
chromaColor: chromaColor,
saturationColor: saturationColor,
screenCurvature: screenCurvature,
glowingLine: glowingLine,
burnIn: burnIn,
bloom: bloom,
rasterization: rasterization,
jitter: jitter,
rbgShift: rbgShift,
brightness: brightness,
contrast: contrast,
ambientLight: ambientLight,
windowOpacity: windowOpacity,
fontName: fontNames[rasterization],
fontWidth: fontWidth,
margin: _margin
"backgroundColor": _backgroundColor,
"fontColor": _fontColor,
"flickering": flickering,
"horizontalSync": horizontalSync,
"staticNoise": staticNoise,
"chromaColor": chromaColor,
"saturationColor": saturationColor,
"screenCurvature": screenCurvature,
"glowingLine": glowingLine,
"burnIn": burnIn,
"bloom": bloom,
"rasterization": rasterization,
"jitter": jitter,
"rbgShift": rbgShift,
"brightness": brightness,
"contrast": contrast,
"ambientLight": ambientLight,
"windowOpacity": windowOpacity,
"fontName": fontNames[rasterization],
"fontWidth": fontWidth,
"margin": _margin,
"blinkingCursor": blinkingCursor,
"frameMargin": _frameMargin,
}
return settings;
return settings
}
function composeProfileString() {
return stringify(composeProfileObject());
return stringify(composeProfileObject())
}
function loadSettings(){
var settingsString = storage.getSetting("_CURRENT_SETTINGS");
var profileString = storage.getSetting("_CURRENT_PROFILE");
function loadSettings() {
var settingsString = storage.getSetting("_CURRENT_SETTINGS")
var profileString = storage.getSetting("_CURRENT_PROFILE")
if(!settingsString) return;
if(!profileString) return;
if (!settingsString)
return
if (!profileString)
return
loadSettingsString(settingsString);
loadProfileString(profileString);
loadSettingsString(settingsString)
loadProfileString(profileString)
if (verbose)
console.log("Loading settings: " + settingsString + profileString);
console.log("Loading settings: " + settingsString + profileString)
}
function storeSettings(){
var settingsString = composeSettingsString();
var profileString = composeProfileString();
function storeSettings() {
var settingsString = composeSettingsString()
var profileString = composeProfileString()
storage.setSetting("_CURRENT_SETTINGS", settingsString);
storage.setSetting("_CURRENT_PROFILE", profileString);
storage.setSetting("_CURRENT_SETTINGS", settingsString)
storage.setSetting("_CURRENT_PROFILE", profileString)
if (verbose) {
console.log("Storing settings: " + settingsString);
console.log("Storing profile: " + profileString);
console.log("Storing settings: " + settingsString)
console.log("Storing profile: " + profileString)
}
}
function loadSettingsString(settingsString){
var settings = JSON.parse(settingsString);
function loadSettingsString(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
windowScaling = settings.windowScaling !== undefined ? settings.windowScaling : windowScaling
fps = settings.fps !== undefined ? settings.fps : fps
windowScaling = settings.windowScaling
!== undefined ? settings.windowScaling : windowScaling
x = settings.x !== undefined ? settings.x : x
y = settings.y !== undefined ? settings.y : y
@@ -290,100 +312,121 @@ QtObject{
fontNames = settings.fontNames !== undefined ? settings.fontNames : fontNames
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;
burnInQuality = settings.burnInQuality !== undefined ? settings.burnInQuality : burnInQuality;
bloomQuality = settings.bloomQuality !== undefined ? settings.bloomQuality : bloomQuality
burnInQuality = settings.burnInQuality
!== undefined ? settings.burnInQuality : burnInQuality
useCustomCommand = settings.useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand
customCommand = settings.customCommand !== undefined ? settings.customCommand : customCommand
useCustomCommand = settings.useCustomCommand
!== undefined ? settings.useCustomCommand : useCustomCommand
customCommand = settings.customCommand
!== undefined ? settings.customCommand : customCommand
useFastBurnIn = settings.useFastBurnIn !== undefined ? settings.useFastBurnIn : useFastBurnIn;
blinkingCursor = settings.blinkingCursor !== undefined ? settings.blinkingCursor : blinkingCursor
useFastBurnIn = settings.useFastBurnIn
!== undefined ? settings.useFastBurnIn : useFastBurnIn
}
function loadProfileString(profileString){
var settings = JSON.parse(profileString);
function loadProfileString(profileString) {
var settings = JSON.parse(profileString)
_backgroundColor = settings.backgroundColor !== undefined ? settings.backgroundColor : _backgroundColor;
_fontColor = settings.fontColor !== undefined ? settings.fontColor : _fontColor;
_backgroundColor = settings.backgroundColor
!== undefined ? settings.backgroundColor : _backgroundColor
_fontColor = settings.fontColor !== undefined ? settings.fontColor : _fontColor
horizontalSync = settings.horizontalSync !== undefined ? settings.horizontalSync : horizontalSync
flickering = settings.flickering !== undefined ? settings.flickering : flickering;
staticNoise = settings.staticNoise !== undefined ? settings.staticNoise : staticNoise;
chromaColor = settings.chromaColor !== undefined ? settings.chromaColor : chromaColor;
saturationColor = settings.saturationColor !== undefined ? settings.saturationColor : saturationColor;
screenCurvature = settings.screenCurvature !== undefined ? settings.screenCurvature : screenCurvature;
glowingLine = settings.glowingLine !== undefined ? settings.glowingLine : glowingLine;
horizontalSync = settings.horizontalSync
!== undefined ? settings.horizontalSync : horizontalSync
flickering = settings.flickering !== undefined ? settings.flickering : flickering
staticNoise = settings.staticNoise !== undefined ? settings.staticNoise : staticNoise
chromaColor = settings.chromaColor !== undefined ? settings.chromaColor : chromaColor
saturationColor = settings.saturationColor
!== 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
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;
contrast = settings.contrast !== undefined ? settings.contrast : contrast;
brightness = settings.brightness !== undefined ? settings.brightness : brightness;
windowOpacity = settings.windowOpacity !== undefined ? settings.windowOpacity : windowOpacity;
ambientLight = settings.ambientLight !== undefined ? settings.ambientLight : ambientLight
contrast = settings.contrast !== undefined ? settings.contrast : contrast
brightness = settings.brightness !== undefined ? settings.brightness : brightness
windowOpacity = settings.windowOpacity
!== undefined ? settings.windowOpacity : windowOpacity
fontNames[rasterization] = settings.fontName !== undefined ? settings.fontName : fontNames[rasterization];
fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth;
fontNames[rasterization] = settings.fontName
!== 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
handleFontChanged();
blinkingCursor = settings.blinkingCursor !== undefined ? settings.blinkingCursor : blinkingCursor
handleFontChanged()
}
function storeCustomProfiles(){
storage.setSetting("_CUSTOM_PROFILES", composeCustomProfilesString());
function storeCustomProfiles() {
storage.setSetting("_CUSTOM_PROFILES", composeCustomProfilesString())
}
function loadCustomProfiles(){
var customProfileString = storage.getSetting("_CUSTOM_PROFILES");
if(customProfileString === undefined) customProfileString = "[]";
loadCustomProfilesString(customProfileString);
function loadCustomProfiles() {
var customProfileString = storage.getSetting("_CUSTOM_PROFILES")
if (customProfileString === undefined)
customProfileString = "[]"
loadCustomProfilesString(customProfileString)
}
function loadCustomProfilesString(customProfilesString){
var customProfiles = JSON.parse(customProfilesString);
for (var i=0; i<customProfiles.length; i++) {
var profile = customProfiles[i];
function loadCustomProfilesString(customProfilesString) {
var customProfiles = JSON.parse(customProfilesString)
for (var i = 0; i < customProfiles.length; i++) {
var profile = customProfiles[i]
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 = []
for(var i=0; i<profilesList.count; i++){
var profile = profilesList.get(i);
if(profile.builtin) continue;
customProfiles.push({text: profile.text, obj_string: profile.obj_string, builtin: false})
for (var i = 0; i < profilesList.count; i++) {
var profile = profilesList.get(i)
if (profile.builtin)
continue
customProfiles.push({
"text": profile.text,
"obj_string": profile.obj_string,
"builtin": false
})
}
return stringify(customProfiles);
return stringify(customProfiles)
}
function loadProfile(index){
var profile = profilesList.get(index);
loadProfileString(profile.obj_string);
function loadProfile(index) {
var profile = profilesList.get(index)
loadProfileString(profile.obj_string)
}
function appendCustomProfile(name, profileString) {
profilesList.append({text: name, obj_string: profileString, builtin: false});
profilesList.append({
"text": name,
"obj_string": profileString,
"builtin": false
})
}
// PROFILES ///////////////////////////////////////////////////////////////
property ListModel profilesList: ListModel{
ListElement{
property ListModel profilesList: ListModel {
ListElement {
text: "Default Amber"
obj_string: '{
"ambientLight": 0.2,
@@ -406,14 +449,15 @@ QtObject{
"screenCurvature": 0.3,
"staticNoise": 0.1198,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.1
}'
builtin: true
}
ListElement{
ListElement {
text: "Monochrome Green"
obj_string: '
{
obj_string: '{
"ambientLight": 0.2,
"backgroundColor": "#000000",
"bloom": 0.5538,
@@ -434,14 +478,15 @@ QtObject{
"screenCurvature": 0.3,
"staticNoise": 0.1198,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.1
}'
builtin: true
}
ListElement{
ListElement {
text: "Green Scanlines"
obj_string: '
{
obj_string: '{
"ambientLight": 0,
"backgroundColor": "#000000",
"bloom": 0.6,
@@ -462,14 +507,15 @@ QtObject{
"screenCurvature": 0.3,
"staticNoise": 0.15,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.1
}'
builtin: true
}
ListElement{
ListElement {
text: "Default Pixelated"
obj_string: '
{
obj_string: '{
"ambientLight": 0,
"backgroundColor": "#000000",
"bloom": 0.4045,
@@ -490,14 +536,15 @@ QtObject{
"screenCurvature": 0,
"staticNoise": 0.15,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.1
}'
builtin: true
}
ListElement{
ListElement {
text: "Apple ]["
obj_string:
'{
obj_string: '{
"ambientLight": 0.3038,
"backgroundColor": "#000000",
"bloom": 0.5,
@@ -518,14 +565,15 @@ QtObject{
"screenCurvature": 0.5,
"staticNoise": 0.099,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.2
}'
builtin: true
}
ListElement{
ListElement {
text: "Vintage"
obj_string: '
{
obj_string: '{
"ambientLight": 0.5,
"backgroundColor": "#000000",
"bloom": 0.4983,
@@ -546,14 +594,15 @@ QtObject{
"screenCurvature": 0.5,
"staticNoise": 0.2969,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.5
}'
builtin: true
}
ListElement{
ListElement {
text: "IBM Dos"
obj_string:
'{
obj_string: '{
"ambientLight": 0.151,
"backgroundColor": "#000000",
"bloom": 0.2969,
@@ -574,14 +623,15 @@ QtObject{
"screenCurvature": 0.4,
"staticNoise": 0.0503,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.2
}'
builtin: true
}
ListElement{
ListElement {
text: "IBM 3278"
obj_string:
'{
obj_string: '{
"ambientLight": 0.1,
"backgroundColor": "#000000",
"bloom": 0.2969,
@@ -602,14 +652,15 @@ QtObject{
"screenCurvature": 0.2,
"staticNoise": 0,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.1
}'
builtin: true
}
ListElement{
ListElement {
text: "Futuristic"
obj_string:
'{
obj_string: '{
"ambientLight": 0,
"backgroundColor": "#000000",
"bloom": 0.5017,
@@ -630,7 +681,9 @@ QtObject{
"screenCurvature": 0,
"staticNoise": 0.0955,
"windowOpacity": 0.7,
"margin": 0.1
"margin": 0.1,
"blinkingCursor": false,
"frameMargin": 0
}'
builtin: true
}
@@ -638,52 +691,52 @@ QtObject{
function getProfileIndexByName(name) {
for (var i = 0; i < profilesList.count; i++) {
if(profilesList.get(i).text === name)
return i;
if (profilesList.get(i).text === name)
return i
}
return -1;
return -1
}
Component.onCompleted: {
// Manage the arguments from the QML side.
var args = Qt.application.arguments;
var args = Qt.application.arguments
if (args.indexOf("--verbose") !== -1) {
verbose = true;
verbose = true
}
if (args.indexOf("--default-settings") === -1) {
loadSettings();
loadSettings()
}
loadCustomProfiles();
loadCustomProfiles()
var profileArgPosition = args.indexOf("--profile");
var profileArgPosition = args.indexOf("--profile")
if (profileArgPosition !== -1) {
var profileIndex = getProfileIndexByName(args[profileArgPosition + 1]);
var profileIndex = getProfileIndexByName(
args[profileArgPosition + 1])
if (profileIndex !== -1)
loadProfile(profileIndex);
loadProfile(profileIndex)
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) {
fullscreen = true;
showMenubar = false;
fullscreen = true
showMenubar = false
}
if (args.indexOf("-T") !== -1) {
wintitle = args[args.indexOf("-T") + 1]
}
initializedSettings();
initializedSettings()
}
Component.onDestruction: {
storeSettings();
storeCustomProfiles();
// storage.dropSettings(); //DROPS THE SETTINGS!.. REMEMBER TO DISABLE ONCE ENABLED!!
storeSettings()
storeCustomProfiles()
// storage.dropSettings(); //DROPS THE SETTINGS!.. REMEMBER TO DISABLE ONCE ENABLED!!
}
// VARS ///////////////////////////////////////////////////////////////////
property Label _sampleLabel: Label {
text: "100%"
}

View File

@@ -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 "utils.js" as Utils
@@ -13,8 +32,8 @@ Loader {
property real delay: (1.0 / appSettings.fps) * 1000
property real burnIn: appSettings.burnIn
property real burnInFadeTime: 1 / Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn)
property real _minBurnInFadeTime: appSettings.minBurnInFadeTime
property real _maxBurnInFadeTime: appSettings.maxBurnInFadeTime
property real _minBurnInFadeTime: appConstants.minBurnInFadeTime
property real _maxBurnInFadeTime: appConstants.maxBurnInFadeTime
active: appSettings.useFastBurnIn && appSettings.burnIn !== 0
@@ -70,6 +89,10 @@ Loader {
}
}
ShaderLibrary {
id: shaderLibrary
}
ShaderEffect {
id: burnInShaderEffect
@@ -99,9 +122,7 @@ Loader {
uniform highp float prevLastUpdate;" +
"float rgb2grey(vec3 v){
return dot(v, vec3(0.21, 0.72, 0.04));
}" +
shaderLibrary.rgb2grey +
"void main() {
vec2 coords = qt_TexCoord0;

View File

@@ -1,51 +0,0 @@
import QtQuick 2.2
import QtQuick.Controls 1.1
MenuBar {
id: defaultMenuBar
property bool visible: true
Menu {
title: qsTr("File")
visible: defaultMenuBar.visible
MenuItem {action: quitAction}
}
Menu {
title: qsTr("Edit")
visible: defaultMenuBar.visible && appSettings.showMenubar
MenuItem {action: copyAction}
MenuItem {action: pasteAction}
MenuSeparator{visible: Qt.platform.os !== "osx"}
MenuItem {action: showsettingsAction}
}
Menu{
title: qsTr("View")
visible: defaultMenuBar.visible
MenuItem {action: fullscreenAction; visible: fullscreenAction.enabled}
MenuItem {action: showMenubarAction; visible: showMenubarAction.enabled}
MenuSeparator{visible: showMenubarAction.enabled}
MenuItem {action: zoomIn}
MenuItem {action: zoomOut}
}
Menu{
id: profilesMenu
title: qsTr("Profiles")
visible: defaultMenuBar.visible
Instantiator{
model: appSettings.profilesList
delegate: MenuItem {
text: model.text
onTriggered: {
appSettings.loadProfileString(obj_string);
appSettings.handleFontChanged();
}
}
onObjectAdded: profilesMenu.insertItem(index, object)
onObjectRemoved: profilesMenu.removeItem(object)
}
}
Menu{
title: qsTr("Help")
visible: defaultMenuBar.visible
MenuItem {action: showAboutAction}
}
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -17,9 +17,8 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1
import "Components"
@@ -28,46 +27,46 @@ RowLayout {
property alias name: check.text
property double value
property alias min_value: slider.minimumValue
property alias max_value: slider.maximumValue
property alias min_value: slider.from
property alias max_value: slider.to
property alias stepSize: slider.stepSize
signal newValue(real newValue);
signal newValue(real newValue)
id: setting_component
Layout.fillWidth: true
onValueChanged: {
check.checked = !(value == 0);
if(check.checked)
slider.value = value;
check.checked = !(value == 0)
if (check.checked)
slider.value = value
}
CheckBox{
CheckBox {
id: check
implicitWidth: 160
onClicked: {
if(!checked){
checked = false;
slider.enabled = false;
newValue(0);
if (!checked) {
checked = false
slider.enabled = false
newValue(0)
} else {
checked = true;
newValue(slider.value);
slider.enabled = true;
checked = true
newValue(slider.value)
slider.enabled = true
}
}
}
Slider{
Slider {
id: slider
stepSize: parent.stepSize
Layout.fillWidth: true
onValueChanged: {
newValue(value);
newValue(value)
}
}
SizedLabel {
Layout.fillHeight: true
text: Math.round(((value - min_value) / (max_value - min_value)) * 100) + "%"
text: Math.round(
((value - min_value) / (max_value - min_value)) * 100) + "%"
}
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -17,14 +17,13 @@
* 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.Dialogs 1.1
Item {
id: rootItem
signal colorSelected (color color)
signal colorSelected(color color)
property color color
property string name
@@ -35,15 +34,16 @@ Item {
visible: false
//This is a workaround to a Qt 5.2 bug.
onColorChanged: if (Qt.platform.os !== "osx") colorSelected(color)
onAccepted: if (Qt.platform.os === "osx") colorSelected(color)
onColorChanged: if (Qt.platform.os !== "osx")
colorSelected(color)
onAccepted: if (Qt.platform.os === "osx")
colorSelected(color)
}
Rectangle{
Rectangle {
anchors.fill: parent
radius: 10
color: rootItem.color
border.color: "black"
Glossy {}
Rectangle {
anchors.fill: parent
anchors.margins: parent.height * 0.25
@@ -51,14 +51,14 @@ Item {
color: "white"
opacity: 0.5
}
Text{
Text {
anchors.centerIn: parent
z: parent.z + 1
text: name + ": " + rootItem.color
}
}
MouseArea{
MouseArea {
anchors.fill: parent
onClicked: colorDialog.visible = true;
onClicked: colorDialog.visible = true
}
}

View File

@@ -1,5 +1,7 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -17,19 +19,14 @@
* 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.Controls 1.0
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
// This component is simply a label with a predefined size.
// Used to improve alignment.
Item {
property alias text: textfield.text
width: appSettings.labelWidth
Label{
Label {
id: textfield
anchors { right: parent.right; verticalCenter: parent.verticalCenter }
}
Layout.minimumWidth: appSettings.labelWidth
width: appSettings.labelWidth
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -17,10 +17,9 @@
* 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
QtObject{
QtObject {
property int selectedFontIndex
property real scaling
property var _font: fontlist.get(selectedFontIndex)
@@ -31,8 +30,8 @@ QtObject{
property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
property bool lowResolutionFont: true
property ListModel fontlist: ListModel{
ListElement{
property ListModel fontlist: ListModel {
ListElement {
name: "COMMODORE_PET"
text: "Commodore PET (1977)"
source: "fonts/1977-commodore-pet/PetMe.ttf"
@@ -41,7 +40,7 @@ QtObject{
baseScaling: 3.5
fontWidth: 0.8
}
ListElement{
ListElement {
name: "IBM_PC"
text: "IBM PC (1981)"
source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf"
@@ -50,7 +49,7 @@ QtObject{
baseScaling: 3.5
fontWidth: 0.8
}
ListElement{
ListElement {
name: "PROGGY_TINY"
text: "Proggy Tiny (Modern)"
source: "fonts/modern-proggy-tiny/ProggyTiny.ttf"
@@ -59,7 +58,7 @@ QtObject{
baseScaling: 3.3
fontWidth: 0.9
}
ListElement{
ListElement {
name: "TERMINUS_SCALED"
text: "Terminus (Modern)"
source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
@@ -68,7 +67,7 @@ QtObject{
baseScaling: 3.0
fontWidth: 1.0
}
ListElement{
ListElement {
name: "PRO_FONT_SCALED"
text: "Pro Font (Modern)"
source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
@@ -77,7 +76,7 @@ QtObject{
baseScaling: 3.0
fontWidth: 1.0
}
ListElement{
ListElement {
name: "APPLE_II"
text: "Apple ][ (1977)"
source: "fonts/1977-apple2/PrintChar21.ttf"
@@ -86,7 +85,7 @@ QtObject{
baseScaling: 3.5
fontWidth: 0.9
}
ListElement{
ListElement {
name: "ATARI_400"
text: "Atari 400-800 (1979)"
source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf"
@@ -95,7 +94,7 @@ QtObject{
baseScaling: 3.5
fontWidth: 0.8
}
ListElement{
ListElement {
name: "COMMODORE_64"
text: "Commodore 64 (1982)"
source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -17,10 +17,9 @@
* 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
QtObject{
QtObject {
property int selectedFontIndex
property real scaling
property var _font: fontlist.get(selectedFontIndex)
@@ -31,8 +30,8 @@ QtObject{
property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
property bool lowResolutionFont: true
property ListModel fontlist: ListModel{
ListElement{
property ListModel fontlist: ListModel {
ListElement {
name: "COMMODORE_PET"
text: "Commodore PET (1977)"
source: "fonts/1977-commodore-pet/PetMe.ttf"
@@ -41,7 +40,7 @@ QtObject{
baseScaling: 3.5
fontWidth: 0.7
}
ListElement{
ListElement {
name: "IBM_PC"
text: "IBM PC (1981)"
source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf"
@@ -50,7 +49,7 @@ QtObject{
baseScaling: 3.5
fontWidth: 0.8
}
ListElement{
ListElement {
name: "PROGGY_TINY"
text: "Proggy Tiny (Modern)"
source: "fonts/modern-proggy-tiny/ProggyTiny.ttf"
@@ -59,7 +58,7 @@ QtObject{
baseScaling: 3.3
fontWidth: 0.9
}
ListElement{
ListElement {
name: "TERMINUS_SCALED"
text: "Terminus (Modern)"
source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
@@ -68,7 +67,7 @@ QtObject{
baseScaling: 3.0
fontWidth: 1.0
}
ListElement{
ListElement {
name: "PRO_FONT_SCALED"
text: "Pro Font (Modern)"
source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
@@ -77,7 +76,7 @@ QtObject{
baseScaling: 3.0
fontWidth: 1.0
}
ListElement{
ListElement {
name: "APPLE_II"
text: "Apple ][ (1977)"
source: "fonts/1977-apple2/PrintChar21.ttf"
@@ -86,7 +85,7 @@ QtObject{
baseScaling: 3.5
fontWidth: 0.8
}
ListElement{
ListElement {
name: "ATARI_400"
text: "Atari 400-800 (1979)"
source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf"
@@ -95,7 +94,7 @@ QtObject{
baseScaling: 3.5
fontWidth: 0.7
}
ListElement{
ListElement {
name: "COMMODORE_64"
text: "Commodore 64 (1982)"
source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -17,27 +17,20 @@
* 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
QtObject{
QtObject {
property int selectedFontIndex
property real scaling
property var source: fontlist.get(selectedFontIndex).source
property var _font: fontlist.get(selectedFontIndex)
property bool lowResolutionFont: _font.lowResolutionFont
property int pixelSize: lowResolutionFont
? _font.pixelSize
: _font.pixelSize * scaling
property int pixelSize: lowResolutionFont ? _font.pixelSize : _font.pixelSize * scaling
property int lineSpacing: lowResolutionFont
? _font.lineSpacing
: pixelSize * _font.lineSpacing
property int lineSpacing: lowResolutionFont ? _font.lineSpacing : pixelSize * _font.lineSpacing
property real screenScaling: lowResolutionFont
? _font.baseScaling * scaling
: 1.0
property real screenScaling: lowResolutionFont ? _font.baseScaling * scaling : 1.0
property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
@@ -52,9 +45,8 @@ QtObject{
// High resolution fonts are instead drawn on a texture which has the
// size of the screen, and the scaling directly controls their pixels size.
// Those are slower to render but are not pixelated.
property ListModel fontlist: ListModel {
ListElement{
ListElement {
name: "TERMINUS_SCALED"
text: "Terminus (Modern)"
source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
@@ -66,7 +58,7 @@ QtObject{
isSystemFont: false
family: ""
}
ListElement{
ListElement {
name: "PRO_FONT_SCALED"
text: "Pro Font (Modern)"
source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
@@ -78,7 +70,7 @@ QtObject{
isSystemFont: false
family: ""
}
ListElement{
ListElement {
name: "EXCELSIOR_SCALED"
text: "Fixedsys Excelsior (Modern)"
source: "fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf"
@@ -90,7 +82,7 @@ QtObject{
isSystemFont: false
family: ""
}
ListElement{
ListElement {
name: "COMMODORE_PET_SCALED"
text: "Commodore PET (1977)"
source: "fonts/1977-commodore-pet/PetMe.ttf"
@@ -102,7 +94,7 @@ QtObject{
isSystemFont: false
family: ""
}
ListElement{
ListElement {
name: "PROGGY_TINY_SCALED"
text: "Proggy Tiny (Modern)"
source: "fonts/modern-proggy-tiny/ProggyTiny.ttf"
@@ -114,7 +106,7 @@ QtObject{
isSystemFont: false
family: ""
}
ListElement{
ListElement {
name: "APPLE_II_SCALED"
text: "Apple ][ (1977)"
source: "fonts/1977-apple2/PrintChar21.ttf"
@@ -126,7 +118,7 @@ QtObject{
isSystemFont: false
family: ""
}
ListElement{
ListElement {
name: "ATARI_400_SCALED"
text: "Atari 400-800 (1979)"
source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf"
@@ -138,7 +130,7 @@ QtObject{
isSystemFont: false
family: ""
}
ListElement{
ListElement {
name: "IBM_PC_SCALED"
text: "IBM PC (1981)"
source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf"
@@ -150,7 +142,7 @@ QtObject{
isSystemFont: false
family: ""
}
ListElement{
ListElement {
name: "COMMODORE_64_SCALED"
text: "Commodore 64 (1982)"
source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"
@@ -162,7 +154,7 @@ QtObject{
isSystemFont: false
family: ""
}
ListElement{
ListElement {
name: "IBM_DOS"
text: "IBM DOS (1985)"
source: "fonts/1985-ibm-pc-vga/PxPlus_IBM_VGA8.ttf"
@@ -174,7 +166,7 @@ QtObject{
isSystemFont: false
family: ""
}
ListElement{
ListElement {
name: "HERMIT"
text: "HD: Hermit (Modern)"
source: "fonts/modern-hermit/Hermit-medium.otf"
@@ -185,7 +177,7 @@ QtObject{
isSystemFont: false
family: ""
}
ListElement{
ListElement {
name: "TERMINUS"
text: "HD: Terminus (Modern)"
source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
@@ -196,7 +188,7 @@ QtObject{
isSystemFont: false
family: ""
}
ListElement{
ListElement {
name: "PRO_FONT"
text: "HD: Pro Font (Modern)"
source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
@@ -207,7 +199,7 @@ QtObject{
isSystemFont: false
family: ""
}
ListElement{
ListElement {
name: "INCONSOLATA"
text: "HD: Inconsolata (Modern)"
source: "fonts/modern-inconsolata/Inconsolata.otf"
@@ -218,10 +210,10 @@ QtObject{
isSystemFont: false
family: ""
}
ListElement{
ListElement {
name: "IBM_3278"
text: "HD: IBM 3278 (1971)"
source: "fonts/1971-ibm-3278/3270-Regular.ttf"
source: "fonts/1971-ibm-3278/3270Medium.ttf"
lineSpacing: 0.2
pixelSize: 32
fontWidth: 1.0
@@ -234,7 +226,7 @@ QtObject{
Component.onCompleted: addSystemFonts()
function addSystemFonts() {
var families = monospaceSystemFonts;
var families = monospaceSystemFonts
for (var i = 0; i < families.length; i++) {
if (verbose) {
console.log("Adding system font: ", families[i])
@@ -245,16 +237,16 @@ QtObject{
function convertToListElement(family) {
return {
name: "System: " + family,
text: qsTr("System: ") + family,
source: "",
lineSpacing: 0.1,
pixelSize: 30,
fontWidth: 1.0,
baseScaling: 1.0,
lowResolutionFont: false,
isSystemFont: true,
family: family
"name": "System: " + family,
"text": qsTr("System: ") + family,
"source": "",
"lineSpacing": 0.1,
"pixelSize": 30,
"fontWidth": 1.0,
"baseScaling": 1.0,
"lowResolutionFont": false,
"isSystemFont": true,
"family": family
}
}
}

View File

@@ -1,21 +0,0 @@
import QtQuick 2.2
Rectangle {
anchors.centerIn: parent
width: parent.width - parent.border.width
height: parent.height - parent.border.width
radius:parent.radius - parent.border.width/2
smooth: true
border.width: parent.border.width/2
border.color: "#22FFFFFF"
gradient: Gradient {
GradientStop { position: 0; color: "#88FFFFFF" }
GradientStop { position: .1; color: "#55FFFFFF" }
GradientStop { position: .5; color: "#33FFFFFF" }
GradientStop { position: .501; color: "#11000000" }
GradientStop { position: .8; color: "#11FFFFFF" }
GradientStop { position: 1; color: "#55FFFFFF" }
}
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -17,14 +17,13 @@
* 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.Window 2.0
import QtQuick.Controls 1.1
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.1
Window{
Window {
id: insertnamedialog
width: 400
height: 100
@@ -39,50 +38,53 @@ Window{
title: qsTr("Error")
visible: false
function showError(message){
text = message;
open();
function showError(message) {
text = message
open()
}
}
function validateName(name){
var profile_list = appSettings.profilesList;
function validateName(name) {
var profile_list = appSettings.profilesList
if (name === "")
return 1;
return 0;
return 1
return 0
}
ColumnLayout{
ColumnLayout {
anchors.margins: 10
anchors.fill: parent
RowLayout{
Label{text: qsTr("Name")}
TextField{
RowLayout {
Label {
text: qsTr("Name")
}
TextField {
id: namefield
Layout.fillWidth: true
Component.onCompleted: forceActiveFocus()
onAccepted: okbutton.clickAction()
}
}
RowLayout{
RowLayout {
Layout.alignment: Qt.AlignBottom | Qt.AlignRight
Button{
Button {
id: okbutton
text: qsTr("OK")
onClicked: clickAction()
function clickAction(){
var name = namefield.text;
switch(validateName(name)){
function clickAction() {
var name = namefield.text
switch (validateName(name)) {
case 1:
errorDialog.showError(qsTr("The name you inserted is empty. Please choose a different one."));
break;
errorDialog.showError(
qsTr("The name you inserted is empty. Please choose a different one."))
break
default:
nameSelected(name);
close();
nameSelected(name)
close()
}
}
}
Button{
Button {
text: qsTr("Cancel")
onClicked: close()
}

View File

@@ -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
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -19,10 +19,11 @@
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Controls 2.0
import QMLTermWidget 1.0
import "menus"
import "utils.js" as Utils
Item{
@@ -72,7 +73,7 @@ Item{
id: kterminal
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 totalHeight: Math.floor(parent.height / screenScaling)
@@ -156,36 +157,28 @@ Item{
Component.onCompleted: {
appSettings.terminalFontChanged.connect(handleFontChanged);
appSettings.initializedSettings.connect(startSession);
appSettings.handleFontChanged()
}
}
Component {
id: linuxContextMenu
Menu{
id: contextmenu
MenuItem { action: copyAction }
MenuItem { action: pasteAction }
MenuSeparator { visible: !appSettings.showMenubar }
MenuItem { action: showsettingsAction ; visible: !appSettings.showMenubar}
MenuSeparator { visible: !appSettings.showMenubar }
CRTMainMenuBar { visible: !appSettings.showMenubar }
}
id: shortContextMenu
ShortContextMenu { }
}
Component {
id: osxContextMenu
Menu{
id: contextmenu
MenuItem{action: copyAction}
MenuItem{action: pasteAction}
}
id: fullContextMenu
FullContextMenu { }
}
Loader {
id: menuLoader
sourceComponent: (Qt.platform.os === "osx" ? osxContextMenu : linuxContextMenu)
sourceComponent: (Qt.platform.os === "osx" || appSettings.showMenubar ? shortContextMenu : fullContextMenu)
}
property alias contextmenu: menuLoader.item
MouseArea{
property real margin: appSettings.margin
MouseArea {
property real margin: appSettings.totalMargin
acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
anchors.fill: parent
@@ -224,10 +217,10 @@ Item{
y = (y - margin) / height;
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 * appConstants.screenCurvatureSize;
return Qt.point((x - cc.width * (1+distortion) * distortion) * kterminal.totalWidth,
(y - cc.height * (1+distortion) * distortion) * kterminal.totalHeight)
return Qt.point((x - cc.width * (1+distortion) * distortion) * (kterminal.totalWidth),
(y - cc.height * (1+distortion) * distortion) * (kterminal.totalHeight))
}
}
ShaderEffectSource{

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -17,35 +17,33 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1
import QtQml 2.0
import "Components"
Tab{
ColumnLayout{
anchors.fill: parent
GroupBox{
ColumnLayout {
GroupBox {
Layout.fillWidth: true
title: qsTr("Command")
ColumnLayout {
anchors.fill: parent
CheckBox{
CheckBox {
id: useCustomCommand
text: qsTr("Use custom command instead of shell at startup")
checked: appSettings.useCustomCommand
onCheckedChanged: appSettings.useCustomCommand = checked
}
// Workaround for QTBUG-31627 for pre 5.3.0
Binding{
Binding {
target: useCustomCommand
property: "checked"
value: appSettings.useCustomCommand
}
TextField{
TextField {
id: customCommand
Layout.fillWidth: true
text: appSettings.customCommand
@@ -54,92 +52,114 @@ Tab{
// Save text even if user forgets to press enter or unfocus
function saveSetting() {
appSettings.customCommand = text;
appSettings.customCommand = text
}
Component.onCompleted: settings_window.closing.connect(saveSetting)
Component.onCompleted: settings_window.closing.connect(
saveSetting)
}
}
}
GroupBox{
GroupBox {
title: qsTr("Performance")
Layout.fillWidth: true
GridLayout{
GridLayout {
anchors.fill: parent
rows: 2
columns: 3
columns: 4
Label{text: qsTr("Effects FPS")}
Slider{
Label {
text: qsTr("Effects FPS")
}
Slider {
Layout.fillWidth: true
Layout.columnSpan: 2
id: fpsSlider
onValueChanged: {
if (enabled) {
appSettings.fps = value !== 60 ? value + 1 : 0;
appSettings.fps = value !== 60 ? value + 1 : 0
}
}
stepSize: 1
enabled: false
Component.onCompleted: {
minimumValue = 0;
maximumValue = 60;
value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60;
enabled = true;
from = 0
to = 60
value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60
enabled = true
}
}
SizedLabel{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")}
Label{text: qsTr("Texture Quality")}
Slider{
Layout.fillWidth: true
Label {
text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")
}
Label {
text: qsTr("Texture Quality")
}
Slider {
id: txtslider
onValueChanged: if (enabled) appSettings.windowScaling = value;
stepSize: 0.05
enabled: false
Component.onCompleted: {
minimumValue = 0.25 //Without this value gets set to 0.5
value = appSettings.windowScaling;
enabled = true;
}
}
SizedLabel{text: Math.round(txtslider.value * 100) + "%"}
Label{text: qsTr("Bloom Quality")}
Slider{
Layout.fillWidth: true
id: bloomSlider
onValueChanged: if (enabled) appSettings.bloomQuality = value;
Layout.columnSpan: 2
onValueChanged: if (enabled)
appSettings.windowScaling = value
stepSize: 0.05
enabled: false
Component.onCompleted: {
minimumValue = 0.25
value = appSettings.bloomQuality;
enabled = true;
from = 0.25 //Without this value gets set to 0.5
value = appSettings.windowScaling
enabled = true
}
}
SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"}
Label {
text: Math.round(txtslider.value * 100) + "%"
}
Label{text: qsTr("BurnIn Quality")}
Slider{
Label {
text: qsTr("Bloom Quality")
}
Slider {
Layout.fillWidth: true
Layout.columnSpan: 2
id: bloomSlider
onValueChanged: if (enabled)
appSettings.bloomQuality = value
stepSize: 0.05
enabled: false
Component.onCompleted: {
from = 0.25
value = appSettings.bloomQuality
enabled = true
}
}
Label {
text: Math.round(bloomSlider.value * 100) + "%"
}
Label {
text: qsTr("BurnIn Quality")
}
Slider {
Layout.fillWidth: true
id: burnInSlider
onValueChanged: if (enabled) appSettings.burnInQuality = value;
Layout.columnSpan: 2
onValueChanged: if (enabled)
appSettings.burnInQuality = value
stepSize: 0.05
enabled: false
Component.onCompleted: {
minimumValue = 0.25
value = appSettings.burnInQuality;
enabled = true;
from = 0.25
value = appSettings.burnInQuality
enabled = true
}
}
SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"}
CheckBox{
Label {
text: Math.round(burnInSlider.value * 100) + "%"
}
CheckBox {
Layout.columnSpan: 2
text: qsTr("Burnin optimization (Might display timing artifacts)")
text: qsTr("Burnin optimization (might display timing artifacts)")
checked: appSettings.useFastBurnIn
onCheckedChanged: appSettings.useFastBurnIn = checked
}
}
}
}
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -17,74 +17,70 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1
Tab{
ColumnLayout{
anchors.fill: parent
ColumnLayout {
spacing: 2
GroupBox{
GroupBox {
title: qsTr("Effects")
Layout.fillWidth: true
ColumnLayout {
anchors.fill: parent
CheckableSlider{
CheckableSlider {
name: qsTr("Bloom")
onNewValue: appSettings.bloom = newValue
value: appSettings.bloom
}
CheckableSlider{
CheckableSlider {
name: qsTr("BurnIn")
onNewValue: appSettings.burnIn = newValue
value: appSettings.burnIn
}
CheckableSlider{
CheckableSlider {
name: qsTr("Static Noise")
onNewValue: appSettings.staticNoise = newValue
value: appSettings.staticNoise
}
CheckableSlider{
CheckableSlider {
name: qsTr("Jitter")
onNewValue: appSettings.jitter = newValue
value: appSettings.jitter
}
CheckableSlider{
CheckableSlider {
name: qsTr("Glow Line")
onNewValue: appSettings.glowingLine = newValue;
onNewValue: appSettings.glowingLine = newValue
value: appSettings.glowingLine
}
CheckableSlider{
CheckableSlider {
name: qsTr("Screen Curvature")
onNewValue: appSettings.screenCurvature = newValue;
value: appSettings.screenCurvature;
onNewValue: appSettings.screenCurvature = newValue
value: appSettings.screenCurvature
}
CheckableSlider{
CheckableSlider {
name: qsTr("Ambient Light")
onNewValue: appSettings.ambientLight = newValue;
onNewValue: appSettings.ambientLight = newValue
value: appSettings.ambientLight
enabled: appSettings.framesIndex !== 0
}
CheckableSlider{
CheckableSlider {
name: qsTr("Flickering")
onNewValue: appSettings.flickering = newValue;
value: appSettings.flickering;
onNewValue: appSettings.flickering = newValue
value: appSettings.flickering
}
CheckableSlider{
CheckableSlider {
name: qsTr("Horizontal Sync")
onNewValue: appSettings.horizontalSync = newValue;
value: appSettings.horizontalSync;
onNewValue: appSettings.horizontalSync = newValue
value: appSettings.horizontalSync
}
CheckableSlider{
CheckableSlider {
name: qsTr("RGB Shift")
onNewValue: appSettings.rbgShift = newValue;
value: appSettings.rbgShift;
}
onNewValue: appSettings.rbgShift = newValue
value: appSettings.rbgShift
}
}
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -17,145 +17,161 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.1
Tab{
ColumnLayout{
anchors.fill: parent
GroupBox{
ColumnLayout {
GroupBox {
Layout.fillWidth: true
Layout.fillHeight: true
title: qsTr("Profile")
RowLayout {
anchors.fill: parent
TableView {
ListView {
id: profilesView
Layout.fillWidth: true
Layout.fillHeight: true
model: appSettings.profilesList
headerVisible: false
TableViewColumn {
title: qsTr("Profile")
role: "text"
width: parent.width * 0.5
delegate: Rectangle {
width: label.width
height: label.height
color: (index == profilesView.currentIndex) ? palette.highlight : palette.base
Label {
id: label
text: appSettings.profilesList.get(index).text
MouseArea {
anchors.fill: parent
onClicked: profilesView.currentIndex = index
onDoubleClicked: appSettings.loadProfile(index)
}
}
onActivated: {
appSettings.loadProfile(row);
}
}
ColumnLayout {
Layout.fillHeight: true
Layout.fillWidth: false
Button{
Button {
Layout.fillWidth: true
text: qsTr("Save")
onClicked: {
insertname.profileName = "";
insertname.profileName = ""
insertname.show()
}
}
Button{
Button {
Layout.fillWidth: true
property alias currentIndex: profilesView.currentRow
property alias currentIndex: profilesView.currentIndex
enabled: currentIndex >= 0
text: qsTr("Load")
onClicked: {
var index = profilesView.currentRow;
var index = currentIndex
if (index >= 0)
appSettings.loadProfile(index);
appSettings.loadProfile(index)
}
}
Button{
Button {
Layout.fillWidth: true
text: qsTr("Remove")
property alias currentIndex: profilesView.currentRow
property alias currentIndex: profilesView.currentIndex
enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin
enabled: currentIndex >= 0 && !appSettings.profilesList.get(
currentIndex).builtin
onClicked: {
appSettings.profilesList.remove(currentIndex);
profilesView.selection.clear();
appSettings.profilesList.remove(currentIndex)
profilesView.selection.clear()
// TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2.
profilesView.model = 0;
profilesView.model = appSettings.profilesList;
profilesView.model = 0
profilesView.model = appSettings.profilesList
}
}
Item {
// Spacing
Layout.fillHeight: true
}
Button{
Button {
Layout.fillWidth: true
text: qsTr("Import")
onClicked: {
fileDialog.selectExisting = true;
fileDialog.callBack = function (url) {loadFile(url);};
fileDialog.open();
fileDialog.selectExisting = true
fileDialog.callBack = function (url) {
loadFile(url)
}
fileDialog.open()
}
function loadFile(url) {
try {
if (appSettings.verbose)
console.log("Loading file: " + url);
console.log("Loading file: " + url)
var profileObject = JSON.parse(fileIO.read(url));
var name = profileObject.name;
var profileObject = JSON.parse(fileIO.read(url))
var name = profileObject.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;
if (version !== appSettings.profileVersion)
throw "This profile is not supported on this version of CRT.";
var version = profileObject.version
!== undefined ? profileObject.version : 1
if (version !== appConstants.profileVersion)
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) {
messageDialog.text = qsTr(err)
messageDialog.open();
messageDialog.open()
}
}
}
Button{
property alias currentIndex: profilesView.currentRow
Button {
property alias currentIndex: profilesView.currentIndex
Layout.fillWidth: true
text: qsTr("Export")
enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin
enabled: currentIndex >= 0 && !appSettings.profilesList.get(
currentIndex).builtin
onClicked: {
fileDialog.selectExisting = false;
fileDialog.callBack = function (url) {storeFile(url);};
fileDialog.open();
fileDialog.selectExisting = false
fileDialog.callBack = function (url) {
storeFile(url)
}
fileDialog.open()
}
function storeFile(url) {
try {
var urlString = url.toString();
var urlString = url.toString()
// Fix the extension if it's missing.
var extension = urlString.substring(urlString.length - 5, urlString.length);
var urlTail = (extension === ".json" ? "" : ".json");
url += urlTail;
var extension = urlString.substring(
urlString.length - 5, urlString.length)
var urlTail = (extension === ".json" ? "" : ".json")
url += urlTail
if (true)
console.log("Storing file: " + url);
console.log("Storing file: " + url)
var profileObject = appSettings.profilesList.get(currentIndex);
var profileSettings = JSON.parse(profileObject.obj_string);
profileSettings["name"] = profileObject.text;
profileSettings["version"] = appSettings.profileVersion;
var profileObject = appSettings.profilesList.get(
currentIndex)
var profileSettings = JSON.parse(
profileObject.obj_string)
profileSettings["name"] = profileObject.text
profileSettings["version"] = appConstants.profileVersion
var result = fileIO.write(url, JSON.stringify(profileSettings, undefined, 2));
var result = fileIO.write(url, JSON.stringify(
profileSettings,
undefined, 2))
if (!result)
throw "The file could not be written.";
throw "The file could not be written."
} catch (err) {
console.log(err);
messageDialog.text = qsTr("There has been an error storing the file.")
messageDialog.open();
console.log(err)
messageDialog.text = qsTr(
"There has been an error storing the file.")
messageDialog.open()
}
}
}
@@ -163,29 +179,44 @@ Tab{
}
}
GroupBox{
GroupBox {
title: qsTr("Screen")
Layout.fillWidth: true
GridLayout{
GridLayout {
anchors.fill: parent
columns: 2
Label{ text: qsTr("Brightness") }
SimpleSlider{
Label {
text: qsTr("Brightness")
}
SimpleSlider {
onValueChanged: appSettings.brightness = value
value: appSettings.brightness
}
Label{ text: qsTr("Contrast") }
SimpleSlider{
Label {
text: qsTr("Contrast")
}
SimpleSlider {
onValueChanged: appSettings.contrast = value
value: appSettings.contrast
}
Label{ text: qsTr("Margin") }
SimpleSlider{
Label {
text: qsTr("Margin")
}
SimpleSlider {
onValueChanged: appSettings._margin = value
value: appSettings._margin
}
Label{ text: qsTr("Opacity") }
SimpleSlider{
Label {
text: qsTr("Frame size")
}
SimpleSlider {
onValueChanged: appSettings._frameMargin = value
value: appSettings._frameMargin
}
Label {
text: qsTr("Opacity")
}
SimpleSlider {
onValueChanged: appSettings.windowOpacity = value
value: appSettings.windowOpacity
}
@@ -193,17 +224,18 @@ Tab{
}
// DIALOGS ////////////////////////////////////////////////////////////////
InsertNameDialog{
InsertNameDialog {
id: insertname
onNameSelected: {
appSettings.appendCustomProfile(name, appSettings.composeProfileString());
appSettings.appendCustomProfile(name,
appSettings.composeProfileString())
}
}
MessageDialog {
id: messageDialog
title: qsTr("File Error")
onAccepted: {
messageDialog.close();
messageDialog.close()
}
}
Loader {
@@ -211,24 +243,23 @@ Tab{
property bool selectExisting: false
id: fileDialog
sourceComponent: FileDialog{
sourceComponent: FileDialog {
nameFilters: ["Json files (*.json)"]
selectMultiple: false
selectFolder: false
selectExisting: fileDialog.selectExisting
onAccepted: callBack(fileUrl);
onAccepted: callBack(fileUrl)
}
onSelectExistingChanged: reload()
function open() {
item.open();
item.open()
}
function reload() {
active = false;
active = true;
}
active = false
active = true
}
}
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -17,158 +17,153 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Controls 2.1
import QtQuick.Layouts 1.1
import QtQml 2.0
import "Components"
Tab{
ColumnLayout{
anchors.fill: parent
ColumnLayout {
GroupBox{
GroupBox {
title: qsTr("Font")
Layout.fillWidth: true
GridLayout{
GridLayout {
anchors.fill: parent
columns: 2
Label { text: qsTr("Rasterization") }
Label {
text: qsTr("Rasterization")
}
ComboBox {
id: rasterizationBox
property string selectedElement: model[currentIndex]
Layout.fillWidth: true
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")]
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels"), qsTr("Sub-Pixels")]
currentIndex: appSettings.rasterization
onCurrentIndexChanged: {
appSettings.rasterization = currentIndex
}
}
Label{ text: qsTr("Name") }
ComboBox{
Label {
text: qsTr("Name")
}
ComboBox {
id: fontChanger
Layout.fillWidth: true
model: appSettings.fontlist
textRole: "text"
onActivated: {
var name = appSettings.fontlist.get(index).name;
appSettings.fontNames[appSettings.rasterization] = name;
appSettings.handleFontChanged();
var name = appSettings.fontlist.get(index).name
appSettings.fontNames[appSettings.rasterization] = name
appSettings.handleFontChanged()
}
function updateIndex(){
var name = appSettings.fontNames[appSettings.rasterization];
var index = appSettings.getIndexByName(name);
function updateIndex() {
var name = appSettings.fontNames[appSettings.rasterization]
var index = appSettings.getIndexByName(name)
if (index !== undefined)
currentIndex = index;
currentIndex = index
}
Connections{
Connections {
target: appSettings
onTerminalFontChanged: fontChanger.updateIndex();
onTerminalFontChanged: fontChanger.updateIndex()
}
Component.onCompleted: updateIndex();
Component.onCompleted: updateIndex()
}
Label{ text: qsTr("Scaling") }
RowLayout{
Label {
text: qsTr("Scaling")
}
RowLayout {
Layout.fillWidth: true
Slider{
Slider {
Layout.fillWidth: true
id: fontScalingChanger
onValueChanged: if(enabled) appSettings.fontScaling = value
onValueChanged: appSettings.fontScaling = value
value: appSettings.fontScaling
stepSize: 0.05
enabled: false // Another trick to fix initial bad behavior.
Component.onCompleted: {
minimumValue = appSettings.minimumFontScaling;
maximumValue = appSettings.maximumFontScaling;
value = appSettings.fontScaling;
enabled = true;
from: appConstants.minimumFontScaling
to: appConstants.maximumFontScaling
}
Connections{
target: appSettings
onFontScalingChanged: fontScalingChanger.value = appSettings.fontScaling;
}
}
SizedLabel{
SizedLabel {
text: Math.round(fontScalingChanger.value * 100) + "%"
}
}
Label{ text: qsTr("Font Width") }
RowLayout{
Label {
text: qsTr("Font Width")
}
RowLayout {
Layout.fillWidth: true
Slider{
Slider {
Layout.fillWidth: true
id: widthChanger
onValueChanged: appSettings.fontWidth = value;
onValueChanged: appSettings.fontWidth = value
value: appSettings.fontWidth
stepSize: 0.05
Component.onCompleted: {
// This is needed to avoid unnecessary chnaged events.
minimumValue = 0.5;
maximumValue = 1.5;
from: 0.5
to: 1.5
}
}
SizedLabel{
SizedLabel {
text: Math.round(widthChanger.value * 100) + "%"
}
}
}
}
GroupBox{
GroupBox {
title: qsTr("Cursor")
Layout.fillWidth: true
ColumnLayout {
anchors.fill: parent
CheckBox{
CheckBox {
id: blinkingCursor
text: qsTr("Blinking Cursor")
checked: appSettings.blinkingCursor
onCheckedChanged: appSettings.blinkingCursor = checked
}
Binding{
Binding {
target: blinkingCursor
property: "checked"
value: appSettings.blinkingCursor
}
}
}
GroupBox{
GroupBox {
title: qsTr("Colors")
Layout.fillWidth: true
ColumnLayout{
ColumnLayout {
anchors.fill: parent
ColumnLayout{
ColumnLayout {
Layout.fillWidth: true
CheckableSlider{
CheckableSlider {
name: qsTr("Chroma Color")
onNewValue: appSettings.chromaColor = newValue
value: appSettings.chromaColor
}
CheckableSlider{
CheckableSlider {
name: qsTr("Saturation Color")
onNewValue: appSettings.saturationColor = newValue
value: appSettings.saturationColor
enabled: appSettings.chromaColor !== 0
}
}
RowLayout{
RowLayout {
Layout.fillWidth: true
ColorButton{
ColorButton {
name: qsTr("Font")
height: 50
Layout.fillWidth: true
onColorSelected: appSettings._fontColor = color;
onColorSelected: appSettings._fontColor = color
color: appSettings._fontColor
}
ColorButton{
ColorButton {
name: qsTr("Background")
height: 50
Layout.fillWidth: true
onColorSelected: appSettings._backgroundColor = color;
onColorSelected: appSettings._backgroundColor = color
color: appSettings._backgroundColor
}
}
}
}
}
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -19,46 +19,50 @@
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Controls 2.1
import QtQuick.Window 2.1
import QtQuick.Layouts 1.1
import QtQuick.Layouts 1.3
import QtQuick.Dialogs 1.1
Window {
id: settings_window
title: qsTr("Settings")
width: 580
height: 400
width: 800
height: 600
property int tabmargins: 15
TabView{
id: tabView
anchors.fill: parent
anchors.margins: 10
SettingsGeneralTab {
id: generalTab
title: qsTr("General")
anchors.fill: parent
anchors.margins: tabmargins
TabBar {
id: bar
width: parent.width
TabButton {
text: qsTr("General")
}
SettingsTerminalTab {
id: terminalTab
title: qsTr("Terminal")
anchors.fill: parent
anchors.margins: tabmargins
TabButton {
text: qsTr("Terminal")
}
SettingsEffectsTab {
id: effectsTab
title: qsTr("Effects")
anchors.fill: parent
anchors.margins: tabmargins
TabButton {
text: qsTr("Effects")
}
SettingsAdvancedTab {
id: performanceTab
title: qsTr("Advanced")
anchors.fill: parent
anchors.margins: tabmargins
TabButton {
text: qsTr("Advanced")
}
}
StackLayout {
anchors {
top: bar.bottom
left: parent.left
right: parent.right
bottom: parent.bottom
margins: tabmargins
}
currentIndex: bar.currentIndex
SettingsGeneralTab { }
SettingsTerminalTab { }
SettingsEffectsTab { }
SettingsAdvancedTab { }
}
}

91
app/qml/ShaderLibrary.qml Normal file
View File

@@ -0,0 +1,91 @@
import QtQuick 2.0
QtObject {
property string rasterizationShader:
(appSettings.rasterization === appConstants.no_rasterization ? "
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
return texel;
}" : "") +
(appSettings.rasterization === appConstants.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 === appConstants.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 === appConstants.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"
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -32,17 +32,25 @@ Item {
property color fontColor: appSettings.fontColor
property color backgroundColor: appSettings.backgroundColor
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
property real screenCurvature: appSettings.screenCurvature * appConstants.screenCurvatureSize
property real chromaColor: appSettings.chromaColor
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 {
id: dynamicShader
property ShaderLibrary shaderLibrary: ShaderLibrary { }
property ShaderEffectSource screenBuffer: frameBuffer
property ShaderEffectSource burnInSource: burnInEffect.source
property ShaderEffectSource frameSource: terminalFrameLoader.item
@@ -71,10 +79,16 @@ Item {
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 staticNoise: appSettings.staticNoise
property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
(height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
property size scaleNoiseSize: Qt.size((width * 0.75) / (noiseTexture.width * 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 ShaderEffectSource noiseSource: noiseShaderSource
@@ -86,7 +100,7 @@ Item {
blending: false
//Smooth random texture used for flickering effect.
Image{
Image {
id: noiseTexture
source: "images/allNoise512.png"
width: 512
@@ -94,7 +108,7 @@ Item {
fillMode: Image.Tile
visible: false
}
ShaderEffectSource{
ShaderEffectSource {
id: noiseShaderSource
sourceItem: noiseTexture
wrapMode: ShaderEffectSource.Repeat
@@ -164,7 +178,8 @@ Item {
uniform highp vec4 backgroundColor;
uniform lowp float shadowLength;
uniform highp vec2 virtual_resolution;" +
uniform highp vec2 virtualResolution;
uniform lowp float rasterizationIntensity;\n" +
(burnIn !== 0 ? "
uniform sampler2D burnInSource;
@@ -174,13 +189,13 @@ Item {
uniform sampler2D slowBurnInSource;" : "") +
(staticNoise !== 0 ? "
uniform highp float staticNoise;" : "") +
(((staticNoise !== 0 || jitter !== 0)
||(fallBack && (flickering || horizontalSync))) ? "
(((staticNoise !== 0 || jitter !== 0) ||(fallBack && (flickering || horizontalSync))) ? "
uniform lowp sampler2D noiseSource;
uniform highp vec2 scaleNoiseSize;" : "") +
(screenCurvature !== 0 ? "
uniform highp float screenCurvature;
(displayTerminalFrame ? "
uniform lowp sampler2D frameSource;" : "") +
(screenCurvature !== 0 ? "
uniform highp float screenCurvature;" : "") +
(glowingLine !== 0 ? "
uniform highp float glowingLine;" : "") +
(chromaColor !== 0 ? "
@@ -203,17 +218,14 @@ Item {
(glowingLine !== 0 ? "
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) {
return min(v.x, v.y);
}
float rgb2grey(vec3 v){
return dot(v, vec3(0.21, 0.72, 0.04));
}
shaderLibrary.min2 +
shaderLibrary.rgb2grey +
shaderLibrary.rasterizationShader +
"
float isInScreen(vec2 v) {
return min2(step(0.0, v) - step(1.0, v));
}
@@ -291,7 +303,7 @@ Item {
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
(glowingLine !== 0 ? "
color += randomPass(coords * virtual_resolution) * glowingLine;" : "") +
color += randomPass(coords * virtualResolution) * glowingLine;" : "") +
"vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" +
@@ -309,6 +321,8 @@ Item {
"txt_color += fontColor.rgb * vec3(color);" +
"txt_color = applyRasterization(staticCoords, txt_color, virtualResolution, rasterizationIntensity);\n" +
"vec3 finalColor = txt_color;" +
(flickering !== 0 ? "
@@ -317,7 +331,7 @@ Item {
(ambientLight !== 0 ? "
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
(screenCurvature !== 0 ?
(displayTerminalFrame ?
"vec4 frameColor = texture2D(frameSource, qt_TexCoord0);
finalColor = mix(finalColor, frameColor.rgb, frameColor.a);"
: "") +
@@ -340,7 +354,7 @@ Item {
Loader {
id: terminalFrameLoader
active: screenCurvature !== 0
active: dynamicShader.displayTerminalFrame
width: staticShader.width
height: staticShader.height
@@ -352,7 +366,7 @@ Item {
visible: false
format: ShaderEffectSource.RGBA
NewTerminalFrame {
TerminalFrame {
id: terminalFrame
blending: false
anchors.fill: parent
@@ -360,6 +374,10 @@ Item {
}
}
ShaderLibrary {
id: shaderLibrary
}
ShaderEffect {
id: staticShader
@@ -385,7 +403,7 @@ Item {
property real ambientLight: parent.ambientLight
property size virtual_resolution: parent.virtual_resolution
property size virtualResolution: parent.virtualResolution
blending: false
visible: false
@@ -408,7 +426,7 @@ Item {
uniform highp vec4 backgroundColor;
uniform lowp float screen_brightness;
uniform highp vec2 virtual_resolution;" +
uniform highp vec2 virtualResolution;" +
(bloom !== 0 ? "
uniform highp sampler2D bloomSource;
@@ -426,36 +444,9 @@ Item {
(ambientLight !== 0 ? "
uniform lowp float ambientLight;" : "") +
"highp float getScanlineIntensity(vec2 coords) {
float result = 1.0;" +
(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));
}" +
shaderLibrary.min2 +
shaderLibrary.sum2 +
shaderLibrary.rgb2grey +
"vec3 convertWithChroma(vec3 inColor) {
vec3 outColor = inColor;" +
@@ -468,6 +459,7 @@ Item {
" return outColor;
}" +
shaderLibrary.rasterizationShader +
"void main() {" +
"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 *= getScanlineIntensity(txt_coords);" +
"txt_color += vec3(0.0001);" +
"float greyscale_color = rgb2grey(txt_color);" +

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -17,9 +17,8 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1
import "Components"
@@ -27,18 +26,18 @@ import "Components"
RowLayout {
property alias value: slider.value
property alias stepSize: slider.stepSize
property alias minimumValue: slider.minimumValue
property alias maximumValue: slider.maximumValue
property alias minimumValue: slider.from
property alias maximumValue: slider.to
property real maxMultiplier: 100
id: setting_component
spacing: 10
Slider{
Slider {
id: slider
stepSize: parent.stepSize
Layout.fillWidth: true
}
SizedLabel{
SizedLabel {
text: Math.round(value * maxMultiplier) + "%"
}
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
Rectangle{
Rectangle {
property size terminalSize
property real topOpacity: 0.6
width: textSize.width * 2
height: textSize.height * 2
radius: 5
@@ -31,17 +31,21 @@ Rectangle{
color: "black"
opacity: sizetimer.running ? 0.6 : 0.0
Behavior on opacity{NumberAnimation{duration: 200}}
Behavior on opacity {
NumberAnimation {
duration: 200
}
}
onTerminalSizeChanged: sizetimer.restart()
Text{
Text {
id: textSize
anchors.centerIn: parent
color: "white"
text: terminalSize.width + "x" + terminalSize.height
}
Timer{
Timer {
id: sizetimer
interval: 1000
running: false

View File

@@ -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 "utils.js" as Utils
@@ -6,12 +26,10 @@ Loader {
property ShaderEffectSource source: item ? item.source : null
active: !appSettings.useFastBurnIn && appSettings.burnIn !== 0
anchors.fill: parent
sourceComponent: Item {
property alias source: burnInSourceEffect
property int burnInScaling: scaleTexture * appSettings.burnInQuality
ShaderEffectSource {
@@ -20,8 +38,8 @@ Loader {
property real fps: appSettings.fps !== 0 ? appSettings.fps : 60
property real burnInFadeTime: Utils.lint(minBurnInFadeTime, maxBurnInFadeTime, burnIn)
property real burnInCoefficient: 1000 / (fps * burnInFadeTime)
property real minBurnInFadeTime: appSettings.minBurnInFadeTime
property real maxBurnInFadeTime: appSettings.maxBurnInFadeTime
property real minBurnInFadeTime: appConstants.minBurnInFadeTime
property real maxBurnInFadeTime: appConstants.maxBurnInFadeTime
id: burnInSourceEffect
@@ -48,7 +66,7 @@ Loader {
}
}
Timer{
Timer {
id: livetimer
// The interval assumes 60 fps. This is the time needed burnout a white pixel.
@@ -59,7 +77,7 @@ Loader {
running: true
onTriggered: burnInSourceEffect.updateBurnIn = false;
}
Connections{
Connections {
target: kterminal
onImagePainted:{
burnInSourceEffect.scheduleUpdate();
@@ -68,7 +86,7 @@ Loader {
}
}
// Restart blurred source settings change.
Connections{
Connections {
target: appSettings
onBurnInChanged: burnInSourceEffect.restartBlurSource();
onTerminalFontChanged: burnInSourceEffect.restartBlurSource();

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -27,7 +27,7 @@ QtObject {
property bool initialized: false
function getDatabase() {
return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000);
return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000)
}
function initialize() {
@@ -35,9 +35,10 @@ QtObject {
db.transaction(
function(tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS settings(setting TEXT UNIQUE, value TEXT)');
});
}
)
initialized = true;
initialized = true
}
function setSetting(setting, value) {
@@ -45,7 +46,8 @@ QtObject {
var db = getDatabase();
var res = "";
db.transaction(function(tx) {
db.transaction(
function(tx) {
var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]);
//console.log(rs.rowsAffected)
if (rs.rowsAffected > 0) {
@@ -54,23 +56,25 @@ QtObject {
res = "Error";
}
}
);
)
// The function returns “OK” if it was successful, or “Error” if it wasn't
return res;
return res
}
function getSetting(setting) {
if(!initialized) initialize();
var db = getDatabase();
var res="";
db.transaction(function(tx) {
var res = "";
db.transaction(
function(tx) {
var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]);
if (rs.rows.length > 0) {
res = rs.rows.item(0).value;
} else {
res = undefined;
}
})
}
)
return res
}
@@ -79,6 +83,7 @@ QtObject {
db.transaction(
function(tx) {
tx.executeSql('DROP TABLE settings');
});
}
)
}
}

View File

@@ -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 QtGraphicalEffects 1.0
@@ -7,44 +26,49 @@ ShaderTerminal {
property alias title: terminal.title
property alias terminalSize: terminal.terminalSize
property real devicePixelRatio: terminalWindow.screen.devicePixelRatio
id: mainShader
opacity: appSettings.windowOpacity * 0.3 + 0.7
source: terminal.mainSource
burnInEffect: terminal.burnInEffect
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
enableTimer: terminalWindow.visible
}
PreprocessedTerminal{
PreprocessedTerminal {
id: terminal
anchors.fill: parent
}
// EFFECTS ////////////////////////////////////////////////////////////////
Loader{
Loader {
id: bloomEffectLoader
active: appSettings.bloom
asynchronous: true
width: parent.width * appSettings.bloomQuality
height: parent.height * appSettings.bloomQuality
sourceComponent: FastBlur{
radius: Utils.lint(16, 64, appSettings.bloomQuality);
sourceComponent: FastBlur {
radius: Utils.lint(16, 64, appSettings.bloomQuality)
source: terminal.mainSource
transparentBorder: true
}
}
Loader{
Loader {
id: bloomSourceLoader
active: appSettings.bloom !== 0
asynchronous: true
sourceComponent: ShaderEffectSource{
sourceComponent: ShaderEffectSource {
id: _bloomEffectSource
sourceItem: bloomEffectLoader.item
hideSource: true
@@ -54,71 +78,4 @@ ShaderTerminal {
}
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
View 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 * appConstants.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
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -17,10 +17,9 @@
* 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
Timer{
Timer {
default property bool enableTimer: false
property real time

Binary file not shown.

View File

@@ -2,13 +2,10 @@
==================================
![Travis-CI](https://api.travis-ci.org/rbanffy/3270font.svg)
![Debian package](https://img.shields.io/debian/v/3270font/unstable)
![Ubuntu package](https://img.shields.io/ubuntu/v/3270font)
![Screenshot](
https://raw.githubusercontent.com/wiki/rbanffy/3270font/emacs.png)
![Screenshot](https://raw.githubusercontent.com/wiki/rbanffy/3270font/emacs.png)
![Sample](https://3270font.s3.amazonaws.com/3270_sample.gif)
![Sample](https://raw.githubusercontent.com/wiki/rbanffy/3270font/3270Medium_sample.png)
A little bit of history
-----------------------
@@ -29,18 +26,15 @@ If you are running Debian or Ubuntu and you don't want to mess with
building your font files, you can simply `apt-get install fonts-3270`
(It's available from the Debian
(https://packages.debian.org/sid/fonts/fonts-3270) and Ubuntu
(http://packages.ubuntu.com/impish/fonts-3270) package repos at
(http://packages.ubuntu.com/zesty/fonts-3270) package repos at
https://packages.debian.org/sid/fonts/fonts-3270 and
https://packages.ubuntu.com/impish/fonts/fonts-3270, although the
http://packages.ubuntu.com/xenial/fonts/fonts-3270, although the
packaged version may not be the latest version, but it's good enough for
most purposes.
On FreeBSD the font can be installed with `pkg install 3270font`.
For those who don't have the luxury of a proper system-managed package,
Adobe Type 1, TTF, OTF and WOFF versions are available for download on
https://3270font.s3.amazonaws.com/3270_fonts_49eab4b.zip (although this
URL may not always reflect the latest build or release).
most purposes. For those who don't have the luxury of a proper
system-managed package, Adobe Type 1, TTF, OTF and WOFF versions are
available for download on
http://s3.amazonaws.com/3270font/3270_fonts_4cfe95c.zip (although this
URL may not always reflect the latest version).
![ASCII is so 60's](
https://raw.githubusercontent.com/wiki/rbanffy/3270font/cyrillic.png)
@@ -52,18 +46,21 @@ The "source" file is edited using FontForge. You'll need it if you want
to generate fonts for your platform. On most civilized operating
systems, you can simply `apt-get install fontforge`, `yum install
fontforge` or even `port install fontforge`. On others, you may need to
grab your copy from https://fontforge.org/. I encourage you to drop by
grab your copy from http://fontforge.org/. I encourage you to drop by
and read the tutorials.
![Powerline-shell compatible!](
https://raw.githubusercontent.com/wiki/rbanffy/3270font/powerline.png)
![Using it on OSX (don't forget to turn antialiasing on)](
https://raw.githubusercontent.com/wiki/rbanffy/3270font/osx_terminal.png)
If you are running Windows, you'll probably need something like WSL or
Cygwin, but, in the end, the font works correctly (with some very minor
hinting issues).
If you are running Windows, you'll probably need something like
Cygwin, but, in the end, the font works correctly (with some very
minor hinting issues).
![Works on Windows](
https://raw.githubusercontent.com/wiki/rbanffy/3270font/windows_10.png)
https://raw.githubusercontent.com/wiki/rbanffy/3270font/windows_7.png)
Generating usable font files
----------------------------
@@ -96,36 +93,6 @@ In order to generate the sample image and the grids for FontForge,
you'll need a Python 3 environment with PIL or pillow installed. The
requirements.txt file lists everything you need to do it.
If all you want is an easier way to provide feedback, you can use
a container runtime, Docker, Podman, and etc, and use these make targets:
- ```make image``` - builds a local image with ```fontforge``` and ```make```
- ```make generate``` - uses the local container image to run ```make font```
Build Requirements
------------------
On Debian derived distros, you'll need Fontforge and python3-dev. On Red
Hat ans similar distros, you'll need Fontforge and python3-devel. Since
some packages will need to be compiled, you'll need a build system (GNU
Make, a C compiler, etc).
Screenshots
-----------
![xterm](https://3270font.s3.amazonaws.com/xterm.png)
![Gnome Terminal](
https://3270font.s3.amazonaws.com/gnome-terminal.png)
![Konsole](https://3270font.s3.amazonaws.com/konsole.png)
![Terminator](https://3270font.s3.amazonaws.com/terminator.png)
![urxvt](https://3270font.s3.amazonaws.com/urxvt.png)
Known problems
--------------

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@@ -17,13 +17,13 @@
* 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.Window 2.1
import QtQuick.Controls 1.1
import QtGraphicalEffects 1.0
import QtQuick.Controls 2.3
ApplicationWindow{
import "menus"
ApplicationWindow {
id: terminalWindow
width: 1024
@@ -37,8 +37,6 @@ ApplicationWindow{
// Load saved window geometry and show the window
Component.onCompleted: {
appSettings.handleFontChanged();
x = appSettings.x
y = appSettings.y
width = appSettings.width
@@ -55,11 +53,9 @@ ApplicationWindow{
property bool fullscreen: appSettings.fullscreen
onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed)
//Workaround: Without __contentItem a ugly thin border is visible.
menuBar: CRTMainMenuBar{
menuBar: WindowMenu {
id: mainMenu
visible: (Qt.platform.os === "osx" || appSettings.showMenubar)
__contentItem.visible: mainMenu.visible
}
property string wintitle: appSettings.wintitle
@@ -81,7 +77,7 @@ ApplicationWindow{
text: qsTr("Fullscreen")
enabled: Qt.platform.os !== "osx"
shortcut: "Alt+F11"
onTriggered: appSettings.fullscreen = !appSettings.fullscreen;
onTriggered: appSettings.fullscreen = !appSettings.fullscreen
checkable: true
checked: appSettings.fullscreen
}
@@ -89,69 +85,71 @@ ApplicationWindow{
id: quitAction
text: qsTr("Quit")
shortcut: "Ctrl+Shift+Q"
onTriggered: Qt.quit();
onTriggered: Qt.quit()
}
Action{
Action {
id: showsettingsAction
text: qsTr("Settings")
onTriggered: {
settingswindow.show();
settingswindow.requestActivate();
settingswindow.raise();
settingswindow.show()
settingswindow.requestActivate()
settingswindow.raise()
}
}
Action{
Action {
id: copyAction
text: qsTr("Copy")
shortcut: "Ctrl+Shift+C"
}
Action{
Action {
id: pasteAction
text: qsTr("Paste")
shortcut: "Ctrl+Shift+V"
}
Action{
Action {
id: zoomIn
text: qsTr("Zoom In")
shortcut: "Ctrl++"
onTriggered: appSettings.incrementScaling();
onTriggered: appSettings.incrementScaling()
}
Action{
Action {
id: zoomOut
text: qsTr("Zoom Out")
shortcut: "Ctrl+-"
onTriggered: appSettings.decrementScaling();
onTriggered: appSettings.decrementScaling()
}
Action{
Action {
id: showAboutAction
text: qsTr("About")
onTriggered: {
aboutDialog.show();
aboutDialog.requestActivate();
aboutDialog.raise();
aboutDialog.show()
aboutDialog.requestActivate()
aboutDialog.raise()
}
}
ApplicationSettings{
ApplicationConstants {
id: appConstants
}
ApplicationSettings {
id: appSettings
}
TerminalContainer{
TerminalContainer {
id: terminalContainer
y: appSettings.showMenubar ? 0 : -2 // Workaroud to hide the margin in the menubar.
width: parent.width
height: (parent.height + Math.abs(y))
}
SettingsWindow{
SettingsWindow {
id: settingswindow
visible: false
}
AboutDialog{
AboutDialog {
id: aboutDialog
visible: false
}
Loader{
Loader {
anchors.centerIn: parent
active: appSettings.showTerminalSize
sourceComponent: SizeOverlay{
sourceComponent: SizeOverlay {
z: 3
terminalSize: terminalContainer.terminalSize
}

View File

@@ -0,0 +1,95 @@
/*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
*
* cool-retro-term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 2.3
Menu {
id: contextmenu
MenuItem {
action: copyAction
}
MenuItem {
action: pasteAction
}
MenuItem {
action: showsettingsAction
}
MenuSeparator {}
Menu {
title: qsTr("File")
MenuItem {
action: quitAction
}
}
Menu {
title: qsTr("Edit")
MenuItem {
action: copyAction
}
MenuItem {
action: pasteAction
}
MenuSeparator {}
MenuItem {
action: showsettingsAction
}
}
Menu {
title: qsTr("View")
MenuItem {
action: fullscreenAction
visible: fullscreenAction.enabled
}
MenuItem {
action: showMenubarAction
visible: showMenubarAction.enabled
}
MenuItem {
action: zoomIn
}
MenuItem {
action: zoomOut
}
}
Menu {
id: profilesMenu
title: qsTr("Profiles")
Instantiator {
model: appSettings.profilesList
delegate: MenuItem {
text: model.text
onTriggered: {
appSettings.loadProfileString(obj_string)
appSettings.handleFontChanged()
}
}
onObjectAdded: profilesMenu.insertItem(index, object)
onObjectRemoved: profilesMenu.removeItem(object)
}
}
Menu {
title: qsTr("Help")
MenuItem {
action: showAboutAction
}
}
}

View File

@@ -0,0 +1,31 @@
/*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
*
* cool-retro-term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 2.3
Menu {
id: contextmenu
MenuItem {
action: copyAction
}
MenuItem {
action: pasteAction
}
}

View File

@@ -0,0 +1,85 @@
/*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
*
* cool-retro-term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 2.3
MenuBar {
id: defaultMenuBar
visible: appSettings.showMenubar
Menu {
title: qsTr("File")
MenuItem {
action: quitAction
}
}
Menu {
title: qsTr("Edit")
MenuItem {
action: copyAction
}
MenuItem {
action: pasteAction
}
MenuSeparator {}
MenuItem {
action: showsettingsAction
}
}
Menu {
title: qsTr("View")
MenuItem {
action: fullscreenAction
visible: fullscreenAction.enabled
}
MenuItem {
action: showMenubarAction
visible: showMenubarAction.enabled
}
MenuItem {
action: zoomIn
}
MenuItem {
action: zoomOut
}
}
Menu {
id: profilesMenu
title: qsTr("Profiles")
Instantiator {
model: appSettings.profilesList
delegate: MenuItem {
text: model.text
onTriggered: {
appSettings.loadProfileString(obj_string)
appSettings.handleFontChanged()
}
}
onObjectAdded: profilesMenu.insertItem(index, object)
onObjectRemoved: profilesMenu.removeItem(object)
}
}
Menu {
title: qsTr("Help")
MenuItem {
action: showAboutAction
}
}
}

View File

@@ -12,7 +12,6 @@
<file>TimeManager.qml</file>
<file>SimpleSlider.qml</file>
<file>ColorButton.qml</file>
<file>Glossy.qml</file>
<file>AboutDialog.qml</file>
<file>InsertNameDialog.qml</file>
<file>SettingsEffectsTab.qml</file>
@@ -20,9 +19,8 @@
<file>SettingsTerminalTab.qml</file>
<file>FontScanlines.qml</file>
<file>fonts/1977-apple2/PrintChar21.ttf</file>
<file>fonts/1971-ibm-3278/3270-Regular.ttf</file>
<file>fonts/1971-ibm-3278/3270Medium.ttf</file>
<file>Storage.qml</file>
<file>CRTMainMenuBar.qml</file>
<file>SettingsAdvancedTab.qml</file>
<file>TerminalContainer.qml</file>
<file>images/crt256.png</file>
@@ -42,7 +40,12 @@
<file>fonts/1977-commodore-pet/PetMe.ttf</file>
<file>BurnInEffect.qml</file>
<file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file>
<file>NewTerminalFrame.qml</file>
<file>TerminalFrame.qml</file>
<file>SlowBurnIn.qml</file>
<file>menus/WindowMenu.qml</file>
<file>menus/FullContextMenu.qml</file>
<file>menus/ShortContextMenu.qml</file>
<file>ShaderLibrary.qml</file>
<file>ApplicationConstants.qml</file>
</qresource>
</RCC>

View File

@@ -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
function clamp(x, min, max) {
if (x <= min)
@@ -6,15 +26,23 @@ function clamp(x, min, max) {
return max;
return x;
}
function lint(a, b, t) {
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),
c1.g * alpha + c2.g * (1-alpha),
c1.b * alpha + c2.b * (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){
var r = parseInt(s.substring(1,3), 16) / 256;
var g = parseInt(s.substring(3,5), 16) / 256;