Compare commits

..

No commits in common. "master" and "1.1.0" have entirely different histories.

45 changed files with 1726 additions and 2396 deletions

4
.github/FUNDING.yml vendored
View File

@ -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&currency_code=EUR&source=url']

View File

@ -1,98 +0,0 @@
name: "ci"
on:
push:
tags: "**"
workflow_dispatch:
defaults:
run:
shell: bash
jobs:
appimage:
runs-on: ubuntu-18.04
steps:
- name: Checkout repository
uses: actions/checkout@v2
with:
submodules: true
- name: Install dependencies
run: |
sudo add-apt-repository -y ppa:beineri/opt-qt-5.15.2-bionic
sudo apt-get update -qq
sudo apt-get install -y \
build-essential make wget libgl1-mesa-dev \
qt515declarative qt515graphicaleffects \
qt515quickcontrols qt515quickcontrols2
- name: Download QT appimage builder
run: |
wget -c -O linuxdeployqt.AppImage \
https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
chmod a+x linuxdeployqt.AppImage
- name: Build project
run: |
source /opt/qt*/bin/qt*-env.sh && \
qmake -v && \
qmake CONFIG+=release PREFIX=/usr && \
make -j$(nproc)
- name: Install to appdir
run: |
source /opt/qt*/bin/qt*-env.sh && \
make INSTALL_ROOT=appdir -j$(nproc) install
- name: Extract version number
run: |
# Extract version for linuxdeployqt to name the file. Use the tag as
# release name but remove prefix.
echo "VERSION=$(echo '${{ github.ref }}' | sed 's;.*/;;')" >> $GITHUB_ENV
- name: Build appimage directory
run: |
mkdir -p \
appdir/usr/bin \
appdir/usr/lib \
appdir/usr/share/applications \
appdir/usr/share/metainfo \
appdir/usr/share/icons/hicolor/128x128/apps
cp cool-retro-term appdir/usr/bin/
cp cool-retro-term.desktop appdir/usr/share/applications/
cp packaging/appdata/cool-retro-term.appdata.xml appdir/usr/share/metainfo/
cp app/icons/128x128/cool-retro-term.png appdir/usr/share/icons/hicolor/128x128/apps/
cp -r ./app/qml appdir/usr/
# Workaround for https://github.com/probonopd/linuxdeployqt/issues/78
cp -r ./qmltermwidget/QMLTermWidget appdir/usr/qml/
find appdir | sort
- name: Build appimage
run: |
source /opt/qt*/bin/qt*-env.sh && \
./linuxdeployqt.AppImage appdir/usr/share/applications/cool-retro-term.desktop \
-verbose=1 -appimage \
-qmldir=./app/qml/ \
-qmldir=./qmltermwidget/
env:
# Unset environment variables
QTDIR:
QT_PLUGIN_PATH:
LD_LIBRARY_PATH:
- name: Upload release
uses: softprops/action-gh-release@v1
with:
body: appimage release
files: ./**/Cool_Retro_Term-*-x86_64.AppImage
- name: Clean up
if: always()
run: |
find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq
make clean
rm -rf appdir

4
.gitignore vendored
View File

@ -18,7 +18,6 @@
*.pro.user.* *.pro.user.*
*.moc *.moc
moc_*.cpp moc_*.cpp
moc_*.h
qrc_*.cpp qrc_*.cpp
ui_*.h ui_*.h
Makefile* Makefile*
@ -48,6 +47,3 @@ cool-retro-term
.DS_Store .DS_Store
*.app *.app
# IntelliJ
.idea

View File

@ -1,37 +0,0 @@
sudo: required
dist: trusty
language: c++
install:
- sudo add-apt-repository -y ppa:beineri/opt-qt58-trusty
- sudo apt-get update -qq
- sudo apt-get -y install build-essential qt58declarative qt58graphicaleffects qt58quickcontrols libgl1-mesa-dev
- source /opt/qt*/bin/qt*-env.sh
script:
- qmake CONFIG+=release PREFIX=/usr
- make -j$(nproc)
- mkdir -p appdir/usr/share/metainfo appdir/usr/bin
- cp packaging/appdata/cool-retro-term.appdata.xml appdir/usr/share/metainfo/
- cp cool-retro-term appdir/usr/bin/
- cp ./cool-retro-term.desktop appdir/
- cp ./app/icons/128x128/cool-retro-term.png appdir/
- cp -r ./app/qml appdir/usr/
- cp -r ./qmltermwidget/QMLTermWidget appdir/usr/qml/ # Workaround for https://github.com/probonopd/linuxdeployqt/issues/78
- wget -c https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
- chmod a+x linuxdeployqt-*.AppImage
- unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH
- export VERSION=$(git rev-parse --short HEAD) # linuxdeployqt uses this for naming the file
- ./linuxdeployqt-*.AppImage appdir/usr/bin/cool-retro-term -qmldir=./app/qml/ -qmldir=./qmltermwidget/ # -verbose=3 2>&1 | grep "path:" -C 3
- ./linuxdeployqt-*.AppImage appdir/usr/bin/cool-retro-term -qmldir=./app/qml/ -qmldir=./qmltermwidget/ -verbose=2 -appimage
after_success:
- find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq
- # curl --upload-file Cool*.AppImage https://transfer.sh/Cool_Retro_Term-git.$(git rev-parse --short HEAD)-x86_64.AppImage
- wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh
- bash upload.sh Cool*.AppImage*
branches:
except:
- # Do not build tags that we create when we upload to GitHub Releases
- /^(?i:continuous)/

173
README.md
View File

