13 Commits

Author SHA1 Message Date
Adam Mathes
e7e3dfed00 spacing 2019-02-09 20:49:31 -08:00
Adam Mathes
aa82250232 tabs -> spaces 2019-02-09 20:25:36 -08:00
Adam Mathes
88f59d2016 fix spacing 2019-02-09 20:23:51 -08:00
Adam Mathes
8021ff4256 Merge branch 'master' of https://github.com/Swordfish90/cool-retro-term 2019-02-09 20:16:27 -08:00
Adam Mathes
32eab18da9 cean closewindow 2019-02-09 19:56:43 -08:00
Adam Mathes
52140c4c45 count child terminals, qt.quit when none left 2019-02-09 19:30:29 -08:00
Adam Mathes
10fd2a11ee qml 2019-02-02 08:01:05 -08:00
Adam Mathes
749ea88909 upstream merge 2019-02-02 07:42:21 -08:00
Adam Mathes
3f0653106e Merge branch 'master' of https://github.com/Swordfish90/cool-retro-term 2018-03-04 13:33:37 -08:00
Adam Mathes
9954fde6f1 qmlterm update 2017-12-17 19:06:35 -08:00
Adam Mathes
3ec46ea833 Merge remote-tracking branch 'upstream/master' 2017-10-18 17:05:54 -07:00
Adam Mathes
d59ac20e38 merge multiterm branch 2017-01-11 17:36:37 -08:00
Adam Mathes
7ce6571e1f change to point to qmlterm fork 2017-01-10 21:21:18 -08:00
38 changed files with 1445 additions and 1685 deletions

1
.gitignore vendored
View File

@@ -18,7 +18,6 @@
*.pro.user.* *.pro.user.*
*.moc *.moc
moc_*.cpp moc_*.cpp
moc_*.h
qrc_*.cpp qrc_*.cpp
ui_*.h ui_*.h
Makefile* Makefile*

View File

