Compare commits
	
		
			13 Commits
		
	
	
		
			1.2.0
			...
			adammathes
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | e7e3dfed00 | ||
|   | aa82250232 | ||
|   | 88f59d2016 | ||
|   | 8021ff4256 | ||
|   | 32eab18da9 | ||
|   | 52140c4c45 | ||
|   | 10fd2a11ee | ||
|   | 749ea88909 | ||
|   | 3f0653106e | ||
|   | 9954fde6f1 | ||
|   | 3ec46ea833 | ||
|   | d59ac20e38 | ||
|   | 7ce6571e1f | 
							
								
								
									
										4
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,4 +0,0 @@ | |||||||
| # These are supported funding model platforms |  | ||||||
|  |  | ||||||
| patreon: swordfish90 |  | ||||||
| custom: ['https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=flscogna%40gmail.com&item_name=Support+CRT¤cy_code=EUR&source=url'] |  | ||||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -18,7 +18,6 @@ | |||||||
| *.pro.user.* | *.pro.user.* | ||||||
| *.moc | *.moc | ||||||
| moc_*.cpp | moc_*.cpp | ||||||
| moc_*.h |  | ||||||
| qrc_*.cpp | qrc_*.cpp | ||||||
| ui_*.h | ui_*.h | ||||||
| Makefile* | Makefile* | ||||||
|   | |||||||
							
								
								
									
										178
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										178
									
								
								README.md
									
									
									
									
									
								
							| @@ -8,11 +8,9 @@ | |||||||