@ -8,23 +8,172 @@
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
![Image](<https://i.imgur.com/TNumkDn.png>) ![Image](<http://i.imgur.com/I6wq1cC.png>)
![Image](<https://i.imgur.com/hfjWOM4.png>) ![Image](<http://i.imgur.com/12EqlpL.png>)
![Image](<https://i.imgur.com/GYRDPzJ.jpg>) ![Image](<http://i.imgur.com/Lx0acQz.jpg>)
## Install ## Get cool-retro-term
You can either build cool-retro-term yourself (see below) or walk the easy way and install one of these 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). Fedora has the `cool-retro-term` in the offcial repositories. All you have to do is `sudo dnf install cool-retro-term`.
Alternatively, most distributions such as Ubuntu, Fedora or Arch already package cool-retro-term in their official repositories. Users of openSUSE can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term).
## Building Arch users can install this [package](https://aur.archlinux.org/packages/cool-retro-term-git/) directly via the [AUR](https://aur.archlinux.org):
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)). 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 second release "1.0.1" 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.0.1::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!
Ubuntu users of 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)
macOS users can grab the latest dmg from the release page: https://github.com/Swordfish90/cool-retro-term/releases
## Build instructions (Linux)
## 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&currency_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.

View File

@ -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/../
@ -16,7 +16,7 @@ macx:ICON = icons/crt.icns
RESOURCES += qml/resources.qrc RESOURCES += qml/resources.qrc
######################################### #########################################
## INSTALLS ## INTALLS
######################################### #########################################
target.path += /usr/bin/ target.path += /usr/bin/

View File

@ -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,43 +33,15 @@ 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)
setenv("QSG_RENDER_LOOP", "threaded", 0);
#endif
#if defined(Q_OS_MAC) #if defined(Q_OS_MAC)
// This allows UTF-8 characters usage in OSX. // This allows UTF-8 characters usage in OSX.
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]" << '\n';
cout << " --default-settings Run cool-retro-term with the default settings" << '\n';
cout << " --workdir <dir> Change working directory to 'dir'" << '\n';
cout << " -e <cmd> Command to execute. This option will catch all following arguments, so use it as the last option." << '\n';
cout << " -T <title> Set window title to 'title'." << '\n';
cout << " --fullscreen Run cool-retro-term in fullscreen." << '\n';
cout << " -p|--profile <prof> Run cool-retro-term with the given profile." << '\n';
cout << " -h|--help Print this help." << '\n';
cout << " --verbose Print additional information such as profiles and settings." << '\n';
cout << " -v|--version Print the program name and version." << '\n';
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 << '\n';
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;
@ -83,11 +53,27 @@ 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;
}
if (args.contains("-v") || args.contains("--version")) {
qDebug() << "cool-retro-term 1.0.1";
return 0;
}
// Manage default command // Manage default command
QStringList cmdList; QStringList cmdList;
@ -96,7 +82,6 @@ int main(int argc, char *argv[])
} }
QVariant command(cmdList.empty() ? QVariant() : cmdList[0]); QVariant command(cmdList.empty() ? QVariant() : cmdList[0]);
QVariant commandArgs(cmdList.size() <= 1 ? QVariant() : QVariant(cmdList.mid(1))); QVariant commandArgs(cmdList.size() <= 1 ? QVariant() : QVariant(cmdList.mid(1)));
engine.rootContext()->setContextProperty("appVersion", appVersion);
engine.rootContext()->setContextProperty("defaultCmd", command); engine.rootContext()->setContextProperty("defaultCmd", command);
engine.rootContext()->setContextProperty("defaultCmdArgs", commandArgs); engine.rootContext()->setContextProperty("defaultCmdArgs", commandArgs);

View File

