42 Commits

Author SHA1 Message Date
Filippo Scognamiglio
3d99b1d29c Move constants to a separate qml file. 2021-07-19 08:40:30 +02:00
Filippo Scognamiglio
4abbe332db Improve terminal frame and expose frame size setting. 2021-07-15 23:20:42 +02:00
Filippo Scognamiglio
3104abd4ad Add subpixel rasterization. 2021-07-07 00:09:10 +02:00
Filippo Scognamiglio
7714f7b503 Improve rasterization rendering and add LCD rasterization (with subpixels). 2021-07-03 16:14:02 +02:00
Filippo Scognamiglio
701cb540e5 Improve QML syntax and update license headers. 2021-06-30 22:49:03 +02:00
Filippo Scognamiglio
205a152350 Merge pull request #662 from Swordfish90/unstable
Migrate to QtQuick.Controls 2.x
2021-06-30 08:45:24 +02:00
Filippo Scognamiglio
dae1a56691 Migrate from QtQuick.Controls 1.x to QtQuick.Controls 2.x. Updated QMLTermWidget submodule. 2021-06-30 08:33:31 +02:00
Filippo Scognamiglio
dac2b4ff16 Merge pull request #560 from ayazhafiz/docs/homebrew
Add installation instructions using Homebrew
2020-05-09 17:00:35 +02:00
Filippo Scognamiglio
2d12b0c747 Bump qmltermwidget submodule. 2020-05-09 16:51:36 +02:00
Filippo Scognamiglio
5fe26edaa6 Merge pull request #540 from kklemon/support-blinking-cursor
Add blinking cursor support
2020-05-09 16:37:49 +02:00
Filippo Scognamiglio
a736cfd548 Merge pull request #569 from barak/master
get --help and --version to write to stdout
2020-05-09 16:36:45 +02:00
Filippo Scognamiglio
5af4214daa Merge pull request #566 from tgerczei/master
now packaged in the official repository
2020-05-09 16:32:14 +02:00
Barak A. Pearlmutter
98ef7b329a allow --help/-h/--version/-v options without graphics 2020-05-08 16:29:51 +01:00
Barak A. Pearlmutter
b0e1962fa7 send cool-retro-term --help and --version to stdout 2020-05-08 16:29:51 +01:00
Barak A. Pearlmutter
83684e8882 squelch ugly quotes on 1st line of cool-retro-term --usage 2020-05-08 16:29:51 +01:00
Barak A. Pearlmutter
1ed7d077a9 git ignore app/moc_predefs.h 2020-05-08 16:29:51 +01:00
Filippo Scognamiglio
ba4b36618f Merge pull request #546 from jayk/master
Yaourt is deprecated, use trizen instead for arch instructions
2020-05-06 18:44:52 +02:00
Filippo Scognamiglio
af647a4bad Merge pull request #584 from pwwiur/patch-1
Adding snap install method
2020-05-06 18:34:41 +02:00
Filippo Scognamiglio
b719530ef0 Merge pull request #576 from AutumnalAntlers/ReadMe-Changes
Update Readme.md to include directions to settings
2020-05-06 18:33:33 +02:00
Amir Fo
530d61d67e Adding snap install method
Adding snap install method which is supported in most of the distros and is easy!
2020-05-04 20:58:13 +04:30
AutumnalAntlers
3d76bcb48c Update Readme.md to include directions to settings
Several users of OS's without titlebars or window decor have expressed confusion at how one change's their theme (in this case, via the context menu). Mentioning how to access the menu in the Readme will make the settings more accessible and prevent any future confusion. It might be more appropriate to create a "Use" heading exploring features such as Performance settings, but for the sake of brevity, I've just inserted a mention at the end of the description, before more OS-specific install instructions.
2020-03-22 11:40:40 -07:00
Tamás Gérczei
70ce2f1f3c now packaged in the official repository 2019-12-28 09:35:08 +01:00
ayazhafiz
21a190a1aa Add installation instructions using Homebrew
I was not aware there was a [Homebrew cask](https://github.com/Homebrew/homebrew-cask/blob/master/Casks/cool-retro-term.rb) for this
project, which simplifies installation on macOS. This commit adds
documentation for installing the app via Homebrew.
2019-11-25 10:20:36 -06:00
Jay Kuri
a88d222709 Merge pull request #1 from jayk/trizen-not-yaourt
Update Readme - Trizen for Arch - Yaourt is deprecated.
2019-08-23 13:47:44 -06:00
Jay Kuri
b2defceae5 Update Readme - Trizen for Arch - Yaourt is deprecated.
yaourt is deprecated.  Use trizen instead.  The command line arguments are identical to yaourt, for easy migration.
2019-08-23 13:47:28 -06:00
Kristian
8d7565ffc4 Disable blinking cursor by default 2019-07-20 16:51:10 +02:00
Kristian
9960b25dff Add support for blinking cursor 2019-07-08 15:21:17 +02:00
Kristian
411c116deb Update qmltermwidget submodule 2019-07-08 15:20:56 +02:00
Filippo Scognamiglio
64e007f1fd Update qmltermwidget submodule with CTRL+SPACE fix. 2019-06-18 22:16:23 +02:00
Filippo Scognamiglio
c62fc365db Merge pull request #509 from 0mp/patch-2
Add FreeBSD installation instructions
2019-04-20 23:14:23 +02:00
Filippo Scognamiglio
e7e630bd5d Merge pull request #524 from Haradric/patch-1
Update README.md
2019-04-20 23:13:34 +02:00
Filippo Scognamiglio
7d77175fbb Merge pull request #521 from tgerczei/master
new ebuild available for 1.1.1
2019-04-20 23:12:46 +02:00
Haradric
f033553972 Update README.md
added installation method via Hombrew
2019-04-16 12:27:22 +03:00
Tamás Gérczei
ae1ed044ba new ebuild available for 1.1.1 2019-04-01 21:07:15 +02:00
Filippo Scognamiglio
35d601c7a7 Add two missing qt dependencies to snapcraft.yaml 2019-03-27 18:56:44 +01:00
Filippo Scognamiglio
f89aeec374 Merge pull request #512 from timm0e/patch-1
Fix typo in README.md
2019-02-17 17:35:20 +01:00
timm0e
42c3b4b42e Fix typo in README.md 2019-02-17 15:32:08 +01:00
Mateusz Piotrowski
322fc31396 Add FreeBSD installation instructions 2019-02-12 10:44:58 +01:00
Filippo Scognamiglio
6e4d5cfddd Merge pull request #503 from mclang/patch-1
Adds installation instruction for Solus
2019-02-02 17:44:58 +01:00
mclang
d81485a8bf Adds installation instruction for Solus 2019-02-01 15:09:17 +02:00
Filippo Scognamiglio
a9260d956c Remove snapcraft plugs. Not used for classic confinement. 2019-01-30 20:05:53 +01:00
Filippo Scognamiglio
025bb560bc Update README.md 2019-01-22 21:49:21 +01:00
40 changed files with 2036 additions and 1569 deletions

1
.gitignore vendored
View File

@@ -18,6 +18,7 @@
*.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,6 +12,8 @@ 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>)
@@ -20,13 +22,19 @@ This terminal emulator works under Linux and macOS and requires Qt 5.2 or higher
## Install ## Install
Walk the easy way and install cool-retro-term using one of these convenient packages: Walk the easy way and install cool-retro-term using one of these convenient packages:
**Fedora** has the `cool-retro-term` in the offcial repositories. All you have to do is `sudo dnf install cool-retro-term`. Just grab the latest AppImage from the release page and make it executable and run it:
wget https://github.com/Swordfish90/cool-retro-term/releases/download/1.1.1/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
**Fedora** has the `cool-retro-term` in the official 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):
yaourt -S aur/cool-retro-term-git trizen -S aur/cool-retro-term-git
or use: or use:
@@ -34,22 +42,32 @@ 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)
**macOS** users can grab the latest dmg from the release page: https://github.com/Swordfish90/cool-retro-term/releases **Solus** users can install using `eopg`:
```
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:
```
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)
@@ -84,6 +102,12 @@ 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
@@ -175,6 +199,12 @@ 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,6 +42,28 @@ 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
@@ -57,29 +79,11 @@ 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;