| cool-retro-term is a terminal emulator which mimics the look and feel of the old cathode tube screens. | cool-retro-term is a terminal emulator which mimics the look and feel of the old cathode tube screens. | ||||||
| It has been designed to be eye-candy, customizable, and reasonably lightweight. | It has been designed to be eye-candy, customizable, and reasonably lightweight. | ||||||
|  |  | ||||||
| It uses the QML port of qtermwidget (Konsole): https://github.com/Swordfish90/qmltermwidget. | It uses the QML port of qtermwidget (Konsole) developed by me: https://github.com/Swordfish90/qmltermwidget . | ||||||
|  |  | ||||||
| This terminal emulator works under Linux and macOS and requires Qt5. It's suggested that you stick to the latest LTS version. | 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 | ||||||
|  |  | ||||||
| @@ -20,11 +18,175 @@ Settings such as colors, fonts, and effects can be accessed via context menu. | |||||||
|  |  | ||||||
|  |  | ||||||
| ## Install | ## Install | ||||||
|  | Walk the easy way and install cool-retro-term using one of these convenient packages: | ||||||
|  |  | ||||||
| If you want to get a hold of the latest version, just go to the Releases page and grab the latest AppImage (Linux) or dmg (macOS). | Just grab the latest AppImage from the release page and make it executable and run it: | ||||||
|  |  | ||||||
| Alternatively, most distributions such as Ubuntu, Fedora or Arch already package cool-retro-term in their official repositories. |     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 | ||||||
|  |  | ||||||
| ## Building | **Fedora** has the `cool-retro-term` in the offcial repositories. All you have to do is `sudo dnf install cool-retro-term`. | ||||||
|  |  | ||||||
| Check out the wiki and follow the instructions on how to build it on [Linux](https://github.com/Swordfish90/cool-retro-term/wiki/Build-Instructions-(Linux)) and [macOS](https://github.com/Swordfish90/cool-retro-term/wiki/Build-Instructions-(macOS)). | 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): | ||||||
|  |  | ||||||
|  |     yaourt -S aur/cool-retro-term-git | ||||||
|  |  | ||||||
|  | or use: | ||||||
|  |  | ||||||
|  |     pacman -S cool-retro-term | ||||||
|  |  | ||||||
|  | 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). | ||||||
|  |  | ||||||
|  | **Ubuntu 17.10** can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term) | ||||||
|  |  | ||||||
|  | **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 | ||||||
|  |  | ||||||
|  | ## Build instructions (Linux) | ||||||
|  |  | ||||||
|  | Build cool-retro-term yourself, you know, the retro way. | ||||||
|  |  | ||||||
|  | ## Dependencies | ||||||
|  | Make sure to install these first. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | **Ubuntu 14.04** | ||||||
|  |  | ||||||
|  |     sudo apt-get install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qtdeclarative5-controls-plugin qtdeclarative5-qtquick2-plugin libqt5qml-graphicaleffects qtdeclarative5-dialogs-plugin qtdeclarative5-localstorage-plugin qtdeclarative5-window-plugin | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | **Ubuntu 16.10** | ||||||
|  |  | ||||||
|  |     sudo apt-get install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qml-module-qtquick-controls qtdeclarative5-qtquick2-plugin libqt5qml-graphicaleffects qml-module-qtquick-dialogs qtdeclarative5-localstorage-plugin qtdeclarative5-window-plugin | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | **Ubuntu 17.04** | ||||||
|  |  | ||||||
|  |     sudo apt install build-essential libqt5qml-graphicaleffects qml-module-qt-labs-folderlistmodel qml-module-qt-labs-settings qml-module-qtquick-controls qml-module-qtquick-dialogs qmlscene qt5-default qt5-qmake qtdeclarative5-dev qtdeclarative5-localstorage-plugin qtdeclarative5-qtquick2-plugin qtdeclarative5-window-plugin | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | **Ubuntu 17.10** | ||||||
|  |  | ||||||
|  |     sudo apt-get install build-essential qml-module-qtgraphicaleffects qml-module-qt-labs-folderlistmodel qml-module-qt-labs-settings qml-module-qtquick-controls qml-module-qtquick-dialogs qmlscene qt5-default qt5-qmake qtdeclarative5-dev qtdeclarative5-localstorage-plugin qtdeclarative5-qtquick2-plugin qtdeclarative5-window-plugin | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | **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 | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | **Fedora** | ||||||
|  | This command should install the known fedora dependencies: | ||||||
|  |  | ||||||
|  |     sudo yum -y install qt5-qtbase qt5-qtbase-devel qt5-qtdeclarative qt5-qtdeclarative-devel qt5-qtgraphicaleffects qt5-qtquickcontrols redhat-rpm-config | ||||||
|  |  | ||||||
|  | or: | ||||||
|  |  | ||||||
|  |     sudo dnf -y install qt5-qtbase qt5-qtbase-devel qt5-qtdeclarative qt5-qtdeclarative-devel qt5-qtgraphicaleffects qt5-qtquickcontrols redhat-rpm-config | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | **Arch Linux** | ||||||
|  |  | ||||||
|  |     sudo pacman -S qt5-base qt5-declarative qt5-quickcontrols qt5-graphicaleffects | ||||||
|  |      | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | **openSUSE** | ||||||
|  |  | ||||||
|  | Add repository with latest Qt 5 (this is only needed on openSUSE 13.1, Factory already has it): | ||||||
|  |  | ||||||
|  |     sudo zypper ar http://download.opensuse.org/repositories/KDE:/Qt5/openSUSE_13.1/ KDE:Qt5 | ||||||
|  |  | ||||||
|  | Install dependencies: | ||||||
|  |  | ||||||
|  |     sudo zypper install libqt5-qtbase-devel libqt5-qtdeclarative-devel libqt5-qtquickcontrols libqt5-qtgraphicaleffects | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | **Anyone else** | ||||||
|  |  | ||||||
|  | Install Qt directly from here http://qt-project.org/downloads . Once done export them in you path (replace "_/opt/Qt5.3.1/5.3/gcc_64/bin_" with your correct folder): | ||||||
|  |      | ||||||
|  |     export PATH=/opt/Qt5.3.1/5.3/gcc_64/bin/:$PATH | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ### Compile | ||||||
|  | Once you installed all dependencies (Qt is installed and in your path) you need to compile and run the application:  | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | # Get it from GitHub | ||||||
|  | git clone --recursive https://github.com/Swordfish90/cool-retro-term.git | ||||||
|  |  | ||||||
|  | # Build it | ||||||
|  | cd cool-retro-term | ||||||
|  |  | ||||||
|  | # Compile (Fedora and OpenSUSE user should use qmake-qt5 instead of qmake) | ||||||
|  | qmake && make | ||||||
|  |  | ||||||
|  | # Have fun! | ||||||
|  | ./cool-retro-term | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## Build instructions (macOS) | ||||||
|  |  | ||||||
|  | 1. Install [Xcode](https://developer.apple.com/xcode/) and agree to the licence agreement | ||||||
|  | 2. Enter the following commands into the terminal: | ||||||
|  |  | ||||||
|  | **Brew** | ||||||
|  |  | ||||||
|  | ```sh | ||||||
|  | brew install qt5 | ||||||
|  | git clone --recursive https://github.com/Swordfish90/cool-retro-term.git | ||||||
|  | export CPPFLAGS="-I/usr/local/opt/qt5/include" | ||||||
|  | export LDFLAGS="-L/usr/local/opt/qt5/lib" | ||||||
|  | export PATH=/usr/local/opt/qt5/bin:$PATH | ||||||
|  | cd cool-retro-term | ||||||
|  | qmake && make | ||||||
|  | mkdir cool-retro-term.app/Contents/PlugIns | ||||||
|  | cp -r qmltermwidget/QMLTermWidget cool-retro-term.app/Contents/PlugIns | ||||||
|  | open cool-retro-term.app | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | **MacPorts** | ||||||
|  |  | ||||||
|  | ```sh | ||||||
|  | sudo port install qt5 | ||||||
|  | git clone --recursive https://github.com/Swordfish90/cool-retro-term.git | ||||||
|  | cd cool-retro-term | ||||||
|  | /opt/local/libexec/qt5/bin/qmake && make | ||||||
|  | mkdir cool-retro-term.app/Contents/PlugIns | ||||||
|  | cp -r qmltermwidget/QMLTermWidget cool-retro-term.app/Contents/PlugIns | ||||||
|  | open cool-retro-term.app | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## 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¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted). | ||||||
|  |  | ||||||
|  | You can also add "bounties" on your favourite issues. More information on the [Bountysource](https://www.bountysource.com/teams/crt/issues) page. | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| QT += qml quick widgets sql quickcontrols2 | QT += qml quick widgets sql | ||||||
| TARGET = cool-retro-term  | TARGET = cool-retro-term  | ||||||
|  |  | ||||||
| DESTDIR = $$OUT_PWD/../ | DESTDIR = $$OUT_PWD/../ | ||||||
|   | |||||||
							
								
								
									
										57
									
								
								app/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								app/main.cpp
									
									
									
									
									
								
							| @@ -6,13 +6,11 @@ | |||||||
|  |  | ||||||
| #include <QtWidgets/QApplication> | #include <QtWidgets/QApplication> | ||||||
| #include <QIcon> | #include <QIcon> | ||||||
| #include <QQuickStyle> |  | ||||||
|  |  | ||||||
| #include <QDebug> | #include <QDebug> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  |  | ||||||
| #include <QFontDatabase> | #include <QFontDatabase> | ||||||
| #include <QLoggingCategory> |  | ||||||
|  |  | ||||||
| #include <fileio.h> | #include <fileio.h> | ||||||
| #include <monospacefontmanager.h> | #include <monospacefontmanager.h> | ||||||
| @@ -35,9 +33,6 @@ int main(int argc, char *argv[]) | |||||||
|     // This disables QT appmenu under Ubuntu, which is not working with QML apps. |     // This disables QT appmenu under Ubuntu, which is not working with QML apps. | ||||||
|     setenv("QT_QPA_PLATFORMTHEME", "", 1); |     setenv("QT_QPA_PLATFORMTHEME", "", 1); | ||||||
|  |  | ||||||
|     // Disable Connections slot warnings |  | ||||||
|     QLoggingCategory::setFilterRules("qt.qml.connections.warning=false"); |  | ||||||
|  |  | ||||||
| #if defined (Q_OS_LINUX) | #if defined (Q_OS_LINUX) | ||||||
|     setenv("QSG_RENDER_LOOP", "threaded", 0); |     setenv("QSG_RENDER_LOOP", "threaded", 0); | ||||||
| #endif | #endif | ||||||
| @@ -47,30 +42,10 @@ 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.2.0"); |  | ||||||
|  |  | ||||||
|     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); | ||||||
|     app.setAttribute(Qt::AA_MacDontSwapCtrlAndMeta, true); |     // set application attributes | ||||||
|  |     // Has no effects, see https://bugreports.qt.io/browse/QTBUG-51293 | ||||||
|  |     // app.setAttribute(Qt::AA_MacDontSwapCtrlAndMeta, true); | ||||||
|  |  | ||||||
|     QQmlApplicationEngine engine; |     QQmlApplicationEngine engine; | ||||||
|     FileIO fileIO; |     FileIO fileIO; | ||||||
| @@ -82,11 +57,29 @@ int main(int argc, char *argv[]) | |||||||
|     app.setWindowIcon(QIcon(":../icons/32x32/cool-retro-term.png")); |     app.setWindowIcon(QIcon(":../icons/32x32/cool-retro-term.png")); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     app.setOrganizationName("cool-retro-term"); |  | ||||||
|     app.setOrganizationDomain("cool-retro-term"); |  | ||||||
|  |  | ||||||
|     // Manage command line arguments from the cpp side |     // Manage command line arguments from the cpp side | ||||||
|     QStringList args = app.arguments(); |     QStringList args = app.arguments(); | ||||||
|  |     if (args.contains("-h") || args.contains("--help")) { | ||||||
|  |         // BUG: This usage help text goes to stderr, should go to stdout. | ||||||
|  |         // BUG: First line of output is surrounded by double quotes. | ||||||
|  |         qDebug() << "Usage: " + args.at(0) + " [--default-settings] [--workdir <dir>] [--program <prog>] [-p|--profile <prof>] [--fullscreen] [-h|--help]"; | ||||||
|  |         qDebug() << "  --default-settings  Run cool-retro-term with the default settings"; | ||||||
|  |         qDebug() << "  --workdir <dir>     Change working directory to 'dir'"; | ||||||
|  |         qDebug() << "  -e <cmd>            Command to execute. This option will catch all following arguments, so use it as the last option."; | ||||||
|  |         qDebug() << "  -T <title>          Set window title to 'title'."; | ||||||
|  |         qDebug() << "  --fullscreen        Run cool-retro-term in fullscreen."; | ||||||
|  |         qDebug() << "  -p|--profile <prof> Run cool-retro-term with the given profile."; | ||||||
|  |         qDebug() << "  -h|--help           Print this help."; | ||||||
|  |         qDebug() << "  --verbose           Print additional information such as profiles and settings."; | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     QString appVersion("1.1.1"); | ||||||
|  |  | ||||||
|  |     if (args.contains("-v") || args.contains("--version")) { | ||||||
|  |         qDebug() << ("cool-retro-term " + appVersion).toStdString().c_str(); | ||||||
|  | 	return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     // Manage default command |     // Manage default command | ||||||
|     QStringList cmdList; |     QStringList cmdList; | ||||||
| @@ -112,7 +105,7 @@ int main(int argc, char *argv[]) | |||||||
|     importPathList.prepend(QCoreApplication::applicationDirPath() + "/../../../qmltermwidget"); |     importPathList.prepend(QCoreApplication::applicationDirPath() + "/../../../qmltermwidget"); | ||||||
|     engine.setImportPathList(importPathList); |     engine.setImportPathList(importPathList); | ||||||
|  |  | ||||||
|     engine.load(QUrl(QStringLiteral ("qrc:/main.qml"))); |     engine.load(QUrl(QStringLiteral ("qrc:/root.qml"))); | ||||||
|  |  | ||||||
|     if (engine.rootObjects().isEmpty()) { |     if (engine.rootObjects().isEmpty()) { | ||||||
|         qDebug() << "Cannot load QML interface"; |         qDebug() << "Cannot load QML interface"; | ||||||
|   | |||||||
| @@ -1,28 +1,9 @@ | |||||||
| /******************************************************************************* |  | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" |  | ||||||
| * https://github.com/Swordfish90/cool-retro-term |  | ||||||
| * |  | ||||||
| * This file is part of cool-retro-term. |  | ||||||
| * |  | ||||||
| * cool-retro-term is free software: you can redistribute it and/or modify |  | ||||||
| * it under the terms of the GNU General Public License as published by |  | ||||||
| * the Free Software Foundation, either version 3 of the License, or |  | ||||||
| * (at your option) any later version. |  | ||||||
| * |  | ||||||
| * This program is distributed in the hope that it will be useful, |  | ||||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
| * GNU General Public License for more details. |  | ||||||
| * |  | ||||||
| * You should have received a copy of the GNU General Public License |  | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. |  | ||||||
| *******************************************************************************/ |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.2 | import QtQuick.Controls 1.1 | ||||||
| import QtQuick.Layouts 1.1 | import QtQuick.Layouts 1.1 | ||||||
| import QtQuick.Window 2.0 | import QtQuick.Window 2.0 | ||||||
|  |  | ||||||
| Window { | Window{ | ||||||
|     id: dialogwindow |     id: dialogwindow | ||||||
|     title: qsTr("About") |     title: qsTr("About") | ||||||
|     width: 600 |     width: 600 | ||||||
| @@ -30,19 +11,16 @@ Window { | |||||||
|  |  | ||||||
|     modality: Qt.ApplicationModal |     modality: Qt.ApplicationModal | ||||||
|  |  | ||||||
|     ColumnLayout { |     ColumnLayout{ | ||||||
|         anchors.fill: parent |         anchors.fill: parent | ||||||
|         anchors.margins: 15 |         anchors.margins: 15 | ||||||
|         spacing: 15 |         spacing: 15 | ||||||
|         Text { |         Text { | ||||||
|             Layout.alignment: Qt.AlignHCenter |             Layout.alignment: Qt.AlignHCenter | ||||||
|             text: "cool-retro-term" |             text: "cool-retro-term" | ||||||
|             font { |             font {bold: true; pointSize: 18} | ||||||
|                 bold: true |  | ||||||
|                 pointSize: 18 |  | ||||||
|         } |         } | ||||||
|         } |         Loader{ | ||||||
|         Loader { |  | ||||||
|             id: mainContent |             id: mainContent | ||||||
|             Layout.fillHeight: true |             Layout.fillHeight: true | ||||||
|             Layout.fillWidth: true |             Layout.fillWidth: true | ||||||
| @@ -63,33 +41,32 @@ Window { | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             ] |             ] | ||||||
|             Component.onCompleted: mainContent.state = "Default" |             Component.onCompleted: mainContent.state = "Default"; | ||||||
|         } |         } | ||||||
|         Item { |         Item{ | ||||||
|             Layout.fillWidth: true |             Layout.fillWidth: true | ||||||
|             height: childrenRect.height |             height: childrenRect.height | ||||||
|             Button { |             Button{ | ||||||
|                 anchors.left: parent.left |                 anchors.left: parent.left | ||||||
|                 text: qsTr("License") |                 text: qsTr("License") | ||||||
|                 onClicked: { |                 onClicked: { | ||||||
|                     mainContent.state == "Default" ? mainContent.state |                     mainContent.state == "Default" ? mainContent.state = "License" : mainContent.state = "Default" | ||||||
|                                                      = "License" : mainContent.state = "Default" |  | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             Button { |             Button{ | ||||||
|                 anchors.right: parent.right |                 anchors.right: parent.right | ||||||
|                 text: qsTr("Close") |                 text: qsTr("Close") | ||||||
|                 onClicked: dialogwindow.close() |                 onClicked: dialogwindow.close(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     // MAIN COMPONENTS //////////////////////////////////////////////////////// |     // MAIN COMPONENTS //////////////////////////////////////////////////////// | ||||||
|     Component { |     Component{ | ||||||
|         id: defaultComponent |         id: defaultComponent | ||||||
|         ColumnLayout { |         ColumnLayout{ | ||||||
|             anchors.fill: parent |             anchors.fill: parent | ||||||
|             spacing: 10 |             spacing: 10 | ||||||
|             Image { |             Image{ | ||||||
|                 Layout.fillWidth: true |                 Layout.fillWidth: true | ||||||
|                 Layout.fillHeight: true |                 Layout.fillHeight: true | ||||||
|                 Layout.alignment: Qt.AlignHCenter |                 Layout.alignment: Qt.AlignHCenter | ||||||
| @@ -97,37 +74,36 @@ Window { | |||||||
|                 source: "images/crt256.png" |                 source: "images/crt256.png" | ||||||
|                 smooth: true |                 smooth: true | ||||||
|             } |             } | ||||||
|             Text { |             Text{ | ||||||
|                 Layout.alignment: Qt.AlignCenter |                 Layout.alignment: Qt.AlignCenter | ||||||
|                 horizontalAlignment: Text.AlignHCenter |                 horizontalAlignment: Text.AlignHCenter | ||||||
|                 text: appSettings.version + "\n" + qsTr( |                 text: appSettings.version + "\n" + | ||||||
|                           "Author: ") + "Filippo Scognamiglio\n" + qsTr( |                       qsTr("Author: ") + "Filippo Scognamiglio\n" + | ||||||
|                           "Email: ") + "flscogna@gmail.com\n" + qsTr( |                       qsTr("Email: ")  + "flscogna@gmail.com\n" + | ||||||
|                           "Source: ") + "https://github.com/Swordfish90/cool-retro-term\n" |                       qsTr("Source: ") + "https://github.com/Swordfish90/cool-retro-term\n" | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     Component { |     Component{ | ||||||
|         id: licenseComponent |         id: licenseComponent | ||||||
|         ScrollView { |         TextArea{ | ||||||
|             anchors.fill: parent |             anchors.fill: parent | ||||||
|             clip: true |  | ||||||
|             TextArea { |  | ||||||
|             readOnly: true |             readOnly: true | ||||||
|                 wrapMode: TextEdit.Wrap |             text: "Copyright (c) 2013 Filippo Scognamiglio <flscogna@gmail.com>\n\n" + | ||||||
|                 text: "Copyright (c) 2013-2021 Filippo Scognamiglio <flscogna@gmail.com>\n\n" |                   "https://github.com/Swordfish90/cool-retro-term\n\n" + | ||||||
|                       + "https://github.com/Swordfish90/cool-retro-term\n\n" + |  | ||||||
|                       "cool-retro-term is free software: you can redistribute it and/or modify " |                   "cool-retro-term is free software: you can redistribute it and/or modify " + | ||||||
|                       + "it under the terms of the GNU General Public License as published by " |                   "it under the terms of the GNU General Public License as published by " + | ||||||
|                       + "the Free Software Foundation, either version 3 of the License, or " |                   "the Free Software Foundation, either version 3 of the License, or " + | ||||||
|                       + "(at your option) any later version.\n\n" + |                   "(at your option) any later version.\n\n" + | ||||||
|                       "This program is distributed in the hope that it will be useful, " |  | ||||||
|                       + "but WITHOUT ANY WARRANTY; without even the implied warranty of " |                   "This program is distributed in the hope that it will be useful, " + | ||||||
|                       + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the " |                   "but WITHOUT ANY WARRANTY; without even the implied warranty of " + | ||||||
|                       + "GNU General Public License for more details.\n\n" + |                   "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the " + | ||||||
|                       "You should have received a copy of the GNU General Public License " |                   "GNU General Public License for more details.\n\n" + | ||||||
|                       + "along with this program.  If not, see <http://www.gnu.org/licenses/>." |  | ||||||
|             } |                   "You should have received a copy of the GNU General Public License " + | ||||||
|  |                   "along with this program.  If not, see <http://www.gnu.org/licenses/>." | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,16 +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 2.0 | import QtQuick.Controls 1.0 | ||||||
|  |  | ||||||
| import "utils.js" as Utils | import "utils.js" as Utils | ||||||
|  |  | ||||||
| QtObject { | QtObject{ | ||||||
|     readonly property string version: appVersion |     readonly property string version: appVersion | ||||||
|     readonly property int profileVersion: 2 |     readonly property int profileVersion: 2 | ||||||
|  |  | ||||||
|     // STATIC CONSTANTS //////////////////////////////////////////////////////// |     // STATIC CONSTANTS //////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     readonly property real screenCurvatureSize: 0.4 |     readonly property real screenCurvatureSize: 0.4 | ||||||
|     readonly property real minimumFontScaling: 0.25 |     readonly property real minimumFontScaling: 0.25 | ||||||
|     readonly property real maximumFontScaling: 2.50 |     readonly property real maximumFontScaling: 2.50 | ||||||
| @@ -34,16 +36,15 @@ QtObject { | |||||||
|     readonly property real minBurnInFadeTime: 160 |     readonly property real minBurnInFadeTime: 160 | ||||||
|     readonly property real maxBurnInFadeTime: 1600 |     readonly property real maxBurnInFadeTime: 1600 | ||||||
|  |  | ||||||
|     property bool isMacOS: Qt.platform.os === "osx" |  | ||||||
|  |  | ||||||
|     // GENERAL SETTINGS /////////////////////////////////////////////////////// |     // GENERAL SETTINGS /////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     property int x: 100 |     property int x: 100 | ||||||
|     property int y: 100 |     property int y: 100 | ||||||
|     property int width: 1024 |     property int width: 1024 | ||||||
|     property int height: 768 |     property int height: 768 | ||||||
|  |  | ||||||
|     property bool fullscreen: false |     property bool fullscreen: false | ||||||
|     property bool showMenubar: false |     property bool showMenubar: Qt.platform.os === "osx" ? true : false | ||||||
|  |  | ||||||
|     property string wintitle: "cool-retro-term" |     property string wintitle: "cool-retro-term" | ||||||
|  |  | ||||||
| @@ -54,13 +55,14 @@ QtObject { | |||||||
|     property bool verbose: false |     property bool verbose: false | ||||||
|  |  | ||||||
|     property real bloomQuality: 0.5 |     property real bloomQuality: 0.5 | ||||||
|  |  | ||||||
|     property real burnInQuality: 0.5 |     property real burnInQuality: 0.5 | ||||||
|  |     property bool useFastBurnIn: Qt.platform.os === "osx" ? false : true | ||||||
|  |  | ||||||
|     property bool blinkingCursor: false |     onWindowScalingChanged: handleFontChanged(); | ||||||
|  |  | ||||||
|     onWindowScalingChanged: handleFontChanged() |  | ||||||
|  |  | ||||||
|     // PROFILE SETTINGS /////////////////////////////////////////////////////// |     // PROFILE SETTINGS /////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     property real windowOpacity: 1.0 |     property real windowOpacity: 1.0 | ||||||
|     property real ambientLight: 0.2 |     property real ambientLight: 0.2 | ||||||
|     property real contrast: 0.80 |     property real contrast: 0.80 | ||||||
| @@ -71,16 +73,9 @@ QtObject { | |||||||
|  |  | ||||||
|     property string _backgroundColor: "#000000" |     property string _backgroundColor: "#000000" | ||||||
|     property string _fontColor: "#ff8100" |     property string _fontColor: "#ff8100" | ||||||
|     property string saturatedColor: Utils.mix(Utils.strToColor("#FFFFFF"), |     property string saturatedColor: Utils.mix(Utils.strToColor("#FFFFFF"), Utils.strToColor(_fontColor), saturationColor * 0.5) | ||||||
|                                               Utils.strToColor(_fontColor), |     property color fontColor: Utils.mix(Utils.strToColor(saturatedColor), Utils.strToColor(_backgroundColor), 0.7 + (contrast * 0.3)) | ||||||
|                                               saturationColor * 0.5) |     property color backgroundColor: Utils.mix(Utils.strToColor(_backgroundColor), Utils.strToColor(saturatedColor), 0.7 + (contrast * 0.3)) | ||||||
|     property color fontColor: Utils.mix(Utils.strToColor(saturatedColor), |  | ||||||
|                                         Utils.strToColor(_backgroundColor), |  | ||||||
|                                         0.7 + (contrast * 0.3)) |  | ||||||
|     property color backgroundColor: Utils.mix(Utils.strToColor( |  | ||||||
|                                                   _backgroundColor), |  | ||||||
|                                               Utils.strToColor(saturatedColor), |  | ||||||
|                                               0.7 + (contrast * 0.3)) |  | ||||||
|  |  | ||||||
|     property real staticNoise: 0.12 |     property real staticNoise: 0.12 | ||||||
|     property real screenCurvature: 0.3 |     property real screenCurvature: 0.3 | ||||||
| @@ -99,21 +94,16 @@ QtObject { | |||||||
|     property real rbgShift: 0.0 |     property real rbgShift: 0.0 | ||||||
|  |  | ||||||
|     property real _margin: 0.5 |     property real _margin: 0.5 | ||||||
|     property real _frameMargin: 0.5 |  | ||||||
|  |  | ||||||
|     property real margin: Utils.lint(1.0, 20.0, _margin) |     property real margin: Utils.lint(1.0, 20.0, _margin) | ||||||
|     property real frameMargin: Utils.lint(1.0, 50.0, _frameMargin) |  | ||||||
|  |  | ||||||
|     property real totalMargin: frameMargin + margin |  | ||||||
|  |  | ||||||
|     readonly property int no_rasterization: 0 |     readonly property int no_rasterization: 0 | ||||||
|     readonly property int scanline_rasterization: 1 |     readonly property int scanline_rasterization: 1 | ||||||
|     readonly property int pixel_rasterization: 2 |     readonly property int pixel_rasterization: 2 | ||||||
|     readonly property int subpixel_rasterization: 3 |  | ||||||
|  |  | ||||||
|     property int rasterization: no_rasterization |     property int rasterization: no_rasterization | ||||||
|  |  | ||||||
|     // FONTS ////////////////////////////////////////////////////////////////// |     // FONTS ////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     readonly property real baseFontScaling: 0.75 |     readonly property real baseFontScaling: 0.75 | ||||||
|     property real fontScaling: 1.0 |     property real fontScaling: 1.0 | ||||||
|     property real totalFontScaling: baseFontScaling * fontScaling |     property real totalFontScaling: baseFontScaling * fontScaling | ||||||
| @@ -127,197 +117,167 @@ QtObject { | |||||||
|  |  | ||||||
|     signal terminalFontChanged(string fontFamily, int pixelSize, int lineSpacing, real screenScaling, real fontWidth) |     signal terminalFontChanged(string fontFamily, int pixelSize, int lineSpacing, real screenScaling, real fontWidth) | ||||||
|  |  | ||||||
|     signal initializedSettings |     signal initializedSettings() | ||||||
|  |  | ||||||
|     property Loader fontManager: Loader { |     property Loader fontManager: Loader{ | ||||||
|         states: [ |         states: [ | ||||||
|             State { |             State { when: rasterization == no_rasterization | ||||||
|                 when: rasterization == no_rasterization |                 PropertyChanges {target: fontManager; source: "Fonts.qml" } }, | ||||||
|                 PropertyChanges { |             State { when: rasterization == scanline_rasterization | ||||||
|                     target: fontManager |                 PropertyChanges {target: fontManager; source: "FontScanlines.qml" } }, | ||||||
|                     source: "Fonts.qml" |             State { when: rasterization == pixel_rasterization; | ||||||
|                 } |                 PropertyChanges {target: fontManager; source: "FontPixels.qml" } } | ||||||
|             }, |  | ||||||
|             State { |  | ||||||
|                 when: rasterization == scanline_rasterization |  | ||||||
|                 PropertyChanges { |  | ||||||
|                     target: fontManager |  | ||||||
|                     source: "FontScanlines.qml" |  | ||||||
|                 } |  | ||||||
|             }, |  | ||||||
|             State { |  | ||||||
|                 when: rasterization == pixel_rasterization |  | ||||||
|                 PropertyChanges { |  | ||||||
|                     target: fontManager |  | ||||||
|                     source: "FontPixels.qml" |  | ||||||
|                 } |  | ||||||
|             }, |  | ||||||
|             State { |  | ||||||
|                 when: rasterization == subpixel_rasterization |  | ||||||
|                 PropertyChanges { |  | ||||||
|                     target: fontManager |  | ||||||
|                     source: "FontPixels.qml" |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         ] |         ] | ||||||
|  |  | ||||||
|         onLoaded: handleFontChanged() |         onLoaded: handleFontChanged() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     property FontLoader fontLoader: FontLoader {} |     property FontLoader fontLoader: FontLoader { } | ||||||
|  |  | ||||||
|     onTotalFontScalingChanged: handleFontChanged() |     onTotalFontScalingChanged: handleFontChanged(); | ||||||
|     onFontWidthChanged: handleFontChanged() |     onFontWidthChanged: handleFontChanged(); | ||||||
|  |  | ||||||
|     function getIndexByName(name) { |     function getIndexByName(name) { | ||||||
|         for (var i = 0; i < fontlist.count; i++) { |         for (var i = 0; i < fontlist.count; i++) { | ||||||
|             var requestedName = fontlist.get(i).name |             var requestedName = fontlist.get(i).name; | ||||||
|             if (name === requestedName) |             if (name === requestedName) | ||||||
|                 return i |                 return i; | ||||||
|         } |         } | ||||||
|         return 0 // If the font is not available default to 0. |         return 0; // If the font is not available default to 0. | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function incrementScaling() { |     function incrementScaling(){ | ||||||
|         fontScaling = Math.min(fontScaling + 0.05, maximumFontScaling) |         fontScaling = Math.min(fontScaling + 0.05, maximumFontScaling); | ||||||
|         handleFontChanged() |         handleFontChanged(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function decrementScaling() { |     function decrementScaling(){ | ||||||
|         fontScaling = Math.max(fontScaling - 0.05, minimumFontScaling) |         fontScaling = Math.max(fontScaling - 0.05, minimumFontScaling); | ||||||
|         handleFontChanged() |         handleFontChanged(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function handleFontChanged() { |     function handleFontChanged(){ | ||||||
|         if (!fontManager.item) |         if (!fontManager.item) return; | ||||||
|             return |  | ||||||
|  |  | ||||||
|         var index = getIndexByName(fontNames[rasterization]) |         var index = getIndexByName(fontNames[rasterization]); | ||||||
|         if (index === undefined) |         if (index === undefined) return; | ||||||
|             return |  | ||||||
|  |  | ||||||
|         fontManager.item.selectedFontIndex = index |         fontManager.item.selectedFontIndex = index; | ||||||
|         fontManager.item.scaling = totalFontScaling |         fontManager.item.scaling = totalFontScaling; | ||||||
|  |  | ||||||
|         var fontSource = fontManager.item.source |         var fontSource = fontManager.item.source; | ||||||
|         var pixelSize = fontManager.item.pixelSize |         var pixelSize = fontManager.item.pixelSize; | ||||||
|         var lineSpacing = fontManager.item.lineSpacing |         var lineSpacing = fontManager.item.lineSpacing; | ||||||
|         var screenScaling = fontManager.item.screenScaling |         var screenScaling = fontManager.item.screenScaling; | ||||||
|         var fontWidth = fontManager.item.defaultFontWidth * appSettings.fontWidth |         var fontWidth = fontManager.item.defaultFontWidth * appSettings.fontWidth; | ||||||
|         var fontFamily = fontManager.item.family |         var fontFamily = fontManager.item.family; | ||||||
|         var isSystemFont = fontManager.item.isSystemFont |         var isSystemFont = fontManager.item.isSystemFont; | ||||||
|  |  | ||||||
|         lowResolutionFont = fontManager.item.lowResolutionFont |         lowResolutionFont = fontManager.item.lowResolutionFont; | ||||||
|  |  | ||||||
|         if (!isSystemFont) { |         if (!isSystemFont) { | ||||||
|             fontLoader.source = fontSource |             fontLoader.source = fontSource; | ||||||
|             fontFamily = fontLoader.name |             fontFamily = fontLoader.name; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         terminalFontChanged(fontFamily, pixelSize, lineSpacing, screenScaling, |         terminalFontChanged(fontFamily, pixelSize, lineSpacing, screenScaling, fontWidth); | ||||||
|                             fontWidth) |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     property Storage storage: Storage {} |     property Storage storage: Storage{ } | ||||||
|  |  | ||||||
|     function stringify(obj) { |     function stringify(obj) { | ||||||
|         var replacer = function (key, val) { |         var replacer = function(key, val) { | ||||||
|             return val.toFixed ? Number(val.toFixed(4)) : val |             return val.toFixed ? Number(val.toFixed(4)) : val; | ||||||
|         } |         } | ||||||
|         return JSON.stringify(obj, replacer, 2) |         return JSON.stringify(obj, replacer, 2); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function composeSettingsString() { |     function composeSettingsString(){ | ||||||
|         var settings = { |         var settings = { | ||||||
|             "fps": fps, |             fps: fps, | ||||||
|             "x": x, |             x: x, | ||||||
|             "y": y, |             y: y, | ||||||
|             "width": width, |             width: width, | ||||||
|             "height": height, |             height: height, | ||||||
|             "windowScaling": windowScaling, |             windowScaling: windowScaling, | ||||||
|             "showTerminalSize": showTerminalSize, |             showTerminalSize: showTerminalSize, | ||||||
|             "fontScaling": fontScaling, |             fontScaling: fontScaling, | ||||||
|             "fontNames": fontNames, |             fontNames: fontNames, | ||||||
|             "showMenubar": showMenubar, |             showMenubar: showMenubar, | ||||||
|             "bloomQuality": bloomQuality, |             bloomQuality: bloomQuality, | ||||||
|             "burnInQuality": burnInQuality, |             burnInQuality: burnInQuality, | ||||||
|             "useCustomCommand": useCustomCommand, |             useCustomCommand: useCustomCommand, | ||||||
|             "customCommand": customCommand |             customCommand: customCommand, | ||||||
|  |             useFastBurnIn: useFastBurnIn | ||||||
|         } |         } | ||||||
|         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) |         if(!settingsString) return; | ||||||
|             return |         if(!profileString) return; | ||||||
|         if (!profileString) |  | ||||||
|             return |  | ||||||
|  |  | ||||||
|         loadSettingsString(settingsString) |         loadSettingsString(settingsString); | ||||||
|         loadProfileString(profileString) |         loadProfileString(profileString); | ||||||
|  |  | ||||||
|         if (verbose) |         if (verbose) | ||||||
|             console.log("Loading settings: " + settingsString + profileString) |             console.log("Loading settings: " + settingsString + profileString); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function storeSettings() { |     function storeSettings(){ | ||||||
|         var settingsString = composeSettingsString() |         var settingsString = composeSettingsString(); | ||||||
|         var profileString = composeProfileString() |         var profileString = composeProfileString(); | ||||||
|  |  | ||||||
|         storage.setSetting("_CURRENT_SETTINGS", settingsString) |         storage.setSetting("_CURRENT_SETTINGS", settingsString); | ||||||
|         storage.setSetting("_CURRENT_PROFILE", profileString) |         storage.setSetting("_CURRENT_PROFILE", profileString); | ||||||
|  |  | ||||||
|         if (verbose) { |         if (verbose) { | ||||||
|             console.log("Storing settings: " + settingsString) |             console.log("Storing settings: " + settingsString); | ||||||
|             console.log("Storing profile: " + profileString) |             console.log("Storing profile: " + profileString); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function loadSettingsString(settingsString) { |     function loadSettingsString(settingsString){ | ||||||
|         var settings = JSON.parse(settingsString) |         var settings = JSON.parse(settingsString); | ||||||
|  |  | ||||||
|         showTerminalSize = settings.showTerminalSize |         showTerminalSize = settings.showTerminalSize !== undefined ? settings.showTerminalSize : showTerminalSize | ||||||
|                 !== undefined ? settings.showTerminalSize : showTerminalSize |  | ||||||
|  |  | ||||||
|         fps = settings.fps !== undefined ? settings.fps : fps |         fps = settings.fps !== undefined ? settings.fps: fps | ||||||
|         windowScaling = settings.windowScaling |         windowScaling = settings.windowScaling !== undefined ? settings.windowScaling : windowScaling | ||||||
|                 !== undefined ? settings.windowScaling : windowScaling |  | ||||||
|  |  | ||||||
|         x = settings.x !== undefined ? settings.x : x |         x = settings.x !== undefined ? settings.x : x | ||||||
|         y = settings.y !== undefined ? settings.y : y |         y = settings.y !== undefined ? settings.y : y | ||||||
| @@ -327,118 +287,98 @@ QtObject { | |||||||
|         fontNames = settings.fontNames !== undefined ? settings.fontNames : fontNames |         fontNames = settings.fontNames !== undefined ? settings.fontNames : fontNames | ||||||
|         fontScaling = settings.fontScaling !== undefined ? settings.fontScaling : fontScaling |         fontScaling = settings.fontScaling !== undefined ? settings.fontScaling : fontScaling | ||||||
|  |  | ||||||
|         showMenubar = settings.showMenubar !== undefined ? settings.showMenubar : showMenubar |         showMenubar = settings.showMenubar !== undefined ? settings.showMenubar : showMenubar; | ||||||
|  |  | ||||||
|         bloomQuality = settings.bloomQuality !== undefined ? settings.bloomQuality : bloomQuality |         bloomQuality = settings.bloomQuality !== undefined ? settings.bloomQuality : bloomQuality; | ||||||
|         burnInQuality = settings.burnInQuality |         burnInQuality = settings.burnInQuality !== undefined ? settings.burnInQuality : burnInQuality; | ||||||
|                 !== undefined ? settings.burnInQuality : burnInQuality |  | ||||||
|  |  | ||||||
|         useCustomCommand = settings.useCustomCommand |         useCustomCommand = settings.useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand | ||||||
|                 !== undefined ? settings.useCustomCommand : useCustomCommand |         customCommand = settings.customCommand !== undefined ? settings.customCommand : customCommand | ||||||
|         customCommand = settings.customCommand |  | ||||||
|                 !== undefined ? settings.customCommand : customCommand |         useFastBurnIn = settings.useFastBurnIn !== undefined ? settings.useFastBurnIn : useFastBurnIn; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function loadProfileString(profileString) { |     function loadProfileString(profileString){ | ||||||
|         var settings = JSON.parse(profileString) |         var settings = JSON.parse(profileString); | ||||||
|  |  | ||||||
|         _backgroundColor = settings.backgroundColor |         _backgroundColor = settings.backgroundColor !== undefined ? settings.backgroundColor : _backgroundColor; | ||||||
|                 !== undefined ? settings.backgroundColor : _backgroundColor |         _fontColor = settings.fontColor !== undefined ? settings.fontColor : _fontColor; | ||||||
|         _fontColor = settings.fontColor !== undefined ? settings.fontColor : _fontColor |  | ||||||
|  |  | ||||||
|         horizontalSync = settings.horizontalSync |         horizontalSync = settings.horizontalSync !== undefined ? settings.horizontalSync : horizontalSync | ||||||
|                 !== undefined ? settings.horizontalSync : horizontalSync |         flickering = settings.flickering !== undefined ? settings.flickering : flickering; | ||||||
|         flickering = settings.flickering !== undefined ? settings.flickering : flickering |         staticNoise = settings.staticNoise !== undefined ? settings.staticNoise : staticNoise; | ||||||
|         staticNoise = settings.staticNoise !== undefined ? settings.staticNoise : staticNoise |         chromaColor = settings.chromaColor !== undefined ? settings.chromaColor : chromaColor; | ||||||
|         chromaColor = settings.chromaColor !== undefined ? settings.chromaColor : chromaColor |         saturationColor = settings.saturationColor !== undefined ? settings.saturationColor : saturationColor; | ||||||
|         saturationColor = settings.saturationColor |         screenCurvature = settings.screenCurvature !== undefined ? settings.screenCurvature : screenCurvature; | ||||||
|                 !== undefined ? settings.saturationColor : saturationColor |         glowingLine = settings.glowingLine !== undefined ? settings.glowingLine : glowingLine; | ||||||
|         screenCurvature = settings.screenCurvature |  | ||||||
|                 !== undefined ? settings.screenCurvature : screenCurvature |  | ||||||
|         glowingLine = settings.glowingLine !== undefined ? settings.glowingLine : glowingLine |  | ||||||
|  |  | ||||||
|         burnIn = settings.burnIn !== undefined ? settings.burnIn : burnIn |         burnIn = settings.burnIn !== undefined ? settings.burnIn : burnIn | ||||||
|         bloom = settings.bloom !== undefined ? settings.bloom : bloom |         bloom = settings.bloom !== undefined ? settings.bloom : bloom | ||||||
|  |  | ||||||
|         rasterization = settings.rasterization |         rasterization = settings.rasterization !== undefined ? settings.rasterization : rasterization; | ||||||
|                 !== undefined ? settings.rasterization : rasterization |  | ||||||
|  |  | ||||||
|         jitter = settings.jitter !== undefined ? settings.jitter : jitter |         jitter = settings.jitter !== undefined ? settings.jitter : jitter; | ||||||
|  |  | ||||||
|         rbgShift = settings.rbgShift !== undefined ? settings.rbgShift : rbgShift |         rbgShift = settings.rbgShift !== undefined ? settings.rbgShift : rbgShift; | ||||||
|  |  | ||||||
|         ambientLight = settings.ambientLight !== undefined ? settings.ambientLight : ambientLight |         ambientLight = settings.ambientLight !== undefined ? settings.ambientLight : ambientLight; | ||||||
|         contrast = settings.contrast !== undefined ? settings.contrast : contrast |         contrast = settings.contrast !== undefined ? settings.contrast : contrast; | ||||||
|         brightness = settings.brightness !== undefined ? settings.brightness : brightness |         brightness = settings.brightness !== undefined ? settings.brightness : brightness; | ||||||
|         windowOpacity = settings.windowOpacity |         windowOpacity = settings.windowOpacity !== undefined ? settings.windowOpacity : windowOpacity; | ||||||
|                 !== undefined ? settings.windowOpacity : windowOpacity |  | ||||||
|  |  | ||||||
|         fontNames[rasterization] = settings.fontName |         fontNames[rasterization] = settings.fontName !== undefined ? settings.fontName : fontNames[rasterization]; | ||||||
|                 !== undefined ? settings.fontName : fontNames[rasterization] |         fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth; | ||||||
|         fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth |  | ||||||
|  |  | ||||||
|         _margin = settings.margin !== undefined ? settings.margin : _margin |         _margin = settings.margin !== undefined ? settings.margin : _margin; | ||||||
|         _frameMargin = settings.frameMargin !== undefined ? settings.frameMargin : _frameMargin |  | ||||||
|  |  | ||||||
|         blinkingCursor = settings.blinkingCursor !== undefined ? settings.blinkingCursor : blinkingCursor |         handleFontChanged(); | ||||||
|  |  | ||||||
|         handleFontChanged() |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function storeCustomProfiles() { |     function storeCustomProfiles(){ | ||||||
|         storage.setSetting("_CUSTOM_PROFILES", composeCustomProfilesString()) |         storage.setSetting("_CUSTOM_PROFILES", composeCustomProfilesString()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function loadCustomProfiles() { |     function loadCustomProfiles(){ | ||||||
|         var customProfileString = storage.getSetting("_CUSTOM_PROFILES") |         var customProfileString = storage.getSetting("_CUSTOM_PROFILES"); | ||||||
|         if (customProfileString === undefined) |         if(customProfileString === undefined) customProfileString = "[]"; | ||||||
|             customProfileString = "[]" |         loadCustomProfilesString(customProfileString); | ||||||
|         loadCustomProfilesString(customProfileString) |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function loadCustomProfilesString(customProfilesString) { |     function loadCustomProfilesString(customProfilesString){ | ||||||
|         var customProfiles = JSON.parse(customProfilesString) |         var customProfiles = JSON.parse(customProfilesString); | ||||||
|         for (var i = 0; i < customProfiles.length; i++) { |         for (var i=0; i<customProfiles.length; i++) { | ||||||
|             var profile = customProfiles[i] |             var profile = customProfiles[i]; | ||||||
|  |  | ||||||
|             if (verbose) |             if (verbose) | ||||||
|                 console.log("Loading custom profile: " + stringify(profile)) |                 console.log("Loading custom profile: " + stringify(profile)); | ||||||
|  |  | ||||||
|             profilesList.append(profile) |             profilesList.append(profile); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function composeCustomProfilesString() { |     function composeCustomProfilesString(){ | ||||||
|         var customProfiles = [] |         var customProfiles = [] | ||||||
|         for (var i = 0; i < profilesList.count; i++) { |         for(var i=0; i<profilesList.count; i++){ | ||||||
|             var profile = profilesList.get(i) |             var profile = profilesList.get(i); | ||||||
|             if (profile.builtin) |             if(profile.builtin) continue; | ||||||
|                 continue |             customProfiles.push({text: profile.text, obj_string: profile.obj_string, builtin: false}) | ||||||
|             customProfiles.push({ |  | ||||||
|                                     "text": profile.text, |  | ||||||
|                                     "obj_string": profile.obj_string, |  | ||||||
|                                     "builtin": false |  | ||||||
|                                 }) |  | ||||||
|         } |         } | ||||||
|         return stringify(customProfiles) |         return stringify(customProfiles); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function loadProfile(index) { |     function loadProfile(index){ | ||||||
|         var profile = profilesList.get(index) |         var profile = profilesList.get(index); | ||||||
|         loadProfileString(profile.obj_string) |         loadProfileString(profile.obj_string); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function appendCustomProfile(name, profileString) { |     function appendCustomProfile(name, profileString) { | ||||||
|         profilesList.append({ |         profilesList.append({text: name, obj_string: profileString, builtin: false}); | ||||||
|                                 "text": name, |  | ||||||
|                                 "obj_string": profileString, |  | ||||||
|                                 "builtin": false |  | ||||||
|                             }) |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // PROFILES /////////////////////////////////////////////////////////////// |     // PROFILES /////////////////////////////////////////////////////////////// | ||||||
|     property ListModel profilesList: ListModel { |  | ||||||
|         ListElement { |     property ListModel profilesList: ListModel{ | ||||||
|  |         ListElement{ | ||||||
|             text: "Default Amber" |             text: "Default Amber" | ||||||
|             obj_string: '{ |             obj_string: '{ | ||||||
|                   "ambientLight": 0.2, |                   "ambientLight": 0.2, | ||||||
| @@ -461,15 +401,14 @@ 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, | ||||||
| @@ -490,15 +429,14 @@ 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, | ||||||
| @@ -519,15 +457,14 @@ 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, | ||||||
| @@ -548,15 +485,14 @@ 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, | ||||||
| @@ -577,15 +513,14 @@ 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, | ||||||
| @@ -606,15 +541,14 @@ 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, | ||||||
| @@ -635,15 +569,14 @@ 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, | ||||||
| @@ -664,15 +597,14 @@ 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, | ||||||
| @@ -693,9 +625,7 @@ 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 | ||||||
|         } |         } | ||||||
| @@ -703,52 +633,52 @@ QtObject { | |||||||
|  |  | ||||||
|     function getProfileIndexByName(name) { |     function getProfileIndexByName(name) { | ||||||
|         for (var i = 0; i < profilesList.count; i++) { |         for (var i = 0; i < profilesList.count; i++) { | ||||||
|             if (profilesList.get(i).text === name) |             if(profilesList.get(i).text === name) | ||||||
|                 return i |                 return i; | ||||||
|         } |         } | ||||||
|         return -1 |         return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     Component.onCompleted: { |     Component.onCompleted: { | ||||||
|         // Manage the arguments from the QML side. |         // Manage the arguments from the QML side. | ||||||
|         var args = Qt.application.arguments |         var args = Qt.application.arguments; | ||||||
|         if (args.indexOf("--verbose") !== -1) { |         if (args.indexOf("--verbose") !== -1) { | ||||||
|             verbose = true |             verbose = true; | ||||||
|         } |         } | ||||||
|         if (args.indexOf("--default-settings") === -1) { |         if (args.indexOf("--default-settings") === -1) { | ||||||
|             loadSettings() |             loadSettings(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         loadCustomProfiles() |         loadCustomProfiles(); | ||||||
|  |  | ||||||
|         var profileArgPosition = args.indexOf("--profile") |         var profileArgPosition = args.indexOf("--profile"); | ||||||
|         if (profileArgPosition !== -1) { |         if (profileArgPosition !== -1) { | ||||||
|             var profileIndex = getProfileIndexByName( |             var profileIndex = getProfileIndexByName(args[profileArgPosition + 1]); | ||||||
|                         args[profileArgPosition + 1]) |  | ||||||
|             if (profileIndex !== -1) |             if (profileIndex !== -1) | ||||||
|                 loadProfile(profileIndex) |                 loadProfile(profileIndex); | ||||||
|             else |             else | ||||||
|                 console.log("Warning: selected profile is not valid; ignoring it") |                 console.log("Warning: selected profile is not valid; ignoring it"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (args.indexOf("--fullscreen") !== -1) { |         if (args.indexOf("--fullscreen") !== -1) { | ||||||
|             fullscreen = true |             fullscreen = true; | ||||||
|             showMenubar = false |             showMenubar = false; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (args.indexOf("-T") !== -1) { |         if (args.indexOf("-T") !== -1) { | ||||||
|             wintitle = args[args.indexOf("-T") + 1] |             wintitle = args[args.indexOf("-T") + 1] | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         initializedSettings() |         initializedSettings(); | ||||||
|     } |     } | ||||||
|     Component.onDestruction: { |     Component.onDestruction: { | ||||||
|         storeSettings() |         storeSettings(); | ||||||
|         storeCustomProfiles() |         storeCustomProfiles(); | ||||||
|         //        storage.dropSettings(); //DROPS THE SETTINGS!.. REMEMBER TO DISABLE ONCE ENABLED!! | //        storage.dropSettings(); //DROPS THE SETTINGS!.. REMEMBER TO DISABLE ONCE ENABLED!! | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // VARS /////////////////////////////////////////////////////////////////// |     // VARS /////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     property Label _sampleLabel: Label { |     property Label _sampleLabel: Label { | ||||||
|         text: "100%" |         text: "100%" | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,22 +1,3 @@ | |||||||
| /******************************************************************************* |  | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" |  | ||||||
| * https://github.com/Swordfish90/cool-retro-term |  | ||||||
| * |  | ||||||
| * This file is part of cool-retro-term. |  | ||||||
| * |  | ||||||
| * cool-retro-term is free software: you can redistribute it and/or modify |  | ||||||
| * it under the terms of the GNU General Public License as published by |  | ||||||
| * the Free Software Foundation, either version 3 of the License, or |  | ||||||
| * (at your option) any later version. |  | ||||||
| * |  | ||||||
| * This program is distributed in the hope that it will be useful, |  | ||||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
| * GNU General Public License for more details. |  | ||||||
| * |  | ||||||
| * You should have received a copy of the GNU General Public License |  | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. |  | ||||||
| *******************************************************************************/ |  | ||||||
| import QtQuick 2.0 | import QtQuick 2.0 | ||||||
|  |  | ||||||
| import "utils.js" as Utils | import "utils.js" as Utils | ||||||
| @@ -29,29 +10,26 @@ Loader { | |||||||
|     property real lastUpdate: 0 |     property real lastUpdate: 0 | ||||||
|     property real prevLastUpdate: 0 |     property real prevLastUpdate: 0 | ||||||
|  |  | ||||||
|  |     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: appSettings.minBurnInFadeTime | ||||||
|     property real _maxBurnInFadeTime: appSettings.maxBurnInFadeTime |     property real _maxBurnInFadeTime: appSettings.maxBurnInFadeTime | ||||||
|  |  | ||||||
|     active: appSettings.burnIn !== 0 |     active: appSettings.useFastBurnIn && appSettings.burnIn !== 0 | ||||||
|  |  | ||||||
|     anchors.fill: parent |     anchors.fill: parent | ||||||
|  |  | ||||||
|     function completelyUpdate() { |     function completelyUpdate() { | ||||||
|         let newTime = timeManager.time |         prevLastUpdate = lastUpdate; | ||||||
|         if (newTime > lastUpdate) { |         lastUpdate = timeManager.time; | ||||||
|             prevLastUpdate = lastUpdate |         item.source.scheduleUpdate(); | ||||||
|             lastUpdate = newTime |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|         item.source.scheduleUpdate() |     function restartBlurSource(){ | ||||||
|     } |         prevLastUpdate = timeManager.time; | ||||||
|  |         lastUpdate = prevLastUpdate; | ||||||
|     function restartBlurSource() { |         completelyUpdate(); | ||||||
|         prevLastUpdate = timeManager.time |  | ||||||
|         lastUpdate = prevLastUpdate |  | ||||||
|         completelyUpdate() |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     sourceComponent: Item { |     sourceComponent: Item { | ||||||
| @@ -75,35 +53,21 @@ Loader { | |||||||
|  |  | ||||||
|             Connections { |             Connections { | ||||||
|                 target: kterminal |                 target: kterminal | ||||||
|  |                 onImagePainted: completelyUpdate() | ||||||
|                 onImagePainted: { |  | ||||||
|                     completelyUpdate() |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|             // Restart blurred source settings change. |             // Restart blurred source settings change. | ||||||
|             Connections { |             Connections{ | ||||||
|                 target: appSettings |                 target: appSettings | ||||||
|  |                 onBurnInChanged: burnInEffect.restartBlurSource(); | ||||||
|                 onBurnInChanged: { |                 onTerminalFontChanged: burnInEffect.restartBlurSource(); | ||||||
|                     burnInEffect.restartBlurSource() |                 onRasterizationChanged: burnInEffect.restartBlurSource(); | ||||||
|  |                 onBurnInQualityChanged: burnInEffect.restartBlurSource(); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|                 onTerminalFontChanged: { |             Connections { | ||||||
|                     burnInEffect.restartBlurSource() |                 target: kterminalScrollbar | ||||||
|  |                 onOpacityChanged: completelyUpdate() | ||||||
|             } |             } | ||||||
|  |  | ||||||
|                 onRasterizationChanged: { |  | ||||||
|                     burnInEffect.restartBlurSource() |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 onBurnInQualityChanged: { |  | ||||||
|                     burnInEffect.restartBlurSource() |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         ShaderLibrary { |  | ||||||
|             id: shaderLibrary |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ShaderEffect { |         ShaderEffect { | ||||||
| @@ -135,7 +99,9 @@ Loader { | |||||||
|  |  | ||||||
|                  uniform highp float prevLastUpdate;" + |                  uniform highp float prevLastUpdate;" + | ||||||
|  |  | ||||||
|                 shaderLibrary.rgb2grey + |                 "float rgb2grey(vec3 v){ | ||||||
|  |                     return dot(v, vec3(0.21, 0.72, 0.04)); | ||||||
|  |                 }" + | ||||||
|  |  | ||||||
|                 "void main() { |                 "void main() { | ||||||
|                     vec2 coords = qt_TexCoord0; |                     vec2 coords = qt_TexCoord0; | ||||||
|   | |||||||
							
								
								
									
										57
									
								
								app/qml/CRTMainMenuBar.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								app/qml/CRTMainMenuBar.qml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | import QtQuick 2.2 | ||||||
|  | import QtQuick.Controls 1.1 | ||||||
|  |  | ||||||
|  | MenuBar { | ||||||
|  |     id: defaultMenuBar | ||||||
|  |     property bool visible: true | ||||||
|  |     Menu { | ||||||
|  |         title: qsTr("File") | ||||||
|  |         visible: defaultMenuBar.visible | ||||||
|  |         MenuItem {action: quitAction} | ||||||
|  |     } | ||||||
|  |     Menu { | ||||||
|  |         title: qsTr("Terminal") | ||||||
|  |         visible: defaultMenuBar.visible | ||||||
|  |         MenuItem {action: newAction} | ||||||
|  |         MenuItem {action: closeAction} | ||||||
|  |     } | ||||||
|  |     Menu { | ||||||
|  |         title: qsTr("Edit") | ||||||
|  |         visible: defaultMenuBar.visible && appSettings.showMenubar | ||||||
|  |         MenuItem {action: copyAction} | ||||||
|  |         MenuItem {action: pasteAction} | ||||||
|  |         MenuSeparator{visible: Qt.platform.os !== "osx"} | ||||||
|  |         MenuItem {action: showsettingsAction} | ||||||
|  |     } | ||||||
|  |     Menu{ | ||||||
|  |         title: qsTr("View") | ||||||
|  |         visible: defaultMenuBar.visible | ||||||
|  |         MenuItem {action: fullscreenAction; visible: fullscreenAction.enabled} | ||||||
|  |         MenuItem {action: showMenubarAction; visible: showMenubarAction.enabled} | ||||||
|  |         MenuSeparator{visible: showMenubarAction.enabled} | ||||||
|  |         MenuItem {action: zoomIn} | ||||||
|  |         MenuItem {action: zoomOut} | ||||||
|  |     } | ||||||
|  |     Menu{ | ||||||
|  |         id: profilesMenu | ||||||
|  |         title: qsTr("Profiles") | ||||||
|  |         visible: defaultMenuBar.visible | ||||||
|  |         Instantiator{ | ||||||
|  |             model: appSettings.profilesList | ||||||
|  |             delegate: MenuItem { | ||||||
|  |                 text: model.text | ||||||
|  |                 onTriggered: { | ||||||
|  |                     appSettings.loadProfileString(obj_string); | ||||||
|  |                     appSettings.handleFontChanged(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             onObjectAdded: profilesMenu.insertItem(index, object) | ||||||
|  |             onObjectRemoved: profilesMenu.removeItem(object) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     Menu{ | ||||||
|  |         title: qsTr("Help") | ||||||
|  |         visible: defaultMenuBar.visible | ||||||
|  |         MenuItem {action: showAboutAction} | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,8 +17,9 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.0 | import QtQuick.Controls 1.1 | ||||||
| import QtQuick.Layouts 1.1 | import QtQuick.Layouts 1.1 | ||||||
|  |  | ||||||
| import "Components" | import "Components" | ||||||
| @@ -27,46 +28,46 @@ RowLayout { | |||||||
|     property alias name: check.text |     property alias name: check.text | ||||||
|  |  | ||||||
|     property double value |     property double value | ||||||
|     property alias min_value: slider.from |     property alias min_value: slider.minimumValue | ||||||
|     property alias max_value: slider.to |     property alias max_value: slider.maximumValue | ||||||
|     property alias stepSize: slider.stepSize |     property alias stepSize: slider.stepSize | ||||||
|  |  | ||||||
|     signal newValue(real newValue) |     signal newValue(real newValue); | ||||||
|  |  | ||||||
|     id: setting_component |     id: setting_component | ||||||
|     Layout.fillWidth: true |     Layout.fillWidth: true | ||||||
|  |  | ||||||
|     onValueChanged: { |     onValueChanged: { | ||||||
|         check.checked = !(value == 0) |         check.checked = !(value == 0); | ||||||
|         if (check.checked) |         if(check.checked) | ||||||
|             slider.value = value |             slider.value = value; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     CheckBox { |     CheckBox{ | ||||||
|         id: check |         id: check | ||||||
|         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; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     Slider { |     Slider{ | ||||||
|         id: slider |         id: slider | ||||||
|         stepSize: parent.stepSize |         stepSize: parent.stepSize | ||||||
|         Layout.fillWidth: true |         Layout.fillWidth: true | ||||||
|         onValueChanged: { |         onValueChanged: { | ||||||
|             newValue(value) |             newValue(value); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     SizedLabel { |     SizedLabel { | ||||||
|         text: Math.round( |         Layout.fillHeight: true | ||||||
|                   ((value - min_value) / (max_value - min_value)) * 100) + "%" |         text: Math.round(((value - min_value) / (max_value - min_value)) * 100) + "%" | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,13 +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.Dialogs 1.1 | import QtQuick.Dialogs 1.1 | ||||||
|  |  | ||||||
| Item { | Item { | ||||||
|     id: rootItem |     id: rootItem | ||||||
|  |  | ||||||
|     signal colorSelected(color color) |     signal colorSelected (color color) | ||||||
|     property color color |     property color color | ||||||
|     property string name |     property string name | ||||||
|  |  | ||||||
| @@ -34,14 +35,15 @@ Item { | |||||||
|         visible: false |         visible: false | ||||||
|  |  | ||||||
|         //This is a workaround to a Qt 5.2 bug. |         //This is a workaround to a Qt 5.2 bug. | ||||||
|         onColorChanged: if (!appSettings.isMacOS) colorSelected(color) |         onColorChanged: if (Qt.platform.os !== "osx") colorSelected(color) | ||||||
|         onAccepted: if (appSettings.isMacOS) 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 | ||||||
| @@ -49,14 +51,14 @@ Item { | |||||||
|             color: "white" |             color: "white" | ||||||
|             opacity: 0.5 |             opacity: 0.5 | ||||||
|         } |         } | ||||||
|         Text { |         Text{ | ||||||
|             anchors.centerIn: parent |             anchors.centerIn: parent | ||||||
|             z: parent.z + 1 |             z: parent.z + 1 | ||||||
|             text: name + ":  " + rootItem.color |             text: name + ":  " + rootItem.color | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     MouseArea { |     MouseArea{ | ||||||
|         anchors.fill: parent |         anchors.fill: parent | ||||||
|         onClicked: colorDialog.visible = true |         onClicked: colorDialog.visible = true; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,7 +1,5 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -19,14 +17,19 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
|  |  | ||||||
| import QtQuick 2.0 | import QtQuick 2.0 | ||||||
| import QtQuick.Controls 2.0 | import QtQuick.Controls 1.0 | ||||||
| import QtQuick.Layouts 1.0 |  | ||||||
|  |  | ||||||
| // This component is simply a label with a predefined size. | // This component is simply a label with a predefined size. | ||||||
| // Used to improve alignment. | // Used to improve alignment. | ||||||
| Label { |  | ||||||
|     id: textfield | Item { | ||||||
|     Layout.minimumWidth: appSettings.labelWidth |     property alias text: textfield.text | ||||||
|     width: appSettings.labelWidth |     width: appSettings.labelWidth | ||||||
|  |     Label{ | ||||||
|  |         id: textfield | ||||||
|  |         anchors { right: parent.right; verticalCenter: parent.verticalCenter } | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,9 +17,10 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
|  |  | ||||||
| QtObject { | QtObject{ | ||||||
|     property int selectedFontIndex |     property int selectedFontIndex | ||||||
|     property real scaling |     property real scaling | ||||||
|     property var _font: fontlist.get(selectedFontIndex) |     property var _font: fontlist.get(selectedFontIndex) | ||||||
| @@ -30,8 +31,8 @@ QtObject { | |||||||
|     property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth |     property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth | ||||||
|     property bool lowResolutionFont: true |     property bool lowResolutionFont: true | ||||||
|  |  | ||||||
|     property ListModel fontlist: ListModel { |     property ListModel fontlist: ListModel{ | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "COMMODORE_PET" |             name: "COMMODORE_PET" | ||||||
|             text: "Commodore PET (1977)" |             text: "Commodore PET (1977)" | ||||||
|             source: "fonts/1977-commodore-pet/PetMe.ttf" |             source: "fonts/1977-commodore-pet/PetMe.ttf" | ||||||
| @@ -40,7 +41,7 @@ QtObject { | |||||||
|             baseScaling: 3.5 |             baseScaling: 3.5 | ||||||
|             fontWidth: 0.8 |             fontWidth: 0.8 | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "IBM_PC" |             name: "IBM_PC" | ||||||
|             text: "IBM PC (1981)" |             text: "IBM PC (1981)" | ||||||
|             source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf" |             source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf" | ||||||
| @@ -49,7 +50,7 @@ QtObject { | |||||||
|             baseScaling: 3.5 |             baseScaling: 3.5 | ||||||
|             fontWidth: 0.8 |             fontWidth: 0.8 | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "PROGGY_TINY" |             name: "PROGGY_TINY" | ||||||
|             text: "Proggy Tiny (Modern)" |             text: "Proggy Tiny (Modern)" | ||||||
|             source: "fonts/modern-proggy-tiny/ProggyTiny.ttf" |             source: "fonts/modern-proggy-tiny/ProggyTiny.ttf" | ||||||
| @@ -58,7 +59,7 @@ QtObject { | |||||||
|             baseScaling: 3.3 |             baseScaling: 3.3 | ||||||
|             fontWidth: 0.9 |             fontWidth: 0.9 | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "TERMINUS_SCALED" |             name: "TERMINUS_SCALED" | ||||||
|             text: "Terminus (Modern)" |             text: "Terminus (Modern)" | ||||||
|             source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf" |             source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf" | ||||||
| @@ -67,7 +68,7 @@ QtObject { | |||||||
|             baseScaling: 3.0 |             baseScaling: 3.0 | ||||||
|             fontWidth: 1.0 |             fontWidth: 1.0 | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "PRO_FONT_SCALED" |             name: "PRO_FONT_SCALED" | ||||||
|             text: "Pro Font (Modern)" |             text: "Pro Font (Modern)" | ||||||
|             source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf" |             source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf" | ||||||
| @@ -76,7 +77,7 @@ QtObject { | |||||||
|             baseScaling: 3.0 |             baseScaling: 3.0 | ||||||
|             fontWidth: 1.0 |             fontWidth: 1.0 | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "APPLE_II" |             name: "APPLE_II" | ||||||
|             text: "Apple ][ (1977)" |             text: "Apple ][ (1977)" | ||||||
|             source: "fonts/1977-apple2/PrintChar21.ttf" |             source: "fonts/1977-apple2/PrintChar21.ttf" | ||||||
| @@ -85,7 +86,7 @@ QtObject { | |||||||
|             baseScaling: 3.5 |             baseScaling: 3.5 | ||||||
|             fontWidth: 0.9 |             fontWidth: 0.9 | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "ATARI_400" |             name: "ATARI_400" | ||||||
|             text: "Atari 400-800 (1979)" |             text: "Atari 400-800 (1979)" | ||||||
|             source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf" |             source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf" | ||||||
| @@ -94,7 +95,7 @@ QtObject { | |||||||
|             baseScaling: 3.5 |             baseScaling: 3.5 | ||||||
|             fontWidth: 0.8 |             fontWidth: 0.8 | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "COMMODORE_64" |             name: "COMMODORE_64" | ||||||
|             text: "Commodore 64 (1982)" |             text: "Commodore 64 (1982)" | ||||||
|             source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf" |             source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf" | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,9 +17,10 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
|  |  | ||||||
| QtObject { | QtObject{ | ||||||
|     property int selectedFontIndex |     property int selectedFontIndex | ||||||
|     property real scaling |     property real scaling | ||||||
|     property var _font: fontlist.get(selectedFontIndex) |     property var _font: fontlist.get(selectedFontIndex) | ||||||
| @@ -30,8 +31,8 @@ QtObject { | |||||||
|     property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth |     property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth | ||||||
|     property bool lowResolutionFont: true |     property bool lowResolutionFont: true | ||||||
|  |  | ||||||
|     property ListModel fontlist: ListModel { |     property ListModel fontlist: ListModel{ | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "COMMODORE_PET" |             name: "COMMODORE_PET" | ||||||
|             text: "Commodore PET (1977)" |             text: "Commodore PET (1977)" | ||||||
|             source: "fonts/1977-commodore-pet/PetMe.ttf" |             source: "fonts/1977-commodore-pet/PetMe.ttf" | ||||||
| @@ -40,7 +41,7 @@ QtObject { | |||||||
|             baseScaling: 3.5 |             baseScaling: 3.5 | ||||||
|             fontWidth: 0.7 |             fontWidth: 0.7 | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "IBM_PC" |             name: "IBM_PC" | ||||||
|             text: "IBM PC (1981)" |             text: "IBM PC (1981)" | ||||||
|             source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf" |             source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf" | ||||||
| @@ -49,7 +50,7 @@ QtObject { | |||||||
|             baseScaling: 3.5 |             baseScaling: 3.5 | ||||||
|             fontWidth: 0.8 |             fontWidth: 0.8 | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "PROGGY_TINY" |             name: "PROGGY_TINY" | ||||||
|             text: "Proggy Tiny (Modern)" |             text: "Proggy Tiny (Modern)" | ||||||
|             source: "fonts/modern-proggy-tiny/ProggyTiny.ttf" |             source: "fonts/modern-proggy-tiny/ProggyTiny.ttf" | ||||||
| @@ -58,7 +59,7 @@ QtObject { | |||||||
|             baseScaling: 3.3 |             baseScaling: 3.3 | ||||||
|             fontWidth: 0.9 |             fontWidth: 0.9 | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "TERMINUS_SCALED" |             name: "TERMINUS_SCALED" | ||||||
|             text: "Terminus (Modern)" |             text: "Terminus (Modern)" | ||||||
|             source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf" |             source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf" | ||||||
| @@ -67,7 +68,7 @@ QtObject { | |||||||
|             baseScaling: 3.0 |             baseScaling: 3.0 | ||||||
|             fontWidth: 1.0 |             fontWidth: 1.0 | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "PRO_FONT_SCALED" |             name: "PRO_FONT_SCALED" | ||||||
|             text: "Pro Font (Modern)" |             text: "Pro Font (Modern)" | ||||||
|             source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf" |             source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf" | ||||||
| @@ -76,7 +77,7 @@ QtObject { | |||||||
|             baseScaling: 3.0 |             baseScaling: 3.0 | ||||||
|             fontWidth: 1.0 |             fontWidth: 1.0 | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "APPLE_II" |             name: "APPLE_II" | ||||||
|             text: "Apple ][ (1977)" |             text: "Apple ][ (1977)" | ||||||
|             source: "fonts/1977-apple2/PrintChar21.ttf" |             source: "fonts/1977-apple2/PrintChar21.ttf" | ||||||
| @@ -85,7 +86,7 @@ QtObject { | |||||||
|             baseScaling: 3.5 |             baseScaling: 3.5 | ||||||
|             fontWidth: 0.8 |             fontWidth: 0.8 | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "ATARI_400" |             name: "ATARI_400" | ||||||
|             text: "Atari 400-800 (1979)" |             text: "Atari 400-800 (1979)" | ||||||
|             source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf" |             source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf" | ||||||
| @@ -94,7 +95,7 @@ QtObject { | |||||||
|             baseScaling: 3.5 |             baseScaling: 3.5 | ||||||
|             fontWidth: 0.7 |             fontWidth: 0.7 | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "COMMODORE_64" |             name: "COMMODORE_64" | ||||||
|             text: "Commodore 64 (1982)" |             text: "Commodore 64 (1982)" | ||||||
|             source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf" |             source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf" | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,20 +17,27 @@ | |||||||
| * 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{ | ||||||
|     property int selectedFontIndex |     property int selectedFontIndex | ||||||
|     property real scaling |     property real scaling | ||||||
|     property var source: fontlist.get(selectedFontIndex).source |     property var source: fontlist.get(selectedFontIndex).source | ||||||
|     property var _font: fontlist.get(selectedFontIndex) |     property var _font: fontlist.get(selectedFontIndex) | ||||||
|     property bool lowResolutionFont: _font.lowResolutionFont |     property bool lowResolutionFont: _font.lowResolutionFont | ||||||
|  |  | ||||||
|     property int pixelSize: lowResolutionFont ? _font.pixelSize : _font.pixelSize * scaling |     property int pixelSize: lowResolutionFont | ||||||
|  |                                  ? _font.pixelSize | ||||||
|  |                                  : _font.pixelSize * scaling | ||||||
|  |  | ||||||
|     property int lineSpacing: lowResolutionFont ? _font.lineSpacing : pixelSize * _font.lineSpacing |     property int lineSpacing: lowResolutionFont | ||||||
|  |                                   ? _font.lineSpacing | ||||||
|  |                                   : pixelSize * _font.lineSpacing | ||||||
|  |  | ||||||
|     property real screenScaling: lowResolutionFont ? _font.baseScaling * scaling : 1.0 |     property real screenScaling: lowResolutionFont | ||||||
|  |                                      ? _font.baseScaling * scaling | ||||||
|  |                                      : 1.0 | ||||||
|  |  | ||||||
|     property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth |     property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth | ||||||
|  |  | ||||||
| @@ -45,8 +52,9 @@ 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" | ||||||
|             text: "Terminus (Modern)" |             text: "Terminus (Modern)" | ||||||
|             source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf" |             source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf" | ||||||
| @@ -58,7 +66,7 @@ QtObject { | |||||||
|             isSystemFont: false |             isSystemFont: false | ||||||
|             family: "" |             family: "" | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "PRO_FONT_SCALED" |             name: "PRO_FONT_SCALED" | ||||||
|             text: "Pro Font (Modern)" |             text: "Pro Font (Modern)" | ||||||
|             source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf" |             source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf" | ||||||
| @@ -70,7 +78,7 @@ QtObject { | |||||||
|             isSystemFont: false |             isSystemFont: false | ||||||
|             family: "" |             family: "" | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "EXCELSIOR_SCALED" |             name: "EXCELSIOR_SCALED" | ||||||
|             text: "Fixedsys Excelsior (Modern)" |             text: "Fixedsys Excelsior (Modern)" | ||||||
|             source: "fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf" |             source: "fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf" | ||||||
| @@ -82,7 +90,7 @@ QtObject { | |||||||
|             isSystemFont: false |             isSystemFont: false | ||||||
|             family: "" |             family: "" | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "COMMODORE_PET_SCALED" |             name: "COMMODORE_PET_SCALED" | ||||||
|             text: "Commodore PET (1977)" |             text: "Commodore PET (1977)" | ||||||
|             source: "fonts/1977-commodore-pet/PetMe.ttf" |             source: "fonts/1977-commodore-pet/PetMe.ttf" | ||||||
| @@ -94,7 +102,7 @@ QtObject { | |||||||
|             isSystemFont: false |             isSystemFont: false | ||||||
|             family: "" |             family: "" | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "PROGGY_TINY_SCALED" |             name: "PROGGY_TINY_SCALED" | ||||||
|             text: "Proggy Tiny (Modern)" |             text: "Proggy Tiny (Modern)" | ||||||
|             source: "fonts/modern-proggy-tiny/ProggyTiny.ttf" |             source: "fonts/modern-proggy-tiny/ProggyTiny.ttf" | ||||||
| @@ -106,7 +114,7 @@ QtObject { | |||||||
|             isSystemFont: false |             isSystemFont: false | ||||||
|             family: "" |             family: "" | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "APPLE_II_SCALED" |             name: "APPLE_II_SCALED" | ||||||
|             text: "Apple ][ (1977)" |             text: "Apple ][ (1977)" | ||||||
|             source: "fonts/1977-apple2/PrintChar21.ttf" |             source: "fonts/1977-apple2/PrintChar21.ttf" | ||||||
| @@ -118,7 +126,7 @@ QtObject { | |||||||
|             isSystemFont: false |             isSystemFont: false | ||||||
|             family: "" |             family: "" | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "ATARI_400_SCALED" |             name: "ATARI_400_SCALED" | ||||||
|             text: "Atari 400-800 (1979)" |             text: "Atari 400-800 (1979)" | ||||||
|             source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf" |             source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf" | ||||||
| @@ -130,7 +138,7 @@ QtObject { | |||||||
|             isSystemFont: false |             isSystemFont: false | ||||||
|             family: "" |             family: "" | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "IBM_PC_SCALED" |             name: "IBM_PC_SCALED" | ||||||
|             text: "IBM PC (1981)" |             text: "IBM PC (1981)" | ||||||
|             source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf" |             source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf" | ||||||
| @@ -142,7 +150,7 @@ QtObject { | |||||||
|             isSystemFont: false |             isSystemFont: false | ||||||
|             family: "" |             family: "" | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "COMMODORE_64_SCALED" |             name: "COMMODORE_64_SCALED" | ||||||
|             text: "Commodore 64 (1982)" |             text: "Commodore 64 (1982)" | ||||||
|             source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf" |             source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf" | ||||||
| @@ -154,7 +162,7 @@ QtObject { | |||||||
|             isSystemFont: false |             isSystemFont: false | ||||||
|             family: "" |             family: "" | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "IBM_DOS" |             name: "IBM_DOS" | ||||||
|             text: "IBM DOS (1985)" |             text: "IBM DOS (1985)" | ||||||
|             source: "fonts/1985-ibm-pc-vga/PxPlus_IBM_VGA8.ttf" |             source: "fonts/1985-ibm-pc-vga/PxPlus_IBM_VGA8.ttf" | ||||||
| @@ -166,7 +174,7 @@ QtObject { | |||||||
|             isSystemFont: false |             isSystemFont: false | ||||||
|             family: "" |             family: "" | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "HERMIT" |             name: "HERMIT" | ||||||
|             text: "HD: Hermit (Modern)" |             text: "HD: Hermit (Modern)" | ||||||
|             source: "fonts/modern-hermit/Hermit-medium.otf" |             source: "fonts/modern-hermit/Hermit-medium.otf" | ||||||
| @@ -177,7 +185,7 @@ QtObject { | |||||||
|             isSystemFont: false |             isSystemFont: false | ||||||
|             family: "" |             family: "" | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "TERMINUS" |             name: "TERMINUS" | ||||||
|             text: "HD: Terminus (Modern)" |             text: "HD: Terminus (Modern)" | ||||||
|             source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf" |             source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf" | ||||||
| @@ -188,7 +196,7 @@ QtObject { | |||||||
|             isSystemFont: false |             isSystemFont: false | ||||||
|             family: "" |             family: "" | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "PRO_FONT" |             name: "PRO_FONT" | ||||||
|             text: "HD: Pro Font (Modern)" |             text: "HD: Pro Font (Modern)" | ||||||
|             source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf" |             source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf" | ||||||
| @@ -199,7 +207,7 @@ QtObject { | |||||||
|             isSystemFont: false |             isSystemFont: false | ||||||
|             family: "" |             family: "" | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "INCONSOLATA" |             name: "INCONSOLATA" | ||||||
|             text: "HD: Inconsolata (Modern)" |             text: "HD: Inconsolata (Modern)" | ||||||
|             source: "fonts/modern-inconsolata/Inconsolata.otf" |             source: "fonts/modern-inconsolata/Inconsolata.otf" | ||||||
| @@ -210,10 +218,10 @@ QtObject { | |||||||
|             isSystemFont: false |             isSystemFont: false | ||||||
|             family: "" |             family: "" | ||||||
|         } |         } | ||||||
|         ListElement { |         ListElement{ | ||||||
|             name: "IBM_3278" |             name: "IBM_3278" | ||||||
|             text: "HD: IBM 3278 (1971)" |             text: "HD: IBM 3278 (1971)" | ||||||
|             source: "fonts/1971-ibm-3278/3270-Regular.ttf" |             source: "fonts/1971-ibm-3278/3270Medium.ttf" | ||||||
|             lineSpacing: 0.2 |             lineSpacing: 0.2 | ||||||
|             pixelSize: 32 |             pixelSize: 32 | ||||||
|             fontWidth: 1.0 |             fontWidth: 1.0 | ||||||
| @@ -226,7 +234,7 @@ QtObject { | |||||||
|     Component.onCompleted: addSystemFonts() |     Component.onCompleted: addSystemFonts() | ||||||
|  |  | ||||||
|     function addSystemFonts() { |     function addSystemFonts() { | ||||||
|         var families = monospaceSystemFonts |         var families = monospaceSystemFonts; | ||||||
|         for (var i = 0; i < families.length; i++) { |         for (var i = 0; i < families.length; i++) { | ||||||
|             if (verbose) { |             if (verbose) { | ||||||
|                 console.log("Adding system font: ", families[i]) |                 console.log("Adding system font: ", families[i]) | ||||||
| @@ -237,16 +245,16 @@ QtObject { | |||||||
|  |  | ||||||
|     function convertToListElement(family) { |     function convertToListElement(family) { | ||||||
|         return { |         return { | ||||||
|             "name": "System: " + family, |             name: "System: " + family, | ||||||
|             "text": qsTr("System: ") + family, |             text: qsTr("System: ") + family, | ||||||
|             "source": "", |             source: "", | ||||||
|             "lineSpacing": 0.1, |             lineSpacing: 0.1, | ||||||
|             "pixelSize": 30, |             pixelSize: 30, | ||||||
|             "fontWidth": 1.0, |             fontWidth: 1.0, | ||||||
|             "baseScaling": 1.0, |             baseScaling: 1.0, | ||||||
|             "lowResolutionFont": false, |             lowResolutionFont: false, | ||||||
|             "isSystemFont": true, |             isSystemFont: true, | ||||||
|             "family": family |             family: family | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										21
									
								
								app/qml/Glossy.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								app/qml/Glossy.qml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | import QtQuick 2.2 | ||||||
|  |  | ||||||
|  | Rectangle { | ||||||
|  |     anchors.centerIn: parent | ||||||
|  |     width: parent.width - parent.border.width | ||||||
|  |     height: parent.height - parent.border.width | ||||||
|  |     radius:parent.radius - parent.border.width/2 | ||||||
|  |     smooth: true | ||||||
|  |  | ||||||
|  |     border.width: parent.border.width/2 | ||||||
|  |     border.color: "#22FFFFFF" | ||||||
|  |  | ||||||
|  |     gradient: Gradient { | ||||||
|  |         GradientStop { position: 0;    color: "#88FFFFFF" } | ||||||
|  |         GradientStop { position: .1;   color: "#55FFFFFF" } | ||||||
|  |         GradientStop { position: .5;   color: "#33FFFFFF" } | ||||||
|  |         GradientStop { position: .501; color: "#11000000" } | ||||||
|  |         GradientStop { position: .8;   color: "#11FFFFFF" } | ||||||
|  |         GradientStop { position: 1;    color: "#55FFFFFF" } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,13 +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.Window 2.0 | import QtQuick.Window 2.0 | ||||||
| import QtQuick.Controls 2.0 | import QtQuick.Controls 1.1 | ||||||
| import QtQuick.Layouts 1.1 | import QtQuick.Layouts 1.1 | ||||||
| import QtQuick.Dialogs 1.1 | import QtQuick.Dialogs 1.1 | ||||||
|  |  | ||||||
| Window { | Window{ | ||||||
|     id: insertnamedialog |     id: insertnamedialog | ||||||
|     width: 400 |     width: 400 | ||||||
|     height: 100 |     height: 100 | ||||||
| @@ -38,53 +39,50 @@ Window { | |||||||
|         title: qsTr("Error") |         title: qsTr("Error") | ||||||
|         visible: false |         visible: false | ||||||
|  |  | ||||||
|         function showError(message) { |         function showError(message){ | ||||||
|             text = message |             text = message; | ||||||
|             open() |             open(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function validateName(name) { |     function validateName(name){ | ||||||
|         var profile_list = appSettings.profilesList |         var profile_list = appSettings.profilesList; | ||||||
|         if (name === "") |         if (name === "") | ||||||
|             return 1 |             return 1; | ||||||
|         return 0 |         return 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     ColumnLayout { |     ColumnLayout{ | ||||||
|         anchors.margins: 10 |         anchors.margins: 10 | ||||||
|         anchors.fill: parent |         anchors.fill: parent | ||||||
|         RowLayout { |         RowLayout{ | ||||||
|             Label { |             Label{text: qsTr("Name")} | ||||||
|                 text: qsTr("Name") |             TextField{ | ||||||
|             } |  | ||||||
|             TextField { |  | ||||||
|                 id: namefield |                 id: namefield | ||||||
|                 Layout.fillWidth: true |                 Layout.fillWidth: true | ||||||
|                 Component.onCompleted: forceActiveFocus() |                 Component.onCompleted: forceActiveFocus() | ||||||
|                 onAccepted: okbutton.clickAction() |                 onAccepted: okbutton.clickAction() | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         RowLayout { |         RowLayout{ | ||||||
|             Layout.alignment: Qt.AlignBottom | Qt.AlignRight |             Layout.alignment: Qt.AlignBottom | Qt.AlignRight | ||||||
|             Button { |             Button{ | ||||||
|                 id: okbutton |                 id: okbutton | ||||||
|                 text: qsTr("OK") |                 text: qsTr("OK") | ||||||
|                 onClicked: clickAction() |                 onClicked: clickAction() | ||||||
|                 function clickAction() { |                 function clickAction(){ | ||||||
|                     var name = namefield.text |                     var name = namefield.text; | ||||||
|                     switch (validateName(name)) { |                     switch(validateName(name)){ | ||||||
|                     case 1: |                     case 1: | ||||||
|                         errorDialog.showError( |                         errorDialog.showError(qsTr("The name you inserted is empty. Please choose a different one.")); | ||||||
|                                     qsTr("The name you inserted is empty. Please choose a different one.")) |                         break; | ||||||
|                         break |  | ||||||
|                     default: |                     default: | ||||||
|                         nameSelected(name) |                         nameSelected(name); | ||||||
|                         close() |                         close(); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             Button { |             Button{ | ||||||
|                 text: qsTr("Cancel") |                 text: qsTr("Cancel") | ||||||
|                 onClicked: close() |                 onClicked: close() | ||||||
|             } |             } | ||||||
|   | |||||||
							
								
								
									
										78
									
								
								app/qml/NewTerminalFrame.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								app/qml/NewTerminalFrame.qml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | |||||||
|  | import QtQuick 2.0 | ||||||
|  |  | ||||||
|  | import "utils.js" as Utils | ||||||
|  |  | ||||||
|  | ShaderEffect { | ||||||
|  |     property color _staticFrameColor: "#ffffff" | ||||||
|  |     property color _backgroundColor: appSettings.backgroundColor | ||||||
|  |     property color _fontColor: appSettings.fontColor | ||||||
|  |     property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2) | ||||||
|  |     property real _ambientLight: Utils.lint(0.2, 0.8, appSettings.ambientLight) | ||||||
|  |  | ||||||
|  |     property color frameColor: Utils.mix(_staticFrameColor, _lightColor, _ambientLight) | ||||||
|  |     property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize | ||||||
|  |     property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight) | ||||||
|  |  | ||||||
|  |     property size aadelta: Qt.size(1.0 / width, 1.0 / height) | ||||||
|  |  | ||||||
|  |     fragmentShader: " | ||||||
|  |         #ifdef GL_ES | ||||||
|  |             precision mediump float; | ||||||
|  |         #endif | ||||||
|  |  | ||||||
|  |         uniform lowp float screenCurvature; | ||||||
|  |         uniform lowp float shadowLength; | ||||||
|  |         uniform highp float qt_Opacity; | ||||||
|  |         uniform lowp vec4 frameColor; | ||||||
|  |         uniform mediump vec2 aadelta; | ||||||
|  |  | ||||||
|  |         varying highp vec2 qt_TexCoord0; | ||||||
|  |  | ||||||
|  |         vec2 distortCoordinates(vec2 coords){ | ||||||
|  |             vec2 cc = (coords - vec2(0.5)); | ||||||
|  |             float dist = dot(cc, cc) * screenCurvature; | ||||||
|  |             return (coords + cc * (1.0 + dist) * dist); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         float max2(vec2 v) { | ||||||
|  |             return max(v.x, v.y); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         float min2(vec2 v) { | ||||||
|  |             return min(v.x, v.y); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         float prod2(vec2 v) { | ||||||
|  |             return v.x * v.y; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         float sum2(vec2 v) { | ||||||
|  |             return v.x + v.y; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         void main(){ | ||||||
|  |             vec2 staticCoords = qt_TexCoord0; | ||||||
|  |             vec2 coords = distortCoordinates(staticCoords); | ||||||
|  |  | ||||||
|  |             vec3 color = vec3(0.0); | ||||||
|  |             float alpha = 0.0; | ||||||
|  |  | ||||||
|  |             float outShadowLength = shadowLength; | ||||||
|  |             float inShadowLength = shadowLength * 0.5; | ||||||
|  |  | ||||||
|  |             float outShadow = max2(1.0 - smoothstep(vec2(-outShadowLength), vec2(0.0), coords) + smoothstep(vec2(1.0), vec2(1.0 + outShadowLength), coords)); | ||||||
|  |             outShadow = clamp(sqrt(outShadow), 0.0, 1.0); | ||||||
|  |             color += frameColor.rgb * outShadow; | ||||||
|  |             alpha = sum2(1.0 - smoothstep(vec2(0.0), aadelta, coords) + smoothstep(vec2(1.0) - aadelta, vec2(1.0), coords)); | ||||||
|  |             alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, outShadow); | ||||||
|  |  | ||||||
|  |             float inShadow = 1.0 - prod2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords)); | ||||||
|  |             inShadow = 0.5 * inShadow * inShadow; | ||||||
|  |             alpha = max(alpha, inShadow); | ||||||
|  |  | ||||||
|  |             gl_FragColor = vec4(color * alpha, alpha); | ||||||
|  |         } | ||||||
|  |     " | ||||||
|  |  | ||||||
|  |     onStatusChanged: if (log) console.log(log) //Print warning messages | ||||||
|  | } | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -19,11 +19,10 @@ | |||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.0 | import QtQuick.Controls 1.1 | ||||||
|  |  | ||||||
| import QMLTermWidget 1.0 | import QMLTermWidget 1.0 | ||||||
|  |  | ||||||
| import "menus" |  | ||||||
| import "utils.js" as Utils | import "utils.js" as Utils | ||||||
|  |  | ||||||
| Item{ | Item{ | ||||||
| @@ -34,6 +33,7 @@ Item{ | |||||||
|  |  | ||||||
|     property ShaderEffectSource mainSource: kterminalSource |     property ShaderEffectSource mainSource: kterminalSource | ||||||
|     property BurnInEffect burnInEffect: burnInEffect |     property BurnInEffect burnInEffect: burnInEffect | ||||||
|  |     property SlowBurnIn slowBurnInEffect: slowBurnInEffect | ||||||
|     property real fontWidth: 1.0 |     property real fontWidth: 1.0 | ||||||
|     property real screenScaling: 1.0 |     property real screenScaling: 1.0 | ||||||
|     property real scaleTexture: 1.0 |     property real scaleTexture: 1.0 | ||||||
| @@ -44,61 +44,35 @@ Item{ | |||||||
|     property size fontMetrics: kterminal.fontMetrics |     property size fontMetrics: kterminal.fontMetrics | ||||||
|  |  | ||||||
|     // Manage copy and paste |     // Manage copy and paste | ||||||
|     Connections { |     Connections{ | ||||||
|         target: copyAction |         target: copyAction | ||||||
|  |         onTriggered: kterminal.copyClipboard(); | ||||||
|         onTriggered: { |  | ||||||
|             kterminal.copyClipboard() |  | ||||||
|     } |     } | ||||||
|     } |     Connections{ | ||||||
|     Connections { |  | ||||||
|         target: pasteAction |         target: pasteAction | ||||||
|  |         onTriggered: kterminal.pasteClipboard() | ||||||
|         onTriggered: { |  | ||||||
|             kterminal.pasteClipboard() |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     //When settings are updated sources need to be redrawn. |     //When settings are updated sources need to be redrawn. | ||||||
|     Connections { |     Connections{ | ||||||
|         target: appSettings |         target: appSettings | ||||||
|  |         onFontScalingChanged: terminalContainer.updateSources(); | ||||||
|         onFontScalingChanged: { |         onFontWidthChanged: terminalContainer.updateSources(); | ||||||
|             terminalContainer.updateSources() |  | ||||||
|     } |     } | ||||||
|  |     Connections{ | ||||||
|         onFontWidthChanged: { |  | ||||||
|             terminalContainer.updateSources() |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     Connections { |  | ||||||
|         target: terminalContainer |         target: terminalContainer | ||||||
|  |         onWidthChanged: terminalContainer.updateSources(); | ||||||
|         onWidthChanged: { |         onHeightChanged: terminalContainer.updateSources(); | ||||||
|             terminalContainer.updateSources() |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|         onHeightChanged: { |  | ||||||
|             terminalContainer.updateSources() |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     Connections { |  | ||||||
|         target: terminalWindow |  | ||||||
|  |  | ||||||
|         onActiveChanged: { |  | ||||||
|             kterminal.forceActiveFocus() |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function updateSources() { |     function updateSources() { | ||||||
|         kterminal.update() |         kterminal.update(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     QMLTermWidget { |     QMLTermWidget { | ||||||
|         id: kterminal |         id: kterminal | ||||||
|  |  | ||||||
|         property int textureResolutionScale: appSettings.lowResolutionFont ? devicePixelRatio : 1 |         property int textureResolutionScale: appSettings.lowResolutionFont ? devicePixelRatio : 1 | ||||||
|         property int margin: appSettings.totalMargin / screenScaling |         property int margin: appSettings.margin / 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) | ||||||
|  |  | ||||||
| @@ -120,7 +94,6 @@ Item{ | |||||||
|         smooth: !appSettings.lowResolutionFont |         smooth: !appSettings.lowResolutionFont | ||||||
|         enableBold: false |         enableBold: false | ||||||
|         fullCursorHeight: true |         fullCursorHeight: true | ||||||
|         blinkingCursor: appSettings.blinkingCursor |  | ||||||
|  |  | ||||||
|         session: QMLTermSession { |         session: QMLTermSession { | ||||||
|             id: ksession |             id: ksession | ||||||
| @@ -168,7 +141,7 @@ Item{ | |||||||
|                 var args = Utils.tokenizeCommandLine(appSettings.customCommand); |                 var args = Utils.tokenizeCommandLine(appSettings.customCommand); | ||||||
|                 ksession.setShellProgram(args[0]); |                 ksession.setShellProgram(args[0]); | ||||||
|                 ksession.setArgs(args.slice(1)); |                 ksession.setArgs(args.slice(1)); | ||||||
|             } else if (!defaultCmd && appSettings.isMacOS) { |             } else if (!defaultCmd && Qt.platform.os === "osx") { | ||||||
|                 // OSX Requires the following default parameters for auto login. |                 // OSX Requires the following default parameters for auto login. | ||||||
|                 ksession.setArgs(["-i", "-l"]); |                 ksession.setArgs(["-i", "-l"]); | ||||||
|             } |             } | ||||||
| @@ -182,28 +155,36 @@ Item{ | |||||||
|         Component.onCompleted: { |         Component.onCompleted: { | ||||||
|             appSettings.terminalFontChanged.connect(handleFontChanged); |             appSettings.terminalFontChanged.connect(handleFontChanged); | ||||||
|             appSettings.initializedSettings.connect(startSession); |             appSettings.initializedSettings.connect(startSession); | ||||||
|             appSettings.handleFontChanged() |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     Component { |     Component { | ||||||
|         id: shortContextMenu |         id: linuxContextMenu | ||||||
|         ShortContextMenu { } |         Menu{ | ||||||
|  |             id: contextmenu | ||||||
|  |             MenuItem { action: copyAction } | ||||||
|  |             MenuItem { action: pasteAction } | ||||||
|  |             MenuSeparator { visible: !appSettings.showMenubar } | ||||||
|  |             MenuItem { action: showsettingsAction ; visible: !appSettings.showMenubar} | ||||||
|  |             MenuSeparator { visible: !appSettings.showMenubar } | ||||||
|  |             CRTMainMenuBar { visible: !appSettings.showMenubar } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     Component { |     Component { | ||||||
|         id: fullContextMenu |         id: osxContextMenu | ||||||
|         FullContextMenu { } |         Menu{ | ||||||
|  |             id: contextmenu | ||||||
|  |             MenuItem{action: copyAction} | ||||||
|  |             MenuItem{action: pasteAction} | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     Loader { |     Loader { | ||||||
|         id: menuLoader |         id: menuLoader | ||||||
|         sourceComponent: (appSettings.isMacOS || appSettings.showMenubar ? shortContextMenu : fullContextMenu) |         sourceComponent: (Qt.platform.os === "osx" ? osxContextMenu : linuxContextMenu) | ||||||
|     } |     } | ||||||
|     property alias contextmenu: menuLoader.item |     property alias contextmenu: menuLoader.item | ||||||
|  |  | ||||||
|     MouseArea { |     MouseArea{ | ||||||
|         property real margin: appSettings.totalMargin |         property real margin: appSettings.margin | ||||||
|  |  | ||||||
|         acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton |         acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton | ||||||
|         anchors.fill: parent |         anchors.fill: parent | ||||||
| @@ -244,8 +225,8 @@ Item{ | |||||||
|             var cc = Qt.size(0.5 - x, 0.5 - y); |             var cc = Qt.size(0.5 - x, 0.5 - y); | ||||||
|             var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize; |             var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize; | ||||||
|  |  | ||||||
|             return Qt.point((x - cc.width  * (1+distortion) * distortion) * (kterminal.totalWidth), |             return Qt.point((x - cc.width  * (1+distortion) * distortion) * kterminal.totalWidth, | ||||||
|                            (y - cc.height * (1+distortion) * distortion) * (kterminal.totalHeight)) |                            (y - cc.height * (1+distortion) * distortion) * kterminal.totalHeight) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     ShaderEffectSource{ |     ShaderEffectSource{ | ||||||
| @@ -275,5 +256,9 @@ Item{ | |||||||
|         BurnInEffect { |         BurnInEffect { | ||||||
|             id: burnInEffect |             id: burnInEffect | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         SlowBurnIn { | ||||||
|  |             id: slowBurnInEffect | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,33 +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 2.0 | import QtQuick.Controls 1.1 | ||||||
| import QtQuick.Layouts 1.1 | import QtQuick.Layouts 1.1 | ||||||
| import QtQml 2.0 |  | ||||||
|  |  | ||||||
| import "Components" | import "Components" | ||||||
|  |  | ||||||
| ColumnLayout { | Tab{ | ||||||
|     GroupBox { |     ColumnLayout{ | ||||||
|  |         anchors.fill: parent | ||||||
|  |  | ||||||
|  |         GroupBox{ | ||||||
|             Layout.fillWidth: true |             Layout.fillWidth: true | ||||||
|             title: qsTr("Command") |             title: qsTr("Command") | ||||||
|  |  | ||||||
|             ColumnLayout { |             ColumnLayout { | ||||||
|                 anchors.fill: parent |                 anchors.fill: parent | ||||||
|             CheckBox { |                 CheckBox{ | ||||||
|                     id: useCustomCommand |                     id: useCustomCommand | ||||||
|                     text: qsTr("Use custom command instead of shell at startup") |                     text: qsTr("Use custom command instead of shell at startup") | ||||||
|                     checked: appSettings.useCustomCommand |                     checked: appSettings.useCustomCommand | ||||||
|                     onCheckedChanged: appSettings.useCustomCommand = checked |                     onCheckedChanged: appSettings.useCustomCommand = checked | ||||||
|                 } |                 } | ||||||
|                 // Workaround for QTBUG-31627 for pre 5.3.0 |                 // Workaround for QTBUG-31627 for pre 5.3.0 | ||||||
|             Binding { |                 Binding{ | ||||||
|                     target: useCustomCommand |                     target: useCustomCommand | ||||||
|                     property: "checked" |                     property: "checked" | ||||||
|                     value: appSettings.useCustomCommand |                     value: appSettings.useCustomCommand | ||||||
|                 } |                 } | ||||||
|             TextField { |                 TextField{ | ||||||
|                     id: customCommand |                     id: customCommand | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                     text: appSettings.customCommand |                     text: appSettings.customCommand | ||||||
| @@ -52,107 +54,91 @@ ColumnLayout { | |||||||
|  |  | ||||||
|                     // Save text even if user forgets to press enter or unfocus |                     // Save text even if user forgets to press enter or unfocus | ||||||
|                     function saveSetting() { |                     function saveSetting() { | ||||||
|                     appSettings.customCommand = text |                         appSettings.customCommand = text; | ||||||
|                     } |                     } | ||||||
|                 Component.onCompleted: settings_window.closing.connect( |                     Component.onCompleted: settings_window.closing.connect(saveSetting) | ||||||
|                                            saveSetting) |  | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     GroupBox { |         GroupBox{ | ||||||
|             title: qsTr("Performance") |             title: qsTr("Performance") | ||||||
|             Layout.fillWidth: true |             Layout.fillWidth: true | ||||||
|         GridLayout { |             GridLayout{ | ||||||
|                 anchors.fill: parent |                 anchors.fill: parent | ||||||
|             columns: 4 |                 rows: 2 | ||||||
|  |                 columns: 3 | ||||||
|  |  | ||||||
|             Label { |                 Label{text: qsTr("Effects FPS")} | ||||||
|                 text: qsTr("Effects FPS") |                 Slider{ | ||||||
|             } |  | ||||||
|             Slider { |  | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                 Layout.columnSpan: 2 |  | ||||||
|                     id: fpsSlider |                     id: fpsSlider | ||||||
|                     onValueChanged: { |                     onValueChanged: { | ||||||
|                         if (enabled) { |                         if (enabled) { | ||||||
|                         appSettings.fps = value !== 60 ? value + 1 : 0 |                             appSettings.fps = value !== 60 ? value + 1 : 0; | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     stepSize: 1 |                     stepSize: 1 | ||||||
|                     enabled: false |                     enabled: false | ||||||
|                     Component.onCompleted: { |                     Component.onCompleted: { | ||||||
|                     from = 0 |                         minimumValue = 0; | ||||||
|                     to = 60 |                         maximumValue = 60; | ||||||
|                     value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60 |                         value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60; | ||||||
|                     enabled = true |                         enabled = true; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|             SizedLabel { |                 SizedLabel{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")} | ||||||
|                 text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max") |                 Label{text: qsTr("Texture Quality")} | ||||||
|             } |                 Slider{ | ||||||
|             Label { |                     Layout.fillWidth: true | ||||||
|                 text: qsTr("Texture Quality") |  | ||||||
|             } |  | ||||||
|             Slider { |  | ||||||
|                     id: txtslider |                     id: txtslider | ||||||
|                 Layout.fillWidth: true |                     onValueChanged: if (enabled) appSettings.windowScaling = value; | ||||||
|                 Layout.columnSpan: 2 |  | ||||||
|                 onValueChanged: if (enabled) |  | ||||||
|                                     appSettings.windowScaling = value |  | ||||||
|                     stepSize: 0.05 |                     stepSize: 0.05 | ||||||
|                     enabled: false |                     enabled: false | ||||||
|                     Component.onCompleted: { |                     Component.onCompleted: { | ||||||
|                     from = 0.25 //Without this value gets set to 0.5 |                         minimumValue = 0.25 //Without this value gets set to 0.5 | ||||||
|                     value = appSettings.windowScaling |                         value = appSettings.windowScaling; | ||||||
|                     enabled = true |                         enabled = true; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             SizedLabel { |                 SizedLabel{text: Math.round(txtslider.value * 100) + "%"} | ||||||
|                 text: Math.round(txtslider.value * 100) + "%" |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             Label { |                 Label{text: qsTr("Bloom Quality")} | ||||||
|                 text: qsTr("Bloom Quality") |                 Slider{ | ||||||
|             } |  | ||||||
|             Slider { |  | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                 Layout.columnSpan: 2 |  | ||||||
|                     id: bloomSlider |                     id: bloomSlider | ||||||
|                 onValueChanged: if (enabled) |                     onValueChanged: if (enabled) appSettings.bloomQuality = value; | ||||||
|                                     appSettings.bloomQuality = value |  | ||||||
|                     stepSize: 0.05 |                     stepSize: 0.05 | ||||||
|                     enabled: false |                     enabled: false | ||||||
|                     Component.onCompleted: { |                     Component.onCompleted: { | ||||||
|                     from = 0.25 |                         minimumValue = 0.25 | ||||||
|                     value = appSettings.bloomQuality |                         value = appSettings.bloomQuality; | ||||||
|                     enabled = true |                         enabled = true; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             SizedLabel { |                 SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"} | ||||||
|                 text: Math.round(bloomSlider.value * 100) + "%" |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             Label { |                 Label{text: qsTr("BurnIn Quality")} | ||||||
|                 text: qsTr("BurnIn Quality") |                 Slider{ | ||||||
|             } |  | ||||||
|             Slider { |  | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                     id: burnInSlider |                     id: burnInSlider | ||||||
|                 Layout.columnSpan: 2 |                     onValueChanged: if (enabled) appSettings.burnInQuality = value; | ||||||
|                 onValueChanged: if (enabled) |  | ||||||
|                                     appSettings.burnInQuality = value |  | ||||||
|                     stepSize: 0.05 |                     stepSize: 0.05 | ||||||
|                     enabled: false |                     enabled: false | ||||||
|                     Component.onCompleted: { |                     Component.onCompleted: { | ||||||
|                     from = 0.25 |                         minimumValue = 0.25 | ||||||
|                     value = appSettings.burnInQuality |                         value = appSettings.burnInQuality; | ||||||
|                     enabled = true |                         enabled = true; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             SizedLabel { |                 SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"} | ||||||
|                 text: Math.round(burnInSlider.value * 100) + "%" |                 CheckBox{ | ||||||
|  |                     Layout.columnSpan: 2 | ||||||
|  |                     text: qsTr("Burnin optimization (Might display timing artifacts)") | ||||||
|  |                     checked: appSettings.useFastBurnIn | ||||||
|  |                     onCheckedChanged: appSettings.useFastBurnIn = checked | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,70 +17,74 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.0 | import QtQuick.Controls 1.1 | ||||||
| import QtQuick.Layouts 1.1 | import QtQuick.Layouts 1.1 | ||||||
|  |  | ||||||
| ColumnLayout { | Tab{ | ||||||
|  |     ColumnLayout{ | ||||||
|  |         anchors.fill: parent | ||||||
|         spacing: 2 |         spacing: 2 | ||||||
|  |  | ||||||
|     GroupBox { |         GroupBox{ | ||||||
|             title: qsTr("Effects") |             title: qsTr("Effects") | ||||||
|             Layout.fillWidth: true |             Layout.fillWidth: true | ||||||
|  |  | ||||||
|             ColumnLayout { |             ColumnLayout { | ||||||
|                 anchors.fill: parent |                 anchors.fill: parent | ||||||
|  |  | ||||||
|             CheckableSlider { |                 CheckableSlider{ | ||||||
|                     name: qsTr("Bloom") |                     name: qsTr("Bloom") | ||||||
|                     onNewValue: appSettings.bloom = newValue |                     onNewValue: appSettings.bloom = newValue | ||||||
|                     value: appSettings.bloom |                     value: appSettings.bloom | ||||||
|                 } |                 } | ||||||
|             CheckableSlider { |                 CheckableSlider{ | ||||||
|                     name: qsTr("BurnIn") |                     name: qsTr("BurnIn") | ||||||
|                     onNewValue: appSettings.burnIn = newValue |                     onNewValue: appSettings.burnIn = newValue | ||||||
|                     value: appSettings.burnIn |                     value: appSettings.burnIn | ||||||
|                 } |                 } | ||||||
|             CheckableSlider { |                 CheckableSlider{ | ||||||
|                     name: qsTr("Static Noise") |                     name: qsTr("Static Noise") | ||||||
|                     onNewValue: appSettings.staticNoise = newValue |                     onNewValue: appSettings.staticNoise = newValue | ||||||
|                     value: appSettings.staticNoise |                     value: appSettings.staticNoise | ||||||
|                 } |                 } | ||||||
|             CheckableSlider { |                 CheckableSlider{ | ||||||
|                     name: qsTr("Jitter") |                     name: qsTr("Jitter") | ||||||
|                     onNewValue: appSettings.jitter = newValue |                     onNewValue: appSettings.jitter = newValue | ||||||
|                     value: appSettings.jitter |                     value: appSettings.jitter | ||||||
|                 } |                 } | ||||||
|             CheckableSlider { |                 CheckableSlider{ | ||||||
|                     name: qsTr("Glow Line") |                     name: qsTr("Glow Line") | ||||||
|                 onNewValue: appSettings.glowingLine = newValue |                     onNewValue: appSettings.glowingLine = newValue; | ||||||
|                     value: appSettings.glowingLine |                     value: appSettings.glowingLine | ||||||
|                 } |                 } | ||||||
|             CheckableSlider { |                 CheckableSlider{ | ||||||
|                     name: qsTr("Screen Curvature") |                     name: qsTr("Screen Curvature") | ||||||
|                 onNewValue: appSettings.screenCurvature = newValue |                     onNewValue: appSettings.screenCurvature = newValue; | ||||||
|                 value: appSettings.screenCurvature |                     value: appSettings.screenCurvature; | ||||||
|                 } |                 } | ||||||
|             CheckableSlider { |                 CheckableSlider{ | ||||||
|                     name: qsTr("Ambient Light") |                     name: qsTr("Ambient Light") | ||||||
|                 onNewValue: appSettings.ambientLight = newValue |                     onNewValue: appSettings.ambientLight = newValue; | ||||||
|                     value: appSettings.ambientLight |                     value: appSettings.ambientLight | ||||||
|                     enabled: appSettings.framesIndex !== 0 |                     enabled: appSettings.framesIndex !== 0 | ||||||
|                 } |                 } | ||||||
|             CheckableSlider { |                 CheckableSlider{ | ||||||
|                     name: qsTr("Flickering") |                     name: qsTr("Flickering") | ||||||
|                 onNewValue: appSettings.flickering = newValue |                     onNewValue: appSettings.flickering = newValue; | ||||||
|                 value: appSettings.flickering |                     value: appSettings.flickering; | ||||||
|                 } |                 } | ||||||
|             CheckableSlider { |                 CheckableSlider{ | ||||||
|                     name: qsTr("Horizontal Sync") |                     name: qsTr("Horizontal Sync") | ||||||
|                 onNewValue: appSettings.horizontalSync = newValue |                     onNewValue: appSettings.horizontalSync = newValue; | ||||||
|                 value: appSettings.horizontalSync |                     value: appSettings.horizontalSync; | ||||||
|                 } |                 } | ||||||
|             CheckableSlider { |                 CheckableSlider{ | ||||||
|                     name: qsTr("RGB Shift") |                     name: qsTr("RGB Shift") | ||||||
|                 onNewValue: appSettings.rbgShift = newValue |                     onNewValue: appSettings.rbgShift = newValue; | ||||||
|                 value: appSettings.rbgShift |                     value: appSettings.rbgShift; | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,162 +17,145 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.4 | import QtQuick.Controls 1.1 | ||||||
| import QtQuick.Layouts 1.1 | import QtQuick.Layouts 1.1 | ||||||
| import QtQuick.Dialogs 1.1 | import QtQuick.Dialogs 1.1 | ||||||
|  |  | ||||||
| ColumnLayout { | Tab{ | ||||||
|     GroupBox { |     ColumnLayout{ | ||||||
|  |         anchors.fill: parent | ||||||
|  |         GroupBox{ | ||||||
|             Layout.fillWidth: true |             Layout.fillWidth: true | ||||||
|  |             Layout.fillHeight: true | ||||||
|             title: qsTr("Profile") |             title: qsTr("Profile") | ||||||
|             RowLayout { |             RowLayout { | ||||||
|                 anchors.fill: parent |                 anchors.fill: parent | ||||||
|             ListView { |                 TableView { | ||||||
|                     id: profilesView |                     id: profilesView | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                     Layout.fillHeight: true |                     Layout.fillHeight: true | ||||||
|                     model: appSettings.profilesList |                     model: appSettings.profilesList | ||||||
|                 clip: true |                     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 { | ||||||
|                     Layout.fillHeight: true |                     Layout.fillHeight: true | ||||||
|                     Layout.fillWidth: false |                     Layout.fillWidth: false | ||||||
|                 Button { |                     Button{ | ||||||
|                         Layout.fillWidth: true |                         Layout.fillWidth: true | ||||||
|                         text: qsTr("Save") |                         text: qsTr("Save") | ||||||
|                         onClicked: { |                         onClicked: { | ||||||
|                         insertname.profileName = "" |                             insertname.profileName = ""; | ||||||
|                             insertname.show() |                             insertname.show() | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 Button { |                     Button{ | ||||||
|                         Layout.fillWidth: true |                         Layout.fillWidth: true | ||||||
|                     property alias currentIndex: profilesView.currentIndex |                         property alias currentIndex: profilesView.currentRow | ||||||
|                         enabled: currentIndex >= 0 |                         enabled: currentIndex >= 0 | ||||||
|                         text: qsTr("Load") |                         text: qsTr("Load") | ||||||
|                         onClicked: { |                         onClicked: { | ||||||
|                         var index = currentIndex |                             var index = profilesView.currentRow; | ||||||
|                             if (index >= 0) |                             if (index >= 0) | ||||||
|                             appSettings.loadProfile(index) |                                 appSettings.loadProfile(index); | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 Button { |                     Button{ | ||||||
|                         Layout.fillWidth: true |                         Layout.fillWidth: true | ||||||
|                         text: qsTr("Remove") |                         text: qsTr("Remove") | ||||||
|                     property alias currentIndex: profilesView.currentIndex |                         property alias currentIndex: profilesView.currentRow | ||||||
|  |  | ||||||
|                     enabled: currentIndex >= 0 && !appSettings.profilesList.get( |                         enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin | ||||||
|                                  currentIndex).builtin |  | ||||||
|                         onClicked: { |                         onClicked: { | ||||||
|                         appSettings.profilesList.remove(currentIndex) |                             appSettings.profilesList.remove(currentIndex); | ||||||
|                         profilesView.selection.clear() |                             profilesView.selection.clear(); | ||||||
|  |  | ||||||
|                             // TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2. |                             // TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2. | ||||||
|                         profilesView.model = 0 |                             profilesView.model = 0; | ||||||
|                         profilesView.model = appSettings.profilesList |                             profilesView.model = appSettings.profilesList; | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     Item { |                     Item { | ||||||
|                         // Spacing |                         // Spacing | ||||||
|                         Layout.fillHeight: true |                         Layout.fillHeight: true | ||||||
|                     } |                     } | ||||||
|                 Button { |                     Button{ | ||||||
|                         Layout.fillWidth: true |                         Layout.fillWidth: true | ||||||
|                         text: qsTr("Import") |                         text: qsTr("Import") | ||||||
|                         onClicked: { |                         onClicked: { | ||||||
|                         fileDialog.selectExisting = true |                             fileDialog.selectExisting = true; | ||||||
|                         fileDialog.callBack = function (url) { |                             fileDialog.callBack = function (url) {loadFile(url);}; | ||||||
|                             loadFile(url) |                             fileDialog.open(); | ||||||
|                         } |  | ||||||
|                         fileDialog.open() |  | ||||||
|                         } |                         } | ||||||
|                         function loadFile(url) { |                         function loadFile(url) { | ||||||
|                             try { |                             try { | ||||||
|                                 if (appSettings.verbose) |                                 if (appSettings.verbose) | ||||||
|                                 console.log("Loading file: " + url) |                                     console.log("Loading file: " + url); | ||||||
|  |  | ||||||
|                             var profileObject = JSON.parse(fileIO.read(url)) |                                 var profileObject = JSON.parse(fileIO.read(url)); | ||||||
|                             var name = profileObject.name |                                 var name = profileObject.name; | ||||||
|  |  | ||||||
|                                 if (!name) |                                 if (!name) | ||||||
|                                 throw "Profile doesn't have a name" |                                     throw "Profile doesn't have a name"; | ||||||
|  |  | ||||||
|                             var version = profileObject.version |                                 var version = profileObject.version !== undefined ? profileObject.version : 1; | ||||||
|                                     !== undefined ? profileObject.version : 1 |  | ||||||
|                                 if (version !== appSettings.profileVersion) |                                 if (version !== appSettings.profileVersion) | ||||||
|                                 throw "This profile is not supported on this version of CRT." |                                     throw "This profile is not supported on this version of CRT."; | ||||||
|  |  | ||||||
|                             delete profileObject.name |                                 delete profileObject.name; | ||||||
|  |  | ||||||
|                             appSettings.appendCustomProfile(name, |                                 appSettings.appendCustomProfile(name, JSON.stringify(profileObject)); | ||||||
|                                                             JSON.stringify( |  | ||||||
|                                                                 profileObject)) |  | ||||||
|                             } catch (err) { |                             } catch (err) { | ||||||
|                                 messageDialog.text = qsTr(err) |                                 messageDialog.text = qsTr(err) | ||||||
|                             messageDialog.open() |                                 messageDialog.open(); | ||||||
|                             } |                             } | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 Button { |                     Button{ | ||||||
|                     property alias currentIndex: profilesView.currentIndex |                         property alias currentIndex: profilesView.currentRow | ||||||
|  |  | ||||||
|                         Layout.fillWidth: true |                         Layout.fillWidth: true | ||||||
|  |  | ||||||
|                         text: qsTr("Export") |                         text: qsTr("Export") | ||||||
|                     enabled: currentIndex >= 0 && !appSettings.profilesList.get( |                         enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin | ||||||
|                                  currentIndex).builtin |  | ||||||
|                         onClicked: { |                         onClicked: { | ||||||
|                         fileDialog.selectExisting = false |                             fileDialog.selectExisting = false; | ||||||
|                         fileDialog.callBack = function (url) { |                             fileDialog.callBack = function (url) {storeFile(url);}; | ||||||
|                             storeFile(url) |                             fileDialog.open(); | ||||||
|                         } |  | ||||||
|                         fileDialog.open() |  | ||||||
|                         } |                         } | ||||||
|                         function storeFile(url) { |                         function storeFile(url) { | ||||||
|                             try { |                             try { | ||||||
|                             var urlString = url.toString() |                                 var urlString = url.toString(); | ||||||
|  |  | ||||||
|                                 // Fix the extension if it's missing. |                                 // Fix the extension if it's missing. | ||||||
|                             var extension = urlString.substring( |                                 var extension = urlString.substring(urlString.length - 5, urlString.length); | ||||||
|                                         urlString.length - 5, urlString.length) |                                 var urlTail = (extension === ".json" ? "" : ".json"); | ||||||
|                             var urlTail = (extension === ".json" ? "" : ".json") |                                 url += urlTail; | ||||||
|                             url += urlTail |  | ||||||
|  |  | ||||||
|                                 if (true) |                                 if (true) | ||||||
|                                 console.log("Storing file: " + url) |                                     console.log("Storing file: " + url); | ||||||
|  |  | ||||||
|                             var profileObject = appSettings.profilesList.get( |                                 var profileObject = appSettings.profilesList.get(currentIndex); | ||||||
|                                         currentIndex) |                                 var profileSettings = JSON.parse(profileObject.obj_string); | ||||||
|                             var profileSettings = JSON.parse( |                                 profileSettings["name"] = profileObject.text; | ||||||
|                                         profileObject.obj_string) |                                 profileSettings["version"] = appSettings.profileVersion; | ||||||
|                             profileSettings["name"] = profileObject.text |  | ||||||
|                             profileSettings["version"] = appSettings.profileVersion |  | ||||||
|  |  | ||||||
|                             var result = fileIO.write(url, JSON.stringify( |                                 var result = fileIO.write(url, JSON.stringify(profileSettings, undefined, 2)); | ||||||
|                                                           profileSettings, |  | ||||||
|                                                           undefined, 2)) |  | ||||||
|                                 if (!result) |                                 if (!result) | ||||||
|                                 throw "The file could not be written." |                                     throw "The file could not be written."; | ||||||
|                             } catch (err) { |                             } catch (err) { | ||||||
|                             console.log(err) |                                 console.log(err); | ||||||
|                             messageDialog.text = qsTr( |                                 messageDialog.text = qsTr("There has been an error storing the file.") | ||||||
|                                         "There has been an error storing the file.") |                                 messageDialog.open(); | ||||||
|                             messageDialog.open() |  | ||||||
|                             } |                             } | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
| @@ -180,65 +163,47 @@ ColumnLayout { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     GroupBox { |         GroupBox{ | ||||||
|             title: qsTr("Screen") |             title: qsTr("Screen") | ||||||
|             Layout.fillWidth: true |             Layout.fillWidth: true | ||||||
|         GridLayout { |             GridLayout{ | ||||||
|                 anchors.fill: parent |                 anchors.fill: parent | ||||||
|                 columns: 2 |                 columns: 2 | ||||||
|             Label { |                 Label{ text: qsTr("Brightness") } | ||||||
|                 text: qsTr("Brightness") |                 SimpleSlider{ | ||||||
|             } |  | ||||||
|             SimpleSlider { |  | ||||||
|                     onValueChanged: appSettings.brightness = value |                     onValueChanged: appSettings.brightness = value | ||||||
|                     value: appSettings.brightness |                     value: appSettings.brightness | ||||||
|                 } |                 } | ||||||
|             Label { |                 Label{ text: qsTr("Contrast") } | ||||||
|                 text: qsTr("Contrast") |                 SimpleSlider{ | ||||||
|             } |  | ||||||
|             SimpleSlider { |  | ||||||
|                     onValueChanged: appSettings.contrast = value |                     onValueChanged: appSettings.contrast = value | ||||||
|                     value: appSettings.contrast |                     value: appSettings.contrast | ||||||
|                 } |                 } | ||||||
|             Label { |                 Label{ text: qsTr("Margin") } | ||||||
|                 text: qsTr("Margin") |                 SimpleSlider{ | ||||||
|             } |  | ||||||
|             SimpleSlider { |  | ||||||
|                     onValueChanged: appSettings._margin = value |                     onValueChanged: appSettings._margin = value | ||||||
|                     value: appSettings._margin |                     value: appSettings._margin | ||||||
|                 } |                 } | ||||||
|             Label { |                 Label{ text: qsTr("Opacity") } | ||||||
|                 text: qsTr("Frame size") |                 SimpleSlider{ | ||||||
|             } |  | ||||||
|             SimpleSlider { |  | ||||||
|                 onValueChanged: appSettings._frameMargin = value |  | ||||||
|                 value: appSettings._frameMargin |  | ||||||
|             } |  | ||||||
|             Label { |  | ||||||
|                 text: qsTr("Opacity") |  | ||||||
|                 visible: !appSettings.isMacOS |  | ||||||
|             } |  | ||||||
|             SimpleSlider { |  | ||||||
|                     onValueChanged: appSettings.windowOpacity = value |                     onValueChanged: appSettings.windowOpacity = value | ||||||
|                     value: appSettings.windowOpacity |                     value: appSettings.windowOpacity | ||||||
|                 visible: !appSettings.isMacOS |  | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // DIALOGS //////////////////////////////////////////////////////////////// |         // DIALOGS //////////////////////////////////////////////////////////////// | ||||||
|     InsertNameDialog { |         InsertNameDialog{ | ||||||
|             id: insertname |             id: insertname | ||||||
|             onNameSelected: { |             onNameSelected: { | ||||||
|             appSettings.appendCustomProfile(name, |                 appSettings.appendCustomProfile(name, appSettings.composeProfileString()); | ||||||
|                                             appSettings.composeProfileString()) |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         MessageDialog { |         MessageDialog { | ||||||
|             id: messageDialog |             id: messageDialog | ||||||
|             title: qsTr("File Error") |             title: qsTr("File Error") | ||||||
|             onAccepted: { |             onAccepted: { | ||||||
|             messageDialog.close() |                 messageDialog.close(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         Loader { |         Loader { | ||||||
| @@ -246,23 +211,24 @@ ColumnLayout { | |||||||
|             property bool selectExisting: false |             property bool selectExisting: false | ||||||
|             id: fileDialog |             id: fileDialog | ||||||
|  |  | ||||||
|         sourceComponent: FileDialog { |             sourceComponent: FileDialog{ | ||||||
|                 nameFilters: ["Json files (*.json)"] |                 nameFilters: ["Json files (*.json)"] | ||||||
|                 selectMultiple: false |                 selectMultiple: false | ||||||
|                 selectFolder: false |                 selectFolder: false | ||||||
|                 selectExisting: fileDialog.selectExisting |                 selectExisting: fileDialog.selectExisting | ||||||
|             onAccepted: callBack(fileUrl) |                 onAccepted: callBack(fileUrl); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             onSelectExistingChanged: reload() |             onSelectExistingChanged: reload() | ||||||
|  |  | ||||||
|             function open() { |             function open() { | ||||||
|             item.open() |                 item.open(); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             function reload() { |             function reload() { | ||||||
|             active = false |                 active = false; | ||||||
|             active = true |                 active = true; | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,156 +17,140 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.1 | import QtQuick.Controls 1.1 | ||||||
| import QtQuick.Layouts 1.1 | import QtQuick.Layouts 1.1 | ||||||
| import QtQml 2.0 |  | ||||||
|  |  | ||||||
| import "Components" | import "Components" | ||||||
|  |  | ||||||
| ColumnLayout { | Tab{ | ||||||
|  |     ColumnLayout{ | ||||||
|  |         anchors.fill: parent | ||||||
|  |  | ||||||
|     GroupBox { |         GroupBox{ | ||||||
|             title: qsTr("Font") |             title: qsTr("Font") | ||||||
|             Layout.fillWidth: true |             Layout.fillWidth: true | ||||||
|         GridLayout { |             GridLayout{ | ||||||
|                 anchors.fill: parent |                 anchors.fill: parent | ||||||
|                 columns: 2 |                 columns: 2 | ||||||
|             Label { |                 Label { text: qsTr("Rasterization") } | ||||||
|                 text: qsTr("Rasterization") |  | ||||||
|             } |  | ||||||
|                 ComboBox { |                 ComboBox { | ||||||
|                     id: rasterizationBox |                     id: rasterizationBox | ||||||
|  |  | ||||||
|                     property string selectedElement: model[currentIndex] |                     property string selectedElement: model[currentIndex] | ||||||
|  |  | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                 model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels"), qsTr("Sub-Pixels")] |                     model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")] | ||||||
|                     currentIndex: appSettings.rasterization |                     currentIndex: appSettings.rasterization | ||||||
|                     onCurrentIndexChanged: { |                     onCurrentIndexChanged: { | ||||||
|                         appSettings.rasterization = currentIndex |                         appSettings.rasterization = currentIndex | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             Label { |                 Label{ text: qsTr("Name") } | ||||||
|                 text: qsTr("Name") |                 ComboBox{ | ||||||
|             } |  | ||||||
|             ComboBox { |  | ||||||
|                     id: fontChanger |                     id: fontChanger | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                     model: appSettings.fontlist |                     model: appSettings.fontlist | ||||||
|                 textRole: "text" |  | ||||||
|                     onActivated: { |                     onActivated: { | ||||||
|                     var name = appSettings.fontlist.get(index).name |                         var name = appSettings.fontlist.get(index).name; | ||||||
|                     appSettings.fontNames[appSettings.rasterization] = name |                         appSettings.fontNames[appSettings.rasterization] = name; | ||||||
|                     appSettings.handleFontChanged() |                         appSettings.handleFontChanged(); | ||||||
|                     } |                     } | ||||||
|                 function updateIndex() { |                     function updateIndex(){ | ||||||
|                     var name = appSettings.fontNames[appSettings.rasterization] |                         var name = appSettings.fontNames[appSettings.rasterization]; | ||||||
|                     var index = appSettings.getIndexByName(name) |                         var index = appSettings.getIndexByName(name); | ||||||
|                         if (index !== undefined) |                         if (index !== undefined) | ||||||
|                         currentIndex = index |                             currentIndex = index; | ||||||
|                     } |                     } | ||||||
|                 Connections { |                     Connections{ | ||||||
|                         target: appSettings |                         target: appSettings | ||||||
|  |                         onTerminalFontChanged: fontChanger.updateIndex(); | ||||||
|                     onTerminalFontChanged: { |  | ||||||
|                         fontChanger.updateIndex() |  | ||||||
|                     } |                     } | ||||||
|  |                     Component.onCompleted: updateIndex(); | ||||||
|                 } |                 } | ||||||
|                 Component.onCompleted: updateIndex() |                 Label{ text: qsTr("Scaling") } | ||||||
|             } |                 RowLayout{ | ||||||
|             Label { |  | ||||||
|                 text: qsTr("Scaling") |  | ||||||
|             } |  | ||||||
|             RowLayout { |  | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                 Slider { |                     Slider{ | ||||||
|                         Layout.fillWidth: true |                         Layout.fillWidth: true | ||||||
|                         id: fontScalingChanger |                         id: fontScalingChanger | ||||||
|                     onValueChanged: appSettings.fontScaling = value |                         onValueChanged: if(enabled) appSettings.fontScaling = value | ||||||
|                     value: appSettings.fontScaling |  | ||||||
|                         stepSize: 0.05 |                         stepSize: 0.05 | ||||||
|                     from: appSettings.minimumFontScaling |                         enabled: false // Another trick to fix initial bad behavior. | ||||||
|                     to: appSettings.maximumFontScaling |                         Component.onCompleted: { | ||||||
|  |                             minimumValue = appSettings.minimumFontScaling; | ||||||
|  |                             maximumValue = appSettings.maximumFontScaling; | ||||||
|  |                             value = appSettings.fontScaling; | ||||||
|  |                             enabled = true; | ||||||
|                         } |                         } | ||||||
|                 SizedLabel { |                         Connections{ | ||||||
|  |                             target: appSettings | ||||||
|  |                             onFontScalingChanged: fontScalingChanger.value = appSettings.fontScaling; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                     SizedLabel{ | ||||||
|                         text: Math.round(fontScalingChanger.value * 100) + "%" |                         text: Math.round(fontScalingChanger.value * 100) + "%" | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             Label { |                 Label{ text: qsTr("Font Width") } | ||||||
|                 text: qsTr("Font Width") |                 RowLayout{ | ||||||
|             } |  | ||||||
|             RowLayout { |  | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                 Slider { |                     Slider{ | ||||||
|                         Layout.fillWidth: true |                         Layout.fillWidth: true | ||||||
|                         id: widthChanger |                         id: widthChanger | ||||||
|                     onValueChanged: appSettings.fontWidth = value |                         onValueChanged: appSettings.fontWidth = value; | ||||||
|                         value: appSettings.fontWidth |                         value: appSettings.fontWidth | ||||||
|                         stepSize: 0.05 |                         stepSize: 0.05 | ||||||
|                     from: 0.5 |                         Component.onCompleted: { | ||||||
|                     to: 1.5 |                             // This is needed to avoid unnecessary chnaged events. | ||||||
|  |                             minimumValue = 0.5; | ||||||
|  |                             maximumValue = 1.5; | ||||||
|                         } |                         } | ||||||
|                 SizedLabel { |                     } | ||||||
|  |                     SizedLabel{ | ||||||
|                         text: Math.round(widthChanger.value * 100) + "%" |                         text: Math.round(widthChanger.value * 100) + "%" | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     GroupBox { |         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 { |  | ||||||
|             title: qsTr("Colors") |             title: qsTr("Colors") | ||||||
|             Layout.fillWidth: true |             Layout.fillWidth: true | ||||||
|         ColumnLayout { |             ColumnLayout{ | ||||||
|                 anchors.fill: parent |                 anchors.fill: parent | ||||||
|             ColumnLayout { |                 ColumnLayout{ | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                 CheckableSlider { |                     CheckableSlider{ | ||||||
|                         name: qsTr("Chroma Color") |                         name: qsTr("Chroma Color") | ||||||
|                         onNewValue: appSettings.chromaColor = newValue |                         onNewValue: appSettings.chromaColor = newValue | ||||||
|                         value: appSettings.chromaColor |                         value: appSettings.chromaColor | ||||||
|                     } |                     } | ||||||
|                 CheckableSlider { |                     CheckableSlider{ | ||||||
|                         name: qsTr("Saturation Color") |                         name: qsTr("Saturation Color") | ||||||
|                         onNewValue: appSettings.saturationColor = newValue |                         onNewValue: appSettings.saturationColor = newValue | ||||||
|                         value: appSettings.saturationColor |                         value: appSettings.saturationColor | ||||||
|                         enabled: appSettings.chromaColor !== 0 |                         enabled: appSettings.chromaColor !== 0 | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             RowLayout { |                 RowLayout{ | ||||||
|                     Layout.fillWidth: true |                     Layout.fillWidth: true | ||||||
|                 ColorButton { |                     ColorButton{ | ||||||
|                         name: qsTr("Font") |                         name: qsTr("Font") | ||||||
|                         height: 50 |                         height: 50 | ||||||
|                         Layout.fillWidth: true |                         Layout.fillWidth: true | ||||||
|                     onColorSelected: appSettings._fontColor = color |                         onColorSelected: appSettings._fontColor = color; | ||||||
|                         color: appSettings._fontColor |                         color: appSettings._fontColor | ||||||
|                     } |                     } | ||||||
|                 ColorButton { |                     ColorButton{ | ||||||
|                         name: qsTr("Background") |                         name: qsTr("Background") | ||||||
|                         height: 50 |                         height: 50 | ||||||
|                         Layout.fillWidth: true |                         Layout.fillWidth: true | ||||||
|                     onColorSelected: appSettings._backgroundColor = color |                         onColorSelected: appSettings._backgroundColor = color; | ||||||
|                         color: appSettings._backgroundColor |                         color: appSettings._backgroundColor | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -19,57 +19,46 @@ | |||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.1 | import QtQuick.Controls 1.1 | ||||||
| import QtQuick.Window 2.1 | import QtQuick.Window 2.1 | ||||||
| import QtQuick.Layouts 1.3 | import QtQuick.Layouts 1.1 | ||||||
| import QtQuick.Dialogs 1.1 | import QtQuick.Dialogs 1.1 | ||||||
|  |  | ||||||
| Window { | Window { | ||||||
|     id: settings_window |     id: settings_window | ||||||
|     title: qsTr("Settings") |     title: qsTr("Settings") | ||||||
|     width: 640 |     width: 580 | ||||||
|     height: 640 |     height: 400 | ||||||
|  |  | ||||||
|     property int tabmargins: 15 |     property int tabmargins: 15 | ||||||
|  |  | ||||||
|     Item { |     TabView{ | ||||||
|         anchors { fill: parent;  margins: tabmargins } |         id: tabView | ||||||
|  |  | ||||||
|         TabBar { |  | ||||||
|             id: bar |  | ||||||
|             anchors { left: parent.left; right: parent.right; top: parent.top; } |  | ||||||
|             TabButton { |  | ||||||
|                 text: qsTr("General") |  | ||||||
|             } |  | ||||||
|             TabButton { |  | ||||||
|                 text: qsTr("Terminal") |  | ||||||
|             } |  | ||||||
|             TabButton { |  | ||||||
|                 text: qsTr("Effects") |  | ||||||
|             } |  | ||||||
|             TabButton { |  | ||||||
|                 text: qsTr("Advanced") |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         Frame { |  | ||||||
|             anchors { |  | ||||||
|                 top: bar.bottom |  | ||||||
|                 left: parent.left |  | ||||||
|                 right: parent.right |  | ||||||
|                 bottom: parent.bottom |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             StackLayout { |  | ||||||
|         anchors.fill: parent |         anchors.fill: parent | ||||||
|  |         anchors.margins: 10 | ||||||
|                 currentIndex: bar.currentIndex |         SettingsGeneralTab { | ||||||
|  |             id: generalTab | ||||||
|                 SettingsGeneralTab { } |             title: qsTr("General") | ||||||
|                 SettingsTerminalTab { } |             anchors.fill: parent | ||||||
|                 SettingsEffectsTab { } |             anchors.margins: tabmargins | ||||||
|                 SettingsAdvancedTab { } |  | ||||||
|         } |         } | ||||||
|  |         SettingsTerminalTab { | ||||||
|  |             id: terminalTab | ||||||
|  |             title: qsTr("Terminal") | ||||||
|  |             anchors.fill: parent | ||||||
|  |             anchors.margins: tabmargins | ||||||
|  |         } | ||||||
|  |         SettingsEffectsTab { | ||||||
|  |             id: effectsTab | ||||||
|  |             title: qsTr("Effects") | ||||||
|  |             anchors.fill: parent | ||||||
|  |             anchors.margins: tabmargins | ||||||
|  |         } | ||||||
|  |         SettingsAdvancedTab { | ||||||
|  |             id: performanceTab | ||||||
|  |             title: qsTr("Advanced") | ||||||
|  |             anchors.fill: parent | ||||||
|  |             anchors.margins: tabmargins | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,91 +0,0 @@ | |||||||
| import QtQuick 2.0 |  | ||||||
|  |  | ||||||
| QtObject { |  | ||||||
|     property string rasterizationShader: |  | ||||||
|         (appSettings.rasterization === appSettings.no_rasterization ? " |  | ||||||
|             lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) { |  | ||||||
|                 return texel; |  | ||||||
|             }" : "") + |  | ||||||
|  |  | ||||||
|         (appSettings.rasterization === appSettings.scanline_rasterization ? " |  | ||||||
|             #define INTENSITY 0.30 |  | ||||||
|             #define BRIGHTBOOST 0.30 |  | ||||||
|  |  | ||||||
|             lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) { |  | ||||||
|                 lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel; |  | ||||||
|                 lowp vec3 pixelLow  = ((1.0 - INTENSITY) + (0.1 * texel)) * texel; |  | ||||||
|  |  | ||||||
|                 vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0); |  | ||||||
|                 lowp float mask = 1.0 - abs(coords.y); |  | ||||||
|  |  | ||||||
|                 lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask); |  | ||||||
|                 return mix(texel, rasterizationColor, intensity); |  | ||||||
|             }" : "") + |  | ||||||
|  |  | ||||||
|         (appSettings.rasterization === appSettings.pixel_rasterization ? " |  | ||||||
|             #define INTENSITY 0.30 |  | ||||||
|             #define BRIGHTBOOST 0.30 |  | ||||||
|  |  | ||||||
|             lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) { |  | ||||||
|                 lowp vec3 result = texel; |  | ||||||
|  |  | ||||||
|                 lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel; |  | ||||||
|                 lowp vec3 pixelLow  = ((1.0 - INTENSITY) + (0.1 * texel)) * texel; |  | ||||||
|  |  | ||||||
|                 vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0); |  | ||||||
|                 coords = coords * coords; |  | ||||||
|                 lowp float mask = 1.0 - coords.x - coords.y; |  | ||||||
|  |  | ||||||
|                 lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask); |  | ||||||
|                 return mix(texel, rasterizationColor, intensity); |  | ||||||
|             }" : "") + |  | ||||||
|  |  | ||||||
|         (appSettings.rasterization === appSettings.subpixel_rasterization ? " |  | ||||||
|             #define INTENSITY 0.30 |  | ||||||
|             #define BRIGHTBOOST 0.30 |  | ||||||
|             #define SUBPIXELS 3.0 |  | ||||||
|             const vec3 offsets = vec3(3.141592654) * vec3(1.0/2.0,1.0/2.0 - 2.0/3.0,1.0/2.0-4.0/3.0); |  | ||||||
|  |  | ||||||
|             lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) { |  | ||||||
|                 vec2 omega = vec2(3.141592654) * vec2(2.0) * virtualResolution; |  | ||||||
|                 vec2 angle = screenCoords * omega; |  | ||||||
|                 vec3 xfactors = (SUBPIXELS + sin(angle.x + offsets)) / (SUBPIXELS + 1.0); |  | ||||||
|  |  | ||||||
|                 lowp vec3 result = texel * xfactors; |  | ||||||
|                 lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * result)) * result; |  | ||||||
|                 lowp vec3 pixelLow  = ((1.0 - INTENSITY) + (0.1 * result)) * result; |  | ||||||
|  |  | ||||||
|                 vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0); |  | ||||||
|                 lowp float mask = 1.0 - abs(coords.y); |  | ||||||
|  |  | ||||||
|                 lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask); |  | ||||||
|                 return mix(texel, rasterizationColor, intensity); |  | ||||||
|             }" : "") + |  | ||||||
|  |  | ||||||
|         "\n\n" |  | ||||||
|  |  | ||||||
|     property string min2: " |  | ||||||
|         float min2(vec2 v) { |  | ||||||
|             return min(v.x, v.y); |  | ||||||
|         }\n\n" |  | ||||||
|  |  | ||||||
|     property string rgb2grey: " |  | ||||||
|         float rgb2grey(vec3 v) { |  | ||||||
|             return dot(v, vec3(0.21, 0.72, 0.04)); |  | ||||||
|         }\n\n" |  | ||||||
|  |  | ||||||
|     property string max2: " |  | ||||||
|         float max2(vec2 v) { |  | ||||||
|             return max(v.x, v.y); |  | ||||||
|         }\n\n" |  | ||||||
|  |  | ||||||
|     property string prod2: " |  | ||||||
|         float prod2(vec2 v) { |  | ||||||
|             return v.x * v.y; |  | ||||||
|         }\n\n" |  | ||||||
|  |  | ||||||
|     property string sum2: " |  | ||||||
|         float sum2(vec2 v) { |  | ||||||
|             return v.x + v.y; |  | ||||||
|         }\n\n" |  | ||||||
| } |  | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -24,6 +24,7 @@ import QtGraphicalEffects 1.0 | |||||||
| import "utils.js" as Utils | import "utils.js" as Utils | ||||||
|  |  | ||||||
| Item { | Item { | ||||||
|  |     property SlowBurnIn slowBurnInEffect | ||||||
|     property ShaderEffectSource source |     property ShaderEffectSource source | ||||||
|     property BurnInEffect burnInEffect |     property BurnInEffect burnInEffect | ||||||
|     property ShaderEffectSource bloomSource |     property ShaderEffectSource bloomSource | ||||||
| @@ -37,19 +38,11 @@ Item { | |||||||
|  |  | ||||||
|     property real ambientLight: appSettings.ambientLight * 0.2 |     property real ambientLight: appSettings.ambientLight * 0.2 | ||||||
|  |  | ||||||
|     property size virtualResolution |     property size virtual_resolution | ||||||
|     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 | ||||||
| @@ -66,24 +59,22 @@ Item { | |||||||
|          property real glowingLine: appSettings.glowingLine * 0.2 |          property real glowingLine: appSettings.glowingLine * 0.2 | ||||||
|  |  | ||||||
|          // Fast burnin properties |          // Fast burnin properties | ||||||
|          property real burnIn: appSettings.burnIn |          property real burnIn: appSettings.useFastBurnIn ? appSettings.burnIn : 0 | ||||||
|          property real burnInLastUpdate: burnInEffect.lastUpdate |          property real burnInLastUpdate: burnInEffect.lastUpdate | ||||||
|          property real burnInTime: burnInEffect.burnInFadeTime |          property real burnInTime: burnInEffect.burnInFadeTime | ||||||
|  |  | ||||||
|  |          // Slow burnin properties | ||||||
|  |          property real slowBurnIn: appSettings.useFastBurnIn ? 0 : appSettings.burnIn | ||||||
|  |          property ShaderEffectSource slowBurnInSource: slowBurnInEffect.source | ||||||
|  |  | ||||||
|          property real jitter: appSettings.jitter |          property real jitter: appSettings.jitter | ||||||
|          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 * 0.75) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling), |          property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling), | ||||||
|                                                (height * 0.75) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling)) |                                                (height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling)) | ||||||
|  |  | ||||||
|          property size virtualResolution: parent.virtualResolution |          property size virtual_resolution: parent.virtual_resolution | ||||||
|  |  | ||||||
|          // 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 | ||||||
| @@ -95,7 +86,7 @@ Item { | |||||||
|          blending: false |          blending: false | ||||||
|  |  | ||||||
|          //Smooth random texture used for flickering effect. |          //Smooth random texture used for flickering effect. | ||||||
|          Image { |          Image{ | ||||||
|              id: noiseTexture |              id: noiseTexture | ||||||
|              source: "images/allNoise512.png" |              source: "images/allNoise512.png" | ||||||
|              width: 512 |              width: 512 | ||||||
| @@ -103,7 +94,7 @@ Item { | |||||||
|              fillMode: Image.Tile |              fillMode: Image.Tile | ||||||
|              visible: false |              visible: false | ||||||
|          } |          } | ||||||
|          ShaderEffectSource { |          ShaderEffectSource{ | ||||||
|              id: noiseShaderSource |              id: noiseShaderSource | ||||||
|              sourceItem: noiseTexture |              sourceItem: noiseTexture | ||||||
|              wrapMode: ShaderEffectSource.Repeat |              wrapMode: ShaderEffectSource.Repeat | ||||||
| @@ -173,22 +164,23 @@ Item { | |||||||
|              uniform highp vec4 backgroundColor; |              uniform highp vec4 backgroundColor; | ||||||
|              uniform lowp float shadowLength; |              uniform lowp float shadowLength; | ||||||
|  |  | ||||||
|              uniform highp vec2 virtualResolution; |              uniform highp vec2 virtual_resolution;" + | ||||||
|              uniform lowp float rasterizationIntensity;\n" + |  | ||||||
|  |  | ||||||
|              (burnIn !== 0 ? " |              (burnIn !== 0 ? " | ||||||
|                  uniform sampler2D burnInSource; |                  uniform sampler2D burnInSource; | ||||||
|                  uniform highp float burnInLastUpdate; |                  uniform highp float burnInLastUpdate; | ||||||
|                  uniform highp float burnInTime;" : "") + |                  uniform highp float burnInTime;" : "") + | ||||||
|  |              (slowBurnIn !== 0 ? " | ||||||
|  |                  uniform sampler2D slowBurnInSource;" : "") + | ||||||
|              (staticNoise !== 0 ? " |              (staticNoise !== 0 ? " | ||||||
|                  uniform highp float staticNoise;" : "") + |                  uniform highp float staticNoise;" : "") + | ||||||
|              (((staticNoise !== 0 || jitter !== 0) ||(fallBack && (flickering || horizontalSync))) ? " |              (((staticNoise !== 0 || jitter !== 0) | ||||||
|  |                ||(fallBack && (flickering || horizontalSync))) ? " | ||||||
|                  uniform lowp sampler2D noiseSource; |                  uniform lowp sampler2D noiseSource; | ||||||
|                  uniform highp vec2 scaleNoiseSize;" : "") + |                  uniform highp vec2 scaleNoiseSize;" : "") + | ||||||
|              (displayTerminalFrame ? " |  | ||||||
|                  uniform lowp sampler2D frameSource;" : "") + |  | ||||||
|              (screenCurvature !== 0 ? " |              (screenCurvature !== 0 ? " | ||||||
|                  uniform highp float screenCurvature;" : "") + |                  uniform highp float screenCurvature; | ||||||
|  |                  uniform lowp sampler2D frameSource;" : "") + | ||||||
|              (glowingLine !== 0 ? " |              (glowingLine !== 0 ? " | ||||||
|                  uniform highp float glowingLine;" : "") + |                  uniform highp float glowingLine;" : "") + | ||||||
|              (chromaColor !== 0 ? " |              (chromaColor !== 0 ? " | ||||||
| @@ -211,14 +203,17 @@ Item { | |||||||
|  |  | ||||||
|              (glowingLine !== 0 ? " |              (glowingLine !== 0 ? " | ||||||
|                  float randomPass(vec2 coords){ |                  float randomPass(vec2 coords){ | ||||||
|                      return fract(smoothstep(-120.0, 0.0, coords.y - (virtualResolution.y + 120.0) * fract(time * 0.00015))); |                      return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015))); | ||||||
|                  }" : "") + |                  }" : "") + | ||||||
|  |  | ||||||
|              shaderLibrary.min2 + |              "float min2(vec2 v) { | ||||||
|              shaderLibrary.rgb2grey + |                  return min(v.x, v.y); | ||||||
|              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)); | ||||||
|              } |              } | ||||||
| @@ -296,7 +291,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 * virtualResolution) * glowingLine;" : "") + |                      color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + | ||||||
|  |  | ||||||
|                  "vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" + |                  "vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" + | ||||||
|  |  | ||||||
| @@ -307,9 +302,12 @@ Item { | |||||||
|                      txt_color = max(txt_color, convertWithChroma(burnInColor));" |                      txt_color = max(txt_color, convertWithChroma(burnInColor));" | ||||||
|                  : "") + |                  : "") + | ||||||
|  |  | ||||||
|                   "txt_color += fontColor.rgb * vec3(color);" + |                  (slowBurnIn !== 0 ? " | ||||||
|  |                      vec4 txt_blur = texture2D(slowBurnInSource, staticCoords); | ||||||
|  |                      txt_color = max(txt_color, convertWithChroma(txt_blur.rgb * txt_blur.a)); | ||||||
|  |                  " : "") + | ||||||
|  |  | ||||||
|                   "txt_color = applyRasterization(staticCoords, txt_color, virtualResolution, rasterizationIntensity);\n" + |                   "txt_color += fontColor.rgb * vec3(color);" + | ||||||
|  |  | ||||||
|                  "vec3 finalColor = txt_color;" + |                  "vec3 finalColor = txt_color;" + | ||||||
|  |  | ||||||
| @@ -319,7 +317,7 @@ Item { | |||||||
|                  (ambientLight !== 0 ? " |                  (ambientLight !== 0 ? " | ||||||
|                      finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") + |                      finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") + | ||||||
|  |  | ||||||
|                  (displayTerminalFrame ? |                  (screenCurvature !== 0 ? | ||||||
|                     "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);" | ||||||
|                  : "") + |                  : "") + | ||||||
| @@ -342,7 +340,7 @@ Item { | |||||||
|      Loader { |      Loader { | ||||||
|          id: terminalFrameLoader |          id: terminalFrameLoader | ||||||
|  |  | ||||||
|          active: dynamicShader.displayTerminalFrame |          active: screenCurvature !== 0 | ||||||
|  |  | ||||||
|          width: staticShader.width |          width: staticShader.width | ||||||
|          height: staticShader.height |          height: staticShader.height | ||||||
| @@ -354,7 +352,7 @@ Item { | |||||||
|              visible: false |              visible: false | ||||||
|              format: ShaderEffectSource.RGBA |              format: ShaderEffectSource.RGBA | ||||||
|  |  | ||||||
|              TerminalFrame { |              NewTerminalFrame { | ||||||
|                  id: terminalFrame |                  id: terminalFrame | ||||||
|                  blending: false |                  blending: false | ||||||
|                  anchors.fill: parent |                  anchors.fill: parent | ||||||
| @@ -362,10 +360,6 @@ Item { | |||||||
|          } |          } | ||||||
|      } |      } | ||||||
|  |  | ||||||
|      ShaderLibrary { |  | ||||||
|          id: shaderLibrary |  | ||||||
|      } |  | ||||||
|  |  | ||||||
|      ShaderEffect { |      ShaderEffect { | ||||||
|          id: staticShader |          id: staticShader | ||||||
|  |  | ||||||
| @@ -391,7 +385,7 @@ Item { | |||||||
|  |  | ||||||
|          property real ambientLight: parent.ambientLight |          property real ambientLight: parent.ambientLight | ||||||
|  |  | ||||||
|          property size virtualResolution: parent.virtualResolution |          property size virtual_resolution: parent.virtual_resolution | ||||||
|  |  | ||||||
|          blending: false |          blending: false | ||||||
|          visible: false |          visible: false | ||||||
| @@ -414,7 +408,7 @@ Item { | |||||||
|              uniform highp vec4 backgroundColor; |              uniform highp vec4 backgroundColor; | ||||||
|              uniform lowp float screen_brightness; |              uniform lowp float screen_brightness; | ||||||
|  |  | ||||||
|              uniform highp vec2 virtualResolution;" + |              uniform highp vec2 virtual_resolution;" + | ||||||
|  |  | ||||||
|              (bloom !== 0 ? " |              (bloom !== 0 ? " | ||||||
|                  uniform highp sampler2D bloomSource; |                  uniform highp sampler2D bloomSource; | ||||||
| @@ -432,9 +426,36 @@ Item { | |||||||
|              (ambientLight !== 0 ? " |              (ambientLight !== 0 ? " | ||||||
|                  uniform lowp float ambientLight;" : "") + |                  uniform lowp float ambientLight;" : "") + | ||||||
|  |  | ||||||
|              shaderLibrary.min2 + |              "highp float getScanlineIntensity(vec2 coords) { | ||||||
|              shaderLibrary.sum2 + |                  float result = 1.0;" + | ||||||
|              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;" + | ||||||
| @@ -447,7 +468,6 @@ 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;" + | ||||||
| @@ -470,6 +490,8 @@ Item { | |||||||
|                      txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60; |                      txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60; | ||||||
|                  " : "") + |                  " : "") + | ||||||
|  |  | ||||||
|  |                   "txt_color *= getScanlineIntensity(txt_coords);" + | ||||||
|  |  | ||||||
|                   "txt_color += vec3(0.0001);" + |                   "txt_color += vec3(0.0001);" + | ||||||
|                   "float greyscale_color = rgb2grey(txt_color);" + |                   "float greyscale_color = rgb2grey(txt_color);" + | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,8 +17,9 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Controls 2.0 | import QtQuick.Controls 1.1 | ||||||
| import QtQuick.Layouts 1.1 | import QtQuick.Layouts 1.1 | ||||||
|  |  | ||||||
| import "Components" | import "Components" | ||||||
| @@ -26,18 +27,18 @@ import "Components" | |||||||
| RowLayout { | RowLayout { | ||||||
|     property alias value: slider.value |     property alias value: slider.value | ||||||
|     property alias stepSize: slider.stepSize |     property alias stepSize: slider.stepSize | ||||||
|     property alias minimumValue: slider.from |     property alias minimumValue: slider.minimumValue | ||||||
|     property alias maximumValue: slider.to |     property alias maximumValue: slider.maximumValue | ||||||
|     property real maxMultiplier: 100 |     property real maxMultiplier: 100 | ||||||
|  |  | ||||||
|     id: setting_component |     id: setting_component | ||||||
|     spacing: 10 |     spacing: 10 | ||||||
|     Slider { |     Slider{ | ||||||
|         id: slider |         id: slider | ||||||
|         stepSize: parent.stepSize |         stepSize: parent.stepSize | ||||||
|         Layout.fillWidth: true |         Layout.fillWidth: true | ||||||
|     } |     } | ||||||
|     SizedLabel { |     SizedLabel{ | ||||||
|         text: Math.round(value * maxMultiplier) + "%" |         text: Math.round(value * maxMultiplier) + "%" | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,12 +17,12 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
|  |  | ||||||
| Rectangle { | Rectangle{ | ||||||
|     property size terminalSize |     property size terminalSize | ||||||
|     property real topOpacity: 0.6 |     property real topOpacity: 0.6 | ||||||
|  |  | ||||||
|     width: textSize.width * 2 |     width: textSize.width * 2 | ||||||
|     height: textSize.height * 2 |     height: textSize.height * 2 | ||||||
|     radius: 5 |     radius: 5 | ||||||
| @@ -31,21 +31,17 @@ Rectangle { | |||||||
|     color: "black" |     color: "black" | ||||||
|     opacity: sizetimer.running ? 0.6 : 0.0 |     opacity: sizetimer.running ? 0.6 : 0.0 | ||||||
|  |  | ||||||
|     Behavior on opacity { |     Behavior on opacity{NumberAnimation{duration: 200}} | ||||||
|         NumberAnimation { |  | ||||||
|             duration: 200 |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     onTerminalSizeChanged: sizetimer.restart() |     onTerminalSizeChanged: sizetimer.restart() | ||||||
|  |  | ||||||
|     Text { |     Text{ | ||||||
|         id: textSize |         id: textSize | ||||||
|         anchors.centerIn: parent |         anchors.centerIn: parent | ||||||
|         color: "white" |         color: "white" | ||||||
|         text: terminalSize.width + "x" + terminalSize.height |         text: terminalSize.width + "x" + terminalSize.height | ||||||
|     } |     } | ||||||
|     Timer { |     Timer{ | ||||||
|         id: sizetimer |         id: sizetimer | ||||||
|         interval: 1000 |         interval: 1000 | ||||||
|         running: false |         running: false | ||||||
|   | |||||||
							
								
								
									
										122
									
								
								app/qml/SlowBurnIn.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								app/qml/SlowBurnIn.qml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,122 @@ | |||||||
|  | import QtQuick 2.0 | ||||||
|  |  | ||||||
|  | import "utils.js" as Utils | ||||||
|  |  | ||||||
|  | Loader { | ||||||
|  |     property ShaderEffectSource source: item ? item.source : null | ||||||
|  |  | ||||||
|  |     active: !appSettings.useFastBurnIn && appSettings.burnIn !== 0 | ||||||
|  |  | ||||||
|  |     anchors.fill: parent | ||||||
|  |  | ||||||
|  |     sourceComponent: Item { | ||||||
|  |         property alias source: burnInSourceEffect | ||||||
|  |  | ||||||
|  |         property int burnInScaling: scaleTexture * appSettings.burnInQuality | ||||||
|  |  | ||||||
|  |         ShaderEffectSource { | ||||||
|  |             property bool updateBurnIn: false | ||||||
|  |             property real burnIn: appSettings.burnIn | ||||||
|  |             property real fps: appSettings.fps !== 0 ? appSettings.fps : 60 | ||||||
|  |             property real burnInFadeTime: Utils.lint(minBurnInFadeTime, maxBurnInFadeTime, burnIn) | ||||||
|  |             property real burnInCoefficient: 1000 / (fps * burnInFadeTime) | ||||||
|  |             property real minBurnInFadeTime: appSettings.minBurnInFadeTime | ||||||
|  |             property real maxBurnInFadeTime: appSettings.maxBurnInFadeTime | ||||||
|  |  | ||||||
|  |             id: burnInSourceEffect | ||||||
|  |  | ||||||
|  |             anchors.fill: parent | ||||||
|  |  | ||||||
|  |             sourceItem: burnInEffect | ||||||
|  |             recursive: true | ||||||
|  |             live: false | ||||||
|  |             hideSource: true | ||||||
|  |             wrapMode: kterminalSource.wrapMode | ||||||
|  |  | ||||||
|  |             visible: false | ||||||
|  |  | ||||||
|  |             function restartBlurSource(){ | ||||||
|  |                 livetimer.restart(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // This updates the burnin synched with the timer. | ||||||
|  |             Connections { | ||||||
|  |                 target: burnInSourceEffect.updateBurnIn ? timeManager : null | ||||||
|  |                 ignoreUnknownSignals: false | ||||||
|  |                 onTimeChanged: { | ||||||
|  |                     burnInSourceEffect.scheduleUpdate(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             Timer{ | ||||||
|  |                 id: livetimer | ||||||
|  |  | ||||||
|  |                 // The interval assumes 60 fps. This is the time needed burnout a white pixel. | ||||||
|  |                 // We multiply 1.1 to have a little bit of margin over the theoretical value. | ||||||
|  |                 // This solution is not extremely clean, but it's probably the best to avoid measuring fps. | ||||||
|  |  | ||||||
|  |                 interval: burnInSourceEffect.burnInFadeTime * 1.1 | ||||||
|  |                 running: true | ||||||
|  |                 onTriggered: burnInSourceEffect.updateBurnIn = false; | ||||||
|  |             } | ||||||
|  |             Connections{ | ||||||
|  |                 target: kterminal | ||||||
|  |                 onImagePainted:{ | ||||||
|  |                     burnInSourceEffect.scheduleUpdate(); | ||||||
|  |                     burnInSourceEffect.updateBurnIn = true; | ||||||
|  |                     livetimer.restart(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             // Restart blurred source settings change. | ||||||
|  |             Connections{ | ||||||
|  |                 target: appSettings | ||||||
|  |                 onBurnInChanged: burnInSourceEffect.restartBlurSource(); | ||||||
|  |                 onTerminalFontChanged: burnInSourceEffect.restartBlurSource(); | ||||||
|  |                 onRasterizationChanged: burnInSourceEffect.restartBlurSource(); | ||||||
|  |                 onBurnInQualityChanged: burnInSourceEffect.restartBlurSource(); | ||||||
|  |             } | ||||||
|  |             Connections { | ||||||
|  |                 target: kterminalScrollbar | ||||||
|  |                 onOpacityChanged: burnInSourceEffect.restartBlurSource(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             ShaderEffect { | ||||||
|  |                 id: burnInEffect | ||||||
|  |  | ||||||
|  |                 property variant txt_source: kterminalSource | ||||||
|  |                 property variant blurredSource: burnInSourceEffect | ||||||
|  |                 property real burnInCoefficient: burnInSourceEffect.burnInCoefficient | ||||||
|  |  | ||||||
|  |                 anchors.fill: parent | ||||||
|  |                 blending: false | ||||||
|  |  | ||||||
|  |                 fragmentShader: | ||||||
|  |                     "#ifdef GL_ES | ||||||
|  |                     precision mediump float; | ||||||
|  |                 #endif\n" + | ||||||
|  |  | ||||||
|  |                 "uniform lowp float qt_Opacity;" + | ||||||
|  |                 "uniform lowp sampler2D txt_source;" + | ||||||
|  |  | ||||||
|  |                 "varying highp vec2 qt_TexCoord0; | ||||||
|  |              uniform lowp sampler2D blurredSource; | ||||||
|  |              uniform highp float burnInCoefficient;" + | ||||||
|  |  | ||||||
|  |                 "float max3(vec3 v) { | ||||||
|  |                      return max (max (v.x, v.y), v.z); | ||||||
|  |                 }" + | ||||||
|  |  | ||||||
|  |                 "void main() {" + | ||||||
|  |                     "vec2 coords = qt_TexCoord0;" + | ||||||
|  |                     "vec3 origColor = texture2D(txt_source, coords).rgb;" + | ||||||
|  |                     "vec3 blur_color = texture2D(blurredSource, coords).rgb - vec3(burnInCoefficient);" + | ||||||
|  |                     "vec3 color = min(origColor + blur_color, max(origColor, blur_color));" + | ||||||
|  |  | ||||||
|  |                     "gl_FragColor = vec4(color, max3(color - origColor));" + | ||||||
|  |                 "}" | ||||||
|  |  | ||||||
|  |                 onStatusChanged: if (log) console.log(log) //Print warning messages | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -27,7 +27,7 @@ QtObject { | |||||||
|     property bool initialized: false |     property bool initialized: false | ||||||
|  |  | ||||||
|     function getDatabase() { |     function getDatabase() { | ||||||
|          return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000) |          return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function initialize() { |     function initialize() { | ||||||
| @@ -35,10 +35,9 @@ QtObject { | |||||||
|         db.transaction( |         db.transaction( | ||||||
|             function(tx) { |             function(tx) { | ||||||
|                 tx.executeSql('CREATE TABLE IF NOT EXISTS settings(setting TEXT UNIQUE, value TEXT)'); |                 tx.executeSql('CREATE TABLE IF NOT EXISTS settings(setting TEXT UNIQUE, value TEXT)'); | ||||||
|             } |           }); | ||||||
|         ) |  | ||||||
|  |  | ||||||
|         initialized = true |         initialized = true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function setSetting(setting, value) { |     function setSetting(setting, value) { | ||||||
| @@ -46,8 +45,7 @@ QtObject { | |||||||
|  |  | ||||||
|        var db = getDatabase(); |        var db = getDatabase(); | ||||||
|        var res = ""; |        var res = ""; | ||||||
|         db.transaction( |        db.transaction(function(tx) { | ||||||
|             function(tx) { |  | ||||||
|             var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]); |             var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]); | ||||||
|                   //console.log(rs.rowsAffected) |                   //console.log(rs.rowsAffected) | ||||||
|                   if (rs.rowsAffected > 0) { |                   if (rs.rowsAffected > 0) { | ||||||
| @@ -56,25 +54,23 @@ QtObject { | |||||||
|                     res = "Error"; |                     res = "Error"; | ||||||
|                   } |                   } | ||||||
|             } |             } | ||||||
|       ) |       ); | ||||||
|       // The function returns “OK” if it was successful, or “Error” if it wasn't |       // The function returns “OK” if it was successful, or “Error” if it wasn't | ||||||
|       return res |       return res; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function getSetting(setting) { |     function getSetting(setting) { | ||||||
|        if(!initialized) initialize(); |        if(!initialized) initialize(); | ||||||
|        var db = getDatabase(); |        var db = getDatabase(); | ||||||
|         var res = ""; |        var res=""; | ||||||
|         db.transaction( |        db.transaction(function(tx) { | ||||||
|             function(tx) { |  | ||||||
|          var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]); |          var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]); | ||||||
|          if (rs.rows.length > 0) { |          if (rs.rows.length > 0) { | ||||||
|               res = rs.rows.item(0).value; |               res = rs.rows.item(0).value; | ||||||
|          } else { |          } else { | ||||||
|              res = undefined; |              res = undefined; | ||||||
|          } |          } | ||||||
|             } |       }) | ||||||
|         ) |  | ||||||
|       return res |       return res | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -83,7 +79,6 @@ QtObject { | |||||||
|         db.transaction( |         db.transaction( | ||||||
|             function(tx) { |             function(tx) { | ||||||
|                 tx.executeSql('DROP TABLE settings'); |                 tx.executeSql('DROP TABLE settings'); | ||||||
|             } |           }); | ||||||
|         ) |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,22 +1,3 @@ | |||||||
| /******************************************************************************* |  | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" |  | ||||||
| * https://github.com/Swordfish90/cool-retro-term |  | ||||||
| * |  | ||||||
| * This file is part of cool-retro-term. |  | ||||||
| * |  | ||||||
| * cool-retro-term is free software: you can redistribute it and/or modify |  | ||||||
| * it under the terms of the GNU General Public License as published by |  | ||||||
| * the Free Software Foundation, either version 3 of the License, or |  | ||||||
| * (at your option) any later version. |  | ||||||
| * |  | ||||||
| * This program is distributed in the hope that it will be useful, |  | ||||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
| * GNU General Public License for more details. |  | ||||||
| * |  | ||||||
| * You should have received a copy of the GNU General Public License |  | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. |  | ||||||
| *******************************************************************************/ |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtGraphicalEffects 1.0 | import QtGraphicalEffects 1.0 | ||||||
|  |  | ||||||
| @@ -26,48 +7,44 @@ 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 | ||||||
|     virtualResolution: terminal.virtualResolution |     slowBurnInEffect: terminal.slowBurnInEffect | ||||||
|     screenResolution: Qt.size( |     virtual_resolution: terminal.virtualResolution | ||||||
|         terminalWindow.width * devicePixelRatio * appSettings.windowScaling, |  | ||||||
|         terminalWindow.height * devicePixelRatio * appSettings.windowScaling |  | ||||||
|     ) |  | ||||||
|  |  | ||||||
|     TimeManager { |     TimeManager{ | ||||||
|         id: timeManager |         id: timeManager | ||||||
|         enableTimer: terminalWindow.visible |         enableTimer: terminalWindow.visible | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     PreprocessedTerminal { |     PreprocessedTerminal{ | ||||||
|         id: terminal |         id: terminal | ||||||
|         anchors.fill: parent |         anchors.fill: parent | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     //  EFFECTS  //////////////////////////////////////////////////////////////// |     //  EFFECTS  //////////////////////////////////////////////////////////////// | ||||||
|     Loader { |  | ||||||
|  |     Loader{ | ||||||
|         id: bloomEffectLoader |         id: bloomEffectLoader | ||||||
|         active: appSettings.bloom |         active: appSettings.bloom | ||||||
|         asynchronous: true |         asynchronous: true | ||||||
|         width: parent.width * appSettings.bloomQuality |         width: parent.width * appSettings.bloomQuality | ||||||
|         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 | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     Loader { |     Loader{ | ||||||
|         id: bloomSourceLoader |         id: bloomSourceLoader | ||||||
|         active: appSettings.bloom !== 0 |         active: appSettings.bloom !== 0 | ||||||
|         asynchronous: true |         asynchronous: true | ||||||
|         sourceComponent: ShaderEffectSource { |         sourceComponent: ShaderEffectSource{ | ||||||
|             id: _bloomEffectSource |             id: _bloomEffectSource | ||||||
|             sourceItem: bloomEffectLoader.item |             sourceItem: bloomEffectLoader.item | ||||||
|             hideSource: true |             hideSource: true | ||||||
| @@ -77,4 +54,71 @@ ShaderTerminal { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     bloomSource: bloomSourceLoader.item |     bloomSource: bloomSourceLoader.item | ||||||
|  |  | ||||||
|  | //    NewTerminalFrame { | ||||||
|  | //        id: terminalFrame | ||||||
|  | //        anchors.fill: parent | ||||||
|  | //        blending: true | ||||||
|  | //    } | ||||||
|  |  | ||||||
|  |     // This shader might be useful in the future. Since we used it only for a couple | ||||||
|  |     // of calculations is probably best to move those in the main shader. If in the future | ||||||
|  |     // we need to store another fullScreen channel this might be handy. | ||||||
|  |  | ||||||
|  | //    ShaderEffect { | ||||||
|  | //        id: rasterizationEffect | ||||||
|  | //        width: parent.width | ||||||
|  | //        height: parent.height | ||||||
|  | //        property real outColor: 0.0 | ||||||
|  | //        property real dispX: (5 / width) * appSettings.windowScaling | ||||||
|  | //        property real dispY: (5 / height) * appSettings.windowScaling | ||||||
|  | //        property size virtual_resolution: terminal.virtualResolution | ||||||
|  |  | ||||||
|  | //        blending: false | ||||||
|  |  | ||||||
|  | //        fragmentShader: | ||||||
|  | //            "uniform lowp float qt_Opacity;" + | ||||||
|  |  | ||||||
|  | //            "varying highp vec2 qt_TexCoord0; | ||||||
|  | //             uniform highp vec2 virtual_resolution; | ||||||
|  | //             uniform highp float dispX; | ||||||
|  | //             uniform highp float dispY; | ||||||
|  | //             uniform mediump float outColor; | ||||||
|  |  | ||||||
|  | //             highp float getScanlineIntensity(vec2 coords) { | ||||||
|  | //                 highp float result = 1.0;" + | ||||||
|  |  | ||||||
|  | //                (appSettings.rasterization != appSettings.no_rasterization ? | ||||||
|  | //                    "result *= abs(sin(coords.y * virtual_resolution.y * "+Math.PI+"));" : "") + | ||||||
|  | //                (appSettings.rasterization == appSettings.pixel_rasterization ? | ||||||
|  | //                    "result *= abs(sin(coords.x * virtual_resolution.x * "+Math.PI+"));" : "") + " | ||||||
|  |  | ||||||
|  | //                return result; | ||||||
|  | //             }" + | ||||||
|  |  | ||||||
|  | //            "void main() {" + | ||||||
|  | //                "highp float color = getScanlineIntensity(qt_TexCoord0);" + | ||||||
|  |  | ||||||
|  | //                "float distance = length(vec2(0.5) - qt_TexCoord0);" + | ||||||
|  | //                "color = mix(color, 0.0, 1.2 * distance * distance);" + | ||||||
|  |  | ||||||
|  | //                "color *= outColor + smoothstep(0.00, dispX, qt_TexCoord0.x) * (1.0 - outColor);" + | ||||||
|  | //                "color *= outColor + smoothstep(0.00, dispY, qt_TexCoord0.y) * (1.0 - outColor);" + | ||||||
|  | //                "color *= outColor + (1.0 - smoothstep(1.00 - dispX, 1.00, qt_TexCoord0.x)) * (1.0 - outColor);" + | ||||||
|  | //                "color *= outColor + (1.0 - smoothstep(1.00 - dispY, 1.00, qt_TexCoord0.y)) * (1.0 - outColor);" + | ||||||
|  |  | ||||||
|  | //                "gl_FragColor.a = color;" + | ||||||
|  | //            "}" | ||||||
|  |  | ||||||
|  | //        onStatusChanged: if (log) console.log(log) //Print warning messages | ||||||
|  | //    } | ||||||
|  |  | ||||||
|  | //    rasterizationSource: ShaderEffectSource{ | ||||||
|  | //        id: rasterizationEffectSource | ||||||
|  | //        sourceItem: rasterizationEffect | ||||||
|  | //        hideSource: true | ||||||
|  | //        smooth: true | ||||||
|  | //        wrapMode: ShaderEffectSource.ClampToEdge | ||||||
|  | //        visible: false | ||||||
|  | //    } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,104 +0,0 @@ | |||||||
| /******************************************************************************* |  | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" |  | ||||||
| * https://github.com/Swordfish90/cool-retro-term |  | ||||||
| * |  | ||||||
| * This file is part of cool-retro-term. |  | ||||||
| * |  | ||||||
| * cool-retro-term is free software: you can redistribute it and/or modify |  | ||||||
| * it under the terms of the GNU General Public License as published by |  | ||||||
| * the Free Software Foundation, either version 3 of the License, or |  | ||||||
| * (at your option) any later version. |  | ||||||
| * |  | ||||||
| * This program is distributed in the hope that it will be useful, |  | ||||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
| * GNU General Public License for more details. |  | ||||||
| * |  | ||||||
| * You should have received a copy of the GNU General Public License |  | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. |  | ||||||
| *******************************************************************************/ |  | ||||||
| import QtQuick 2.0 |  | ||||||
|  |  | ||||||
| import "utils.js" as Utils |  | ||||||
|  |  | ||||||
| ShaderEffect { |  | ||||||
|     property color _staticFrameColor: "#fff" |  | ||||||
|     property color _backgroundColor: appSettings.backgroundColor |  | ||||||
|     property color _fontColor: appSettings.fontColor |  | ||||||
|     property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2) |  | ||||||
|     property real _ambientLight: Utils.lint(0.2, 0.8, appSettings.ambientLight) |  | ||||||
|  |  | ||||||
|     property color frameColor: Utils.mix(_staticFrameColor, _lightColor, _ambientLight) |  | ||||||
|     property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize |  | ||||||
|  |  | ||||||
|     // Coefficient of the log curve used to approximate shadowing |  | ||||||
|     property real screenShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight) |  | ||||||
|     property real frameShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight) |  | ||||||
|  |  | ||||||
|     property size margin: Qt.size( |  | ||||||
|         appSettings.frameMargin / width * appSettings.windowScaling, |  | ||||||
|         appSettings.frameMargin / height * appSettings.windowScaling |  | ||||||
|     ) |  | ||||||
|  |  | ||||||
|     ShaderLibrary { |  | ||||||
|         id: shaderLibrary |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     fragmentShader: " |  | ||||||
|         #ifdef GL_ES |  | ||||||
|             precision mediump float; |  | ||||||
|         #endif |  | ||||||
|  |  | ||||||
|         uniform lowp float screenCurvature; |  | ||||||
|         uniform lowp float screenShadowCoeff; |  | ||||||
|         uniform lowp float frameShadowCoeff; |  | ||||||
|         uniform highp float qt_Opacity; |  | ||||||
|         uniform lowp vec4 frameColor; |  | ||||||
|         uniform mediump vec2 margin; |  | ||||||
|  |  | ||||||
|         varying highp vec2 qt_TexCoord0; |  | ||||||
|  |  | ||||||
|         vec2 distortCoordinates(vec2 coords){ |  | ||||||
|             vec2 cc = (coords - vec2(0.5)); |  | ||||||
|             float dist = dot(cc, cc) * screenCurvature; |  | ||||||
|             return (coords + cc * (1.0 + dist) * dist); |  | ||||||
|         } |  | ||||||
|         " + |  | ||||||
|  |  | ||||||
|         shaderLibrary.max2 + |  | ||||||
|         shaderLibrary.min2 + |  | ||||||
|         shaderLibrary.prod2 + |  | ||||||
|         shaderLibrary.sum2 + |  | ||||||
|  |  | ||||||
|         " |  | ||||||
|  |  | ||||||
|         vec2 positiveLog(vec2 x) { |  | ||||||
|             return clamp(log(x), vec2(0.0), vec2(100.0)); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         void main() { |  | ||||||
|             vec2 staticCoords = qt_TexCoord0; |  | ||||||
|             vec2 coords = distortCoordinates(staticCoords) * (vec2(1.0) + margin * 2.0) - margin; |  | ||||||
|  |  | ||||||
|             vec2 vignetteCoords = staticCoords * (1.0 - staticCoords.yx); |  | ||||||
|             float vignette = pow(prod2(vignetteCoords) * 15.0, 0.25); |  | ||||||
|  |  | ||||||
|             vec3 color = frameColor.rgb * vec3(1.0 - vignette); |  | ||||||
|             float alpha = 0.0; |  | ||||||
|  |  | ||||||
|             float frameShadow = max2(positiveLog(-coords * frameShadowCoeff + vec2(1.0)) + positiveLog(coords * frameShadowCoeff - (vec2(frameShadowCoeff) - vec2(1.0)))); |  | ||||||
|             frameShadow = max(sqrt(frameShadow), 0.0); |  | ||||||
|             color *= frameShadow; |  | ||||||
|             alpha = sum2(1.0 - step(vec2(0.0), coords) + step(vec2(1.0), coords)); |  | ||||||
|             alpha = clamp(alpha, 0.0, 1.0); |  | ||||||
|             alpha *= mix(1.0, 0.9, frameShadow); |  | ||||||
|  |  | ||||||
|             float screenShadow = 1.0 - prod2(positiveLog(coords * screenShadowCoeff + vec2(1.0)) * positiveLog(-coords * screenShadowCoeff + vec2(screenShadowCoeff + 1.0))); |  | ||||||
|             alpha = max(0.8 * screenShadow, alpha); |  | ||||||
|  |  | ||||||
|             gl_FragColor = vec4(color * alpha, alpha); |  | ||||||
|         } |  | ||||||
|     " |  | ||||||
|  |  | ||||||
|     onStatusChanged: if (log) console.log(log) //Print warning messages |  | ||||||
| } |  | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,9 +17,10 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
|  |  | ||||||
| Timer { | Timer{ | ||||||
|     default property bool enableTimer: false |     default property bool enableTimer: false | ||||||
|     property real time |     property real time | ||||||
|  |  | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								app/qml/fonts/1971-ibm-3278/3270Medium.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								app/qml/fonts/1971-ibm-3278/3270Medium.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										100
									
								
								app/qml/main.qml
									
									
									
									
									
								
							
							
						
						
									
										100
									
								
								app/qml/main.qml
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| /******************************************************************************* | /******************************************************************************* | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" | * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
| * https://github.com/Swordfish90/cool-retro-term | * https://github.com/Swordfish90/cool-retro-term | ||||||
| * | * | ||||||
| * This file is part of cool-retro-term. | * This file is part of cool-retro-term. | ||||||
| @@ -17,13 +17,13 @@ | |||||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| *******************************************************************************/ | *******************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | import QtQuick 2.2 | ||||||
| import QtQuick.Window 2.1 | import QtQuick.Window 2.1 | ||||||
| import QtQuick.Controls 2.3 | import QtQuick.Controls 1.1 | ||||||
|  | import QtGraphicalEffects 1.0 | ||||||
|  |  | ||||||
| import "menus" | ApplicationWindow{ | ||||||
|  |  | ||||||
| ApplicationWindow { |  | ||||||
|     id: terminalWindow |     id: terminalWindow | ||||||
|  |  | ||||||
|     width: 1024 |     width: 1024 | ||||||
| @@ -37,6 +37,8 @@ ApplicationWindow { | |||||||
|  |  | ||||||
|     // Load saved window geometry and show the window |     // Load saved window geometry and show the window | ||||||
|     Component.onCompleted: {         |     Component.onCompleted: {         | ||||||
|  |         appSettings.handleFontChanged(); | ||||||
|  |  | ||||||
|         x = appSettings.x |         x = appSettings.x | ||||||
|         y = appSettings.y |         y = appSettings.y | ||||||
|         width = appSettings.width |         width = appSettings.width | ||||||
| @@ -53,30 +55,38 @@ ApplicationWindow { | |||||||
|     property bool fullscreen: appSettings.fullscreen |     property bool fullscreen: appSettings.fullscreen | ||||||
|     onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed) |     onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed) | ||||||
|  |  | ||||||
|     menuBar: qtquickMenuLoader.item |     //Workaround: Without __contentItem a ugly thin border is visible. | ||||||
|  |     menuBar: CRTMainMenuBar{ | ||||||
|     Loader { |         id: mainMenu | ||||||
|         id: qtquickMenuLoader |         visible: (Qt.platform.os === "osx" || appSettings.showMenubar) | ||||||
|         active: !appSettings.isMacOS && appSettings.showMenubar |         __contentItem.visible: mainMenu.visible | ||||||
|         sourceComponent: WindowMenu { } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     Loader { |  | ||||||
|         id: globalMenuLoader |  | ||||||
|         active: appSettings.isMacOS |  | ||||||
|         sourceComponent: OSXMenu { } |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     property string wintitle: appSettings.wintitle |     property string wintitle: appSettings.wintitle | ||||||
|  |  | ||||||
|     color: "#00000000" |     color: "#00000000" | ||||||
|  |  | ||||||
|     title: terminalContainer.title || qsTr(appSettings.wintitle) |     title: terminalContainer.title || qsTr(appSettings.wintitle) | ||||||
|  |  | ||||||
|  | 	Action { | ||||||
|  |         id: newAction | ||||||
|  |         text: qsTr("New Window") | ||||||
|  |         shortcut: Qt.platform.os === "osx" ? StandardKey.New : "Ctrl+Shift+N" | ||||||
|  |         onTriggered: { | ||||||
|  |             root.newWindow() | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     Action { | ||||||
|  |         id: closeAction | ||||||
|  |         text: qsTr("Close Window") | ||||||
|  |         shortcut: Qt.platform.os === "osx" ? StandardKey.Close : "Ctrl+Shift+W" | ||||||
|  |         onTriggered: { | ||||||
|  |             terminalWindow.close() | ||||||
|  |         } | ||||||
|  |     } | ||||||
|     Action { |     Action { | ||||||
|         id: showMenubarAction |         id: showMenubarAction | ||||||
|         text: qsTr("Show Menubar") |         text: qsTr("Show Menubar") | ||||||
|         enabled: !appSettings.isMacOS |         enabled: Qt.platform.os !== "osx" | ||||||
|         shortcut: "Ctrl+Shift+M" |         shortcut: "Ctrl+Shift+M" | ||||||
|         checkable: true |         checkable: true | ||||||
|         checked: appSettings.showMenubar |         checked: appSettings.showMenubar | ||||||
| @@ -85,9 +95,9 @@ ApplicationWindow { | |||||||
|     Action { |     Action { | ||||||
|         id: fullscreenAction |         id: fullscreenAction | ||||||
|         text: qsTr("Fullscreen") |         text: qsTr("Fullscreen") | ||||||
|         enabled: !appSettings.isMacOS |         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 | ||||||
|     } |     } | ||||||
| @@ -95,76 +105,74 @@ 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{ | ||||||
|         id: copyAction |         id: copyAction | ||||||
|         text: qsTr("Copy") |         text: qsTr("Copy") | ||||||
|         shortcut: "Ctrl+Shift+C" |         shortcut: "Ctrl+Shift+C" | ||||||
|     } |     } | ||||||
|     Action { |     Action{ | ||||||
|         id: pasteAction |         id: pasteAction | ||||||
|         text: qsTr("Paste") |         text: qsTr("Paste") | ||||||
|         shortcut: "Ctrl+Shift+V" |         shortcut: "Ctrl+Shift+V" | ||||||
|     } |     } | ||||||
|     Action { |     Action{ | ||||||
|         id: zoomIn |         id: zoomIn | ||||||
|         text: qsTr("Zoom In") |         text: qsTr("Zoom In") | ||||||
|         shortcut: "Ctrl++" |         shortcut: "Ctrl++" | ||||||
|         onTriggered: appSettings.incrementScaling() |         onTriggered: appSettings.incrementScaling(); | ||||||
|     } |     } | ||||||
|     Action { |     Action{ | ||||||
|         id: zoomOut |         id: zoomOut | ||||||
|         text: qsTr("Zoom Out") |         text: qsTr("Zoom Out") | ||||||
|         shortcut: "Ctrl+-" |         shortcut: "Ctrl+-" | ||||||
|         onTriggered: appSettings.decrementScaling() |         onTriggered: appSettings.decrementScaling(); | ||||||
|     } |     } | ||||||
|     Action { |     Action{ | ||||||
|         id: showAboutAction |         id: showAboutAction | ||||||
|         text: qsTr("About") |         text: qsTr("About") | ||||||
|         onTriggered: { |         onTriggered: { | ||||||
|             aboutDialog.show() |             aboutDialog.show(); | ||||||
|             aboutDialog.requestActivate() |             aboutDialog.requestActivate(); | ||||||
|             aboutDialog.raise() |             aboutDialog.raise(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     ApplicationSettings { |     ApplicationSettings{ | ||||||
|         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)) | ||||||
|     } |     } | ||||||
|     SettingsWindow { |     SettingsWindow{ | ||||||
|         id: settingswindow |         id: settingswindow | ||||||
|         visible: false |         visible: false | ||||||
|     } |     } | ||||||
|     AboutDialog { |     AboutDialog{ | ||||||
|         id: aboutDialog |         id: aboutDialog | ||||||
|         visible: false |         visible: false | ||||||
|     } |     } | ||||||
|     Loader { |     Loader{ | ||||||
|         anchors.centerIn: parent |         anchors.centerIn: parent | ||||||
|         active: appSettings.showTerminalSize |         active: appSettings.showTerminalSize | ||||||
|         sourceComponent: SizeOverlay { |         sourceComponent: SizeOverlay{ | ||||||
|             z: 3 |             z: 3 | ||||||
|             terminalSize: terminalContainer.terminalSize |             terminalSize: terminalContainer.terminalSize | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     onClosing: { |     onClosing: { | ||||||
|         // OSX Since we are currently supporting only one window |         root.closeWindow() | ||||||
|         // quit the application when it is closed. |  | ||||||
|         if (appSettings.isMacOS) |  | ||||||
|             Qt.quit() |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,95 +0,0 @@ | |||||||
| /******************************************************************************* |  | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" |  | ||||||
| * https://github.com/Swordfish90/cool-retro-term |  | ||||||
| * |  | ||||||
| * This file is part of cool-retro-term. |  | ||||||
| * |  | ||||||
| * cool-retro-term is free software: you can redistribute it and/or modify |  | ||||||
| * it under the terms of the GNU General Public License as published by |  | ||||||
| * the Free Software Foundation, either version 3 of the License, or |  | ||||||
| * (at your option) any later version. |  | ||||||
| * |  | ||||||
| * This program is distributed in the hope that it will be useful, |  | ||||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
| * GNU General Public License for more details. |  | ||||||
| * |  | ||||||
| * You should have received a copy of the GNU General Public License |  | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. |  | ||||||
| *******************************************************************************/ |  | ||||||
| import QtQuick 2.2 |  | ||||||
| import QtQuick.Controls 2.3 |  | ||||||
|  |  | ||||||
| Menu { |  | ||||||
|     id: contextmenu |  | ||||||
|     MenuItem { |  | ||||||
|         action: copyAction |  | ||||||
|     } |  | ||||||
|     MenuItem { |  | ||||||
|         action: pasteAction |  | ||||||
|     } |  | ||||||
|     MenuItem { |  | ||||||
|         action: showsettingsAction |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     MenuSeparator {} |  | ||||||
|  |  | ||||||
|     Menu { |  | ||||||
|         title: qsTr("File") |  | ||||||
|         MenuItem { |  | ||||||
|             action: quitAction |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     Menu { |  | ||||||
|         title: qsTr("Edit") |  | ||||||
|         MenuItem { |  | ||||||
|             action: copyAction |  | ||||||
|         } |  | ||||||
|         MenuItem { |  | ||||||
|             action: pasteAction |  | ||||||
|         } |  | ||||||
|         MenuSeparator {} |  | ||||||
|         MenuItem { |  | ||||||
|             action: showsettingsAction |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     Menu { |  | ||||||
|         title: qsTr("View") |  | ||||||
|         MenuItem { |  | ||||||
|             action: fullscreenAction |  | ||||||
|             visible: fullscreenAction.enabled |  | ||||||
|         } |  | ||||||
|         MenuItem { |  | ||||||
|             action: showMenubarAction |  | ||||||
|             visible: showMenubarAction.enabled |  | ||||||
|         } |  | ||||||
|         MenuItem { |  | ||||||
|             action: zoomIn |  | ||||||
|         } |  | ||||||
|         MenuItem { |  | ||||||
|             action: zoomOut |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     Menu { |  | ||||||
|         id: profilesMenu |  | ||||||
|         title: qsTr("Profiles") |  | ||||||
|         Instantiator { |  | ||||||
|             model: appSettings.profilesList |  | ||||||
|             delegate: MenuItem { |  | ||||||
|                 text: model.text |  | ||||||
|                 onTriggered: { |  | ||||||
|                     appSettings.loadProfileString(obj_string) |  | ||||||
|                     appSettings.handleFontChanged() |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             onObjectAdded: profilesMenu.insertItem(index, object) |  | ||||||
|             onObjectRemoved: profilesMenu.removeItem(object) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     Menu { |  | ||||||
|         title: qsTr("Help") |  | ||||||
|         MenuItem { |  | ||||||
|             action: showAboutAction |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,89 +0,0 @@ | |||||||
| /******************************************************************************* |  | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" |  | ||||||
| * https://github.com/Swordfish90/cool-retro-term |  | ||||||
| * |  | ||||||
| * This file is part of cool-retro-term. |  | ||||||
| * |  | ||||||
| * cool-retro-term is free software: you can redistribute it and/or modify |  | ||||||
| * it under the terms of the GNU General Public License as published by |  | ||||||
| * the Free Software Foundation, either version 3 of the License, or |  | ||||||
| * (at your option) any later version. |  | ||||||
| * |  | ||||||
| * This program is distributed in the hope that it will be useful, |  | ||||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
| * GNU General Public License for more details. |  | ||||||
| * |  | ||||||
| * You should have received a copy of the GNU General Public License |  | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. |  | ||||||
| *******************************************************************************/ |  | ||||||
|  |  | ||||||
| import QtQuick 2.3 |  | ||||||
| import Qt.labs.platform 1.1 |  | ||||||
|  |  | ||||||
| MenuBar { |  | ||||||
|     id: defaultMenuBar |  | ||||||
|  |  | ||||||
|     Menu { |  | ||||||
|         title: qsTr("File") |  | ||||||
|         MenuItem { |  | ||||||
|             text: quitAction.text |  | ||||||
|             onTriggered: quitAction.trigger() |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     Menu { |  | ||||||
|         title: qsTr("Edit") |  | ||||||
|         MenuItem { |  | ||||||
|             text: copyAction.text |  | ||||||
|             shortcut: "Meta+C" |  | ||||||
|             onTriggered: copyAction.trigger() |  | ||||||
|         } |  | ||||||
|         MenuItem { |  | ||||||
|             text: pasteAction.text |  | ||||||
|             shortcut: "Meta+V" |  | ||||||
|             onTriggered: pasteAction.trigger() |  | ||||||
|         } |  | ||||||
|         MenuSeparator {} |  | ||||||
|         MenuItem { |  | ||||||
|             text: showsettingsAction.text |  | ||||||
|             shortcut: showsettingsAction.shortcut |  | ||||||
|             onTriggered: showsettingsAction.trigger() |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     Menu { |  | ||||||
|         title: qsTr("View") |  | ||||||
|         MenuItem { |  | ||||||
|             text: zoomIn.text |  | ||||||
|             shortcut: "Meta++" |  | ||||||
|             onTriggered: zoomIn.trigger() |  | ||||||
|         } |  | ||||||
|         MenuItem { |  | ||||||
|             text: zoomOut.text |  | ||||||
|             shortcut: "Meta+-" |  | ||||||
|             onTriggered: zoomOut.trigger() |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     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 { |  | ||||||
|             text: showAboutAction.text |  | ||||||
|             onTriggered: showAboutAction.trigger() |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,31 +0,0 @@ | |||||||
| /******************************************************************************* |  | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" |  | ||||||
| * https://github.com/Swordfish90/cool-retro-term |  | ||||||
| * |  | ||||||
| * This file is part of cool-retro-term. |  | ||||||
| * |  | ||||||
| * cool-retro-term is free software: you can redistribute it and/or modify |  | ||||||
| * it under the terms of the GNU General Public License as published by |  | ||||||
| * the Free Software Foundation, either version 3 of the License, or |  | ||||||
| * (at your option) any later version. |  | ||||||
| * |  | ||||||
| * This program is distributed in the hope that it will be useful, |  | ||||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
| * GNU General Public License for more details. |  | ||||||
| * |  | ||||||
| * You should have received a copy of the GNU General Public License |  | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. |  | ||||||
| *******************************************************************************/ |  | ||||||
| import QtQuick 2.2 |  | ||||||
| import QtQuick.Controls 2.3 |  | ||||||
|  |  | ||||||
| Menu { |  | ||||||
|     id: contextmenu |  | ||||||
|     MenuItem { |  | ||||||
|         action: copyAction |  | ||||||
|     } |  | ||||||
|     MenuItem { |  | ||||||
|         action: pasteAction |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,85 +0,0 @@ | |||||||
| /******************************************************************************* |  | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" |  | ||||||
| * https://github.com/Swordfish90/cool-retro-term |  | ||||||
| * |  | ||||||
| * This file is part of cool-retro-term. |  | ||||||
| * |  | ||||||
| * cool-retro-term is free software: you can redistribute it and/or modify |  | ||||||
| * it under the terms of the GNU General Public License as published by |  | ||||||
| * the Free Software Foundation, either version 3 of the License, or |  | ||||||
| * (at your option) any later version. |  | ||||||
| * |  | ||||||
| * This program is distributed in the hope that it will be useful, |  | ||||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
| * GNU General Public License for more details. |  | ||||||
| * |  | ||||||
| * You should have received a copy of the GNU General Public License |  | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. |  | ||||||
| *******************************************************************************/ |  | ||||||
| import QtQuick 2.2 |  | ||||||
| import QtQuick.Controls 2.3 |  | ||||||
|  |  | ||||||
| MenuBar { |  | ||||||
|     id: defaultMenuBar |  | ||||||
|     visible: appSettings.showMenubar |  | ||||||
|  |  | ||||||
|     Menu { |  | ||||||
|         title: qsTr("File") |  | ||||||
|         MenuItem { |  | ||||||
|             action: quitAction |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     Menu { |  | ||||||
|         title: qsTr("Edit") |  | ||||||
|         MenuItem { |  | ||||||
|             action: copyAction |  | ||||||
|         } |  | ||||||
|         MenuItem { |  | ||||||
|             action: pasteAction |  | ||||||
|         } |  | ||||||
|         MenuSeparator {} |  | ||||||
|         MenuItem { |  | ||||||
|             action: showsettingsAction |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     Menu { |  | ||||||
|         title: qsTr("View") |  | ||||||
|         MenuItem { |  | ||||||
|             action: fullscreenAction |  | ||||||
|             visible: fullscreenAction.enabled |  | ||||||
|         } |  | ||||||
|         MenuItem { |  | ||||||
|             action: showMenubarAction |  | ||||||
|             visible: showMenubarAction.enabled |  | ||||||
|         } |  | ||||||
|         MenuItem { |  | ||||||
|             action: zoomIn |  | ||||||
|         } |  | ||||||
|         MenuItem { |  | ||||||
|             action: zoomOut |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     Menu { |  | ||||||
|         id: profilesMenu |  | ||||||
|         title: qsTr("Profiles") |  | ||||||
|         Instantiator { |  | ||||||
|             model: appSettings.profilesList |  | ||||||
|             delegate: MenuItem { |  | ||||||
|                 text: model.text |  | ||||||
|                 onTriggered: { |  | ||||||
|                     appSettings.loadProfileString(obj_string) |  | ||||||
|                     appSettings.handleFontChanged() |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             onObjectAdded: profilesMenu.insertItem(index, object) |  | ||||||
|             onObjectRemoved: profilesMenu.removeItem(object) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     Menu { |  | ||||||
|         title: qsTr("Help") |  | ||||||
|         MenuItem { |  | ||||||
|             action: showAboutAction |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -12,15 +12,18 @@ | |||||||
|         <file>TimeManager.qml</file> |         <file>TimeManager.qml</file> | ||||||
|         <file>SimpleSlider.qml</file> |         <file>SimpleSlider.qml</file> | ||||||
|         <file>ColorButton.qml</file> |         <file>ColorButton.qml</file> | ||||||
|  |         <file>Glossy.qml</file> | ||||||
|         <file>AboutDialog.qml</file> |         <file>AboutDialog.qml</file> | ||||||
|         <file>InsertNameDialog.qml</file> |         <file>InsertNameDialog.qml</file> | ||||||
|         <file>SettingsEffectsTab.qml</file> |         <file>SettingsEffectsTab.qml</file> | ||||||
|         <file>main.qml</file> |         <file>main.qml</file> | ||||||
|  |         <file>root.qml</file> | ||||||
|         <file>SettingsTerminalTab.qml</file> |         <file>SettingsTerminalTab.qml</file> | ||||||
|         <file>FontScanlines.qml</file> |         <file>FontScanlines.qml</file> | ||||||
|         <file>fonts/1977-apple2/PrintChar21.ttf</file> |         <file>fonts/1977-apple2/PrintChar21.ttf</file> | ||||||
|         <file>fonts/1971-ibm-3278/3270-Regular.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> | ||||||
| @@ -40,11 +43,7 @@ | |||||||
|         <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>TerminalFrame.qml</file> |         <file>NewTerminalFrame.qml</file> | ||||||
|         <file>menus/WindowMenu.qml</file> |         <file>SlowBurnIn.qml</file> | ||||||
|         <file>menus/FullContextMenu.qml</file> |  | ||||||
|         <file>menus/ShortContextMenu.qml</file> |  | ||||||
|         <file>ShaderLibrary.qml</file> |  | ||||||
|         <file>menus/OSXMenu.qml</file> |  | ||||||
|     </qresource> |     </qresource> | ||||||
| </RCC> | </RCC> | ||||||
|   | |||||||
							
								
								
									
										43
									
								
								app/qml/root.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								app/qml/root.qml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | |||||||
|  | /******************************************************************************* | ||||||
|  |  * Copyright (c) 2013 "Filippo Scognamiglio" | ||||||
|  |  * https://github.com/Swordfish90/cool-retro-term | ||||||
|  |  * | ||||||
|  |  * This file is part of cool-retro-term. | ||||||
|  |  * | ||||||
|  |  * cool-retro-term is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  *******************************************************************************/ | ||||||
|  | import QtQuick 2.2 | ||||||
|  | import QtQuick.Window 2.1 | ||||||
|  |  | ||||||
|  | QtObject { | ||||||
|  |     id: root | ||||||
|  |     property int terminalCount | ||||||
|  |  | ||||||
|  |     function newWindow() { | ||||||
|  |         var component = Qt.createComponent("main.qml") | ||||||
|  |         var window = component.createObject()			 | ||||||
|  |         window.show() | ||||||
|  |         terminalCount = terminalCount + 1 | ||||||
|  |     } | ||||||
|  |     function closeWindow() { | ||||||
|  |         terminalCount = terminalCount - 1 | ||||||
|  |         if (terminalCount == 0) { | ||||||
|  |             Qt.quit() | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     Component.onCompleted: { | ||||||
|  |         terminalCount = 0 | ||||||
|  |         root.newWindow() | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,23 +1,3 @@ | |||||||
| /******************************************************************************* |  | ||||||
| * Copyright (c) 2013-2021 "Filippo Scognamiglio" |  | ||||||
| * https://github.com/Swordfish90/cool-retro-term |  | ||||||
| * |  | ||||||
| * This file is part of cool-retro-term. |  | ||||||
| * |  | ||||||
| * cool-retro-term is free software: you can redistribute it and/or modify |  | ||||||
| * it under the terms of the GNU General Public License as published by |  | ||||||
| * the Free Software Foundation, either version 3 of the License, or |  | ||||||
| * (at your option) any later version. |  | ||||||
| * |  | ||||||
| * This program is distributed in the hope that it will be useful, |  | ||||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
| * GNU General Public License for more details. |  | ||||||
| * |  | ||||||
| * You should have received a copy of the GNU General Public License |  | ||||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. |  | ||||||
| *******************************************************************************/ |  | ||||||
|  |  | ||||||
| .pragma library | .pragma library | ||||||
| function clamp(x, min, max) { | function clamp(x, min, max) { | ||||||
|     if (x <= min) |     if (x <= min) | ||||||
| @@ -26,23 +6,15 @@ function clamp(x, min, max) { | |||||||
|         return max; |         return max; | ||||||
|     return x; |     return x; | ||||||
| } | } | ||||||
|  |  | ||||||
| function lint(a, b, t) { | function lint(a, b, t) { | ||||||
|     return (1 - t) * a + (t) * b; |     return (1 - t) * a + (t) * b; | ||||||
| } | } | ||||||
|  | function mix(c1, c2, alpha){ | ||||||
| function mix(c1, c2, alpha) { |  | ||||||
|     return Qt.rgba(c1.r * alpha + c2.r * (1-alpha), |     return Qt.rgba(c1.r * alpha + c2.r * (1-alpha), | ||||||
|                    c1.g * alpha + c2.g * (1-alpha), |                    c1.g * alpha + c2.g * (1-alpha), | ||||||
|                    c1.b * alpha + c2.b * (1-alpha), |                    c1.b * alpha + c2.b * (1-alpha), | ||||||
|                    c1.a * alpha + c2.a * (1-alpha)) |                    c1.a * alpha + c2.a * (1-alpha)) | ||||||
| } | } | ||||||
|  |  | ||||||
| function 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; | ||||||
|   | |||||||
 Submodule qmltermwidget updated: 63228027e1...48274c7566
									
								
							| @@ -66,6 +66,4 @@ parts: | |||||||
|       - libgl1-mesa-dev |       - libgl1-mesa-dev | ||||||
|       - qtdeclarative5-dev-tools |       - qtdeclarative5-dev-tools | ||||||
|       - qml-module-qtquick-extras |       - qml-module-qtquick-extras | ||||||
|       - qml-module-qt-labs-settings |  | ||||||
|       - qml-module-qt-labs-folderlistmodel |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user