4 Commits

Author SHA1 Message Date
Ricardo Bánffy
09b07e8258 Update 3270-Regular.ttf to v3.0.0 2022-07-01 23:08:39 +01:00
Ricardo Bánffy
39181f42cf Update font version to 2.3.1 2021-03-25 09:52:21 +00:00
Ricardo Bánffy
a31b77e5bc Update 3270 font with version 2.0.4.
See https://github.com/rbanffy/3270font/tree/v2.0.4 for changes.
2020-05-17 12:29:24 +01:00
Ricardo Bánffy
b417643415 Renamed 3270 font to latest binary version 2020-05-17 12:21:13 +01:00
37 changed files with 1410 additions and 1633 deletions

View File

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

View File

@@ -1,24 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
*
* cool-retro-term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Controls 2.2 import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import QtQuick.Window 2.0 import QtQuick.Window 2.0
@@ -37,10 +18,7 @@ Window {
Text { Text {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
text: "cool-retro-term" text: "cool-retro-term"
font { font {bold: true; pointSize: 18}
bold: true
pointSize: 18
}
} }
Loader{ Loader{
id: mainContent id: mainContent
@@ -63,7 +41,7 @@ Window {
} }
} }
] ]
Component.onCompleted: mainContent.state = "Default" Component.onCompleted: mainContent.state = "Default";
} }
Item{ Item{
Layout.fillWidth: true Layout.fillWidth: true
@@ -72,14 +50,13 @@ Window {
anchors.left: parent.left anchors.left: parent.left
text: qsTr("License") text: qsTr("License")
onClicked: { onClicked: {
mainContent.state == "Default" ? mainContent.state mainContent.state == "Default" ? mainContent.state = "License" : mainContent.state = "Default"
= "License" : mainContent.state = "Default"
} }
} }
Button{ Button{
anchors.right: parent.right anchors.right: parent.right
text: qsTr("Close") text: qsTr("Close")
onClicked: dialogwindow.close() onClicked: dialogwindow.close();
} }
} }
} }
@@ -100,34 +77,33 @@ Window {
Text{ Text{
Layout.alignment: Qt.AlignCenter Layout.alignment: Qt.AlignCenter
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
text: appSettings.version + "\n" + qsTr( text: appSettings.version + "\n" +
"Author: ") + "Filippo Scognamiglio\n" + qsTr( qsTr("Author: ") + "Filippo Scognamiglio\n" +
"Email: ") + "flscogna@gmail.com\n" + qsTr( qsTr("Email: ") + "flscogna@gmail.com\n" +
"Source: ") + "https://github.com/Swordfish90/cool-retro-term\n" qsTr("Source: ") + "https://github.com/Swordfish90/cool-retro-term\n"
} }
} }
} }
Component{ Component{
id: licenseComponent id: licenseComponent
ScrollView {
anchors.fill: parent
clip: true
TextArea{ TextArea{
anchors.fill: parent
readOnly: true readOnly: true
wrapMode: TextEdit.Wrap text: "Copyright (c) 2013 Filippo Scognamiglio <flscogna@gmail.com>\n\n" +
text: "Copyright (c) 2013-2021 Filippo Scognamiglio <flscogna@gmail.com>\n\n" "https://github.com/Swordfish90/cool-retro-term\n\n" +
+ "https://github.com/Swordfish90/cool-retro-term\n\n" +
"cool-retro-term is free software: you can redistribute it and/or modify " "cool-retro-term is free software: you can redistribute it and/or modify " +
+ "it under the terms of the GNU General Public License as published by " "it under the terms of the GNU General Public License as published by " +
+ "the Free Software Foundation, either version 3 of the License, or " "the Free Software Foundation, either version 3 of the License, or " +
+ "(at your option) any later version.\n\n" + "(at your option) any later version.\n\n" +
"This program is distributed in the hope that it will be useful, "
+ "but WITHOUT ANY WARRANTY; without even the implied warranty of " "This program is distributed in the hope that it will be useful, " +
+ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "but WITHOUT ANY WARRANTY; without even the implied warranty of " +
+ "GNU General Public License for more details.\n\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " +
"You should have received a copy of the GNU General Public License " "GNU General Public License for more details.\n\n" +
+ "along with this program. If not, see <http://www.gnu.org/licenses/>."
} "You should have received a copy of the GNU General Public License " +
"along with this program. If not, see <http://www.gnu.org/licenses/>."
} }
} }
} }

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,8 +17,9 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Controls 2.0 import QtQuick.Controls 1.0
import "utils.js" as Utils import "utils.js" as Utils
@@ -27,6 +28,7 @@ QtObject {
readonly property int profileVersion: 2 readonly property int profileVersion: 2
// STATIC CONSTANTS //////////////////////////////////////////////////////// // STATIC CONSTANTS ////////////////////////////////////////////////////////
readonly property real screenCurvatureSize: 0.4 readonly property real screenCurvatureSize: 0.4
readonly property real minimumFontScaling: 0.25 readonly property real minimumFontScaling: 0.25
readonly property real maximumFontScaling: 2.50 readonly property real maximumFontScaling: 2.50
@@ -35,6 +37,7 @@ QtObject {
readonly property real maxBurnInFadeTime: 1600 readonly property real maxBurnInFadeTime: 1600
// GENERAL SETTINGS /////////////////////////////////////////////////////// // GENERAL SETTINGS ///////////////////////////////////////////////////////
property int x: 100 property int x: 100
property int y: 100 property int y: 100
property int width: 1024 property int width: 1024
@@ -58,9 +61,10 @@ QtObject {
property bool blinkingCursor: false property bool blinkingCursor: false
onWindowScalingChanged: handleFontChanged() onWindowScalingChanged: handleFontChanged();
// PROFILE SETTINGS /////////////////////////////////////////////////////// // PROFILE SETTINGS ///////////////////////////////////////////////////////
property real windowOpacity: 1.0 property real windowOpacity: 1.0
property real ambientLight: 0.2 property real ambientLight: 0.2
property real contrast: 0.80 property real contrast: 0.80
@@ -71,16 +75,9 @@ QtObject {
property string _backgroundColor: "#000000" property string _backgroundColor: "#000000"
property string _fontColor: "#ff8100" property string _fontColor: "#ff8100"
property string saturatedColor: Utils.mix(Utils.strToColor("#FFFFFF"), property string saturatedColor: Utils.mix(Utils.strToColor("#FFFFFF"), Utils.strToColor(_fontColor), saturationColor * 0.5)
Utils.strToColor(_fontColor), property color fontColor: Utils.mix(Utils.strToColor(saturatedColor), Utils.strToColor(_backgroundColor), 0.7 + (contrast * 0.3))
saturationColor * 0.5) property color backgroundColor: Utils.mix(Utils.strToColor(_backgroundColor), Utils.strToColor(saturatedColor), 0.7 + (contrast * 0.3))
property color fontColor: Utils.mix(Utils.strToColor(saturatedColor),
Utils.strToColor(_backgroundColor),
0.7 + (contrast * 0.3))
property color backgroundColor: Utils.mix(Utils.strToColor(
_backgroundColor),
Utils.strToColor(saturatedColor),
0.7 + (contrast * 0.3))
property real staticNoise: 0.12 property real staticNoise: 0.12
property real screenCurvature: 0.3 property real screenCurvature: 0.3
@@ -108,6 +105,7 @@ QtObject {
property int rasterization: no_rasterization property int rasterization: no_rasterization
// FONTS ////////////////////////////////////////////////////////////////// // FONTS //////////////////////////////////////////////////////////////////
readonly property real baseFontScaling: 0.75 readonly property real baseFontScaling: 0.75
property real fontScaling: 1.0 property real fontScaling: 1.0
property real totalFontScaling: baseFontScaling * fontScaling property real totalFontScaling: baseFontScaling * fontScaling
@@ -121,31 +119,16 @@ QtObject {
signal terminalFontChanged(string fontFamily, int pixelSize, int lineSpacing, real screenScaling, real fontWidth) signal terminalFontChanged(string fontFamily, int pixelSize, int lineSpacing, real screenScaling, real fontWidth)
signal initializedSettings signal initializedSettings()
property Loader fontManager: Loader{ property Loader fontManager: Loader{
states: [ states: [
State { State { when: rasterization == no_rasterization
when: rasterization == no_rasterization PropertyChanges {target: fontManager; source: "Fonts.qml" } },
PropertyChanges { State { when: rasterization == scanline_rasterization
target: fontManager PropertyChanges {target: fontManager; source: "FontScanlines.qml" } },
source: "Fonts.qml" State { when: rasterization == pixel_rasterization;
} PropertyChanges {target: fontManager; source: "FontPixels.qml" } }
},
State {
when: rasterization == scanline_rasterization
PropertyChanges {
target: fontManager
source: "FontScanlines.qml"
}
},
State {
when: rasterization == pixel_rasterization
PropertyChanges {
target: fontManager
source: "FontPixels.qml"
}
}
] ]
onLoaded: handleFontChanged() onLoaded: handleFontChanged()
@@ -153,158 +136,151 @@ QtObject {
property FontLoader fontLoader: FontLoader { } property FontLoader fontLoader: FontLoader { }
onTotalFontScalingChanged: handleFontChanged() onTotalFontScalingChanged: handleFontChanged();
onFontWidthChanged: handleFontChanged() onFontWidthChanged: handleFontChanged();
function getIndexByName(name) { function getIndexByName(name) {
for (var i = 0; i < fontlist.count; i++) { for (var i = 0; i < fontlist.count; i++) {
var requestedName = fontlist.get(i).name var requestedName = fontlist.get(i).name;
if (name === requestedName) if (name === requestedName)
return i return i;
} }
return 0 // If the font is not available default to 0. return 0; // If the font is not available default to 0.
} }
function incrementScaling(){ function incrementScaling(){
fontScaling = Math.min(fontScaling + 0.05, maximumFontScaling) fontScaling = Math.min(fontScaling + 0.05, maximumFontScaling);
handleFontChanged() handleFontChanged();
} }
function decrementScaling(){ function decrementScaling(){
fontScaling = Math.max(fontScaling - 0.05, minimumFontScaling) fontScaling = Math.max(fontScaling - 0.05, minimumFontScaling);
handleFontChanged() handleFontChanged();
} }
function handleFontChanged(){ function handleFontChanged(){
if (!fontManager.item) if (!fontManager.item) return;
return
var index = getIndexByName(fontNames[rasterization]) var index = getIndexByName(fontNames[rasterization]);
if (index === undefined) if (index === undefined) return;
return
fontManager.item.selectedFontIndex = index fontManager.item.selectedFontIndex = index;
fontManager.item.scaling = totalFontScaling fontManager.item.scaling = totalFontScaling;
var fontSource = fontManager.item.source var fontSource = fontManager.item.source;
var pixelSize = fontManager.item.pixelSize var pixelSize = fontManager.item.pixelSize;
var lineSpacing = fontManager.item.lineSpacing var lineSpacing = fontManager.item.lineSpacing;
var screenScaling = fontManager.item.screenScaling var screenScaling = fontManager.item.screenScaling;
var fontWidth = fontManager.item.defaultFontWidth * appSettings.fontWidth var fontWidth = fontManager.item.defaultFontWidth * appSettings.fontWidth;
var fontFamily = fontManager.item.family var fontFamily = fontManager.item.family;
var isSystemFont = fontManager.item.isSystemFont var isSystemFont = fontManager.item.isSystemFont;
lowResolutionFont = fontManager.item.lowResolutionFont lowResolutionFont = fontManager.item.lowResolutionFont;
if (!isSystemFont) { if (!isSystemFont) {
fontLoader.source = fontSource fontLoader.source = fontSource;
fontFamily = fontLoader.name fontFamily = fontLoader.name;
} }
terminalFontChanged(fontFamily, pixelSize, lineSpacing, screenScaling, terminalFontChanged(fontFamily, pixelSize, lineSpacing, screenScaling, fontWidth);
fontWidth)
} }
property Storage storage: Storage{ } property Storage storage: Storage{ }
function stringify(obj) { function stringify(obj) {
var replacer = function(key, val) { var replacer = function(key, val) {
return val.toFixed ? Number(val.toFixed(4)) : val return val.toFixed ? Number(val.toFixed(4)) : val;
} }
return JSON.stringify(obj, replacer, 2) return JSON.stringify(obj, replacer, 2);
} }
function composeSettingsString(){ function composeSettingsString(){
var settings = { var settings = {
"fps": fps, fps: fps,
"x": x, x: x,
"y": y, y: y,
"width": width, width: width,
"height": height, height: height,
"windowScaling": windowScaling, windowScaling: windowScaling,
"showTerminalSize": showTerminalSize, showTerminalSize: showTerminalSize,
"fontScaling": fontScaling, fontScaling: fontScaling,
"fontNames": fontNames, fontNames: fontNames,
"showMenubar": showMenubar, showMenubar: showMenubar,
"bloomQuality": bloomQuality, bloomQuality: bloomQuality,
"burnInQuality": burnInQuality, burnInQuality: burnInQuality,
"useCustomCommand": useCustomCommand, useCustomCommand: useCustomCommand,
"customCommand": customCommand, customCommand: customCommand,
"useFastBurnIn": useFastBurnIn, useFastBurnIn: useFastBurnIn,
"blinkingCursor": blinkingCursor blinkingCursor: blinkingCursor
} }
return stringify(settings) return stringify(settings);
} }
function composeProfileObject(){ function composeProfileObject(){
var settings = { var settings = {
"backgroundColor": _backgroundColor, backgroundColor: _backgroundColor,
"fontColor": _fontColor, fontColor: _fontColor,
"flickering": flickering, flickering: flickering,
"horizontalSync": horizontalSync, horizontalSync: horizontalSync,
"staticNoise": staticNoise, staticNoise: staticNoise,
"chromaColor": chromaColor, chromaColor: chromaColor,
"saturationColor": saturationColor, saturationColor: saturationColor,
"screenCurvature": screenCurvature, screenCurvature: screenCurvature,
"glowingLine": glowingLine, glowingLine: glowingLine,
"burnIn": burnIn, burnIn: burnIn,
"bloom": bloom, bloom: bloom,
"rasterization": rasterization, rasterization: rasterization,
"jitter": jitter, jitter: jitter,
"rbgShift": rbgShift, rbgShift: rbgShift,
"brightness": brightness, brightness: brightness,
"contrast": contrast, contrast: contrast,
"ambientLight": ambientLight, ambientLight: ambientLight,
"windowOpacity": windowOpacity, windowOpacity: windowOpacity,
"fontName": fontNames[rasterization], fontName: fontNames[rasterization],
"fontWidth": fontWidth, fontWidth: fontWidth,
"margin": _margin margin: _margin
} }
return settings return settings;
} }
function composeProfileString() { function composeProfileString() {
return stringify(composeProfileObject()) return stringify(composeProfileObject());
} }
function loadSettings(){ function loadSettings(){
var settingsString = storage.getSetting("_CURRENT_SETTINGS") var settingsString = storage.getSetting("_CURRENT_SETTINGS");
var profileString = storage.getSetting("_CURRENT_PROFILE") var profileString = storage.getSetting("_CURRENT_PROFILE");
if (!settingsString) if(!settingsString) return;
return if(!profileString) return;
if (!profileString)
return
loadSettingsString(settingsString) loadSettingsString(settingsString);
loadProfileString(profileString) loadProfileString(profileString);
if (verbose) if (verbose)
console.log("Loading settings: " + settingsString + profileString) console.log("Loading settings: " + settingsString + profileString);
} }
function storeSettings(){ function storeSettings(){
var settingsString = composeSettingsString() var settingsString = composeSettingsString();
var profileString = composeProfileString() var profileString = composeProfileString();
storage.setSetting("_CURRENT_SETTINGS", settingsString) storage.setSetting("_CURRENT_SETTINGS", settingsString);
storage.setSetting("_CURRENT_PROFILE", profileString) storage.setSetting("_CURRENT_PROFILE", profileString);
if (verbose) { if (verbose) {
console.log("Storing settings: " + settingsString) console.log("Storing settings: " + settingsString);
console.log("Storing profile: " + profileString) console.log("Storing profile: " + profileString);
} }
} }
function loadSettingsString(settingsString){ function loadSettingsString(settingsString){
var settings = JSON.parse(settingsString) var settings = JSON.parse(settingsString);
showTerminalSize = settings.showTerminalSize showTerminalSize = settings.showTerminalSize !== undefined ? settings.showTerminalSize : showTerminalSize
!== undefined ? settings.showTerminalSize : showTerminalSize
fps = settings.fps !== undefined ? settings.fps: fps fps = settings.fps !== undefined ? settings.fps: fps
windowScaling = settings.windowScaling windowScaling = settings.windowScaling !== undefined ? settings.windowScaling : windowScaling
!== undefined ? settings.windowScaling : windowScaling
x = settings.x !== undefined ? settings.x : x x = settings.x !== undefined ? settings.x : x
y = settings.y !== undefined ? settings.y : y y = settings.y !== undefined ? settings.y : y
@@ -314,119 +290,98 @@ QtObject {
fontNames = settings.fontNames !== undefined ? settings.fontNames : fontNames fontNames = settings.fontNames !== undefined ? settings.fontNames : fontNames
fontScaling = settings.fontScaling !== undefined ? settings.fontScaling : fontScaling fontScaling = settings.fontScaling !== undefined ? settings.fontScaling : fontScaling
showMenubar = settings.showMenubar !== undefined ? settings.showMenubar : showMenubar showMenubar = settings.showMenubar !== undefined ? settings.showMenubar : showMenubar;
bloomQuality = settings.bloomQuality !== undefined ? settings.bloomQuality : bloomQuality bloomQuality = settings.bloomQuality !== undefined ? settings.bloomQuality : bloomQuality;
burnInQuality = settings.burnInQuality burnInQuality = settings.burnInQuality !== undefined ? settings.burnInQuality : burnInQuality;
!== undefined ? settings.burnInQuality : burnInQuality
useCustomCommand = settings.useCustomCommand useCustomCommand = settings.useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand
!== undefined ? settings.useCustomCommand : useCustomCommand customCommand = settings.customCommand !== undefined ? settings.customCommand : customCommand
customCommand = settings.customCommand
!== undefined ? settings.customCommand : customCommand
useFastBurnIn = settings.useFastBurnIn useFastBurnIn = settings.useFastBurnIn !== undefined ? settings.useFastBurnIn : useFastBurnIn;
!== undefined ? settings.useFastBurnIn : useFastBurnIn
blinkingCursor = settings.blinkingCursor blinkingCursor = settings.blinkingCursor !== undefined ? settings.blinkingCursor : blinkingCursor
!== undefined ? settings.blinkingCursor : blinkingCursor
} }
function loadProfileString(profileString){ function loadProfileString(profileString){
var settings = JSON.parse(profileString) var settings = JSON.parse(profileString);
_backgroundColor = settings.backgroundColor _backgroundColor = settings.backgroundColor !== undefined ? settings.backgroundColor : _backgroundColor;
!== undefined ? settings.backgroundColor : _backgroundColor _fontColor = settings.fontColor !== undefined ? settings.fontColor : _fontColor;
_fontColor = settings.fontColor !== undefined ? settings.fontColor : _fontColor
horizontalSync = settings.horizontalSync horizontalSync = settings.horizontalSync !== undefined ? settings.horizontalSync : horizontalSync
!== undefined ? settings.horizontalSync : horizontalSync flickering = settings.flickering !== undefined ? settings.flickering : flickering;
flickering = settings.flickering !== undefined ? settings.flickering : flickering staticNoise = settings.staticNoise !== undefined ? settings.staticNoise : staticNoise;
staticNoise = settings.staticNoise !== undefined ? settings.staticNoise : staticNoise chromaColor = settings.chromaColor !== undefined ? settings.chromaColor : chromaColor;
chromaColor = settings.chromaColor !== undefined ? settings.chromaColor : chromaColor saturationColor = settings.saturationColor !== undefined ? settings.saturationColor : saturationColor;
saturationColor = settings.saturationColor screenCurvature = settings.screenCurvature !== undefined ? settings.screenCurvature : screenCurvature;
!== undefined ? settings.saturationColor : saturationColor glowingLine = settings.glowingLine !== undefined ? settings.glowingLine : glowingLine;
screenCurvature = settings.screenCurvature
!== undefined ? settings.screenCurvature : screenCurvature
glowingLine = settings.glowingLine !== undefined ? settings.glowingLine : glowingLine
burnIn = settings.burnIn !== undefined ? settings.burnIn : burnIn burnIn = settings.burnIn !== undefined ? settings.burnIn : burnIn
bloom = settings.bloom !== undefined ? settings.bloom : bloom bloom = settings.bloom !== undefined ? settings.bloom : bloom
rasterization = settings.rasterization rasterization = settings.rasterization !== undefined ? settings.rasterization : rasterization;
!== undefined ? settings.rasterization : rasterization
jitter = settings.jitter !== undefined ? settings.jitter : jitter jitter = settings.jitter !== undefined ? settings.jitter : jitter;
rbgShift = settings.rbgShift !== undefined ? settings.rbgShift : rbgShift rbgShift = settings.rbgShift !== undefined ? settings.rbgShift : rbgShift;
ambientLight = settings.ambientLight !== undefined ? settings.ambientLight : ambientLight ambientLight = settings.ambientLight !== undefined ? settings.ambientLight : ambientLight;
contrast = settings.contrast !== undefined ? settings.contrast : contrast contrast = settings.contrast !== undefined ? settings.contrast : contrast;
brightness = settings.brightness !== undefined ? settings.brightness : brightness brightness = settings.brightness !== undefined ? settings.brightness : brightness;
windowOpacity = settings.windowOpacity windowOpacity = settings.windowOpacity !== undefined ? settings.windowOpacity : windowOpacity;
!== undefined ? settings.windowOpacity : windowOpacity
fontNames[rasterization] = settings.fontName fontNames[rasterization] = settings.fontName !== undefined ? settings.fontName : fontNames[rasterization];
!== undefined ? settings.fontName : fontNames[rasterization] fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth;
fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth
_margin = settings.margin !== undefined ? settings.margin : _margin _margin = settings.margin !== undefined ? settings.margin : _margin;
handleFontChanged() handleFontChanged();
} }
function storeCustomProfiles(){ function storeCustomProfiles(){
storage.setSetting("_CUSTOM_PROFILES", composeCustomProfilesString()) storage.setSetting("_CUSTOM_PROFILES", composeCustomProfilesString());
} }
function loadCustomProfiles(){ function loadCustomProfiles(){
var customProfileString = storage.getSetting("_CUSTOM_PROFILES") var customProfileString = storage.getSetting("_CUSTOM_PROFILES");
if (customProfileString === undefined) if(customProfileString === undefined) customProfileString = "[]";
customProfileString = "[]" loadCustomProfilesString(customProfileString);
loadCustomProfilesString(customProfileString)
} }
function loadCustomProfilesString(customProfilesString){ function loadCustomProfilesString(customProfilesString){
var customProfiles = JSON.parse(customProfilesString) var customProfiles = JSON.parse(customProfilesString);
for (var i=0; i<customProfiles.length; i++) { for (var i=0; i<customProfiles.length; i++) {
var profile = customProfiles[i] var profile = customProfiles[i];
if (verbose) if (verbose)
console.log("Loading custom profile: " + stringify(profile)) console.log("Loading custom profile: " + stringify(profile));
profilesList.append(profile) profilesList.append(profile);
} }
} }
function composeCustomProfilesString(){ function composeCustomProfilesString(){
var customProfiles = [] var customProfiles = []
for(var i=0; i<profilesList.count; i++){ for(var i=0; i<profilesList.count; i++){
var profile = profilesList.get(i) var profile = profilesList.get(i);
if (profile.builtin) if(profile.builtin) continue;
continue customProfiles.push({text: profile.text, obj_string: profile.obj_string, builtin: false})
customProfiles.push({
"text": profile.text,
"obj_string": profile.obj_string,
"builtin": false
})
} }
return stringify(customProfiles) return stringify(customProfiles);
} }
function loadProfile(index){ function loadProfile(index){
var profile = profilesList.get(index) var profile = profilesList.get(index);
loadProfileString(profile.obj_string) loadProfileString(profile.obj_string);
} }
function appendCustomProfile(name, profileString) { function appendCustomProfile(name, profileString) {
profilesList.append({ profilesList.append({text: name, obj_string: profileString, builtin: false});
"text": name,
"obj_string": profileString,
"builtin": false
})
} }
// PROFILES /////////////////////////////////////////////////////////////// // PROFILES ///////////////////////////////////////////////////////////////
property ListModel profilesList: ListModel{ property ListModel profilesList: ListModel{
ListElement{ ListElement{
text: "Default Amber" text: "Default Amber"
@@ -457,7 +412,8 @@ QtObject {
} }
ListElement{ ListElement{
text: "Monochrome Green" text: "Monochrome Green"
obj_string: '{ obj_string: '
{
"ambientLight": 0.2, "ambientLight": 0.2,
"backgroundColor": "#000000", "backgroundColor": "#000000",
"bloom": 0.5538, "bloom": 0.5538,
@@ -484,7 +440,8 @@ QtObject {
} }
ListElement{ ListElement{
text: "Green Scanlines" text: "Green Scanlines"
obj_string: '{ obj_string: '
{
"ambientLight": 0, "ambientLight": 0,
"backgroundColor": "#000000", "backgroundColor": "#000000",
"bloom": 0.6, "bloom": 0.6,
@@ -511,7 +468,8 @@ QtObject {
} }
ListElement{ ListElement{
text: "Default Pixelated" text: "Default Pixelated"
obj_string: '{ obj_string: '
{
"ambientLight": 0, "ambientLight": 0,
"backgroundColor": "#000000", "backgroundColor": "#000000",
"bloom": 0.4045, "bloom": 0.4045,
@@ -538,7 +496,8 @@ QtObject {
} }
ListElement{ ListElement{
text: "Apple ][" text: "Apple ]["
obj_string: '{ obj_string:
'{
"ambientLight": 0.3038, "ambientLight": 0.3038,
"backgroundColor": "#000000", "backgroundColor": "#000000",
"bloom": 0.5, "bloom": 0.5,
@@ -565,7 +524,8 @@ QtObject {
} }
ListElement{ ListElement{
text: "Vintage" text: "Vintage"
obj_string: '{ obj_string: '
{
"ambientLight": 0.5, "ambientLight": 0.5,
"backgroundColor": "#000000", "backgroundColor": "#000000",
"bloom": 0.4983, "bloom": 0.4983,
@@ -592,7 +552,8 @@ QtObject {
} }
ListElement{ ListElement{
text: "IBM Dos" text: "IBM Dos"
obj_string: '{ obj_string:
'{
"ambientLight": 0.151, "ambientLight": 0.151,
"backgroundColor": "#000000", "backgroundColor": "#000000",
"bloom": 0.2969, "bloom": 0.2969,
@@ -619,7 +580,8 @@ QtObject {
} }
ListElement{ ListElement{
text: "IBM 3278" text: "IBM 3278"
obj_string: '{ obj_string:
'{
"ambientLight": 0.1, "ambientLight": 0.1,
"backgroundColor": "#000000", "backgroundColor": "#000000",
"bloom": 0.2969, "bloom": 0.2969,
@@ -646,7 +608,8 @@ QtObject {
} }
ListElement{ ListElement{
text: "Futuristic" text: "Futuristic"
obj_string: '{ obj_string:
'{
"ambientLight": 0, "ambientLight": 0,
"backgroundColor": "#000000", "backgroundColor": "#000000",
"bloom": 0.5017, "bloom": 0.5017,
@@ -676,51 +639,51 @@ QtObject {
function getProfileIndexByName(name) { function getProfileIndexByName(name) {
for (var i = 0; i < profilesList.count; i++) { for (var i = 0; i < profilesList.count; i++) {
if(profilesList.get(i).text === name) if(profilesList.get(i).text === name)
return i return i;
} }
return -1 return -1;
} }
Component.onCompleted: { Component.onCompleted: {
// Manage the arguments from the QML side. // Manage the arguments from the QML side.
var args = Qt.application.arguments var args = Qt.application.arguments;
if (args.indexOf("--verbose") !== -1) { if (args.indexOf("--verbose") !== -1) {
verbose = true verbose = true;
} }
if (args.indexOf("--default-settings") === -1) { if (args.indexOf("--default-settings") === -1) {
loadSettings() loadSettings();
} }
loadCustomProfiles() loadCustomProfiles();
var profileArgPosition = args.indexOf("--profile") var profileArgPosition = args.indexOf("--profile");
if (profileArgPosition !== -1) { if (profileArgPosition !== -1) {
var profileIndex = getProfileIndexByName( var profileIndex = getProfileIndexByName(args[profileArgPosition + 1]);
args[profileArgPosition + 1])
if (profileIndex !== -1) if (profileIndex !== -1)
loadProfile(profileIndex) loadProfile(profileIndex);
else else
console.log("Warning: selected profile is not valid; ignoring it") console.log("Warning: selected profile is not valid; ignoring it");
} }
if (args.indexOf("--fullscreen") !== -1) { if (args.indexOf("--fullscreen") !== -1) {
fullscreen = true fullscreen = true;
showMenubar = false showMenubar = false;
} }
if (args.indexOf("-T") !== -1) { if (args.indexOf("-T") !== -1) {
wintitle = args[args.indexOf("-T") + 1] wintitle = args[args.indexOf("-T") + 1]
} }
initializedSettings() initializedSettings();
} }
Component.onDestruction: { Component.onDestruction: {
storeSettings() storeSettings();
storeCustomProfiles() storeCustomProfiles();
// storage.dropSettings(); //DROPS THE SETTINGS!.. REMEMBER TO DISABLE ONCE ENABLED!! // storage.dropSettings(); //DROPS THE SETTINGS!.. REMEMBER TO DISABLE ONCE ENABLED!!
} }
// VARS /////////////////////////////////////////////////////////////////// // VARS ///////////////////////////////////////////////////////////////////
property Label _sampleLabel: Label { property Label _sampleLabel: Label {
text: "100%" text: "100%"
} }

View File

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

View File

@@ -0,0 +1,51 @@
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-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,8 +17,9 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Controls 2.0 import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import "Components" import "Components"
@@ -27,19 +28,19 @@ RowLayout {
property alias name: check.text property alias name: check.text
property double value property double value
property alias min_value: slider.from property alias min_value: slider.minimumValue
property alias max_value: slider.to property alias max_value: slider.maximumValue
property alias stepSize: slider.stepSize property alias stepSize: slider.stepSize
signal newValue(real newValue) signal newValue(real newValue);
id: setting_component id: setting_component
Layout.fillWidth: true Layout.fillWidth: true
onValueChanged: { onValueChanged: {
check.checked = !(value == 0) check.checked = !(value == 0);
if(check.checked) if(check.checked)
slider.value = value slider.value = value;
} }
CheckBox{ CheckBox{
@@ -47,13 +48,13 @@ RowLayout {
implicitWidth: 160 implicitWidth: 160
onClicked: { onClicked: {
if(!checked){ if(!checked){
checked = false checked = false;
slider.enabled = false slider.enabled = false;
newValue(0) newValue(0);
} else { } else {
checked = true checked = true;
newValue(slider.value) newValue(slider.value);
slider.enabled = true slider.enabled = true;
} }
} }
} }
@@ -62,11 +63,11 @@ RowLayout {
stepSize: parent.stepSize stepSize: parent.stepSize
Layout.fillWidth: true Layout.fillWidth: true
onValueChanged: { onValueChanged: {
newValue(value) newValue(value);
} }
} }
SizedLabel { SizedLabel {
text: Math.round( Layout.fillHeight: true
((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-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Dialogs 1.1 import QtQuick.Dialogs 1.1
@@ -34,16 +35,15 @@ Item {
visible: false visible: false
//This is a workaround to a Qt 5.2 bug. //This is a workaround to a Qt 5.2 bug.
onColorChanged: if (Qt.platform.os !== "osx") onColorChanged: if (Qt.platform.os !== "osx") colorSelected(color)
colorSelected(color) onAccepted: if (Qt.platform.os === "osx") colorSelected(color)
onAccepted: if (Qt.platform.os === "osx")
colorSelected(color)
} }
Rectangle{ Rectangle{
anchors.fill: parent anchors.fill: parent
radius: 10 radius: 10
color: rootItem.color color: rootItem.color
border.color: "black"
Glossy {}
Rectangle { Rectangle {
anchors.fill: parent anchors.fill: parent
anchors.margins: parent.height * 0.25 anchors.margins: parent.height * 0.25
@@ -59,6 +59,6 @@ Item {
} }
MouseArea{ MouseArea{
anchors.fill: parent anchors.fill: parent
onClicked: colorDialog.visible = true onClicked: colorDialog.visible = true;
} }
} }

View File

@@ -1,7 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -19,14 +17,19 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 2.0 import QtQuick.Controls 1.0
import QtQuick.Layouts 1.0
// This component is simply a label with a predefined size. // This component is simply a label with a predefined size.
// Used to improve alignment. // Used to improve alignment.
Item {
property alias text: textfield.text
width: appSettings.labelWidth
Label{ Label{
id: textfield id: textfield
Layout.minimumWidth: appSettings.labelWidth anchors { right: parent.right; verticalCenter: parent.verticalCenter }
width: appSettings.labelWidth }
} }

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
QtObject{ QtObject{

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
QtObject{ QtObject{

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
QtObject{ QtObject{
@@ -26,11 +27,17 @@ QtObject {
property var _font: fontlist.get(selectedFontIndex) property var _font: fontlist.get(selectedFontIndex)
property bool lowResolutionFont: _font.lowResolutionFont property bool lowResolutionFont: _font.lowResolutionFont
property int pixelSize: lowResolutionFont ? _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 property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
@@ -45,6 +52,7 @@ QtObject {
// High resolution fonts are instead drawn on a texture which has the // High resolution fonts are instead drawn on a texture which has the
// size of the screen, and the scaling directly controls their pixels size. // size of the screen, and the scaling directly controls their pixels size.
// Those are slower to render but are not pixelated. // Those are slower to render but are not pixelated.
property ListModel fontlist: ListModel { property ListModel fontlist: ListModel {
ListElement{ ListElement{
name: "TERMINUS_SCALED" name: "TERMINUS_SCALED"
@@ -213,7 +221,7 @@ QtObject {
ListElement{ ListElement{
name: "IBM_3278" name: "IBM_3278"
text: "HD: IBM 3278 (1971)" text: "HD: IBM 3278 (1971)"
source: "fonts/1971-ibm-3278/3270Medium.ttf" source: "fonts/1971-ibm-3278/3270-Regular.ttf"
lineSpacing: 0.2 lineSpacing: 0.2
pixelSize: 32 pixelSize: 32
fontWidth: 1.0 fontWidth: 1.0
@@ -226,7 +234,7 @@ QtObject {
Component.onCompleted: addSystemFonts() Component.onCompleted: addSystemFonts()
function addSystemFonts() { function addSystemFonts() {
var families = monospaceSystemFonts var families = monospaceSystemFonts;
for (var i = 0; i < families.length; i++) { for (var i = 0; i < families.length; i++) {
if (verbose) { if (verbose) {
console.log("Adding system font: ", families[i]) console.log("Adding system font: ", families[i])
@@ -237,16 +245,16 @@ QtObject {
function convertToListElement(family) { function convertToListElement(family) {
return { return {
"name": "System: " + family, name: "System: " + family,
"text": qsTr("System: ") + family, text: qsTr("System: ") + family,
"source": "", source: "",
"lineSpacing": 0.1, lineSpacing: 0.1,
"pixelSize": 30, pixelSize: 30,
"fontWidth": 1.0, fontWidth: 1.0,
"baseScaling": 1.0, baseScaling: 1.0,
"lowResolutionFont": false, lowResolutionFont: false,
"isSystemFont": true, isSystemFont: true,
"family": family family: family
} }
} }
} }

21
app/qml/Glossy.qml Normal file
View File

@@ -0,0 +1,21 @@
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-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,9 +17,10 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Window 2.0 import QtQuick.Window 2.0
import QtQuick.Controls 2.0 import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.1 import QtQuick.Dialogs 1.1
@@ -39,25 +40,23 @@ Window {
visible: false visible: false
function showError(message){ function showError(message){
text = message text = message;
open() open();
} }
} }
function validateName(name){ function validateName(name){
var profile_list = appSettings.profilesList var profile_list = appSettings.profilesList;
if (name === "") if (name === "")
return 1 return 1;
return 0 return 0;
} }
ColumnLayout{ ColumnLayout{
anchors.margins: 10 anchors.margins: 10
anchors.fill: parent anchors.fill: parent
RowLayout{ RowLayout{
Label { Label{text: qsTr("Name")}
text: qsTr("Name")
}
TextField{ TextField{
id: namefield id: namefield
Layout.fillWidth: true Layout.fillWidth: true
@@ -72,15 +71,14 @@ Window {
text: qsTr("OK") text: qsTr("OK")
onClicked: clickAction() onClicked: clickAction()
function clickAction(){ function clickAction(){
var name = namefield.text var name = namefield.text;
switch(validateName(name)){ switch(validateName(name)){
case 1: case 1:
errorDialog.showError( errorDialog.showError(qsTr("The name you inserted is empty. Please choose a different one."));
qsTr("The name you inserted is empty. Please choose a different one.")) break;
break
default: default:
nameSelected(name) nameSelected(name);
close() close();
} }
} }
} }

View File

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

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -19,11 +19,10 @@
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Controls 2.0 import QtQuick.Controls 1.1
import QMLTermWidget 1.0 import QMLTermWidget 1.0
import "menus"
import "utils.js" as Utils import "utils.js" as Utils
Item{ Item{
@@ -157,23 +156,31 @@ Item{
Component.onCompleted: { Component.onCompleted: {
appSettings.terminalFontChanged.connect(handleFontChanged); appSettings.terminalFontChanged.connect(handleFontChanged);
appSettings.initializedSettings.connect(startSession); appSettings.initializedSettings.connect(startSession);
appSettings.handleFontChanged()
} }
} }
Component { Component {
id: shortContextMenu id: linuxContextMenu
ShortContextMenu { } 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 }
}
} }
Component { Component {
id: fullContextMenu id: osxContextMenu
FullContextMenu { } Menu{
id: contextmenu
MenuItem{action: copyAction}
MenuItem{action: pasteAction}
}
} }
Loader { Loader {
id: menuLoader id: menuLoader
sourceComponent: (Qt.platform.os === "osx" || appSettings.showMenubar ? shortContextMenu : fullContextMenu) sourceComponent: (Qt.platform.os === "osx" ? osxContextMenu : linuxContextMenu)
} }
property alias contextmenu: menuLoader.item property alias contextmenu: menuLoader.item

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.

View File

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

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,12 +17,12 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
Rectangle{ Rectangle{
property size terminalSize property size terminalSize
property real topOpacity: 0.6 property real topOpacity: 0.6
width: textSize.width * 2 width: textSize.width * 2
height: textSize.height * 2 height: textSize.height * 2
radius: 5 radius: 5
@@ -31,11 +31,7 @@ Rectangle {
color: "black" color: "black"
opacity: sizetimer.running ? 0.6 : 0.0 opacity: sizetimer.running ? 0.6 : 0.0
Behavior on opacity { Behavior on opacity{NumberAnimation{duration: 200}}
NumberAnimation {
duration: 200
}
}
onTerminalSizeChanged: sizetimer.restart() onTerminalSizeChanged: sizetimer.restart()

View File

@@ -1,23 +1,3 @@
/*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
*
* cool-retro-term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.0 import QtQuick 2.0
import "utils.js" as Utils import "utils.js" as Utils
@@ -26,10 +6,12 @@ Loader {
property ShaderEffectSource source: item ? item.source : null property ShaderEffectSource source: item ? item.source : null
active: !appSettings.useFastBurnIn && appSettings.burnIn !== 0 active: !appSettings.useFastBurnIn && appSettings.burnIn !== 0
anchors.fill: parent anchors.fill: parent
sourceComponent: Item { sourceComponent: Item {
property alias source: burnInSourceEffect property alias source: burnInSourceEffect
property int burnInScaling: scaleTexture * appSettings.burnInQuality property int burnInScaling: scaleTexture * appSettings.burnInQuality
ShaderEffectSource { ShaderEffectSource {

View File

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

View File

@@ -1,22 +1,3 @@
/*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
*
* cool-retro-term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
import QtGraphicalEffects 1.0 import QtGraphicalEffects 1.0
@@ -45,6 +26,7 @@ ShaderTerminal {
} }
// EFFECTS //////////////////////////////////////////////////////////////// // EFFECTS ////////////////////////////////////////////////////////////////
Loader{ Loader{
id: bloomEffectLoader id: bloomEffectLoader
active: appSettings.bloom active: appSettings.bloom
@@ -53,7 +35,7 @@ ShaderTerminal {
height: parent.height * appSettings.bloomQuality height: parent.height * appSettings.bloomQuality
sourceComponent: FastBlur{ sourceComponent: FastBlur{
radius: Utils.lint(16, 64, appSettings.bloomQuality) radius: Utils.lint(16, 64, appSettings.bloomQuality);
source: terminal.mainSource source: terminal.mainSource
transparentBorder: true transparentBorder: true
} }
@@ -72,4 +54,71 @@ ShaderTerminal {
} }
bloomSource: bloomSourceLoader.item bloomSource: bloomSourceLoader.item
// NewTerminalFrame {
// id: terminalFrame
// anchors.fill: parent
// blending: true
// }
// This shader might be useful in the future. Since we used it only for a couple
// of calculations is probably best to move those in the main shader. If in the future
// we need to store another fullScreen channel this might be handy.
// ShaderEffect {
// id: rasterizationEffect
// width: parent.width
// height: parent.height
// property real outColor: 0.0
// property real dispX: (5 / width) * appSettings.windowScaling
// property real dispY: (5 / height) * appSettings.windowScaling
// property size virtual_resolution: terminal.virtualResolution
// blending: false
// fragmentShader:
// "uniform lowp float qt_Opacity;" +
// "varying highp vec2 qt_TexCoord0;
// uniform highp vec2 virtual_resolution;
// uniform highp float dispX;
// uniform highp float dispY;
// uniform mediump float outColor;
// highp float getScanlineIntensity(vec2 coords) {
// highp float result = 1.0;" +
// (appSettings.rasterization != appSettings.no_rasterization ?
// "result *= abs(sin(coords.y * virtual_resolution.y * "+Math.PI+"));" : "") +
// (appSettings.rasterization == appSettings.pixel_rasterization ?
// "result *= abs(sin(coords.x * virtual_resolution.x * "+Math.PI+"));" : "") + "
// return result;
// }" +
// "void main() {" +
// "highp float color = getScanlineIntensity(qt_TexCoord0);" +
// "float distance = length(vec2(0.5) - qt_TexCoord0);" +
// "color = mix(color, 0.0, 1.2 * distance * distance);" +
// "color *= outColor + smoothstep(0.00, dispX, qt_TexCoord0.x) * (1.0 - outColor);" +
// "color *= outColor + smoothstep(0.00, dispY, qt_TexCoord0.y) * (1.0 - outColor);" +
// "color *= outColor + (1.0 - smoothstep(1.00 - dispX, 1.00, qt_TexCoord0.x)) * (1.0 - outColor);" +
// "color *= outColor + (1.0 - smoothstep(1.00 - dispY, 1.00, qt_TexCoord0.y)) * (1.0 - outColor);" +
// "gl_FragColor.a = color;" +
// "}"
// onStatusChanged: if (log) console.log(log) //Print warning messages
// }
// rasterizationSource: ShaderEffectSource{
// id: rasterizationEffectSource
// sourceItem: rasterizationEffect
// hideSource: true
// smooth: true
// wrapMode: ShaderEffectSource.ClampToEdge
// visible: false
// }
} }

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
Timer{ Timer{

Binary file not shown.

View File

@@ -2,10 +2,13 @@
================================== ==================================
![Travis-CI](https://api.travis-ci.org/rbanffy/3270font.svg) ![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://raw.githubusercontent.com/wiki/rbanffy/3270font/3270Medium_sample.png) ![Sample](https://3270font.s3.amazonaws.com/3270_sample.gif)
A little bit of history A little bit of history
----------------------- -----------------------
@@ -26,15 +29,18 @@ 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` building your font files, you can simply `apt-get install fonts-3270`
(It's available from the Debian (It's available from the Debian
(https://packages.debian.org/sid/fonts/fonts-3270) and Ubuntu (https://packages.debian.org/sid/fonts/fonts-3270) and Ubuntu
(http://packages.ubuntu.com/zesty/fonts-3270) package repos at (http://packages.ubuntu.com/impish/fonts-3270) package repos at
https://packages.debian.org/sid/fonts/fonts-3270 and https://packages.debian.org/sid/fonts/fonts-3270 and
http://packages.ubuntu.com/xenial/fonts/fonts-3270, although the https://packages.ubuntu.com/impish/fonts/fonts-3270, although the
packaged version may not be the latest version, but it's good enough for packaged version may not be the latest version, but it's good enough for
most purposes. For those who don't have the luxury of a proper most purposes.
system-managed package, Adobe Type 1, TTF, OTF and WOFF versions are
available for download on On FreeBSD the font can be installed with `pkg install 3270font`.
http://s3.amazonaws.com/3270font/3270_fonts_4cfe95c.zip (although this
URL may not always reflect the latest version). 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).
![ASCII is so 60's]( ![ASCII is so 60's](
https://raw.githubusercontent.com/wiki/rbanffy/3270font/cyrillic.png) https://raw.githubusercontent.com/wiki/rbanffy/3270font/cyrillic.png)
@@ -46,21 +52,18 @@ The "source" file is edited using FontForge. You'll need it if you want
to generate fonts for your platform. On most civilized operating to generate fonts for your platform. On most civilized operating
systems, you can simply `apt-get install fontforge`, `yum install systems, you can simply `apt-get install fontforge`, `yum install
fontforge` or even `port install fontforge`. On others, you may need to fontforge` or even `port install fontforge`. On others, you may need to
grab your copy from http://fontforge.org/. I encourage you to drop by grab your copy from https://fontforge.org/. I encourage you to drop by
and read the tutorials. 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)]( ![Using it on OSX (don't forget to turn antialiasing on)](
https://raw.githubusercontent.com/wiki/rbanffy/3270font/osx_terminal.png) https://raw.githubusercontent.com/wiki/rbanffy/3270font/osx_terminal.png)
If you are running Windows, you'll probably need something like 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 Cygwin, but, in the end, the font works correctly (with some very minor
minor hinting issues). hinting issues).
![Works on Windows]( ![Works on Windows](
https://raw.githubusercontent.com/wiki/rbanffy/3270font/windows_7.png) https://raw.githubusercontent.com/wiki/rbanffy/3270font/windows_10.png)
Generating usable font files Generating usable font files
---------------------------- ----------------------------
@@ -93,6 +96,36 @@ 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 you'll need a Python 3 environment with PIL or pillow installed. The
requirements.txt file lists everything you need to do it. 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 Known problems
-------------- --------------

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,11 +17,11 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Window 2.1 import QtQuick.Window 2.1
import QtQuick.Controls 2.3 import QtQuick.Controls 1.1
import QtGraphicalEffects 1.0
import "menus"
ApplicationWindow{ ApplicationWindow{
id: terminalWindow id: terminalWindow
@@ -37,6 +37,8 @@ ApplicationWindow {
// Load saved window geometry and show the window // Load saved window geometry and show the window
Component.onCompleted: { Component.onCompleted: {
appSettings.handleFontChanged();
x = appSettings.x x = appSettings.x
y = appSettings.y y = appSettings.y
width = appSettings.width width = appSettings.width
@@ -53,9 +55,11 @@ ApplicationWindow {
property bool fullscreen: appSettings.fullscreen property bool fullscreen: appSettings.fullscreen
onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed) onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed)
menuBar: WindowMenu { //Workaround: Without __contentItem a ugly thin border is visible.
menuBar: CRTMainMenuBar{
id: mainMenu id: mainMenu
visible: (Qt.platform.os === "osx" || appSettings.showMenubar) visible: (Qt.platform.os === "osx" || appSettings.showMenubar)
__contentItem.visible: mainMenu.visible
} }
property string wintitle: appSettings.wintitle property string wintitle: appSettings.wintitle
@@ -77,7 +81,7 @@ ApplicationWindow {
text: qsTr("Fullscreen") text: qsTr("Fullscreen")
enabled: Qt.platform.os !== "osx" enabled: Qt.platform.os !== "osx"
shortcut: "Alt+F11" shortcut: "Alt+F11"
onTriggered: appSettings.fullscreen = !appSettings.fullscreen onTriggered: appSettings.fullscreen = !appSettings.fullscreen;
checkable: true checkable: true
checked: appSettings.fullscreen checked: appSettings.fullscreen
} }
@@ -85,15 +89,15 @@ ApplicationWindow {
id: quitAction id: quitAction
text: qsTr("Quit") text: qsTr("Quit")
shortcut: "Ctrl+Shift+Q" shortcut: "Ctrl+Shift+Q"
onTriggered: Qt.quit() onTriggered: Qt.quit();
} }
Action{ Action{
id: showsettingsAction id: showsettingsAction
text: qsTr("Settings") text: qsTr("Settings")
onTriggered: { onTriggered: {
settingswindow.show() settingswindow.show();
settingswindow.requestActivate() settingswindow.requestActivate();
settingswindow.raise() settingswindow.raise();
} }
} }
Action{ Action{
@@ -110,21 +114,21 @@ ApplicationWindow {
id: zoomIn id: zoomIn
text: qsTr("Zoom In") text: qsTr("Zoom In")
shortcut: "Ctrl++" shortcut: "Ctrl++"
onTriggered: appSettings.incrementScaling() onTriggered: appSettings.incrementScaling();
} }
Action{ Action{
id: zoomOut id: zoomOut
text: qsTr("Zoom Out") text: qsTr("Zoom Out")
shortcut: "Ctrl+-" shortcut: "Ctrl+-"
onTriggered: appSettings.decrementScaling() onTriggered: appSettings.decrementScaling();
} }
Action{ Action{
id: showAboutAction id: showAboutAction
text: qsTr("About") text: qsTr("About")
onTriggered: { onTriggered: {
aboutDialog.show() aboutDialog.show();
aboutDialog.requestActivate() aboutDialog.requestActivate();
aboutDialog.raise() aboutDialog.raise();
} }
} }
ApplicationSettings{ ApplicationSettings{
@@ -132,6 +136,7 @@ ApplicationWindow {
} }
TerminalContainer{ TerminalContainer{
id: terminalContainer id: terminalContainer
y: appSettings.showMenubar ? 0 : -2 // Workaroud to hide the margin in the menubar.
width: parent.width width: parent.width
height: (parent.height + Math.abs(y)) height: (parent.height + Math.abs(y))
} }

View File

@@ -1,95 +0,0 @@
/*******************************************************************************
* 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

@@ -1,31 +0,0 @@
/*******************************************************************************
* 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

@@ -1,85 +0,0 @@
/*******************************************************************************
* 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,6 +12,7 @@
<file>TimeManager.qml</file> <file>TimeManager.qml</file>
<file>SimpleSlider.qml</file> <file>SimpleSlider.qml</file>
<file>ColorButton.qml</file> <file>ColorButton.qml</file>
<file>Glossy.qml</file>
<file>AboutDialog.qml</file> <file>AboutDialog.qml</file>
<file>InsertNameDialog.qml</file> <file>InsertNameDialog.qml</file>
<file>SettingsEffectsTab.qml</file> <file>SettingsEffectsTab.qml</file>
@@ -19,8 +20,9 @@
<file>SettingsTerminalTab.qml</file> <file>SettingsTerminalTab.qml</file>
<file>FontScanlines.qml</file> <file>FontScanlines.qml</file>
<file>fonts/1977-apple2/PrintChar21.ttf</file> <file>fonts/1977-apple2/PrintChar21.ttf</file>
<file>fonts/1971-ibm-3278/3270Medium.ttf</file> <file>fonts/1971-ibm-3278/3270-Regular.ttf</file>
<file>Storage.qml</file> <file>Storage.qml</file>
<file>CRTMainMenuBar.qml</file>
<file>SettingsAdvancedTab.qml</file> <file>SettingsAdvancedTab.qml</file>
<file>TerminalContainer.qml</file> <file>TerminalContainer.qml</file>
<file>images/crt256.png</file> <file>images/crt256.png</file>
@@ -42,8 +44,5 @@
<file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file> <file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file>
<file>NewTerminalFrame.qml</file> <file>NewTerminalFrame.qml</file>
<file>SlowBurnIn.qml</file> <file>SlowBurnIn.qml</file>
<file>menus/WindowMenu.qml</file>
<file>menus/FullContextMenu.qml</file>
<file>menus/ShortContextMenu.qml</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@@ -1,23 +1,3 @@
/*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
*
* cool-retro-term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
.pragma library .pragma library
function clamp(x, min, max) { function clamp(x, min, max) {
if (x <= min) if (x <= min)
@@ -26,18 +6,15 @@ function clamp(x, min, max) {
return max; return max;
return x; return x;
} }
function lint(a, b, t) { function lint(a, b, t) {
return (1 - t) * a + (t) * b; return (1 - t) * a + (t) * b;
} }
function mix(c1, c2, alpha){ function mix(c1, c2, alpha){
return Qt.rgba(c1.r * alpha + c2.r * (1-alpha), return Qt.rgba(c1.r * alpha + c2.r * (1-alpha),
c1.g * alpha + c2.g * (1-alpha), c1.g * alpha + c2.g * (1-alpha),
c1.b * alpha + c2.b * (1-alpha), c1.b * alpha + c2.b * (1-alpha),
c1.a * alpha + c2.a * (1-alpha)) c1.a * alpha + c2.a * (1-alpha))
} }
function strToColor(s){ function strToColor(s){
var r = parseInt(s.substring(1,3), 16) / 256; var r = parseInt(s.substring(1,3), 16) / 256;
var g = parseInt(s.substring(3,5), 16) / 256; var g = parseInt(s.substring(3,5), 16) / 256;