@ -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 readOnly: true
TextArea { text: "Copyright (c) 2013 Filippo Scognamiglio <flscogna@gmail.com>\n\n" +
readOnly: true "https://github.com/Swordfish90/cool-retro-term\n\n" +
wrapMode: TextEdit.Wrap
text: "Copyright (c) 2013-2021 Filippo Scognamiglio <flscogna@gmail.com>\n\n" "cool-retro-term is free software: you can redistribute it and/or modify " +
+ "https://github.com/Swordfish90/cool-retro-term\n\n" + "it under the terms of the GNU General Public License as published by " +
"cool-retro-term is free software: you can redistribute it and/or modify " "the Free Software Foundation, either version 3 of the License, or " +
+ "it under the terms of the GNU General Public License as published by " "(at your option) any later version.\n\n" +
+ "the Free Software Foundation, either version 3 of the License, or "
+ "(at your option) any later version.\n\n" + "This program is distributed in the hope that it will be useful, " +
"This program is distributed in the hope that it will be useful, " "but WITHOUT ANY WARRANTY; without even the implied warranty of " +
+ "but WITHOUT ANY WARRANTY; without even the implied warranty of " "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " +
+ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public License for more details.\n\n" +
+ "GNU General Public License for more details.\n\n" +
"You should have received a copy of the GNU General Public License " "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/>."
}
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,22 +1,3 @@
/*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
*
* cool-retro-term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.0 import QtQuick 2.0
import "utils.js" as Utils import "utils.js" as Utils
@ -29,34 +10,39 @@ 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: 160
property real _maxBurnInFadeTime: appSettings.maxBurnInFadeTime property real _maxBurnInFadeTime: 1600
active: appSettings.burnIn !== 0 active: appSettings.burnIn !== 0
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() { function restartBlurSource(){
prevLastUpdate = timeManager.time prevLastUpdate = timeManager.time;
lastUpdate = prevLastUpdate lastUpdate = prevLastUpdate;
completelyUpdate() completelyUpdate();
} }
sourceComponent: Item { sourceComponent: Item {
property alias source: burnInEffectSource property alias source: burnInEffectSource
property int burnInScaling: scaleTexture * appSettings.burnInQuality
width: appSettings.lowResolutionFont
? kterminal.totalWidth * Math.max(1, burnInScaling)
: kterminal.totalWidth * scaleTexture * appSettings.burnInQuality
height: appSettings.lowResolutionFont
? kterminal.totalHeight * Math.max(1, burnInScaling)
: kterminal.totalHeight * scaleTexture * appSettings.burnInQuality
ShaderEffectSource { ShaderEffectSource {
id: burnInEffectSource id: burnInEffectSource
@ -75,35 +61,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: {
burnInEffect.restartBlurSource()
}
onRasterizationChanged: {
burnInEffect.restartBlurSource()
}
onBurnInQualityChanged: {
burnInEffect.restartBlurSource()
}
} }
}
ShaderLibrary { Connections {
id: shaderLibrary target: kterminalScrollbar
onOpacityChanged: completelyUpdate()
}
} }
ShaderEffect { ShaderEffect {
@ -116,6 +88,7 @@ Loader {
property real prevLastUpdate: burnInEffect.prevLastUpdate property real prevLastUpdate: burnInEffect.prevLastUpdate
anchors.fill: parent anchors.fill: parent
blending: false blending: false
fragmentShader: fragmentShader:
@ -135,7 +108,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;

View File

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

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@ -17,8 +17,9 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Controls 2.0 import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import "Components" import "Components"
@ -27,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) + "%"
} }
} }

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@ -17,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;
} }
} }

View File

@ -1,7 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@ -19,14 +17,19 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 2.0 import QtQuick.Controls 1.0
import QtQuick.Layouts 1.0
// This component is simply a label with a predefined size. // This component is simply a label with a predefined size.
// Used to improve alignment. // Used to improve alignment.
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 }
}
} }

View File

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

View File

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

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@ -17,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,27 +234,25 @@ 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) { console.log("Adding system font: ", families[i])
console.log("Adding system font: ", families[i])
}
fontlist.append(convertToListElement(families[i])) fontlist.append(convertToListElement(families[i]))
} }
} }
function convertToListElement(family) { function convertToListElement(family) {
return { return {
"name": "System: " + family, name: "System: " + family,
"text": qsTr("System: ") + family, text: qsTr("System: ") + family,
"source": "", source: "",
"lineSpacing": 0.1, lineSpacing: 0.1,
"pixelSize": 30, pixelSize: 30,
"fontWidth": 1.0, fontWidth: 1.0,
"baseScaling": 1.0, baseScaling: 1.0,
"lowResolutionFont": false, lowResolutionFont: false,
"isSystemFont": true, isSystemFont: true,
"family": family family: family
} }
} }
} }

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

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

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@ -17,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()
} }

View 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(0.0, 1.0, sqrt(outShadow));
color += frameColor.rgb * outShadow;
alpha = sum2(1.0 - smoothstep(vec2(0.0), aadelta, coords) + smoothstep(vec2(1.0) - aadelta, vec2(1.0), coords));
alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, outShadow);
float inShadow = 1.0 - prod2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords));
inShadow = 0.5 * inShadow * inShadow;
alpha = max(alpha, inShadow);
gl_FragColor = vec4(color * alpha, alpha);
}
"
onStatusChanged: if (log) console.log(log) //Print warning messages
}

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-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{
@ -44,90 +43,45 @@ 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()
}
}
Connections {
target: pasteActionAlt
onTriggered: {
kterminal.pasteSelection()
}
} }
//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()
}
onFontWidthChanged: {
terminalContainer.updateSources()
}
} }
Connections { 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 margin: appSettings.margin / screenScaling
property int margin: appSettings.totalMargin / screenScaling
property int totalWidth: Math.floor(parent.width / (screenScaling * fontWidth)) property int totalWidth: Math.floor(parent.width / (screenScaling * fontWidth))
property int totalHeight: Math.floor(parent.height / screenScaling) property int totalHeight: Math.floor(parent.height / screenScaling)
property int rawWidth: totalWidth - 2 * margin width: totalWidth - 2 * margin
property int rawHeight: totalHeight - 2 * margin height: totalHeight - 2 * margin
textureSize: Qt.size(width / textureResolutionScale, height / textureResolutionScale)
width: ensureMultiple(rawWidth, devicePixelRatio)
height: ensureMultiple(rawHeight, devicePixelRatio)
/** Ensure size is a multiple of factor. This is needed for pixel perfect scaling on highdpi screens. */
function ensureMultiple(size, factor) {
return Math.round(size / factor) * factor;
}
colorScheme: "cool-retro-term" colorScheme: "cool-retro-term"
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
@ -175,7 +129,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"]);
} }
@ -189,28 +143,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
@ -251,8 +213,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{
@ -265,22 +227,7 @@ Item{
sourceRect: Qt.rect(-kterminal.margin, -kterminal.margin, kterminal.totalWidth, kterminal.totalHeight) sourceRect: Qt.rect(-kterminal.margin, -kterminal.margin, kterminal.totalWidth, kterminal.totalHeight)
} }
Item { BurnInEffect {
id: burnInContainer id: burnInEffect
property int burnInScaling: scaleTexture * appSettings.burnInQuality
width: Math.round(appSettings.lowResolutionFont
? kterminal.totalWidth * Math.max(1, burnInScaling)
: kterminal.totalWidth * scaleTexture * appSettings.burnInQuality)
height: Math.round(appSettings.lowResolutionFont
? kterminal.totalHeight * Math.max(1, burnInScaling)
: kterminal.totalHeight * scaleTexture * appSettings.burnInQuality)
BurnInEffect {
id: burnInEffect
}
} }
} }

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@ -17,142 +17,122 @@
* 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{
Layout.fillWidth: true anchors.fill: parent
title: qsTr("Command")
ColumnLayout { GroupBox{
anchors.fill: parent Layout.fillWidth: true
CheckBox { title: qsTr("Command")
id: useCustomCommand ColumnLayout {
text: qsTr("Use custom command instead of shell at startup") anchors.fill: parent
checked: appSettings.useCustomCommand CheckBox{
onCheckedChanged: appSettings.useCustomCommand = checked id: useCustomCommand
} text: qsTr("Use custom command instead of shell at startup")
// Workaround for QTBUG-31627 for pre 5.3.0 checked: appSettings.useCustomCommand
Binding { onCheckedChanged: appSettings.useCustomCommand = checked
target: useCustomCommand }
property: "checked" // Workaround for QTBUG-31627 for pre 5.3.0
value: appSettings.useCustomCommand Binding{
} target: useCustomCommand
TextField { property: "checked"
id: customCommand value: appSettings.useCustomCommand
Layout.fillWidth: true }
text: appSettings.customCommand TextField{
enabled: useCustomCommand.checked id: customCommand
onEditingFinished: appSettings.customCommand = text Layout.fillWidth: true
text: appSettings.customCommand
// Save text even if user forgets to press enter or unfocus enabled: useCustomCommand.checked
function saveSetting() { onEditingFinished: appSettings.customCommand = text
appSettings.customCommand = text
// Save text even if user forgets to press enter or unfocus
function saveSetting() {
appSettings.customCommand = text;
}
Component.onCompleted: settings_window.closing.connect(saveSetting)
} }
Component.onCompleted: settings_window.closing.connect(
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{
} Layout.fillWidth: true
Slider { id: fpsSlider
Layout.fillWidth: true onValueChanged: {
Layout.columnSpan: 2 if (enabled) {
id: fpsSlider appSettings.fps = value !== 60 ? value + 1 : 0;
onValueChanged: { }
if (enabled) { }
appSettings.fps = value !== 60 ? value + 1 : 0 stepSize: 1
enabled: false
Component.onCompleted: {
minimumValue = 0;
maximumValue = 60;
value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60;
enabled = true;
} }
} }
stepSize: 1
enabled: false
Component.onCompleted: {
from = 0
to = 60
value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60
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") id: txtslider
} onValueChanged: if (enabled) appSettings.windowScaling = value;
Slider { stepSize: 0.05
id: txtslider enabled: false
Layout.fillWidth: true Component.onCompleted: {
Layout.columnSpan: 2 minimumValue = 0.25 //Without this value gets set to 0.5
onValueChanged: if (enabled) value = appSettings.windowScaling;
appSettings.windowScaling = value enabled = true;
stepSize: 0.05 }
enabled: false
Component.onCompleted: {
from = 0.25 //Without this value gets set to 0.5
value = appSettings.windowScaling
enabled = true
} }
} SizedLabel{text: Math.round(txtslider.value * 100) + "%"}
SizedLabel {
text: Math.round(txtslider.value * 100) + "%"
}
Label { Label{text: qsTr("Bloom Quality")}
text: qsTr("Bloom Quality") Slider{
} Layout.fillWidth: true
Slider { id: bloomSlider
Layout.fillWidth: true onValueChanged: if (enabled) appSettings.bloomQuality = value;
Layout.columnSpan: 2 stepSize: 0.05
id: bloomSlider enabled: false
onValueChanged: if (enabled) Component.onCompleted: {
appSettings.bloomQuality = value minimumValue = 0.25
stepSize: 0.05 value = appSettings.bloomQuality;
enabled: false enabled = true;
Component.onCompleted: { }
from = 0.25
value = appSettings.bloomQuality
enabled = true
} }
} SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"}
SizedLabel {
text: Math.round(bloomSlider.value * 100) + "%"
}
Label { Label{text: qsTr("BurnIn Quality")}
text: qsTr("BurnIn Quality") Slider{
} Layout.fillWidth: true
Slider { id: burnInSlider
Layout.fillWidth: true onValueChanged: if (enabled) appSettings.burnInQuality = value;
id: burnInSlider stepSize: 0.05
Layout.columnSpan: 2 enabled: false
onValueChanged: if (enabled) Component.onCompleted: {
appSettings.burnInQuality = value minimumValue = 0.25
stepSize: 0.05 value = appSettings.burnInQuality;
enabled: false enabled = true;
Component.onCompleted: { }
from = 0.25
value = appSettings.burnInQuality
enabled = true
} }
} SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"}
SizedLabel {
text: Math.round(burnInSlider.value * 100) + "%"
} }
} }
} }

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@ -17,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{
spacing: 2 ColumnLayout{
anchors.fill: parent
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;
}
} }
} }
} }

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@ -17,252 +17,218 @@
* 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{
Layout.fillWidth: true anchors.fill: parent
title: qsTr("Profile") GroupBox{
RowLayout { Layout.fillWidth: true
anchors.fill: parent Layout.fillHeight: true
ListView { title: qsTr("Profile")
id: profilesView RowLayout {
Layout.fillWidth: true anchors.fill: parent
Layout.fillHeight: true TableView {
model: appSettings.profilesList id: profilesView
clip: true
delegate: Rectangle {
width: label.width
height: label.height
color: (index == profilesView.currentIndex) ? palette.highlight : palette.base
Label {
id: label
text: appSettings.profilesList.get(index).text
MouseArea {
anchors.fill: parent
onClicked: profilesView.currentIndex = index
onDoubleClicked: appSettings.loadProfile(index)
}
}
}
}
ColumnLayout {
Layout.fillHeight: true
Layout.fillWidth: false
Button {
Layout.fillWidth: true Layout.fillWidth: true
text: qsTr("Save")
onClicked: {
insertname.profileName = ""
insertname.show()
}
}
Button {
Layout.fillWidth: true
property alias currentIndex: profilesView.currentIndex
enabled: currentIndex >= 0
text: qsTr("Load")
onClicked: {
var index = currentIndex
if (index >= 0)
appSettings.loadProfile(index)
}
}
Button {
Layout.fillWidth: true
text: qsTr("Remove")
property alias currentIndex: profilesView.currentIndex
enabled: currentIndex >= 0 && !appSettings.profilesList.get(
currentIndex).builtin
onClicked: {
appSettings.profilesList.remove(currentIndex)
profilesView.selection.clear()
// TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2.
profilesView.model = 0
profilesView.model = appSettings.profilesList
}
}
Item {
// Spacing
Layout.fillHeight: true Layout.fillHeight: true
} model: appSettings.profilesList
Button { headerVisible: false
Layout.fillWidth: true TableViewColumn {
text: qsTr("Import") title: qsTr("Profile")
onClicked: { role: "text"
fileDialog.selectExisting = true width: parent.width * 0.5
fileDialog.callBack = function (url) {
loadFile(url)
}
fileDialog.open()
} }
function loadFile(url) { onActivated: {
try { appSettings.loadProfile(row);
if (appSettings.verbose)
console.log("Loading file: " + url)
var profileObject = JSON.parse(fileIO.read(url))
var name = profileObject.name
if (!name)
throw "Profile doesn't have a name"
var version = profileObject.version
!== undefined ? profileObject.version : 1
if (version !== appSettings.profileVersion)
throw "This profile is not supported on this version of CRT."
delete profileObject.name
appSettings.appendCustomProfile(name,
JSON.stringify(
profileObject))
} catch (err) {
messageDialog.text = qsTr(err)
messageDialog.open()
}
} }
} }
Button { ColumnLayout {
property alias currentIndex: profilesView.currentIndex Layout.fillHeight: true
Layout.fillWidth: false
Layout.fillWidth: true Button{
Layout.fillWidth: true
text: qsTr("Export") text: qsTr("Save")
enabled: currentIndex >= 0 && !appSettings.profilesList.get( onClicked: {
currentIndex).builtin insertname.profileName = "";
onClicked: { insertname.show()
fileDialog.selectExisting = false
fileDialog.callBack = function (url) {
storeFile(url)
} }
fileDialog.open()
} }
function storeFile(url) { Button{
try { Layout.fillWidth: true
var urlString = url.toString() property alias currentIndex: profilesView.currentRow
enabled: currentIndex >= 0
text: qsTr("Load")
onClicked: {
var index = profilesView.currentRow;
if (index >= 0)
appSettings.loadProfile(index);
}
}
Button{
Layout.fillWidth: true
text: qsTr("Remove")
property alias currentIndex: profilesView.currentRow
// Fix the extension if it's missing. enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin
var extension = urlString.substring( onClicked: {
urlString.length - 5, urlString.length) appSettings.profilesList.remove(currentIndex);
var urlTail = (extension === ".json" ? "" : ".json") profilesView.selection.clear();
url += urlTail
if (true) // TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2.
console.log("Storing file: " + url) profilesView.model = 0;
profilesView.model = appSettings.profilesList;
}
}
Item {
// Spacing
Layout.fillHeight: true
}
Button{
Layout.fillWidth: true
text: qsTr("Import")
onClicked: {
fileDialog.selectExisting = true;
fileDialog.callBack = function (url) {loadFile(url);};
fileDialog.open();
}
function loadFile(url) {
try {
if (appSettings.verbose)
console.log("Loading file: " + url);
var profileObject = appSettings.profilesList.get( var profileObject = JSON.parse(fileIO.read(url));
currentIndex) var name = profileObject.name;
var profileSettings = JSON.parse(
profileObject.obj_string)
profileSettings["name"] = profileObject.text
profileSettings["version"] = appSettings.profileVersion
var result = fileIO.write(url, JSON.stringify( if (!name)
profileSettings, throw "Profile doesn't have a name";
undefined, 2))
if (!result) var version = profileObject.version !== undefined ? profileObject.version : 1;
throw "The file could not be written." if (version !== appSettings.profileVersion)
} catch (err) { throw "This profile is not supported on this version of CRT.";
console.log(err)
messageDialog.text = qsTr( delete profileObject.name;
"There has been an error storing the file.")
messageDialog.open() appSettings.appendCustomProfile(name, JSON.stringify(profileObject));
} catch (err) {
messageDialog.text = qsTr(err)
messageDialog.open();
}
}
}
Button{
property alias currentIndex: profilesView.currentRow
Layout.fillWidth: true
text: qsTr("Export")
enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin
onClicked: {
fileDialog.selectExisting = false;
fileDialog.callBack = function (url) {storeFile(url);};
fileDialog.open();
}
function storeFile(url) {
try {
var urlString = url.toString();
// Fix the extension if it's missing.
var extension = urlString.substring(urlString.length - 5, urlString.length);
var urlTail = (extension === ".json" ? "" : ".json");
url += urlTail;
if (true)
console.log("Storing file: " + url);
var profileObject = appSettings.profilesList.get(currentIndex);
var profileSettings = JSON.parse(profileObject.obj_string);
profileSettings["name"] = profileObject.text;
profileSettings["version"] = appSettings.profileVersion;
var result = fileIO.write(url, JSON.stringify(profileSettings, undefined, 2));
if (!result)
throw "The file could not be written.";
} catch (err) {
console.log(err);
messageDialog.text = qsTr("There has been an error storing the file.")
messageDialog.open();
}
} }
} }
} }
} }
} }
}
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{
} onValueChanged: appSettings.brightness = value
SimpleSlider { value: appSettings.brightness
onValueChanged: appSettings.brightness = value }
value: appSettings.brightness Label{ text: qsTr("Contrast") }
} SimpleSlider{
Label { onValueChanged: appSettings.contrast = value
text: qsTr("Contrast") value: appSettings.contrast
} }
SimpleSlider { Label{ text: qsTr("Margin") }
onValueChanged: appSettings.contrast = value SimpleSlider{
value: appSettings.contrast onValueChanged: appSettings._margin = value
} value: appSettings._margin
Label { }
text: qsTr("Margin") Label{ text: qsTr("Opacity") }
} SimpleSlider{
SimpleSlider { onValueChanged: appSettings.windowOpacity = value
onValueChanged: appSettings._margin = value value: appSettings.windowOpacity
value: appSettings._margin }
}
Label {
text: qsTr("Frame size")
}
SimpleSlider {
onValueChanged: appSettings._frameMargin = value
value: appSettings._frameMargin
}
Label {
text: qsTr("Opacity")
visible: !appSettings.isMacOS
}
SimpleSlider {
onValueChanged: appSettings.windowOpacity = value
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 { property var callBack
property var callBack 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;
}
} }
} }
} }

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@ -17,166 +17,138 @@
* 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 {
} id: rasterizationBox
ComboBox {
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 {
text: qsTr("Name")
}
ComboBox {
id: fontChanger
Layout.fillWidth: true
model: appSettings.fontlist
textRole: "text"
onActivated: {
var name = appSettings.fontlist.get(index).name
appSettings.fontNames[appSettings.rasterization] = name
appSettings.handleFontChanged()
}
function updateIndex() {
var name = appSettings.fontNames[appSettings.rasterization]
var index = appSettings.getIndexByName(name)
if (index !== undefined)
currentIndex = index
}
Connections {
target: appSettings
onTerminalFontChanged: {
fontChanger.updateIndex()
} }
} }
Component.onCompleted: updateIndex() Label{ text: qsTr("Name") }
} ComboBox{
Label { id: fontChanger
text: qsTr("Scaling")
}
RowLayout {
Layout.fillWidth: true
Slider {
Layout.fillWidth: true Layout.fillWidth: true
id: fontScalingChanger model: appSettings.fontlist
onValueChanged: appSettings.fontScaling = value onActivated: {
value: appSettings.fontScaling var name = appSettings.fontlist.get(index).name;
stepSize: 0.05 appSettings.fontNames[appSettings.rasterization] = name;
from: appSettings.minimumFontScaling appSettings.handleFontChanged();
to: appSettings.maximumFontScaling }
function updateIndex(){
var name = appSettings.fontNames[appSettings.rasterization];
var index = appSettings.getIndexByName(name);
if (index !== undefined)
currentIndex = index;
}
Connections{
target: appSettings
onTerminalFontChanged: fontChanger.updateIndex();
}
Component.onCompleted: updateIndex();
} }
SizedLabel { Label{ text: qsTr("Scaling") }
text: Math.round(fontScalingChanger.value * 100) + "%" RowLayout{
}
}
Label {
text: qsTr("Font Width")
}
RowLayout {
Layout.fillWidth: true
Slider {
Layout.fillWidth: true Layout.fillWidth: true
id: widthChanger Slider{
onValueChanged: appSettings.fontWidth = value Layout.fillWidth: true
value: appSettings.fontWidth id: fontScalingChanger
stepSize: 0.05 onValueChanged: if(enabled) appSettings.fontScaling = value
from: 0.5 stepSize: 0.05
to: 1.5 enabled: false // Another trick to fix initial bad behavior.
Component.onCompleted: {
minimumValue = appSettings.minimumFontScaling;
maximumValue = appSettings.maximumFontScaling;
value = appSettings.fontScaling;
enabled = true;
}
Connections{
target: appSettings
onFontScalingChanged: fontScalingChanger.value = appSettings.fontScaling;
}
}
SizedLabel{
text: Math.round(fontScalingChanger.value * 100) + "%"
}
} }
SizedLabel { Label{ text: qsTr("Font Width") }
text: Math.round(widthChanger.value * 100) + "%" RowLayout{
Layout.fillWidth: true
Slider{
Layout.fillWidth: true
id: widthChanger
onValueChanged: appSettings.fontWidth = value;
value: appSettings.fontWidth
stepSize: 0.05
Component.onCompleted: {
// This is needed to avoid unnecessary chnaged events.
minimumValue = 0.5;
maximumValue = 1.5;
}
}
SizedLabel{
text: Math.round(widthChanger.value * 100) + "%"
}
} }
} }
} }
} GroupBox{
GroupBox { title: qsTr("Colors")
title: qsTr("Cursor") Layout.fillWidth: true
Layout.fillWidth: true ColumnLayout{
ColumnLayout { anchors.fill: parent
anchors.fill: parent ColumnLayout{
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")
Layout.fillWidth: true
ColumnLayout {
anchors.fill: parent
ColumnLayout {
Layout.fillWidth: true
CheckableSlider {
name: qsTr("Chroma Color")
onNewValue: appSettings.chromaColor = newValue
value: appSettings.chromaColor
}
CheckableSlider {
name: qsTr("Saturation Color")
onNewValue: appSettings.saturationColor = newValue
value: appSettings.saturationColor
enabled: appSettings.chromaColor !== 0
}
CheckableSlider {
name: qsTr("Frame Gloss")
onNewValue: appSettings.frameGloss = newValue
value: appSettings.frameGloss
}
}
RowLayout {
Layout.fillWidth: true
ColorButton {
name: qsTr("Font")
height: 50
Layout.fillWidth: true Layout.fillWidth: true
onColorSelected: appSettings._fontColor = color CheckableSlider{
color: appSettings._fontColor name: qsTr("Chroma Color")
onNewValue: appSettings.chromaColor = newValue
value: appSettings.chromaColor
}
CheckableSlider{
name: qsTr("Saturation Color")
onNewValue: appSettings.saturationColor = newValue
value: appSettings.saturationColor
enabled: appSettings.chromaColor !== 0
}
} }
ColorButton { RowLayout{
name: qsTr("Background")
height: 50
Layout.fillWidth: true Layout.fillWidth: true
onColorSelected: appSettings._backgroundColor = color ColorButton{
color: appSettings._backgroundColor name: qsTr("Font")
} height: 50
ColorButton { Layout.fillWidth: true
name: qsTr("Frame") onColorSelected: appSettings._fontColor = color;
height: 50 color: appSettings._fontColor
Layout.fillWidth: true }
onColorSelected: appSettings._frameColor = color ColorButton{
color: appSettings._frameColor name: qsTr("Background")
height: 50
Layout.fillWidth: true
onColorSelected: appSettings._backgroundColor = color;
color: appSettings._backgroundColor
}
} }
} }
} }

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@ -19,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
anchors.fill: parent
TabBar { anchors.margins: 10
id: bar SettingsGeneralTab {
anchors { left: parent.left; right: parent.right; top: parent.top; } id: generalTab
TabButton { title: qsTr("General")
text: qsTr("General") anchors.fill: parent
} anchors.margins: tabmargins
TabButton {
text: qsTr("Terminal")
}
TabButton {
text: qsTr("Effects")
}
TabButton {
text: qsTr("Advanced")
}
} }
SettingsTerminalTab {
Frame { id: terminalTab
anchors { title: qsTr("Terminal")
top: bar.bottom anchors.fill: parent
left: parent.left anchors.margins: tabmargins
right: parent.right }
bottom: parent.bottom SettingsEffectsTab {
} id: effectsTab
title: qsTr("Effects")
StackLayout { anchors.fill: parent
anchors.fill: parent anchors.margins: tabmargins
}
currentIndex: bar.currentIndex SettingsAdvancedTab {
id: performanceTab
SettingsGeneralTab { } title: qsTr("Advanced")
SettingsTerminalTab { } anchors.fill: parent
SettingsEffectsTab { } anchors.margins: tabmargins
SettingsAdvancedTab { }
}
} }
} }
} }