View File

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

View File

@@ -0,0 +1,39 @@
/*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
*
* cool-retro-term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
QtObject {
readonly property string version: appVersion
readonly property int profileVersion: 2
readonly property real screenCurvatureSize: 0.4
readonly property real minimumFontScaling: 0.25
readonly property real maximumFontScaling: 2.50
readonly property real minBurnInFadeTime: 160
readonly property real maxBurnInFadeTime: 1600
readonly property int no_rasterization: 0
readonly property int scanline_rasterization: 1
readonly property int pixel_rasterization: 2
readonly property int subpixel_rasterization: 3
readonly property real baseFontScaling: 0.75
}

View File

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

View File

@@ -1,3 +1,22 @@
/*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
*
* cool-retro-term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.0 import QtQuick 2.0
import "utils.js" as Utils import "utils.js" as Utils
@@ -13,8 +32,8 @@ Loader {
property real delay: (1.0 / appSettings.fps) * 1000 property real delay: (1.0 / appSettings.fps) * 1000
property real burnIn: appSettings.burnIn property real burnIn: appSettings.burnIn
property real burnInFadeTime: 1 / Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn) property real burnInFadeTime: 1 / Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn)
property real _minBurnInFadeTime: appSettings.minBurnInFadeTime property real _minBurnInFadeTime: appConstants.minBurnInFadeTime
property real _maxBurnInFadeTime: appSettings.maxBurnInFadeTime property real _maxBurnInFadeTime: appConstants.maxBurnInFadeTime
active: appSettings.useFastBurnIn && appSettings.burnIn !== 0 active: appSettings.useFastBurnIn && appSettings.burnIn !== 0
@@ -70,6 +89,10 @@ Loader {
} }
} }
ShaderLibrary {
id: shaderLibrary
}
ShaderEffect { ShaderEffect {
id: burnInShaderEffect id: burnInShaderEffect
@@ -99,9 +122,7 @@ Loader {
uniform highp float prevLastUpdate;" + uniform highp float prevLastUpdate;" +
"float rgb2grey(vec3 v){ shaderLibrary.rgb2grey +
return dot(v, vec3(0.21, 0.72, 0.04));
}" +
"void main() { "void main() {
vec2 coords = qt_TexCoord0; vec2 coords = qt_TexCoord0;

View File

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

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * 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,8 @@
* 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 1.1 import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import "Components" import "Components"
@@ -28,19 +27,19 @@ RowLayout {
property alias name: check.text property alias name: check.text
property double value property double value
property alias min_value: slider.minimumValue property alias min_value: slider.from
property alias max_value: slider.maximumValue property alias max_value: slider.to
property alias stepSize: slider.stepSize property alias stepSize: slider.stepSize
signal newValue(real newValue); signal newValue(real newValue)
id: setting_component id: setting_component
Layout.fillWidth: true Layout.fillWidth: true
onValueChanged: { onValueChanged: {
check.checked = !(value == 0); check.checked = !(value == 0)
if (check.checked) if (check.checked)
slider.value = value; slider.value = value
} }
CheckBox { CheckBox {
@@ -48,13 +47,13 @@ RowLayout {
implicitWidth: 160 implicitWidth: 160
onClicked: { onClicked: {
if (!checked) { if (!checked) {
checked = false; checked = false
slider.enabled = false; slider.enabled = false
newValue(0); newValue(0)
} else { } else {
checked = true; checked = true
newValue(slider.value); newValue(slider.value)
slider.enabled = true; slider.enabled = true
} }
} }
} }
@@ -63,11 +62,11 @@ RowLayout {
stepSize: parent.stepSize stepSize: parent.stepSize
Layout.fillWidth: true Layout.fillWidth: true
onValueChanged: { onValueChanged: {
newValue(value); newValue(value)
} }
} }
SizedLabel { SizedLabel {
Layout.fillHeight: true text: Math.round(
text: Math.round(((value - min_value) / (max_value - min_value)) * 100) + "%" ((value - min_value) / (max_value - min_value)) * 100) + "%"
} }
} }

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,7 +17,6 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Dialogs 1.1 import QtQuick.Dialogs 1.1
@@ -35,15 +34,16 @@ Item {
visible: false visible: false
//This is a workaround to a Qt 5.2 bug. //This is a workaround to a Qt 5.2 bug.
onColorChanged: if (Qt.platform.os !== "osx") colorSelected(color) onColorChanged: if (Qt.platform.os !== "osx")
onAccepted: if (Qt.platform.os === "osx") colorSelected(color) colorSelected(color)
onAccepted: if (Qt.platform.os === "osx")
colorSelected(color)
} }
Rectangle { Rectangle {
anchors.fill: parent anchors.fill: parent
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,5 +1,7 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,19 +19,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.0 import QtQuick 2.0
import QtQuick.Controls 1.0 import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
// This component is simply a label with a predefined size. // 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
anchors { right: parent.right; verticalCenter: parent.verticalCenter } Layout.minimumWidth: appSettings.labelWidth
} width: appSettings.labelWidth
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,78 +0,0 @@
import QtQuick 2.0
import "utils.js" as Utils
ShaderEffect {
property color _staticFrameColor: "#ffffff"
property color _backgroundColor: appSettings.backgroundColor
property color _fontColor: appSettings.fontColor
property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2)
property real _ambientLight: Utils.lint(0.2, 0.8, appSettings.ambientLight)
property color frameColor: Utils.mix(_staticFrameColor, _lightColor, _ambientLight)
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight)
property size aadelta: Qt.size(1.0 / width, 1.0 / height)
fragmentShader: "
#ifdef GL_ES
precision mediump float;
#endif
uniform lowp float screenCurvature;
uniform lowp float shadowLength;
uniform highp float qt_Opacity;
uniform lowp vec4 frameColor;
uniform mediump vec2 aadelta;
varying highp vec2 qt_TexCoord0;
vec2 distortCoordinates(vec2 coords){
vec2 cc = (coords - vec2(0.5));
float dist = dot(cc, cc) * screenCurvature;
return (coords + cc * (1.0 + dist) * dist);
}
float max2(vec2 v) {
return max(v.x, v.y);
}
float min2(vec2 v) {
return min(v.x, v.y);
}
float prod2(vec2 v) {
return v.x * v.y;
}
float sum2(vec2 v) {
return v.x + v.y;
}
void main(){
vec2 staticCoords = qt_TexCoord0;
vec2 coords = distortCoordinates(staticCoords);
vec3 color = vec3(0.0);
float alpha = 0.0;
float outShadowLength = shadowLength;
float inShadowLength = shadowLength * 0.5;
float outShadow = max2(1.0 - smoothstep(vec2(-outShadowLength), vec2(0.0), coords) + smoothstep(vec2(1.0), vec2(1.0 + outShadowLength), coords));
outShadow = clamp(sqrt(outShadow), 0.0, 1.0);
color += frameColor.rgb * outShadow;
alpha = sum2(1.0 - smoothstep(vec2(0.0), aadelta, coords) + smoothstep(vec2(1.0) - aadelta, vec2(1.0), coords));
alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, outShadow);
float inShadow = 1.0 - prod2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords));
inShadow = 0.5 * inShadow * inShadow;
alpha = max(alpha, inShadow);
gl_FragColor = vec4(color * alpha, alpha);
}
"
onStatusChanged: if (log) console.log(log) //Print warning messages
}

View File

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

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,20 +17,18 @@
* 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 1.1 import QtQuick.Controls 2.0
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 {
@@ -54,9 +52,10 @@ Tab{
// Save text even if user forgets to press enter or unfocus // Save text even if user forgets to press enter or unfocus
function saveSetting() { function saveSetting() {
appSettings.customCommand = text; appSettings.customCommand = text
} }
Component.onCompleted: settings_window.closing.connect(saveSetting) Component.onCompleted: settings_window.closing.connect(
saveSetting)
} }
} }
} }
@@ -66,80 +65,101 @@ Tab{
Layout.fillWidth: true Layout.fillWidth: true
GridLayout { GridLayout {
anchors.fill: parent anchors.fill: parent
rows: 2 columns: 4
columns: 3
Label{text: qsTr("Effects FPS")} Label {
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: {
minimumValue = 0; from = 0
maximumValue = 60; to = 60
value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60; value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60
enabled = true; enabled = true
} }
} }
SizedLabel{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")} Label {
Label{text: qsTr("Texture Quality")} text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")
}
Label {
text: qsTr("Texture Quality")
}
Slider { Slider {
Layout.fillWidth: true
id: txtslider id: txtslider
onValueChanged: if (enabled) appSettings.windowScaling = value; Layout.fillWidth: true
Layout.columnSpan: 2
onValueChanged: if (enabled)
appSettings.windowScaling = value
stepSize: 0.05 stepSize: 0.05
enabled: false enabled: false
Component.onCompleted: { Component.onCompleted: {
minimumValue = 0.25 //Without this value gets set to 0.5 from = 0.25 //Without this value gets set to 0.5
value = appSettings.windowScaling; value = appSettings.windowScaling
enabled = true; enabled = true
} }
} }
SizedLabel{text: Math.round(txtslider.value * 100) + "%"} Label {
text: Math.round(txtslider.value * 100) + "%"
}
Label{text: qsTr("Bloom Quality")} Label {
text: qsTr("Bloom Quality")
}
Slider { Slider {
Layout.fillWidth: true Layout.fillWidth: true
Layout.columnSpan: 2
id: bloomSlider id: bloomSlider
onValueChanged: if (enabled) appSettings.bloomQuality = value; onValueChanged: if (enabled)
appSettings.bloomQuality = value
stepSize: 0.05 stepSize: 0.05
enabled: false enabled: false
Component.onCompleted: { Component.onCompleted: {
minimumValue = 0.25 from = 0.25
value = appSettings.bloomQuality; value = appSettings.bloomQuality
enabled = true; enabled = true
} }
} }
SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"} Label {
text: Math.round(bloomSlider.value * 100) + "%"
}
Label{text: qsTr("BurnIn Quality")} Label {
text: qsTr("BurnIn Quality")
}
Slider { Slider {
Layout.fillWidth: true Layout.fillWidth: true
id: burnInSlider id: burnInSlider
onValueChanged: if (enabled) appSettings.burnInQuality = value; Layout.columnSpan: 2
onValueChanged: if (enabled)
appSettings.burnInQuality = value
stepSize: 0.05 stepSize: 0.05
enabled: false enabled: false
Component.onCompleted: { Component.onCompleted: {
minimumValue = 0.25 from = 0.25
value = appSettings.burnInQuality; value = appSettings.burnInQuality
enabled = true; enabled = true
} }
} }
SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"} Label {
text: Math.round(burnInSlider.value * 100) + "%"
}
CheckBox { CheckBox {
Layout.columnSpan: 2 Layout.columnSpan: 2
text: qsTr("Burnin optimization (Might display timing artifacts)") text: qsTr("Burnin optimization (might display timing artifacts)")
checked: appSettings.useFastBurnIn checked: appSettings.useFastBurnIn
onCheckedChanged: appSettings.useFastBurnIn = checked onCheckedChanged: appSettings.useFastBurnIn = checked
} }
} }
} }
} }
}

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * 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,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.Controls 1.1 import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
Tab{
ColumnLayout { ColumnLayout {
anchors.fill: parent
spacing: 2 spacing: 2
GroupBox { GroupBox {
@@ -56,35 +53,34 @@ Tab{
} }
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 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,34 +17,35 @@
* 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 1.1 import QtQuick.Controls 2.4
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
TableView { ListView {
id: profilesView id: profilesView
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
model: appSettings.profilesList model: appSettings.profilesList
headerVisible: false delegate: Rectangle {
TableViewColumn { width: label.width
title: qsTr("Profile") height: label.height
role: "text" color: (index == profilesView.currentIndex) ? palette.highlight : palette.base
width: parent.width * 0.5 Label {
id: label
text: appSettings.profilesList.get(index).text
MouseArea {
anchors.fill: parent
onClicked: profilesView.currentIndex = index
onDoubleClicked: appSettings.loadProfile(index)
}
} }
onActivated: {
appSettings.loadProfile(row);
} }
} }
ColumnLayout { ColumnLayout {
@@ -54,34 +55,35 @@ Tab{
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.currentRow property alias currentIndex: profilesView.currentIndex
enabled: currentIndex >= 0 enabled: currentIndex >= 0
text: qsTr("Load") text: qsTr("Load")
onClicked: { onClicked: {
var index = profilesView.currentRow; var index = currentIndex
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.currentRow property alias currentIndex: profilesView.currentIndex
enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin enabled: currentIndex >= 0 && !appSettings.profilesList.get(
currentIndex).builtin
onClicked: { onClicked: {
appSettings.profilesList.remove(currentIndex); appSettings.profilesList.remove(currentIndex)
profilesView.selection.clear(); profilesView.selection.clear()
// TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2. // TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2.
profilesView.model = 0; profilesView.model = 0
profilesView.model = appSettings.profilesList; profilesView.model = appSettings.profilesList
} }
} }
Item { Item {
@@ -92,70 +94,84 @@ Tab{
Layout.fillWidth: true Layout.fillWidth: true
text: qsTr("Import") text: qsTr("Import")
onClicked: { onClicked: {
fileDialog.selectExisting = true; fileDialog.selectExisting = true
fileDialog.callBack = function (url) {loadFile(url);}; fileDialog.callBack = function (url) {
fileDialog.open(); loadFile(url)
}
fileDialog.open()
} }
function loadFile(url) { function loadFile(url) {
try { try {
if (appSettings.verbose) if (appSettings.verbose)
console.log("Loading file: " + url); console.log("Loading file: " + url)
var profileObject = JSON.parse(fileIO.read(url)); var profileObject = JSON.parse(fileIO.read(url))
var name = profileObject.name; var name = profileObject.name
if (!name) if (!name)
throw "Profile doesn't have a name"; throw "Profile doesn't have a name"
var version = profileObject.version !== undefined ? profileObject.version : 1; var version = profileObject.version
if (version !== appSettings.profileVersion) !== undefined ? profileObject.version : 1
throw "This profile is not supported on this version of CRT."; if (version !== appConstants.profileVersion)
throw "This profile is not supported on this version of CRT."
delete profileObject.name; delete profileObject.name
appSettings.appendCustomProfile(name, JSON.stringify(profileObject)); appSettings.appendCustomProfile(name,
JSON.stringify(
profileObject))
} catch (err) { } catch (err) {
messageDialog.text = qsTr(err) messageDialog.text = qsTr(err)
messageDialog.open(); messageDialog.open()
} }
} }
} }
Button { Button {
property alias currentIndex: profilesView.currentRow property alias currentIndex: profilesView.currentIndex
Layout.fillWidth: true Layout.fillWidth: true
text: qsTr("Export") text: qsTr("Export")
enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin enabled: currentIndex >= 0 && !appSettings.profilesList.get(
currentIndex).builtin
onClicked: { onClicked: {
fileDialog.selectExisting = false; fileDialog.selectExisting = false
fileDialog.callBack = function (url) {storeFile(url);}; fileDialog.callBack = function (url) {
fileDialog.open(); storeFile(url)
}
fileDialog.open()
} }
function storeFile(url) { function storeFile(url) {
try { try {
var urlString = url.toString(); var urlString = url.toString()
// Fix the extension if it's missing. // Fix the extension if it's missing.
var extension = urlString.substring(urlString.length - 5, urlString.length); var extension = urlString.substring(
var urlTail = (extension === ".json" ? "" : ".json"); urlString.length - 5, urlString.length)
url += urlTail; var urlTail = (extension === ".json" ? "" : ".json")
url += urlTail
if (true) if (true)
console.log("Storing file: " + url); console.log("Storing file: " + url)
var profileObject = appSettings.profilesList.get(currentIndex); var profileObject = appSettings.profilesList.get(
var profileSettings = JSON.parse(profileObject.obj_string); currentIndex)
profileSettings["name"] = profileObject.text; var profileSettings = JSON.parse(
profileSettings["version"] = appSettings.profileVersion; profileObject.obj_string)
profileSettings["name"] = profileObject.text
profileSettings["version"] = appConstants.profileVersion
var result = fileIO.write(url, JSON.stringify(profileSettings, undefined, 2)); var result = fileIO.write(url, JSON.stringify(
profileSettings,
undefined, 2))
if (!result) if (!result)
throw "The file could not be written."; throw "The file could not be written."
} catch (err) { } catch (err) {
console.log(err); console.log(err)
messageDialog.text = qsTr("There has been an error storing the file.") messageDialog.text = qsTr(
messageDialog.open(); "There has been an error storing the file.")
messageDialog.open()
} }
} }
} }
@@ -169,22 +185,37 @@ Tab{
GridLayout { GridLayout {
anchors.fill: parent anchors.fill: parent
columns: 2 columns: 2
Label{ text: qsTr("Brightness") } Label {
text: qsTr("Brightness")
}
SimpleSlider { SimpleSlider {
onValueChanged: appSettings.brightness = value onValueChanged: appSettings.brightness = value
value: appSettings.brightness value: appSettings.brightness
} }
Label{ text: qsTr("Contrast") } Label {
text: qsTr("Contrast")
}
SimpleSlider { SimpleSlider {
onValueChanged: appSettings.contrast = value onValueChanged: appSettings.contrast = value
value: appSettings.contrast value: appSettings.contrast
} }
Label{ text: qsTr("Margin") } Label {
text: qsTr("Margin")
}
SimpleSlider { SimpleSlider {
onValueChanged: appSettings._margin = value onValueChanged: appSettings._margin = value
value: appSettings._margin value: appSettings._margin
} }
Label{ text: qsTr("Opacity") } Label {
text: qsTr("Frame size")
}
SimpleSlider {
onValueChanged: appSettings._frameMargin = value
value: appSettings._frameMargin
}
Label {
text: qsTr("Opacity")
}
SimpleSlider { SimpleSlider {
onValueChanged: appSettings.windowOpacity = value onValueChanged: appSettings.windowOpacity = value
value: appSettings.windowOpacity value: appSettings.windowOpacity
@@ -196,14 +227,15 @@ Tab{
InsertNameDialog { InsertNameDialog {
id: insertname id: insertname
onNameSelected: { onNameSelected: {
appSettings.appendCustomProfile(name, appSettings.composeProfileString()); appSettings.appendCustomProfile(name,
appSettings.composeProfileString())
} }
} }
MessageDialog { MessageDialog {
id: messageDialog id: messageDialog
title: qsTr("File Error") title: qsTr("File Error")
onAccepted: { onAccepted: {
messageDialog.close(); messageDialog.close()
} }
} }
Loader { Loader {
@@ -216,19 +248,18 @@ Tab{
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 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,16 +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 1.1 import QtQuick.Controls 2.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")
@@ -34,79 +32,77 @@ Tab{
GridLayout { GridLayout {
anchors.fill: parent anchors.fill: parent
columns: 2 columns: 2
Label { text: qsTr("Rasterization") } Label {
text: qsTr("Rasterization")
}
ComboBox { ComboBox {
id: rasterizationBox id: rasterizationBox
property string selectedElement: model[currentIndex] property string selectedElement: model[currentIndex]
Layout.fillWidth: true Layout.fillWidth: true
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")] model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels"), qsTr("Sub-Pixels")]
currentIndex: appSettings.rasterization currentIndex: appSettings.rasterization
onCurrentIndexChanged: { onCurrentIndexChanged: {
appSettings.rasterization = currentIndex appSettings.rasterization = currentIndex
} }
} }
Label{ text: qsTr("Name") } Label {
text: qsTr("Name")
}
ComboBox { ComboBox {
id: fontChanger id: fontChanger
Layout.fillWidth: true Layout.fillWidth: true
model: appSettings.fontlist model: appSettings.fontlist
textRole: "text"
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: if(enabled) appSettings.fontScaling = value onValueChanged: appSettings.fontScaling = value
value: appSettings.fontScaling
stepSize: 0.05 stepSize: 0.05
enabled: false // Another trick to fix initial bad behavior. from: appConstants.minimumFontScaling
Component.onCompleted: { to: appConstants.maximumFontScaling
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{ text: qsTr("Font Width") } Label {
text: qsTr("Font Width")
}
RowLayout { RowLayout {
Layout.fillWidth: true Layout.fillWidth: true
Slider { Slider {
Layout.fillWidth: true Layout.fillWidth: true
id: widthChanger id: widthChanger
onValueChanged: appSettings.fontWidth = value; onValueChanged: appSettings.fontWidth = value
value: appSettings.fontWidth value: appSettings.fontWidth
stepSize: 0.05 stepSize: 0.05
Component.onCompleted: { from: 0.5
// This is needed to avoid unnecessary chnaged events. to: 1.5
minimumValue = 0.5;
maximumValue = 1.5;
}
} }
SizedLabel { SizedLabel {
text: Math.round(widthChanger.value * 100) + "%" text: Math.round(widthChanger.value * 100) + "%"
@@ -114,6 +110,24 @@ Tab{
} }
} }
} }
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
@@ -139,18 +153,17 @@ Tab{
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 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -19,46 +19,50 @@
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Controls 1.1 import QtQuick.Controls 2.1
import QtQuick.Window 2.1 import QtQuick.Window 2.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.3
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: 580 width: 800
height: 400 height: 600
property int tabmargins: 15 property int tabmargins: 15
TabView{ TabBar {
id: tabView id: bar
anchors.fill: parent width: parent.width
anchors.margins: 10 TabButton {
SettingsGeneralTab { text: qsTr("General")
id: generalTab
title: qsTr("General")
anchors.fill: parent
anchors.margins: tabmargins
} }
SettingsTerminalTab { TabButton {
id: terminalTab text: qsTr("Terminal")
title: qsTr("Terminal")
anchors.fill: parent
anchors.margins: tabmargins
} }
SettingsEffectsTab { TabButton {
id: effectsTab text: qsTr("Effects")
title: qsTr("Effects")
anchors.fill: parent
anchors.margins: tabmargins
} }
SettingsAdvancedTab { TabButton {
id: performanceTab text: qsTr("Advanced")
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 { }
}
} }

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

@@ -0,0 +1,91 @@
import QtQuick 2.0
QtObject {
property string rasterizationShader:
(appSettings.rasterization === appConstants.no_rasterization ? "
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
return texel;
}" : "") +
(appSettings.rasterization === appConstants.scanline_rasterization ? "
#define INTENSITY 0.30
#define BRIGHTBOOST 0.30
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel;
lowp vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * texel)) * texel;
vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0);
lowp float mask = 1.0 - abs(coords.y);
lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask);
return mix(texel, rasterizationColor, intensity);
}" : "") +
(appSettings.rasterization === appConstants.pixel_rasterization ? "
#define INTENSITY 0.30
#define BRIGHTBOOST 0.30
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
lowp vec3 result = texel;
lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel;
lowp vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * texel)) * texel;
vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0);
coords = coords * coords;
lowp float mask = 1.0 - coords.x - coords.y;
lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask);
return mix(texel, rasterizationColor, intensity);
}" : "") +
(appSettings.rasterization === appConstants.subpixel_rasterization ? "
#define INTENSITY 0.30
#define BRIGHTBOOST 0.30
#define SUBPIXELS 3.0
const vec3 offsets = vec3(3.141592654) * vec3(1.0/2.0,1.0/2.0 - 2.0/3.0,1.0/2.0-4.0/3.0);
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
vec2 omega = vec2(3.141592654) * vec2(2.0) * virtualResolution;
vec2 angle = screenCoords * omega;
vec3 xfactors = (SUBPIXELS + sin(angle.x + offsets)) / (SUBPIXELS + 1.0);
lowp vec3 result = texel * xfactors;
lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * result)) * result;
lowp vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * result)) * result;
vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0);
lowp float mask = 1.0 - abs(coords.y);
lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask);
return mix(texel, rasterizationColor, intensity);
}" : "") +
"\n\n"
property string min2: "
float min2(vec2 v) {
return min(v.x, v.y);
}\n\n"
property string rgb2grey: "
float rgb2grey(vec3 v) {
return dot(v, vec3(0.21, 0.72, 0.04));
}\n\n"
property string max2: "
float max2(vec2 v) {
return max(v.x, v.y);
}\n\n"
property string prod2: "
float prod2(vec2 v) {
return v.x * v.y;
}\n\n"
property string sum2: "
float sum2(vec2 v) {
return v.x + v.y;
}\n\n"
}

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -32,17 +32,25 @@ Item {
property color fontColor: appSettings.fontColor property color fontColor: appSettings.fontColor
property color backgroundColor: appSettings.backgroundColor property color backgroundColor: appSettings.backgroundColor
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize property real screenCurvature: appSettings.screenCurvature * appConstants.screenCurvatureSize
property real chromaColor: appSettings.chromaColor property real chromaColor: appSettings.chromaColor
property real ambientLight: appSettings.ambientLight * 0.2 property real ambientLight: appSettings.ambientLight * 0.2
property size virtual_resolution property size virtualResolution
property size screenResolution
property real _screenDensity: Math.min(
screenResolution.width / virtualResolution.width,
screenResolution.height / virtualResolution.height
)
ShaderEffect { ShaderEffect {
id: dynamicShader id: dynamicShader
property ShaderLibrary shaderLibrary: ShaderLibrary { }
property ShaderEffectSource screenBuffer: frameBuffer property ShaderEffectSource screenBuffer: frameBuffer
property ShaderEffectSource burnInSource: burnInEffect.source property ShaderEffectSource burnInSource: burnInEffect.source
property ShaderEffectSource frameSource: terminalFrameLoader.item property ShaderEffectSource frameSource: terminalFrameLoader.item
@@ -71,10 +79,16 @@ Item {
property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter) property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter)
property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight) property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight)
property real staticNoise: appSettings.staticNoise property real staticNoise: appSettings.staticNoise
property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling), property size scaleNoiseSize: Qt.size((width * 0.75) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
(height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling)) (height * 0.75) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
property size virtual_resolution: parent.virtual_resolution property size virtualResolution: parent.virtualResolution
// Rasterization might display oversamping issues if virtual resolution is close to physical display resolution.
// We progressively disable rasterization from 4x up to 2x resolution.
property real rasterizationIntensity: Utils.smoothstep(2.0, 4.0, _screenDensity)
property real displayTerminalFrame: appSettings._frameMargin > 0 || appSettings.screenCurvature > 0
property real time: timeManager.time property real time: timeManager.time
property ShaderEffectSource noiseSource: noiseShaderSource property ShaderEffectSource noiseSource: noiseShaderSource
@@ -164,7 +178,8 @@ Item {
uniform highp vec4 backgroundColor; uniform highp vec4 backgroundColor;
uniform lowp float shadowLength; uniform lowp float shadowLength;
uniform highp vec2 virtual_resolution;" + uniform highp vec2 virtualResolution;
uniform lowp float rasterizationIntensity;\n" +
(burnIn !== 0 ? " (burnIn !== 0 ? "
uniform sampler2D burnInSource; uniform sampler2D burnInSource;
@@ -174,13 +189,13 @@ Item {
uniform sampler2D slowBurnInSource;" : "") + uniform sampler2D slowBurnInSource;" : "") +
(staticNoise !== 0 ? " (staticNoise !== 0 ? "
uniform highp float staticNoise;" : "") + uniform highp float staticNoise;" : "") +
(((staticNoise !== 0 || jitter !== 0) (((staticNoise !== 0 || jitter !== 0) ||(fallBack && (flickering || horizontalSync))) ? "
||(fallBack && (flickering || horizontalSync))) ? "
uniform lowp sampler2D noiseSource; uniform lowp sampler2D noiseSource;
uniform highp vec2 scaleNoiseSize;" : "") + uniform highp vec2 scaleNoiseSize;" : "") +
(screenCurvature !== 0 ? " (displayTerminalFrame ? "
uniform highp float screenCurvature;
uniform lowp sampler2D frameSource;" : "") + uniform lowp sampler2D frameSource;" : "") +
(screenCurvature !== 0 ? "
uniform highp float screenCurvature;" : "") +
(glowingLine !== 0 ? " (glowingLine !== 0 ? "
uniform highp float glowingLine;" : "") + uniform highp float glowingLine;" : "") +
(chromaColor !== 0 ? " (chromaColor !== 0 ? "
@@ -203,17 +218,14 @@ Item {
(glowingLine !== 0 ? " (glowingLine !== 0 ? "
float randomPass(vec2 coords){ float randomPass(vec2 coords){
return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015))); return fract(smoothstep(-120.0, 0.0, coords.y - (virtualResolution.y + 120.0) * fract(time * 0.00015)));
}" : "") + }" : "") +
"float min2(vec2 v) { shaderLibrary.min2 +
return min(v.x, v.y); shaderLibrary.rgb2grey +
} shaderLibrary.rasterizationShader +
float rgb2grey(vec3 v){
return dot(v, vec3(0.21, 0.72, 0.04));
}
"
float isInScreen(vec2 v) { float isInScreen(vec2 v) {
return min2(step(0.0, v) - step(1.0, v)); return min2(step(0.0, v) - step(1.0, v));
} }
@@ -291,7 +303,7 @@ Item {
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") + color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
(glowingLine !== 0 ? " (glowingLine !== 0 ? "
color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + color += randomPass(coords * virtualResolution) * glowingLine;" : "") +
"vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" + "vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" +
@@ -309,6 +321,8 @@ Item {
"txt_color += fontColor.rgb * vec3(color);" + "txt_color += fontColor.rgb * vec3(color);" +
"txt_color = applyRasterization(staticCoords, txt_color, virtualResolution, rasterizationIntensity);\n" +
"vec3 finalColor = txt_color;" + "vec3 finalColor = txt_color;" +
(flickering !== 0 ? " (flickering !== 0 ? "
@@ -317,7 +331,7 @@ Item {
(ambientLight !== 0 ? " (ambientLight !== 0 ? "
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") + finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
(screenCurvature !== 0 ? (displayTerminalFrame ?
"vec4 frameColor = texture2D(frameSource, qt_TexCoord0); "vec4 frameColor = texture2D(frameSource, qt_TexCoord0);
finalColor = mix(finalColor, frameColor.rgb, frameColor.a);" finalColor = mix(finalColor, frameColor.rgb, frameColor.a);"
: "") + : "") +
@@ -340,7 +354,7 @@ Item {
Loader { Loader {
id: terminalFrameLoader id: terminalFrameLoader
active: screenCurvature !== 0 active: dynamicShader.displayTerminalFrame
width: staticShader.width width: staticShader.width
height: staticShader.height height: staticShader.height
@@ -352,7 +366,7 @@ Item {
visible: false visible: false
format: ShaderEffectSource.RGBA format: ShaderEffectSource.RGBA
NewTerminalFrame { TerminalFrame {
id: terminalFrame id: terminalFrame
blending: false blending: false
anchors.fill: parent anchors.fill: parent
@@ -360,6 +374,10 @@ Item {
} }
} }
ShaderLibrary {
id: shaderLibrary
}
ShaderEffect { ShaderEffect {
id: staticShader id: staticShader
@@ -385,7 +403,7 @@ Item {
property real ambientLight: parent.ambientLight property real ambientLight: parent.ambientLight
property size virtual_resolution: parent.virtual_resolution property size virtualResolution: parent.virtualResolution
blending: false blending: false
visible: false visible: false
@@ -408,7 +426,7 @@ Item {
uniform highp vec4 backgroundColor; uniform highp vec4 backgroundColor;
uniform lowp float screen_brightness; uniform lowp float screen_brightness;
uniform highp vec2 virtual_resolution;" + uniform highp vec2 virtualResolution;" +
(bloom !== 0 ? " (bloom !== 0 ? "
uniform highp sampler2D bloomSource; uniform highp sampler2D bloomSource;
@@ -426,36 +444,9 @@ Item {
(ambientLight !== 0 ? " (ambientLight !== 0 ? "
uniform lowp float ambientLight;" : "") + uniform lowp float ambientLight;" : "") +
"highp float getScanlineIntensity(vec2 coords) { shaderLibrary.min2 +
float result = 1.0;" + shaderLibrary.sum2 +
shaderLibrary.rgb2grey +
(appSettings.rasterization != appSettings.no_rasterization ?
"float val = 0.0;
vec2 rasterizationCoords = fract(coords * virtual_resolution);
val += smoothstep(0.0, 0.5, rasterizationCoords.y);
val -= smoothstep(0.5, 1.0, rasterizationCoords.y);
result *= mix(0.5, 1.0, val);" : "") +
(appSettings.rasterization == appSettings.pixel_rasterization ?
"val = 0.0;
val += smoothstep(0.0, 0.5, rasterizationCoords.x);
val -= smoothstep(0.5, 1.0, rasterizationCoords.x);
result *= mix(0.5, 1.0, val);" : "") + "
return result;
}
float min2(vec2 v) {
return min(v.x, v.y);
}
float sum2(vec2 v) {
return v.x + v.y;
}
float rgb2grey(vec3 v){
return dot(v, vec3(0.21, 0.72, 0.04));
}" +
"vec3 convertWithChroma(vec3 inColor) { "vec3 convertWithChroma(vec3 inColor) {
vec3 outColor = inColor;" + vec3 outColor = inColor;" +
@@ -468,6 +459,7 @@ Item {
" return outColor; " return outColor;
}" + }" +
shaderLibrary.rasterizationShader +
"void main() {" + "void main() {" +
"vec2 cc = vec2(0.5) - qt_TexCoord0;" + "vec2 cc = vec2(0.5) - qt_TexCoord0;" +
@@ -490,8 +482,6 @@ Item {
txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60; txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60;
" : "") + " : "") +
"txt_color *= getScanlineIntensity(txt_coords);" +
"txt_color += vec3(0.0001);" + "txt_color += vec3(0.0001);" +
"float greyscale_color = rgb2grey(txt_color);" + "float greyscale_color = rgb2grey(txt_color);" +

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,9 +17,8 @@
* 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 1.1 import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import "Components" import "Components"
@@ -27,8 +26,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.minimumValue property alias minimumValue: slider.from
property alias maximumValue: slider.maximumValue property alias maximumValue: slider.to
property real maxMultiplier: 100 property real maxMultiplier: 100
id: setting_component id: setting_component

View File

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

View File

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

View File

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

View File

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

104
app/qml/TerminalFrame.qml Normal file
View File

@@ -0,0 +1,104 @@
/*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
*
* cool-retro-term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.0
import "utils.js" as Utils
ShaderEffect {
property color _staticFrameColor: "#fff"
property color _backgroundColor: appSettings.backgroundColor
property color _fontColor: appSettings.fontColor
property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2)
property real _ambientLight: Utils.lint(0.2, 0.8, appSettings.ambientLight)
property color frameColor: Utils.mix(_staticFrameColor, _lightColor, _ambientLight)
property real screenCurvature: appSettings.screenCurvature * appConstants.screenCurvatureSize
// Coefficient of the log curve used to approximate shadowing
property real screenShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight)
property real frameShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight)
property size margin: Qt.size(
appSettings.frameMargin / width * appSettings.windowScaling,
appSettings.frameMargin / height * appSettings.windowScaling
)
ShaderLibrary {
id: shaderLibrary
}
fragmentShader: "
#ifdef GL_ES
precision mediump float;
#endif
uniform lowp float screenCurvature;
uniform lowp float screenShadowCoeff;
uniform lowp float frameShadowCoeff;
uniform highp float qt_Opacity;
uniform lowp vec4 frameColor;
uniform mediump vec2 margin;
varying highp vec2 qt_TexCoord0;
vec2 distortCoordinates(vec2 coords){
vec2 cc = (coords - vec2(0.5));
float dist = dot(cc, cc) * screenCurvature;
return (coords + cc * (1.0 + dist) * dist);
}
" +
shaderLibrary.max2 +
shaderLibrary.min2 +
shaderLibrary.prod2 +
shaderLibrary.sum2 +
"
vec2 positiveLog(vec2 x) {
return clamp(log(x), vec2(0.0), vec2(100.0));
}
void main() {
vec2 staticCoords = qt_TexCoord0;
vec2 coords = distortCoordinates(staticCoords) * (vec2(1.0) + margin * 2.0) - margin;
vec2 vignetteCoords = staticCoords * (1.0 - staticCoords.yx);
float vignette = pow(prod2(vignetteCoords) * 15.0, 0.25);
vec3 color = frameColor.rgb * vec3(1.0 - vignette);
float alpha = 0.0;
float frameShadow = max2(positiveLog(-coords * frameShadowCoeff + vec2(1.0)) + positiveLog(coords * frameShadowCoeff - (vec2(frameShadowCoeff) - vec2(1.0))));
frameShadow = max(sqrt(frameShadow), 0.0);
color *= frameShadow;
alpha = sum2(1.0 - step(vec2(0.0), coords) + step(vec2(1.0), coords));
alpha = clamp(alpha, 0.0, 1.0);
alpha *= mix(1.0, 0.9, frameShadow);
float screenShadow = 1.0 - prod2(positiveLog(coords * screenShadowCoeff + vec2(1.0)) * positiveLog(-coords * screenShadowCoeff + vec2(screenShadowCoeff + 1.0)));
alpha = max(0.8 * screenShadow, alpha);
gl_FragColor = vec4(color * alpha, alpha);
}
"
onStatusChanged: if (log) console.log(log) //Print warning messages
}

View File

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

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,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 1.1 import QtQuick.Controls 2.3
import QtGraphicalEffects 1.0
import "menus"
ApplicationWindow { ApplicationWindow {
id: terminalWindow id: terminalWindow
@@ -37,8 +37,6 @@ 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
@@ -55,11 +53,9 @@ 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)
//Workaround: Without __contentItem a ugly thin border is visible. menuBar: WindowMenu {
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
@@ -81,7 +77,7 @@ ApplicationWindow{
text: qsTr("Fullscreen") text: qsTr("Fullscreen")
enabled: Qt.platform.os !== "osx" enabled: Qt.platform.os !== "osx"
shortcut: "Alt+F11" shortcut: "Alt+F11"
onTriggered: appSettings.fullscreen = !appSettings.fullscreen; onTriggered: appSettings.fullscreen = !appSettings.fullscreen
checkable: true checkable: true
checked: appSettings.fullscreen checked: appSettings.fullscreen
} }
@@ -89,15 +85,15 @@ ApplicationWindow{
id: quitAction id: quitAction
text: qsTr("Quit") text: qsTr("Quit")
shortcut: "Ctrl+Shift+Q" shortcut: "Ctrl+Shift+Q"
onTriggered: Qt.quit(); onTriggered: Qt.quit()
} }
Action { Action {
id: showsettingsAction id: showsettingsAction
text: qsTr("Settings") text: qsTr("Settings")
onTriggered: { onTriggered: {
settingswindow.show(); settingswindow.show()
settingswindow.requestActivate(); settingswindow.requestActivate()
settingswindow.raise(); settingswindow.raise()
} }
} }
Action { Action {
@@ -114,29 +110,31 @@ 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()
} }
} }
ApplicationConstants {
id: appConstants
}
ApplicationSettings { ApplicationSettings {
id: appSettings id: appSettings
} }
TerminalContainer { TerminalContainer {
id: terminalContainer id: terminalContainer
y: appSettings.showMenubar ? 0 : -2 // Workaroud to hide the margin in the menubar.
width: parent.width width: parent.width
height: (parent.height + Math.abs(y)) height: (parent.height + Math.abs(y))
} }

View File

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

View File

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

View File

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

View File

@@ -12,7 +12,6 @@
<file>TimeManager.qml</file> <file>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>
@@ -22,7 +21,6 @@
<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,7 +40,12 @@
<file>fonts/1977-commodore-pet/PetMe.ttf</file> <file>fonts/1977-commodore-pet/PetMe.ttf</file>
<file>BurnInEffect.qml</file> <file>BurnInEffect.qml</file>
<file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file> <file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file>
<file>NewTerminalFrame.qml</file> <file>TerminalFrame.qml</file>
<file>SlowBurnIn.qml</file> <file>SlowBurnIn.qml</file>
<file>menus/WindowMenu.qml</file>
<file>menus/FullContextMenu.qml</file>
<file>menus/ShortContextMenu.qml</file>
<file>ShaderLibrary.qml</file>
<file>ApplicationConstants.qml</file>
</qresource> </qresource>
</RCC> </RCC>

View File

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

View File

@@ -14,21 +14,6 @@ apps:
desktop: usr/share/applications/cool-retro-term.desktop desktop: usr/share/applications/cool-retro-term.desktop
environment: environment:
QML2_IMPORT_PATH: $SNAP/usr/lib/x86_64-linux-gnu/qt5/qml QML2_IMPORT_PATH: $SNAP/usr/lib/x86_64-linux-gnu/qt5/qml
plugs:
- unity7
- x11
- desktop
- home
- network
- network-bind
- network-manager
- password-manager-service
- locale-control
- gsettings
- shutdown
- firewall-control
- process-control
- system-observe
parts: parts:
desktop-qt5: desktop-qt5:
@@ -81,4 +66,6 @@ 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