@@ -12,8 +12,6 @@ It uses the QML port of qtermwidget (Konsole) developed by me: https://github.co
This terminal emulator works under Linux and macOS and requires Qt 5.2 or higher. This terminal emulator works under Linux and macOS and requires Qt 5.2 or higher.
Settings such as colors, fonts, and effects can be accessed via context menu.
## Screenshots ## Screenshots
![Image](<https://i.imgur.com/TNumkDn.png>) ![Image](<https://i.imgur.com/TNumkDn.png>)
![Image](<https://i.imgur.com/hfjWOM4.png>) ![Image](<https://i.imgur.com/hfjWOM4.png>)
@@ -28,13 +26,13 @@ Just grab the latest AppImage from the release page and make it executable and r
chmod a+x Cool-Retro-Term-1.1.1-x86_64.AppImage chmod a+x Cool-Retro-Term-1.1.1-x86_64.AppImage
./Cool-Retro-Term-1.1.1-x86_64.AppImage ./Cool-Retro-Term-1.1.1-x86_64.AppImage
**Fedora** has the `cool-retro-term` in the official repositories. All you have to do is `sudo dnf install cool-retro-term`. **Fedora** has the `cool-retro-term` in the offcial repositories. All you have to do is `sudo dnf install cool-retro-term`.
Users of **openSUSE** can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term). Users of **openSUSE** can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term).
**Arch** users can install this [package](https://aur.archlinux.org/packages/cool-retro-term-git/) directly via the [AUR](https://aur.archlinux.org): **Arch** users can install this [package](https://aur.archlinux.org/packages/cool-retro-term-git/) directly via the [AUR](https://aur.archlinux.org):
trizen -S aur/cool-retro-term-git yaourt -S aur/cool-retro-term-git
or use: or use:
@@ -42,6 +40,17 @@ or use:
to install precompiled from community repository. to install precompiled from community repository.
**Gentoo** users can now install the third release "1.1.0" from a 3rd-party repository preferably via layman:
USE="git" emerge app-portage/layman
wget https://www.gerczei.eu/files/gerczei.xml -O /etc/layman/overlays/gerczei.xml
layman -f -a qt -a gerczei # those who've added the repo before 27/08/17 should remove, update and add it again as its source has changed
ACCEPT_KEYWORDS="~*" emerge =x11-terms/cool-retro-term-1.1.0::gerczei
The live ebuild (version 9999-r1) tracking the bleeding-edge WIP codebase also remains available.
A word of warning: USE flags and keywords are to be added to portage's configuration files and every emerge operation should be executed with '-p' (short option for --pretend) appended to the command line first as per best practice!
Users of **Ubuntu 14.04 LTS (Trusty) up to 15.10 (Wily)** can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb). Users of **Ubuntu 14.04 LTS (Trusty) up to 15.10 (Wily)** can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb).
**Ubuntu 17.10** can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term) **Ubuntu 17.10** can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term)
@@ -51,23 +60,7 @@ Users of **Ubuntu 14.04 LTS (Trusty) up to 15.10 (Wily)** can use [this PPA](htt
eopkg it cool-retro-term eopkg it cool-retro-term
``` ```
**macOS** users can grab the latest dmg from the [release page](https://github.com/Swordfish90/cool-retro-term/releases) or install via Homebrew: **macOS** users can grab the latest dmg from the release page: https://github.com/Swordfish90/cool-retro-term/releases
```
brew cask install cool-retro-term
```
**FreeBSD** users can install cool-retro-term with `pkg`:
pkg install cool-retro-term
## Build instructions (FreeBSD)
Grab a copy of [the FreeBSD Ports Collection](https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html), modify [`/usr/ports/x11/cool-retro-term/Makefile`](https://svnweb.freebsd.org/ports/head/x11/cool-retro-term/Makefile?view=markup) as you like, and then run `make install` to build and install the emulator:
```
cd /usr/ports/x11/cool-retro-term
make install
```
## Build instructions (Linux) ## Build instructions (Linux)
@@ -102,12 +95,6 @@ Make sure to install these first.
--- ---
**snapcraft (most of distros)**
sudo snap install cool-retro-term --classic
---
**Debian Jessie and above** **Debian Jessie and above**
sudo apt install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtgraphicaleffects qml-module-qtquick-dialogs qml-module-qtquick-localstorage qml-module-qtquick-window2 qml-module-qt-labs-settings qml-module-qt-labs-folderlistmodel sudo apt install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtgraphicaleffects qml-module-qtquick-dialogs qml-module-qtquick-localstorage qml-module-qtquick-window2 qml-module-qt-labs-settings qml-module-qt-labs-folderlistmodel
@@ -199,12 +186,6 @@ cp -r qmltermwidget/QMLTermWidget cool-retro-term.app/Contents/PlugIns
open cool-retro-term.app open cool-retro-term.app
``` ```
**Homebrew**
```sh
brew cask install cool-retro-term
```
## Donations ## Donations
I made this project in my spare time because I love what I'm doing. If you are enjoying it and you want to buy me a beer click [here](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=flscogna%40gmail%2ecom&lc=IT&item_name=Filippo%20Scognamiglio&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted). I made this project in my spare time because I love what I'm doing. If you are enjoying it and you want to buy me a beer click [here](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=flscogna%40gmail%2ecom&lc=IT&item_name=Filippo%20Scognamiglio&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted).

View File

@@ -42,28 +42,6 @@ int main(int argc, char *argv[])
setenv("LC_CTYPE", "UTF-8", 1); setenv("LC_CTYPE", "UTF-8", 1);
#endif #endif
if (argc>1 && (!strcmp(argv[1],"-h") || !strcmp(argv[1],"--help"))) {
QTextStream cout(stdout, QIODevice::WriteOnly);
cout << "Usage: " << argv[0] << " [--default-settings] [--workdir <dir>] [--program <prog>] [-p|--profile <prof>] [--fullscreen] [-h|--help]" << endl;
cout << " --default-settings Run cool-retro-term with the default settings" << endl;
cout << " --workdir <dir> Change working directory to 'dir'" << endl;
cout << " -e <cmd> Command to execute. This option will catch all following arguments, so use it as the last option." << endl;
cout << " -T <title> Set window title to 'title'." << endl;
cout << " --fullscreen Run cool-retro-term in fullscreen." << endl;
cout << " -p|--profile <prof> Run cool-retro-term with the given profile." << endl;
cout << " -h|--help Print this help." << endl;
cout << " --verbose Print additional information such as profiles and settings." << endl;
return 0;
}
QString appVersion("1.1.1");
if (argc>1 && (!strcmp(argv[1],"-v") || !strcmp(argv[1],"--version"))) {
QTextStream cout(stdout, QIODevice::WriteOnly);
cout << "cool-retro-term " << appVersion << endl;
return 0;
}
QApplication app(argc, argv); QApplication app(argc, argv);
// set application attributes // set application attributes
// Has no effects, see https://bugreports.qt.io/browse/QTBUG-51293 // Has no effects, see https://bugreports.qt.io/browse/QTBUG-51293
@@ -79,11 +57,29 @@ 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();
if (args.contains("-h") || args.contains("--help")) {
// BUG: This usage help text goes to stderr, should go to stdout.
// BUG: First line of output is surrounded by double quotes.
qDebug() << "Usage: " + args.at(0) + " [--default-settings] [--workdir <dir>] [--program <prog>] [-p|--profile <prof>] [--fullscreen] [-h|--help]";
qDebug() << " --default-settings Run cool-retro-term with the default settings";
qDebug() << " --workdir <dir> Change working directory to 'dir'";
qDebug() << " -e <cmd> Command to execute. This option will catch all following arguments, so use it as the last option.";
qDebug() << " -T <title> Set window title to 'title'.";
qDebug() << " --fullscreen Run cool-retro-term in fullscreen.";
qDebug() << " -p|--profile <prof> Run cool-retro-term with the given profile.";
qDebug() << " -h|--help Print this help.";
qDebug() << " --verbose Print additional information such as profiles and settings.";
return 0;
}
QString appVersion("1.1.1");
if (args.contains("-v") || args.contains("--version")) {
qDebug() << ("cool-retro-term " + appVersion).toStdString().c_str();
return 0;
}
// Manage default command // Manage default command
QStringList cmdList; QStringList cmdList;
@@ -109,7 +105,7 @@ int main(int argc, char *argv[])
importPathList.prepend(QCoreApplication::applicationDirPath() + "/../../../qmltermwidget"); importPathList.prepend(QCoreApplication::applicationDirPath() + "/../../../qmltermwidget");
engine.setImportPathList(importPathList); engine.setImportPathList(importPathList);
engine.load(QUrl(QStringLiteral ("qrc:/main.qml"))); engine.load(QUrl(QStringLiteral ("qrc:/root.qml")));
if (engine.rootObjects().isEmpty()) { if (engine.rootObjects().isEmpty()) {
qDebug() << "Cannot load QML interface"; qDebug() << "Cannot load QML interface";

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
@@ -56,11 +59,10 @@ QtObject {
property real burnInQuality: 0.5 property real burnInQuality: 0.5
property bool useFastBurnIn: Qt.platform.os === "osx" ? false : true property bool useFastBurnIn: Qt.platform.os === "osx" ? false : true
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 +73,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 +103,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 +117,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 +134,150 @@ 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
} }
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 +287,96 @@ 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
!== 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 +407,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 +435,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 +463,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 +491,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 +519,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 +547,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 +575,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 +603,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 +634,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,57 @@
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("Terminal")
visible: defaultMenuBar.visible
MenuItem {action: newAction}
MenuItem {action: closeAction}
}
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"
@@ -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{
@@ -95,7 +94,6 @@ Item{
smooth: !appSettings.lowResolutionFont smooth: !appSettings.lowResolutionFont
enableBold: false enableBold: false
fullCursorHeight: true fullCursorHeight: true
blinkingCursor: appSettings.blinkingCursor
session: QMLTermSession { session: QMLTermSession {
id: ksession id: ksession
@@ -157,23 +155,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) + "%"
@@ -110,24 +114,6 @@ ColumnLayout {
} }
} }
} }
GroupBox {
title: qsTr("Cursor")
Layout.fillWidth: true
ColumnLayout {
anchors.fill: parent
CheckBox {
id: blinkingCursor
text: qsTr("Blinking Cursor")
checked: appSettings.blinkingCursor
onCheckedChanged: appSettings.blinkingCursor = checked
}
Binding {
target: blinkingCursor
property: "checked"
value: appSettings.blinkingCursor
}
}
}
GroupBox{ GroupBox{
title: qsTr("Colors") title: qsTr("Colors")
Layout.fillWidth: true Layout.fillWidth: true
@@ -153,17 +139,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{

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
@@ -63,6 +67,22 @@ ApplicationWindow {
color: "#00000000" color: "#00000000"
title: terminalContainer.title || qsTr(appSettings.wintitle) title: terminalContainer.title || qsTr(appSettings.wintitle)
Action {
id: newAction
text: qsTr("New Window")
shortcut: Qt.platform.os === "osx" ? StandardKey.New : "Ctrl+Shift+N"
onTriggered: {
root.newWindow()
}
}
Action {
id: closeAction
text: qsTr("Close Window")
shortcut: Qt.platform.os === "osx" ? StandardKey.Close : "Ctrl+Shift+W"
onTriggered: {
terminalWindow.close()
}
}
Action { Action {
id: showMenubarAction id: showMenubarAction
text: qsTr("Show Menubar") text: qsTr("Show Menubar")
@@ -77,7 +97,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 +105,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 +130,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 +152,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))
} }
@@ -152,9 +173,6 @@ ApplicationWindow {
} }
} }
onClosing: { onClosing: {
// OSX Since we are currently supporting only one window root.closeWindow()
// quit the application when it is closed.
if (Qt.platform.os === "osx")
Qt.quit()
} }
} }

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,15 +12,18 @@
<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>
<file>main.qml</file> <file>main.qml</file>
<file>root.qml</file>
<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/3270Medium.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 +45,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>

43
app/qml/root.qml Normal file
View File

@@ -0,0 +1,43 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
*
* cool-retro-term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Window 2.1
QtObject {
id: root
property int terminalCount
function newWindow() {
var component = Qt.createComponent("main.qml")
var window = component.createObject()
window.show()
terminalCount = terminalCount + 1
}
function closeWindow() {
terminalCount = terminalCount - 1
if (terminalCount == 0) {
Qt.quit()
}
}
Component.onCompleted: {
terminalCount = 0
root.newWindow()
}
}

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;

View File

@@ -66,6 +66,4 @@ parts:
- libgl1-mesa-dev - libgl1-mesa-dev
- qtdeclarative5-dev-tools - qtdeclarative5-dev-tools
- qml-module-qtquick-extras - qml-module-qtquick-extras
- qml-module-qt-labs-settings
- qml-module-qt-labs-folderlistmodel