View File

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

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@ -37,21 +37,11 @@ Item {
property real ambientLight: appSettings.ambientLight * 0.2 property real ambientLight: appSettings.ambientLight * 0.2
property real frameGloss: appSettings.frameGloss property size virtual_resolution
property size virtualResolution
property size screenResolution
property real _screenDensity: Math.min(
screenResolution.width / virtualResolution.width,
screenResolution.height / virtualResolution.height
)
ShaderEffect { ShaderEffect {
id: dynamicShader id: dynamicShader
property ShaderLibrary shaderLibrary: ShaderLibrary { }
property ShaderEffectSource screenBuffer: frameBuffer property ShaderEffectSource screenBuffer: frameBuffer
property ShaderEffectSource burnInSource: burnInEffect.source property ShaderEffectSource burnInSource: burnInEffect.source
property ShaderEffectSource frameSource: terminalFrameLoader.item property ShaderEffectSource frameSource: terminalFrameLoader.item
@ -61,32 +51,22 @@ Item {
property real screenCurvature: parent.screenCurvature property real screenCurvature: parent.screenCurvature
property real chromaColor: parent.chromaColor property real chromaColor: parent.chromaColor
property real ambientLight: parent.ambientLight property real ambientLight: parent.ambientLight
property real frameGloss: parent.frameGloss
property real flickering: appSettings.flickering property real flickering: appSettings.flickering
property real horizontalSync: appSettings.horizontalSync property real horizontalSync: appSettings.horizontalSync
property real horizontalSyncStrength: Utils.lint(0.05, 0.35, horizontalSync) property real horizontalSyncStrength: Utils.lint(0.05, 0.35, horizontalSync)
property real glowingLine: appSettings.glowingLine * 0.2 property real glowingLine: appSettings.glowingLine * 0.2
// Fast burnin properties
property real burnIn: appSettings.burnIn property real burnIn: appSettings.burnIn
property real burnInLastUpdate: burnInEffect.lastUpdate property real burnInLastUpdate: burnInEffect.lastUpdate
property real burnInTime: burnInEffect.burnInFadeTime property real burnInTime: burnInEffect.burnInFadeTime
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
@ -98,7 +78,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
@ -106,7 +86,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
@ -175,10 +155,8 @@ Item {
uniform highp vec4 fontColor; uniform highp vec4 fontColor;
uniform highp vec4 backgroundColor; uniform highp vec4 backgroundColor;
uniform lowp float shadowLength; uniform lowp float shadowLength;
uniform lowp float frameGloss;
uniform highp vec2 virtualResolution; uniform highp vec2 virtual_resolution;" +
uniform lowp float rasterizationIntensity;\n" +
(burnIn !== 0 ? " (burnIn !== 0 ? "
uniform sampler2D burnInSource; uniform sampler2D burnInSource;
@ -186,13 +164,13 @@ Item {
uniform highp float burnInTime;" : "") + uniform highp float burnInTime;" : "") +
(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 ? "
@ -215,14 +193,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));
} }
@ -247,17 +228,6 @@ Item {
" return outColor; " return outColor;
}" + }" +
//pseudo-random vector
//https://stackoverflow.com/a/10625698
"float random( vec2 p )
{
vec2 K1 = vec2(
23.14069263277926, // e^pi (Gelfond's constant)
2.665144142690225 // 2^sqrt(2) (Gelfond-Schneider constant)
);
return fract( cos( dot(p,K1) ) * 12345.6789 );
}" +
"void main() {" + "void main() {" +
"vec2 cc = vec2(0.5) - qt_TexCoord0;" + "vec2 cc = vec2(0.5) - qt_TexCoord0;" +
"float distance = length(cc);" + "float distance = length(cc);" +
@ -296,11 +266,7 @@ Item {
: "") + : "") +
(jitter !== 0 || staticNoise !== 0 ? (jitter !== 0 || staticNoise !== 0 ?
"vec4 noiseTexel = texture2D( "vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));"
noiseSource, scaleNoiseSize * coords
+ vec2(0.0, random(vec2(fract(time / 237.0), 822.9582)))
+ vec2(fract(time / 31.0), fract(time / 177.0))
);"
: "") + : "") +
(jitter !== 0 ? " (jitter !== 0 ? "
@ -315,7 +281,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;" +
@ -328,8 +294,6 @@ Item {
"txt_color += fontColor.rgb * vec3(color);" + "txt_color += fontColor.rgb * vec3(color);" +
"txt_color = applyRasterization(staticCoords, txt_color, virtualResolution, rasterizationIntensity);\n" +
"vec3 finalColor = txt_color;" + "vec3 finalColor = txt_color;" +
(flickering !== 0 ? " (flickering !== 0 ? "
@ -338,9 +302,9 @@ 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 + (finalColor*frameGloss), frameColor.a);" finalColor = mix(finalColor, frameColor.rgb, frameColor.a);"
: "") + : "") +
"gl_FragColor = vec4(finalColor, qt_Opacity);" + "gl_FragColor = vec4(finalColor, qt_Opacity);" +
@ -361,7 +325,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
@ -373,7 +337,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
@ -381,10 +345,6 @@ Item {
} }
} }
ShaderLibrary {
id: shaderLibrary
}
ShaderEffect { ShaderEffect {
id: staticShader id: staticShader
@ -410,7 +370,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
@ -433,7 +393,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;
@ -451,9 +411,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;" +
@ -466,7 +453,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;" +
@ -489,12 +475,14 @@ 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);" +
(screenCurvature !== 0 ? " (screenCurvature !== 0 ? "
float reflectionMask = sum2(step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords)); float reflectionMask = sum2(step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords));
reflectionMask = clamp(reflectionMask, 0.0, 1.0);" reflectionMask = clamp(0.0, 1.0, reflectionMask);"
: :
"float reflectionMask = 1.0;") + "float reflectionMask = 1.0;") +

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@ -17,8 +17,9 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Controls 2.0 import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import "Components" import "Components"
@ -26,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) + "%"
} }
} }

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@ -17,12 +17,12 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/ *******************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
Rectangle { Rectangle{
property size terminalSize property size terminalSize
property real topOpacity: 0.6 property real topOpacity: 0.6
width: textSize.width * 2 width: textSize.width * 2
height: textSize.height * 2 height: textSize.height * 2
radius: 5 radius: 5
@ -31,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

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@ -27,7 +27,7 @@ QtObject {
property bool initialized: false property bool initialized: false
function getDatabase() { function getDatabase() {
return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000) return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000);
} }
function initialize() { function initialize() {
@ -35,47 +35,43 @@ 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) {
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('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) {
res = "OK"; res = "OK";
} else { } else {
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
} }
function dropSettings(){ function dropSettings(){
@ -83,7 +79,6 @@ QtObject {
db.transaction( db.transaction(
function(tx) { function(tx) {
tx.executeSql('DROP TABLE settings'); tx.executeSql('DROP TABLE settings');
} });
)
} }
} }

View File

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

View File

@ -1,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 _frameColor: appSettings.frameColor
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(_frameColor, _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 = clamp(sqrt(frameShadow), 0.0, 1.0);
color *= frameShadow;
alpha = sum2(1.0 - step(vec2(0.0), coords) + step(vec2(1.0), coords));
alpha = clamp(alpha, 0.0, 1.0);
alpha *= mix(1.0, 0.9, frameShadow);
float screenShadow = 1.0 - prod2(positiveLog(coords * screenShadowCoeff + vec2(1.0)) * positiveLog(-coords * screenShadowCoeff + vec2(screenShadowCoeff + 1.0)));
alpha = max(0.8 * screenShadow, alpha);
gl_FragColor = vec4(color * alpha, alpha);
}
"
onStatusChanged: if (log) console.log(log) //Print warning messages
}

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-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.

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013-2021 "Filippo Scognamiglio" * Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@ -17,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,22 @@ 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 { 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 +79,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,73 +89,69 @@ 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: pasteActionAlt
text: qsTr("Paste selection")
shortcut: "Shift+Insert"
}
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
} }
@ -169,7 +159,7 @@ ApplicationWindow {
onClosing: { onClosing: {
// OSX Since we are currently supporting only one window // OSX Since we are currently supporting only one window
// quit the application when it is closed. // quit the application when it is closed.
if (appSettings.isMacOS) if (Qt.platform.os === "osx")
Qt.quit() Qt.quit()
} }
} }

View File

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

View File

@ -1,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()
}
}
}

View File

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

View File

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

View File

@ -12,6 +12,7 @@
<file>TimeManager.qml</file> <file>TimeManager.qml</file>
<file>SimpleSlider.qml</file> <file>SimpleSlider.qml</file>
<file>ColorButton.qml</file> <file>ColorButton.qml</file>
<file>Glossy.qml</file>
<file>AboutDialog.qml</file> <file>AboutDialog.qml</file>
<file>InsertNameDialog.qml</file> <file>InsertNameDialog.qml</file>
<file>SettingsEffectsTab.qml</file> <file>SettingsEffectsTab.qml</file>
@ -19,8 +20,9 @@
<file>SettingsTerminalTab.qml</file> <file>SettingsTerminalTab.qml</file>
<file>FontScanlines.qml</file> <file>FontScanlines.qml</file>
<file>fonts/1977-apple2/PrintChar21.ttf</file> <file>fonts/1977-apple2/PrintChar21.ttf</file>
<file>fonts/1971-ibm-3278/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 +42,6 @@
<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>menus/FullContextMenu.qml</file>
<file>menus/ShortContextMenu.qml</file>
<file>ShaderLibrary.qml</file>
<file>menus/OSXMenu.qml</file>
</qresource> </qresource>
</RCC> </RCC>

View File

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

@ -1 +1 @@
Subproject commit 63228027e1f97c24abb907550b22ee91836929c5 Subproject commit 48274c75660e28d44af7c195e79accdf1bd44963

View File

@ -1,46 +1,32 @@
name: cool-retro-term # check to see if it's available name: cool-retro-term # check to see if it's available
version: '1.1.1' # this is freakin' awesome version: '1.1.0' # this is freakin' awesome
summary: cool-retro-term is a cool and retro terminal emulator. # 79 char long summary summary: cool-retro-term is a terminal emulator. # 79 char long summary
description: | description: |
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. 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.
grade: stable # must be 'stable' to release into candidate/stable channels grade: stable # must be 'stable' to release into candidate/stable channels
confinement: classic # use 'strict' once you have the right plugs confinement: strict # use 'strict' once you have the right plugs
base: core18
apps: apps:
cool-retro-term: cool-retro-term:
command: bin/desktop-launch $SNAP/usr/bin/cool-retro-term command: desktop-launch $SNAP/usr/bin/cool-retro-term
desktop: usr/share/applications/cool-retro-term.desktop desktop: usr/share/applications/cool-retro-term.desktop
environment: plugs:
QML2_IMPORT_PATH: $SNAP/usr/lib/x86_64-linux-gnu/qt5/qml - unity7
- x11
- desktop
- home
- network
- network-bind
- network-manager
- password-manager-service
- locale-control
- gsettings
- shutdown
- firewall-control
- process-control
- system-observe
parts: parts:
desktop-qt5:
source: https://github.com/ubuntu/snapcraft-desktop-helpers.git
source-subdir: qt
plugin: make
make-parameters: ["FLAVOR=qt5"]
build-packages:
- build-essential
- qtbase5-dev
- dpkg-dev
stage-packages:
- libxkbcommon0
- ttf-ubuntu-font-family
- dmz-cursor-theme
- light-themes
- adwaita-icon-theme
- gnome-themes-standard
- shared-mime-info
- libqt5gui5
- libgdk-pixbuf2.0-0
- libqt5svg5 # for loading icon themes which are svg
- try: [appmenu-qt5] # not available on core18
- locales-all
- xdg-user-dirs
- fcitx-frontend-qt5
my-part: my-part:
source: https://github.com/Swordfish90/cool-retro-term source: https://github.com/Swordfish90/cool-retro-term
source-type: git source-type: git
@ -58,14 +44,11 @@ parts:
stage-packages: stage-packages:
- qmlscene - qmlscene
- qml-module-qtquick-controls - qml-module-qtquick-controls
- qml-module-qtquick2 - qtdeclarative5-qtquick2-plugin
- qml-module-qtgraphicaleffects - libqt5qml-graphicaleffects
- qml-module-qtquick-dialogs - qml-module-qtquick-dialogs
- qml-module-qtquick-localstorage - qtdeclarative5-localstorage-plugin
- qml-module-qtquick-window2 - qtdeclarative5-window-plugin
- 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