Compare commits
158 Commits
framebuffe
...
master
Author | SHA1 | Date | |
---|---|---|---|
b98408dd32 | |||
36054434a5 | |||
d9e41c27ef | |||
8e8f8e4706 | |||
edb1a6f9e1 | |||
![]() |
33723db314 | ||
4bc440e906 | |||
![]() |
27b248d851 | ||
e3c2e024bb | |||
![]() |
b69610d7f3 | ||
92a768d6f1 | |||
![]() |
5ecd7d754d | ||
![]() |
e3161f64f6 | ||
![]() |
5b0b091ab6 | ||
![]() |
4fdf28fb79 | ||
49213a1cf0 | |||
e30db231f6 | |||
6609c4867f | |||
![]() |
84c5e8bca6 | ||
1a25749315 | |||
![]() |
3852f5995d | ||
9093b7a16e | |||
afead1c2c0 | |||
1b2572f381 | |||
![]() |
27ca6b3f73 | ||
![]() |
f157648d1e | ||
![]() |
d4baaeccfc | ||
![]() |
d412b66c6e | ||
![]() |
74ae511f92 | ||
![]() |
a3fbafe4ae | ||
![]() |
8a45fbe9ed | ||
![]() |
01c7929ee3 | ||
![]() |
2261af17d7 | ||
![]() |
41f34c3992 | ||
![]() |
36b1cd2dde | ||
![]() |
80374b3ec6 | ||
![]() |
bc00d1e45f | ||
![]() |
6ddb507247 | ||
![]() |
b0f3b8f3d0 | ||
![]() |
06e7191056 | ||
![]() |
997131ba64 | ||
![]() |
ef9f412e5f | ||
![]() |
7b69d41c60 | ||
![]() |
552947f507 | ||
![]() |
f69f2df63c | ||
![]() |
aa270067f6 | ||
![]() |
28977313da | ||
![]() |
cfe35d7795 | ||
![]() |
4abbe332db | ||
![]() |
3104abd4ad | ||
![]() |
7714f7b503 | ||
![]() |
9d06f10a9b | ||
![]() |
8c27f7683b | ||
![]() |
bf1a491789 | ||
![]() |
701cb540e5 | ||
![]() |
0f18a0349a | ||
![]() |
205a152350 | ||
![]() |
dae1a56691 | ||
![]() |
39181f42cf | ||
![]() |
3d706ad1a7 | ||
![]() |
a31b77e5bc | ||
![]() |
b417643415 | ||
![]() |
dac2b4ff16 | ||
![]() |
2d12b0c747 | ||
![]() |
5fe26edaa6 | ||
![]() |
a736cfd548 | ||
![]() |
5af4214daa | ||
![]() |
98ef7b329a | ||
![]() |
b0e1962fa7 | ||
![]() |
83684e8882 | ||
![]() |
1ed7d077a9 | ||
![]() |
ba4b36618f | ||
![]() |
af647a4bad | ||
![]() |
b719530ef0 | ||
![]() |
530d61d67e | ||
![]() |
3d76bcb48c | ||
![]() |
70ce2f1f3c | ||
![]() |
21a190a1aa | ||
![]() |
a88d222709 | ||
![]() |
b2defceae5 | ||
![]() |
8d7565ffc4 | ||
![]() |
9960b25dff | ||
![]() |
411c116deb | ||
![]() |
64e007f1fd | ||
![]() |
c62fc365db | ||
![]() |
e7e630bd5d | ||
![]() |
7d77175fbb | ||
![]() |
f033553972 | ||
![]() |
ae1ed044ba | ||
![]() |
35d601c7a7 | ||
![]() |
f89aeec374 | ||
![]() |
42c3b4b42e | ||
![]() |
322fc31396 | ||
![]() |
6e4d5cfddd | ||
![]() |
d81485a8bf | ||
![]() |
a9260d956c | ||
![]() |
025bb560bc | ||
![]() |
cdd1488e13 | ||
![]() |
b8b2644969 | ||
![]() |
09b5c0a5d0 | ||
![]() |
1ed66f3aa2 | ||
![]() |
3b4d5d1c3f | ||
![]() |
f98fd5a7ad | ||
![]() |
b961109623 | ||
![]() |
8f0d1023a4 | ||
![]() |
79773ba95c | ||
![]() |
ff3f02fb8c | ||
![]() |
0af2b20b3a | ||
![]() |
b026fe357e | ||
![]() |
ade36c013b | ||
![]() |
54a6a7f590 | ||
![]() |
20728e4a0f | ||
![]() |
afa456f6b3 | ||
![]() |
3fbfb77430 | ||
![]() |
051bcb62c6 | ||
![]() |
d2c57eed6d | ||
![]() |
f2f38c0e0d | ||
![]() |
4046bdbc6a | ||
![]() |
c83cc206fd | ||
![]() |
41ac14fbd3 | ||
![]() |
e4c1cad1a7 | ||
![]() |
863c1ac27a | ||
![]() |
c85eba617c | ||
![]() |
dcb7b7c309 | ||
![]() |
3cee186663 | ||
![]() |
06afe507f6 | ||
![]() |
4268d4d770 | ||
![]() |
d61dae5ab4 | ||
![]() |
b5f39c1d53 | ||
![]() |
767a61b86e | ||
![]() |
0d3c0a2233 | ||
![]() |
0431103a1d | ||
![]() |
633e4e642c | ||
![]() |
db7a7f38f7 | ||
![]() |
4bff6efe97 | ||
![]() |
c514dc7a24 | ||
![]() |
24754edb6a | ||
![]() |
79fbb76524 | ||
![]() |
b85aede966 | ||
![]() |
c66ca6e44f | ||
![]() |
a192024fef | ||
![]() |
918df9098a | ||
![]() |
c9271bfa36 | ||
![]() |
fa162c818b | ||
![]() |
ff976e3ec2 | ||
![]() |
17c5651305 | ||
![]() |
7c7b049ba1 | ||
![]() |
0823fe8b3d | ||
![]() |
e787fd0fb5 | ||
![]() |
650497bff4 | ||
![]() |
2f25bd30b0 | ||
![]() |
d58157a450 | ||
![]() |
9d049bd041 | ||
![]() |
988222b711 | ||
![]() |
f42bd3036f | ||
![]() |
297239fb5c | ||
![]() |
dbd46d44aa | ||
![]() |
254f4d6e92 |
4
.github/FUNDING.yml
vendored
Normal file
4
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
patreon: swordfish90
|
||||||
|
custom: ['https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=flscogna%40gmail.com&item_name=Support+CRT¤cy_code=EUR&source=url']
|
98
.github/workflows/appimage.yml
vendored
Normal file
98
.github/workflows/appimage.yml
vendored
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
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
4
.gitignore
vendored
@ -18,6 +18,7 @@
|
|||||||
*.pro.user.*
|
*.pro.user.*
|
||||||
*.moc
|
*.moc
|
||||||
moc_*.cpp
|
moc_*.cpp
|
||||||
|
moc_*.h
|
||||||
qrc_*.cpp
|
qrc_*.cpp
|
||||||
ui_*.h
|
ui_*.h
|
||||||
Makefile*
|
Makefile*
|
||||||
@ -47,3 +48,6 @@ cool-retro-term
|
|||||||
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
*.app
|
*.app
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
.idea
|
||||||
|
37
.travis.yml
Normal file
37
.travis.yml
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
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
173
README.md
@ -8,172 +8,23 @@
|
|||||||
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) developed by me: https://github.com/Swordfish90/qmltermwidget .
|
It uses the QML port of qtermwidget (Konsole): https://github.com/Swordfish90/qmltermwidget.
|
||||||
|
|
||||||
This terminal emulator works under Linux and macOS and requires Qt 5.2 or higher.
|
This terminal emulator works under Linux and macOS and requires Qt5. It's suggested that you stick to the latest LTS version.
|
||||||
|
|
||||||
|
Settings such as colors, fonts, and effects can be accessed via context menu.
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
## Get cool-retro-term
|
## Install
|
||||||
You can either build cool-retro-term yourself (see below) or walk the easy way and install one of these packages:
|
|
||||||
|
|
||||||
Fedora has the `cool-retro-term` in the offcial repositories. All you have to do is `sudo dnf install cool-retro-term`.
|
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).
|
||||||
|
|
||||||
Users of openSUSE can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term).
|
Alternatively, most distributions such as Ubuntu, Fedora or Arch already package cool-retro-term in their official repositories.
|
||||||
|
|
||||||
Arch users can install this [package](https://aur.archlinux.org/packages/cool-retro-term-git/) directly via the [AUR](https://aur.archlinux.org):
|
## Building
|
||||||
|
|
||||||
yaourt -S aur/cool-retro-term-git
|
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)).
|
||||||
|
|
||||||
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¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted).
|
|
||||||
|
|
||||||
You can also add "bounties" on your favourite issues. More information on the [Bountysource](https://www.bountysource.com/teams/crt/issues) page.
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
QT += qml quick widgets sql
|
QT += qml quick widgets sql quickcontrols2
|
||||||
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
|
||||||
|
|
||||||
#########################################
|
#########################################
|
||||||
## INTALLS
|
## INSTALLS
|
||||||
#########################################
|
#########################################
|
||||||
|
|
||||||
target.path += /usr/bin/
|
target.path += /usr/bin/
|
||||||
|
59
app/main.cpp
59
app/main.cpp
@ -6,11 +6,13 @@
|
|||||||
|
|
||||||
#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>
|
||||||
@ -33,15 +35,43 @@ 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);
|
||||||
// set application attributes
|
app.setAttribute(Qt::AA_MacDontSwapCtrlAndMeta, true);
|
||||||
// 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;
|
||||||
@ -53,27 +83,11 @@ int main(int argc, char *argv[])
|
|||||||
app.setWindowIcon(QIcon(":../icons/32x32/cool-retro-term.png"));
|
app.setWindowIcon(QIcon(":../icons/32x32/cool-retro-term.png"));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
app.setOrganizationName("cool-retro-term");
|
||||||
|
app.setOrganizationDomain("cool-retro-term");
|
||||||
|
|
||||||
// Manage command line arguments from the cpp side
|
// Manage command line arguments from the cpp side
|
||||||
QStringList args = app.arguments();
|
QStringList args = app.arguments();
|
||||||
if (args.contains("-h") || args.contains("--help")) {
|
|
||||||
// BUG: This usage help text goes to stderr, should go to stdout.
|
|
||||||
// BUG: First line of output is surrounded by double quotes.
|
|
||||||
qDebug() << "Usage: " + args.at(0) + " [--default-settings] [--workdir <dir>] [--program <prog>] [-p|--profile <prof>] [--fullscreen] [-h|--help]";
|
|
||||||
qDebug() << " --default-settings Run cool-retro-term with the default settings";
|
|
||||||
qDebug() << " --workdir <dir> Change working directory to 'dir'";
|
|
||||||
qDebug() << " -e <cmd> Command to execute. This option will catch all following arguments, so use it as the last option.";
|
|
||||||
qDebug() << " -T <title> Set window title to 'title'.";
|
|
||||||
qDebug() << " --fullscreen Run cool-retro-term in fullscreen.";
|
|
||||||
qDebug() << " -p|--profile <prof> Run cool-retro-term with the given profile.";
|
|
||||||
qDebug() << " -h|--help Print this help.";
|
|
||||||
qDebug() << " --verbose Print additional information such as profiles and settings.";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
||||||
@ -82,6 +96,7 @@ 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);
|
||||||
|
|
||||||
|
@ -1,9 +1,28 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
|
*
|
||||||
|
* This file is part of cool-retro-term.
|
||||||
|
*
|
||||||
|
* cool-retro-term is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*******************************************************************************/
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 2.2
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
import QtQuick.Window 2.0
|
import QtQuick.Window 2.0
|
||||||
|
|
||||||
Window{
|
Window {
|
||||||
id: dialogwindow
|
id: dialogwindow
|
||||||
title: qsTr("About")
|
title: qsTr("About")
|
||||||
width: 600
|
width: 600
|
||||||
@ -11,16 +30,19 @@ 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 {bold: true; pointSize: 18}
|
font {
|
||||||
|
bold: true
|
||||||
|
pointSize: 18
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loader{
|
Loader {
|
||||||
id: mainContent
|
id: mainContent
|
||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
@ -41,32 +63,33 @@ 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 = "License" : mainContent.state = "Default"
|
mainContent.state == "Default" ? mainContent.state
|
||||||
|
= "License" : mainContent.state = "Default"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Button{
|
Button {
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
text: qsTr("Close")
|
text: qsTr("Close")
|
||||||
onClicked: dialogwindow.close();
|
onClicked: dialogwindow.close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 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
|
||||||
@ -74,36 +97,37 @@ 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" +
|
text: appSettings.version + "\n" + qsTr(
|
||||||
qsTr("Author: ") + "Filippo Scognamiglio\n" +
|
"Author: ") + "Filippo Scognamiglio\n" + qsTr(
|
||||||
qsTr("Email: ") + "flscogna@gmail.com\n" +
|
"Email: ") + "flscogna@gmail.com\n" + qsTr(
|
||||||
qsTr("Source: ") + "https://github.com/Swordfish90/cool-retro-term\n"
|
"Source: ") + "https://github.com/Swordfish90/cool-retro-term\n"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Component{
|
Component {
|
||||||
id: licenseComponent
|
id: licenseComponent
|
||||||
TextArea{
|
ScrollView {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
readOnly: true
|
clip: true
|
||||||
text: "Copyright (c) 2013 Filippo Scognamiglio <flscogna@gmail.com>\n\n" +
|
TextArea {
|
||||||
"https://github.com/Swordfish90/cool-retro-term\n\n" +
|
readOnly: true
|
||||||
|
wrapMode: TextEdit.Wrap
|
||||||
"cool-retro-term is free software: you can redistribute it and/or modify " +
|
text: "Copyright (c) 2013-2021 Filippo Scognamiglio <flscogna@gmail.com>\n\n"
|
||||||
"it under the terms of the GNU General Public License as published by " +
|
+ "https://github.com/Swordfish90/cool-retro-term\n\n" +
|
||||||
"the Free Software Foundation, either version 3 of the License, or " +
|
"cool-retro-term is free software: you can redistribute it and/or modify "
|
||||||
"(at your option) any later version.\n\n" +
|
+ "it under the terms of the GNU General Public License as published by "
|
||||||
|
+ "the Free Software Foundation, either version 3 of the License, or "
|
||||||
"This program is distributed in the hope that it will be useful, " +
|
+ "(at your option) any later version.\n\n" +
|
||||||
"but WITHOUT ANY WARRANTY; without even the implied warranty of " +
|
"This program is distributed in the hope that it will be useful, "
|
||||||
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " +
|
+ "but WITHOUT ANY WARRANTY; without even the implied warranty of "
|
||||||
"GNU General Public License for more details.\n\n" +
|
+ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the "
|
||||||
|
+ "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
@ -1,3 +1,22 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
|
*
|
||||||
|
* This file is part of cool-retro-term.
|
||||||
|
*
|
||||||
|
* cool-retro-term is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*******************************************************************************/
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
|
|
||||||
import "utils.js" as Utils
|
import "utils.js" as Utils
|
||||||
@ -10,39 +29,34 @@ 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: 160
|
property real _minBurnInFadeTime: appSettings.minBurnInFadeTime
|
||||||
property real _maxBurnInFadeTime: 1600
|
property real _maxBurnInFadeTime: appSettings.maxBurnInFadeTime
|
||||||
|
|
||||||
active: appSettings.burnIn !== 0
|
active: appSettings.burnIn !== 0
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
function completelyUpdate() {
|
function completelyUpdate() {
|
||||||
prevLastUpdate = lastUpdate;
|
let newTime = timeManager.time
|
||||||
lastUpdate = timeManager.time;
|
if (newTime > lastUpdate) {
|
||||||
item.source.scheduleUpdate();
|
prevLastUpdate = lastUpdate
|
||||||
|
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.width * Math.max(1, burnInScaling)
|
|
||||||
: kterminal.width * scaleTexture * appSettings.burnInQuality
|
|
||||||
|
|
||||||
height: appSettings.lowResolutionFont
|
|
||||||
? kterminal.height * Math.max(1, burnInScaling)
|
|
||||||
: kterminal.height * scaleTexture * appSettings.burnInQuality
|
|
||||||
|
|
||||||
ShaderEffectSource {
|
ShaderEffectSource {
|
||||||
id: burnInEffectSource
|
id: burnInEffectSource
|
||||||
|
|
||||||
@ -52,35 +66,46 @@ Loader {
|
|||||||
live: false
|
live: false
|
||||||
recursive: true
|
recursive: true
|
||||||
hideSource: true
|
hideSource: true
|
||||||
wrapMode: kterminalSource.wrapMode
|
wrapMode: ShaderEffectSource.ClampToEdge
|
||||||
|
|
||||||
format: ShaderEffectSource.RGBA
|
format: ShaderEffectSource.RGBA
|
||||||
|
smooth: true
|
||||||
// Enabling smooth with a low burnInQuality causes bad artifacts because the FBO
|
|
||||||
// has different values when it's read back. This lowers the quality, but makes it more consistent.
|
|
||||||
smooth: appSettings.burnInQuality === 1.0
|
|
||||||
|
|
||||||
visible: false
|
visible: false
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: kterminal
|
target: kterminal
|
||||||
onImagePainted: completelyUpdate()
|
|
||||||
|
onImagePainted: {
|
||||||
|
completelyUpdate()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Restart blurred source settings change.
|
// Restart blurred source settings change.
|
||||||
Connections{
|
|
||||||
target: appSettings
|
|
||||||
onBurnInChanged: burnInEffect.restartBlurSource();
|
|
||||||
onTerminalFontChanged: burnInEffect.restartBlurSource();
|
|
||||||
onRasterizationChanged: burnInEffect.restartBlurSource();
|
|
||||||
onBurnInQualityChanged: burnInEffect.restartBlurSource();
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: kterminalScrollbar
|
target: appSettings
|
||||||
onOpacityChanged: completelyUpdate()
|
|
||||||
|
onBurnInChanged: {
|
||||||
|
burnInEffect.restartBlurSource()
|
||||||
|
}
|
||||||
|
|
||||||
|
onTerminalFontChanged: {
|
||||||
|
burnInEffect.restartBlurSource()
|
||||||
|
}
|
||||||
|
|
||||||
|
onRasterizationChanged: {
|
||||||
|
burnInEffect.restartBlurSource()
|
||||||
|
}
|
||||||
|
|
||||||
|
onBurnInQualityChanged: {
|
||||||
|
burnInEffect.restartBlurSource()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ShaderLibrary {
|
||||||
|
id: shaderLibrary
|
||||||
|
}
|
||||||
|
|
||||||
ShaderEffect {
|
ShaderEffect {
|
||||||
id: burnInShaderEffect
|
id: burnInShaderEffect
|
||||||
|
|
||||||
@ -91,7 +116,6 @@ Loader {
|
|||||||
property real prevLastUpdate: burnInEffect.prevLastUpdate
|
property real prevLastUpdate: burnInEffect.prevLastUpdate
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
blending: false
|
blending: false
|
||||||
|
|
||||||
fragmentShader:
|
fragmentShader:
|
||||||
@ -111,9 +135,7 @@ Loader {
|
|||||||
|
|
||||||
uniform highp float prevLastUpdate;" +
|
uniform highp float prevLastUpdate;" +
|
||||||
|
|
||||||
"float rgb2grey(vec3 v){
|
shaderLibrary.rgb2grey +
|
||||||
return dot(v, vec3(0.21, 0.72, 0.04));
|
|
||||||
}" +
|
|
||||||
|
|
||||||
"void main() {
|
"void main() {
|
||||||
vec2 coords = qt_TexCoord0;
|
vec2 coords = qt_TexCoord0;
|
||||||
|
@ -1,51 +0,0 @@
|
|||||||
import QtQuick 2.2
|
|
||||||
import QtQuick.Controls 1.1
|
|
||||||
|
|
||||||
MenuBar {
|
|
||||||
id: defaultMenuBar
|
|
||||||
property bool visible: true
|
|
||||||
Menu {
|
|
||||||
title: qsTr("File")
|
|
||||||
visible: defaultMenuBar.visible
|
|
||||||
MenuItem {action: quitAction}
|
|
||||||
}
|
|
||||||
Menu {
|
|
||||||
title: qsTr("Edit")
|
|
||||||
visible: defaultMenuBar.visible && appSettings.showMenubar
|
|
||||||
MenuItem {action: copyAction}
|
|
||||||
MenuItem {action: pasteAction}
|
|
||||||
MenuSeparator{visible: Qt.platform.os !== "osx"}
|
|
||||||
MenuItem {action: showsettingsAction}
|
|
||||||
}
|
|
||||||
Menu{
|
|
||||||
title: qsTr("View")
|
|
||||||
visible: defaultMenuBar.visible
|
|
||||||
MenuItem {action: fullscreenAction; visible: fullscreenAction.enabled}
|
|
||||||
MenuItem {action: showMenubarAction; visible: showMenubarAction.enabled}
|
|
||||||
MenuSeparator{visible: showMenubarAction.enabled}
|
|
||||||
MenuItem {action: zoomIn}
|
|
||||||
MenuItem {action: zoomOut}
|
|
||||||
}
|
|
||||||
Menu{
|
|
||||||
id: profilesMenu
|
|
||||||
title: qsTr("Profiles")
|
|
||||||
visible: defaultMenuBar.visible
|
|
||||||
Instantiator{
|
|
||||||
model: appSettings.profilesList
|
|
||||||
delegate: MenuItem {
|
|
||||||
text: model.text
|
|
||||||
onTriggered: {
|
|
||||||
appSettings.loadProfileString(obj_string);
|
|
||||||
appSettings.handleFontChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
onObjectAdded: profilesMenu.insertItem(index, object)
|
|
||||||
onObjectRemoved: profilesMenu.removeItem(object)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Menu{
|
|
||||||
title: qsTr("Help")
|
|
||||||
visible: defaultMenuBar.visible
|
|
||||||
MenuItem {action: showAboutAction}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -17,9 +17,8 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 2.0
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
|
|
||||||
import "Components"
|
import "Components"
|
||||||
@ -28,46 +27,46 @@ RowLayout {
|
|||||||
property alias name: check.text
|
property alias name: check.text
|
||||||
|
|
||||||
property double value
|
property double value
|
||||||
property alias min_value: slider.minimumValue
|
property alias min_value: slider.from
|
||||||
property alias max_value: slider.maximumValue
|
property alias max_value: slider.to
|
||||||
property alias stepSize: slider.stepSize
|
property alias stepSize: slider.stepSize
|
||||||
|
|
||||||
signal newValue(real newValue);
|
signal newValue(real newValue)
|
||||||
|
|
||||||
id: setting_component
|
id: setting_component
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
|
|
||||||
onValueChanged: {
|
onValueChanged: {
|
||||||
check.checked = !(value == 0);
|
check.checked = !(value == 0)
|
||||||
if(check.checked)
|
if (check.checked)
|
||||||
slider.value = value;
|
slider.value = value
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckBox{
|
CheckBox {
|
||||||
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 {
|
||||||
Layout.fillHeight: true
|
text: Math.round(
|
||||||
text: Math.round(((value - min_value) / (max_value - min_value)) * 100) + "%"
|
((value - min_value) / (max_value - min_value)) * 100) + "%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -17,14 +17,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.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
|
||||||
|
|
||||||
@ -35,15 +34,14 @@ Item {
|
|||||||
visible: false
|
visible: false
|
||||||
|
|
||||||
//This is a workaround to a Qt 5.2 bug.
|
//This is a workaround to a Qt 5.2 bug.
|
||||||
onColorChanged: if (Qt.platform.os !== "osx") colorSelected(color)
|
onColorChanged: if (!appSettings.isMacOS) colorSelected(color)
|
||||||
onAccepted: if (Qt.platform.os === "osx") colorSelected(color)
|
onAccepted: if (appSettings.isMacOS) 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
|
||||||
@ -51,14 +49,14 @@ Item {
|
|||||||
color: "white"
|
color: "white"
|
||||||
opacity: 0.5
|
opacity: 0.5
|
||||||
}
|
}
|
||||||
Text{
|
Text {
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
z: parent.z + 1
|
z: parent.z + 1
|
||||||
text: name + ": " + rootItem.color
|
text: name + ": " + rootItem.color
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MouseArea{
|
MouseArea {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
onClicked: colorDialog.visible = true;
|
onClicked: colorDialog.visible = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -17,19 +19,14 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
import QtQuick.Controls 1.0
|
import QtQuick.Controls 2.0
|
||||||
|
import QtQuick.Layouts 1.0
|
||||||
|
|
||||||
// This component is simply a label with a predefined size.
|
// This component is simply a label with a predefined size.
|
||||||
// Used to improve alignment.
|
// Used to improve alignment.
|
||||||
|
Label {
|
||||||
Item {
|
id: textfield
|
||||||
property alias text: textfield.text
|
Layout.minimumWidth: appSettings.labelWidth
|
||||||
width: appSettings.labelWidth
|
width: appSettings.labelWidth
|
||||||
Label{
|
|
||||||
id: textfield
|
|
||||||
anchors { right: parent.right; verticalCenter: parent.verticalCenter }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -17,10 +17,9 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
|
|
||||||
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)
|
||||||
@ -31,8 +30,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"
|
||||||
@ -41,7 +40,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"
|
||||||
@ -50,7 +49,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"
|
||||||
@ -59,7 +58,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"
|
||||||
@ -68,7 +67,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"
|
||||||
@ -77,7 +76,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"
|
||||||
@ -86,7 +85,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"
|
||||||
@ -95,7 +94,7 @@ QtObject{
|
|||||||
baseScaling: 3.5
|
baseScaling: 3.5
|
||||||
fontWidth: 0.8
|
fontWidth: 0.8
|
||||||
}
|
}
|
||||||
ListElement{
|
ListElement {
|
||||||
name: "COMMODORE_64"
|
name: "COMMODORE_64"
|
||||||
text: "Commodore 64 (1982)"
|
text: "Commodore 64 (1982)"
|
||||||
source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"
|
source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -17,10 +17,9 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
|
|
||||||
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)
|
||||||
@ -31,8 +30,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"
|
||||||
@ -41,7 +40,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"
|
||||||
@ -50,7 +49,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"
|
||||||
@ -59,7 +58,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"
|
||||||
@ -68,7 +67,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"
|
||||||
@ -77,7 +76,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"
|
||||||
@ -86,7 +85,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"
|
||||||
@ -95,7 +94,7 @@ QtObject{
|
|||||||
baseScaling: 3.5
|
baseScaling: 3.5
|
||||||
fontWidth: 0.7
|
fontWidth: 0.7
|
||||||
}
|
}
|
||||||
ListElement{
|
ListElement {
|
||||||
name: "COMMODORE_64"
|
name: "COMMODORE_64"
|
||||||
text: "Commodore 64 (1982)"
|
text: "Commodore 64 (1982)"
|
||||||
source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"
|
source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -17,27 +17,20 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
|
|
||||||
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
|
property int pixelSize: lowResolutionFont ? _font.pixelSize : _font.pixelSize * scaling
|
||||||
? _font.pixelSize
|
|
||||||
: _font.pixelSize * scaling
|
|
||||||
|
|
||||||
property int lineSpacing: lowResolutionFont
|
property int lineSpacing: lowResolutionFont ? _font.lineSpacing : pixelSize * _font.lineSpacing
|
||||||
? _font.lineSpacing
|
|
||||||
: pixelSize * _font.lineSpacing
|
|
||||||
|
|
||||||
property real screenScaling: lowResolutionFont
|
property real screenScaling: lowResolutionFont ? _font.baseScaling * scaling : 1.0
|
||||||
? _font.baseScaling * scaling
|
|
||||||
: 1.0
|
|
||||||
|
|
||||||
property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
|
property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
|
||||||
|
|
||||||
@ -52,9 +45,8 @@ 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"
|
||||||
@ -66,7 +58,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"
|
||||||
@ -78,7 +70,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"
|
||||||
@ -90,7 +82,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"
|
||||||
@ -102,7 +94,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"
|
||||||
@ -114,7 +106,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"
|
||||||
@ -126,7 +118,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"
|
||||||
@ -138,7 +130,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"
|
||||||
@ -150,7 +142,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"
|
||||||
@ -162,7 +154,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"
|
||||||
@ -174,7 +166,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"
|
||||||
@ -185,7 +177,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"
|
||||||
@ -196,7 +188,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"
|
||||||
@ -207,7 +199,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"
|
||||||
@ -218,10 +210,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/3270Medium.ttf"
|
source: "fonts/1971-ibm-3278/3270-Regular.ttf"
|
||||||
lineSpacing: 0.2
|
lineSpacing: 0.2
|
||||||
pixelSize: 32
|
pixelSize: 32
|
||||||
fontWidth: 1.0
|
fontWidth: 1.0
|
||||||
@ -234,25 +226,27 @@ 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++) {
|
||||||
console.log("Adding system font: ", families[i])
|
if (verbose) {
|
||||||
|
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
import QtQuick 2.2
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
width: parent.width - parent.border.width
|
|
||||||
height: parent.height - parent.border.width
|
|
||||||
radius:parent.radius - parent.border.width/2
|
|
||||||
smooth: true
|
|
||||||
|
|
||||||
border.width: parent.border.width/2
|
|
||||||
border.color: "#22FFFFFF"
|
|
||||||
|
|
||||||
gradient: Gradient {
|
|
||||||
GradientStop { position: 0; color: "#88FFFFFF" }
|
|
||||||
GradientStop { position: .1; color: "#55FFFFFF" }
|
|
||||||
GradientStop { position: .5; color: "#33FFFFFF" }
|
|
||||||
GradientStop { position: .501; color: "#11000000" }
|
|
||||||
GradientStop { position: .8; color: "#11FFFFFF" }
|
|
||||||
GradientStop { position: 1; color: "#55FFFFFF" }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -17,14 +17,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.0
|
import QtQuick.Window 2.0
|
||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 2.0
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
import QtQuick.Dialogs 1.1
|
import QtQuick.Dialogs 1.1
|
||||||
|
|
||||||
Window{
|
Window {
|
||||||
id: insertnamedialog
|
id: insertnamedialog
|
||||||
width: 400
|
width: 400
|
||||||
height: 100
|
height: 100
|
||||||
@ -39,50 +38,53 @@ 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{text: qsTr("Name")}
|
Label {
|
||||||
TextField{
|
text: qsTr("Name")
|
||||||
|
}
|
||||||
|
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(qsTr("The name you inserted is empty. Please choose a different one."));
|
errorDialog.showError(
|
||||||
break;
|
qsTr("The name you inserted is empty. Please choose a different one."))
|
||||||
|
break
|
||||||
default:
|
default:
|
||||||
nameSelected(name);
|
nameSelected(name)
|
||||||
close();
|
close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Button{
|
Button {
|
||||||
text: qsTr("Cancel")
|
text: qsTr("Cancel")
|
||||||
onClicked: close()
|
onClicked: close()
|
||||||
}
|
}
|
||||||
|
@ -1,66 +0,0 @@
|
|||||||
import QtQuick 2.0
|
|
||||||
|
|
||||||
import "utils.js" as Utils
|
|
||||||
|
|
||||||
ShaderEffect {
|
|
||||||
property color _staticFrameColor: "#dedede"
|
|
||||||
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)
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
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 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 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, outShadow);
|
|
||||||
color += frameColor.rgb * sqrt(outShadow);
|
|
||||||
alpha = sum2(1.0 - step(0.0, coords) + step(1.0, coords));
|
|
||||||
alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, sqrt(outShadow));
|
|
||||||
|
|
||||||
gl_FragColor = vec4(color * alpha, alpha);
|
|
||||||
}
|
|
||||||
"
|
|
||||||
|
|
||||||
onStatusChanged: if (log) console.log(log) //Print warning messages
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -19,16 +19,17 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 2.0
|
||||||
|
|
||||||
import QMLTermWidget 1.0
|
import QMLTermWidget 1.0
|
||||||
|
|
||||||
|
import "menus"
|
||||||
import "utils.js" as Utils
|
import "utils.js" as Utils
|
||||||
|
|
||||||
Item{
|
Item{
|
||||||
id: terminalContainer
|
id: terminalContainer
|
||||||
|
|
||||||
property size virtualResolution: Qt.size(kterminal.width, kterminal.height)
|
property size virtualResolution: Qt.size(kterminal.totalWidth, kterminal.totalHeight)
|
||||||
property alias mainTerminal: kterminal
|
property alias mainTerminal: kterminal
|
||||||
|
|
||||||
property ShaderEffectSource mainSource: kterminalSource
|
property ShaderEffectSource mainSource: kterminalSource
|
||||||
@ -43,40 +44,90 @@ 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();
|
|
||||||
onFontWidthChanged: terminalContainer.updateSources();
|
onFontScalingChanged: {
|
||||||
|
terminalContainer.updateSources()
|
||||||
|
}
|
||||||
|
|
||||||
|
onFontWidthChanged: {
|
||||||
|
terminalContainer.updateSources()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Connections{
|
Connections {
|
||||||
target: terminalContainer
|
target: terminalContainer
|
||||||
onWidthChanged: terminalContainer.updateSources();
|
|
||||||
onHeightChanged: terminalContainer.updateSources();
|
onWidthChanged: {
|
||||||
|
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
|
||||||
width: Math.floor(parent.width / (screenScaling * fontWidth))
|
|
||||||
height: Math.floor(parent.height / screenScaling)
|
property int textureResolutionScale: appSettings.lowResolutionFont ? devicePixelRatio : 1
|
||||||
|
property int margin: appSettings.totalMargin / screenScaling
|
||||||
|
property int totalWidth: Math.floor(parent.width / (screenScaling * fontWidth))
|
||||||
|
property int totalHeight: Math.floor(parent.height / screenScaling)
|
||||||
|
|
||||||
|
property int rawWidth: totalWidth - 2 * margin
|
||||||
|
property int rawHeight: 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
|
||||||
@ -124,7 +175,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 && Qt.platform.os === "osx") {
|
} else if (!defaultCmd && appSettings.isMacOS) {
|
||||||
// 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"]);
|
||||||
}
|
}
|
||||||
@ -138,35 +189,29 @@ Item{
|
|||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
appSettings.terminalFontChanged.connect(handleFontChanged);
|
appSettings.terminalFontChanged.connect(handleFontChanged);
|
||||||
appSettings.initializedSettings.connect(startSession);
|
appSettings.initializedSettings.connect(startSession);
|
||||||
|
appSettings.handleFontChanged()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Component {
|
Component {
|
||||||
id: linuxContextMenu
|
id: shortContextMenu
|
||||||
Menu{
|
ShortContextMenu { }
|
||||||
id: contextmenu
|
|
||||||
MenuItem { action: copyAction }
|
|
||||||
MenuItem { action: pasteAction }
|
|
||||||
MenuSeparator { visible: !appSettings.showMenubar }
|
|
||||||
MenuItem { action: showsettingsAction ; visible: !appSettings.showMenubar}
|
|
||||||
MenuSeparator { visible: !appSettings.showMenubar }
|
|
||||||
CRTMainMenuBar { visible: !appSettings.showMenubar }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Component {
|
Component {
|
||||||
id: osxContextMenu
|
id: fullContextMenu
|
||||||
Menu{
|
FullContextMenu { }
|
||||||
id: contextmenu
|
|
||||||
MenuItem{action: copyAction}
|
|
||||||
MenuItem{action: pasteAction}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Loader {
|
Loader {
|
||||||
id: menuLoader
|
id: menuLoader
|
||||||
sourceComponent: (Qt.platform.os === "osx" ? osxContextMenu : linuxContextMenu)
|
sourceComponent: (appSettings.isMacOS || appSettings.showMenubar ? shortContextMenu : fullContextMenu)
|
||||||
}
|
}
|
||||||
property alias contextmenu: menuLoader.item
|
property alias contextmenu: menuLoader.item
|
||||||
|
|
||||||
MouseArea{
|
MouseArea {
|
||||||
|
property real margin: appSettings.totalMargin
|
||||||
|
|
||||||
acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
|
acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
cursorShape: kterminal.terminalUsesMouse ? Qt.ArrowCursor : Qt.IBeamCursor
|
cursorShape: kterminal.terminalUsesMouse ? Qt.ArrowCursor : Qt.IBeamCursor
|
||||||
@ -200,14 +245,14 @@ Item{
|
|||||||
}
|
}
|
||||||
|
|
||||||
function correctDistortion(x, y){
|
function correctDistortion(x, y){
|
||||||
x = x / width;
|
x = (x - margin) / width;
|
||||||
y = y / height;
|
y = (y - margin) / height;
|
||||||
|
|
||||||
var cc = Qt.size(0.5 - x, 0.5 - y);
|
var cc = Qt.size(0.5 - x, 0.5 - y);
|
||||||
var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize;
|
var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize;
|
||||||
|
|
||||||
return Qt.point((x - cc.width * (1+distortion) * distortion) * kterminal.width,
|
return Qt.point((x - cc.width * (1+distortion) * distortion) * (kterminal.totalWidth),
|
||||||
(y - cc.height * (1+distortion) * distortion) * kterminal.height)
|
(y - cc.height * (1+distortion) * distortion) * (kterminal.totalHeight))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ShaderEffectSource{
|
ShaderEffectSource{
|
||||||
@ -216,10 +261,26 @@ Item{
|
|||||||
hideSource: true
|
hideSource: true
|
||||||
wrapMode: ShaderEffectSource.Repeat
|
wrapMode: ShaderEffectSource.Repeat
|
||||||
visible: false
|
visible: false
|
||||||
textureSize: Qt.size(kterminal.width * scaleTexture, kterminal.height * scaleTexture);
|
textureSize: Qt.size(kterminal.totalWidth * scaleTexture, kterminal.totalHeight * scaleTexture)
|
||||||
|
sourceRect: Qt.rect(-kterminal.margin, -kterminal.margin, kterminal.totalWidth, kterminal.totalHeight)
|
||||||
}
|
}
|
||||||
|
|
||||||
BurnInEffect {
|
Item {
|
||||||
id: burnInEffect
|
id: burnInContainer
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
159
app/qml/SettingsAdvancedTab.qml
Normal file
159
app/qml/SettingsAdvancedTab.qml
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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.0
|
||||||
|
import QtQuick.Layouts 1.1
|
||||||
|
import QtQml 2.0
|
||||||
|
|
||||||
|
import "Components"
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
GroupBox {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
title: qsTr("Command")
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
CheckBox {
|
||||||
|
id: useCustomCommand
|
||||||
|
text: qsTr("Use custom command instead of shell at startup")
|
||||||
|
checked: appSettings.useCustomCommand
|
||||||
|
onCheckedChanged: appSettings.useCustomCommand = checked
|
||||||
|
}
|
||||||
|
// Workaround for QTBUG-31627 for pre 5.3.0
|
||||||
|
Binding {
|
||||||
|
target: useCustomCommand
|
||||||
|
property: "checked"
|
||||||
|
value: appSettings.useCustomCommand
|
||||||
|
}
|
||||||
|
TextField {
|
||||||
|
id: customCommand
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: appSettings.customCommand
|
||||||
|
enabled: useCustomCommand.checked
|
||||||
|
onEditingFinished: 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GroupBox {
|
||||||
|
title: qsTr("Performance")
|
||||||
|
Layout.fillWidth: true
|
||||||
|
GridLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
columns: 4
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: qsTr("Effects FPS")
|
||||||
|
}
|
||||||
|
Slider {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
id: fpsSlider
|
||||||
|
onValueChanged: {
|
||||||
|
if (enabled) {
|
||||||
|
appSettings.fps = value !== 60 ? value + 1 : 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stepSize: 1
|
||||||
|
enabled: false
|
||||||
|
Component.onCompleted: {
|
||||||
|
from = 0
|
||||||
|
to = 60
|
||||||
|
value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60
|
||||||
|
enabled = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SizedLabel {
|
||||||
|
text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
text: qsTr("Texture Quality")
|
||||||
|
}
|
||||||
|
Slider {
|
||||||
|
id: txtslider
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
onValueChanged: if (enabled)
|
||||||
|
appSettings.windowScaling = value
|
||||||
|
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) + "%"
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: qsTr("Bloom Quality")
|
||||||
|
}
|
||||||
|
Slider {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
id: bloomSlider
|
||||||
|
onValueChanged: if (enabled)
|
||||||
|
appSettings.bloomQuality = value
|
||||||
|
stepSize: 0.05
|
||||||
|
enabled: false
|
||||||
|
Component.onCompleted: {
|
||||||
|
from = 0.25
|
||||||
|
value = appSettings.bloomQuality
|
||||||
|
enabled = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SizedLabel {
|
||||||
|
text: Math.round(bloomSlider.value * 100) + "%"
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: qsTr("BurnIn Quality")
|
||||||
|
}
|
||||||
|
Slider {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
id: burnInSlider
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
onValueChanged: if (enabled)
|
||||||
|
appSettings.burnInQuality = value
|
||||||
|
stepSize: 0.05
|
||||||
|
enabled: false
|
||||||
|
Component.onCompleted: {
|
||||||
|
from = 0.25
|
||||||
|
value = appSettings.burnInQuality
|
||||||
|
enabled = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SizedLabel {
|
||||||
|
text: Math.round(burnInSlider.value * 100) + "%"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -17,98 +17,70 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 2.0
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
|
|
||||||
Tab{
|
ColumnLayout {
|
||||||
ColumnLayout{
|
spacing: 2
|
||||||
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{
|
|
||||||
name: qsTr("BurnIn")
|
|
||||||
onNewValue: appSettings.burnIn = newValue
|
|
||||||
value: appSettings.burnIn
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("Static Noise")
|
|
||||||
onNewValue: appSettings.staticNoise = newValue
|
|
||||||
value: appSettings.staticNoise
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("Jitter")
|
|
||||||
onNewValue: appSettings.jitter = newValue
|
|
||||||
value: appSettings.jitter
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("Glow Line")
|
|
||||||
onNewValue: appSettings.glowingLine = newValue;
|
|
||||||
value: appSettings.glowingLine
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("Screen Curvature")
|
|
||||||
onNewValue: appSettings.screenCurvature = newValue;
|
|
||||||
value: appSettings.screenCurvature;
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("Ambient Light")
|
|
||||||
onNewValue: appSettings.ambientLight = newValue;
|
|
||||||
value: appSettings.ambientLight
|
|
||||||
enabled: appSettings.framesIndex !== 0
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("Flickering")
|
|
||||||
onNewValue: appSettings.flickering = newValue;
|
|
||||||
value: appSettings.flickering;
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("Horizontal Sync")
|
|
||||||
onNewValue: appSettings.horizontalSync = newValue;
|
|
||||||
value: appSettings.horizontalSync;
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("RGB Shift")
|
|
||||||
onNewValue: appSettings.rbgShift = newValue;
|
|
||||||
value: appSettings.rbgShift;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
CheckableSlider {
|
||||||
|
name: qsTr("BurnIn")
|
||||||
GroupBox{
|
onNewValue: appSettings.burnIn = newValue
|
||||||
title: qsTr("Lights")
|
value: appSettings.burnIn
|
||||||
Layout.fillWidth: true
|
}
|
||||||
GridLayout{
|
CheckableSlider {
|
||||||
anchors.fill: parent
|
name: qsTr("Static Noise")
|
||||||
columns: 2
|
onNewValue: appSettings.staticNoise = newValue
|
||||||
Label{ text: qsTr("Brightness") }
|
value: appSettings.staticNoise
|
||||||
SimpleSlider{
|
}
|
||||||
onValueChanged: appSettings.brightness = value
|
CheckableSlider {
|
||||||
value: appSettings.brightness
|
name: qsTr("Jitter")
|
||||||
}
|
onNewValue: appSettings.jitter = newValue
|
||||||
Label{ text: qsTr("Contrast") }
|
value: appSettings.jitter
|
||||||
SimpleSlider{
|
}
|
||||||
onValueChanged: appSettings.contrast = value
|
CheckableSlider {
|
||||||
value: appSettings.contrast
|
name: qsTr("Glow Line")
|
||||||
}
|
onNewValue: appSettings.glowingLine = newValue
|
||||||
Label{ text: qsTr("Opacity") }
|
value: appSettings.glowingLine
|
||||||
SimpleSlider{
|
}
|
||||||
onValueChanged: appSettings.windowOpacity = value
|
CheckableSlider {
|
||||||
value: appSettings.windowOpacity
|
name: qsTr("Screen Curvature")
|
||||||
}
|
onNewValue: appSettings.screenCurvature = newValue
|
||||||
|
value: appSettings.screenCurvature
|
||||||
|
}
|
||||||
|
CheckableSlider {
|
||||||
|
name: qsTr("Ambient Light")
|
||||||
|
onNewValue: appSettings.ambientLight = newValue
|
||||||
|
value: appSettings.ambientLight
|
||||||
|
enabled: appSettings.framesIndex !== 0
|
||||||
|
}
|
||||||
|
CheckableSlider {
|
||||||
|
name: qsTr("Flickering")
|
||||||
|
onNewValue: appSettings.flickering = newValue
|
||||||
|
value: appSettings.flickering
|
||||||
|
}
|
||||||
|
CheckableSlider {
|
||||||
|
name: qsTr("Horizontal Sync")
|
||||||
|
onNewValue: appSettings.horizontalSync = newValue
|
||||||
|
value: appSettings.horizontalSync
|
||||||
|
}
|
||||||
|
CheckableSlider {
|
||||||
|
name: qsTr("RGB Shift")
|
||||||
|
onNewValue: appSettings.rbgShift = newValue
|
||||||
|
value: appSettings.rbgShift
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -17,222 +17,252 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 2.4
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
import QtQuick.Dialogs 1.1
|
import QtQuick.Dialogs 1.1
|
||||||
|
|
||||||
Tab{
|
ColumnLayout {
|
||||||
ColumnLayout{
|
GroupBox {
|
||||||
anchors.fill: parent
|
Layout.fillWidth: true
|
||||||
GroupBox{
|
title: qsTr("Profile")
|
||||||
Layout.fillWidth: true
|
RowLayout {
|
||||||
Layout.fillHeight: true
|
anchors.fill: parent
|
||||||
title: qsTr("Profile")
|
ListView {
|
||||||
RowLayout {
|
id: profilesView
|
||||||
anchors.fill: parent
|
Layout.fillWidth: true
|
||||||
TableView {
|
Layout.fillHeight: true
|
||||||
id: profilesView
|
model: appSettings.profilesList
|
||||||
Layout.fillWidth: true
|
clip: true
|
||||||
Layout.fillHeight: true
|
delegate: Rectangle {
|
||||||
model: appSettings.profilesList
|
width: label.width
|
||||||
headerVisible: false
|
height: label.height
|
||||||
TableViewColumn {
|
color: (index == profilesView.currentIndex) ? palette.highlight : palette.base
|
||||||
title: qsTr("Profile")
|
Label {
|
||||||
role: "text"
|
id: label
|
||||||
width: parent.width * 0.5
|
text: appSettings.profilesList.get(index).text
|
||||||
}
|
MouseArea {
|
||||||
onActivated: {
|
anchors.fill: parent
|
||||||
appSettings.loadProfile(row);
|
onClicked: profilesView.currentIndex = index
|
||||||
}
|
onDoubleClicked: appSettings.loadProfile(index)
|
||||||
}
|
|
||||||
ColumnLayout {
|
|
||||||
Layout.fillHeight: true
|
|
||||||
Layout.fillWidth: false
|
|
||||||
Button{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
text: qsTr("New")
|
|
||||||
onClicked: {
|
|
||||||
insertname.profileName = "";
|
|
||||||
insertname.show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Button{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
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
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
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 = 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{
|
|
||||||
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{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
title: qsTr("Command")
|
|
||||||
ColumnLayout {
|
ColumnLayout {
|
||||||
anchors.fill: parent
|
Layout.fillHeight: true
|
||||||
CheckBox{
|
Layout.fillWidth: false
|
||||||
id: useCustomCommand
|
Button {
|
||||||
text: qsTr("Use custom command instead of shell at startup")
|
|
||||||
checked: appSettings.useCustomCommand
|
|
||||||
onCheckedChanged: appSettings.useCustomCommand = checked
|
|
||||||
}
|
|
||||||
// Workaround for QTBUG-31627 for pre 5.3.0
|
|
||||||
Binding{
|
|
||||||
target: useCustomCommand
|
|
||||||
property: "checked"
|
|
||||||
value: appSettings.useCustomCommand
|
|
||||||
}
|
|
||||||
TextField{
|
|
||||||
id: customCommand
|
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
text: appSettings.customCommand
|
text: qsTr("Save")
|
||||||
enabled: useCustomCommand.checked
|
onClicked: {
|
||||||
onEditingFinished: appSettings.customCommand = text
|
insertname.profileName = ""
|
||||||
|
insertname.show()
|
||||||
// Save text even if user forgets to press enter or unfocus
|
|
||||||
function saveSetting() {
|
|
||||||
appSettings.customCommand = text;
|
|
||||||
}
|
}
|
||||||
Component.onCompleted: settings_window.closing.connect(saveSetting)
|
|
||||||
}
|
}
|
||||||
}
|
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
|
||||||
|
|
||||||
// DIALOGS ////////////////////////////////////////////////////////////////
|
enabled: currentIndex >= 0 && !appSettings.profilesList.get(
|
||||||
InsertNameDialog{
|
currentIndex).builtin
|
||||||
id: insertname
|
onClicked: {
|
||||||
onNameSelected: {
|
appSettings.profilesList.remove(currentIndex)
|
||||||
appSettings.appendCustomProfile(name, appSettings.composeProfileString());
|
profilesView.selection.clear()
|
||||||
}
|
|
||||||
}
|
|
||||||
MessageDialog {
|
|
||||||
id: messageDialog
|
|
||||||
title: qsTr("File Error")
|
|
||||||
onAccepted: {
|
|
||||||
messageDialog.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loader {
|
|
||||||
property var callBack
|
|
||||||
property bool selectExisting: false
|
|
||||||
id: fileDialog
|
|
||||||
|
|
||||||
sourceComponent: FileDialog{
|
// TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2.
|
||||||
nameFilters: ["Json files (*.json)"]
|
profilesView.model = 0
|
||||||
selectMultiple: false
|
profilesView.model = appSettings.profilesList
|
||||||
selectFolder: false
|
}
|
||||||
selectExisting: fileDialog.selectExisting
|
}
|
||||||
onAccepted: callBack(fileUrl);
|
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)
|
||||||
|
|
||||||
onSelectExistingChanged: reload()
|
var profileObject = JSON.parse(fileIO.read(url))
|
||||||
|
var name = profileObject.name
|
||||||
|
|
||||||
function open() {
|
if (!name)
|
||||||
item.open();
|
throw "Profile doesn't have a name"
|
||||||
}
|
|
||||||
|
|
||||||
function reload() {
|
var version = profileObject.version
|
||||||
active = false;
|
!== undefined ? profileObject.version : 1
|
||||||
active = true;
|
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 {
|
||||||
|
property alias currentIndex: profilesView.currentIndex
|
||||||
|
|
||||||
|
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 {
|
||||||
|
title: qsTr("Screen")
|
||||||
|
Layout.fillWidth: true
|
||||||
|
GridLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
columns: 2
|
||||||
|
Label {
|
||||||
|
text: qsTr("Brightness")
|
||||||
|
}
|
||||||
|
SimpleSlider {
|
||||||
|
onValueChanged: appSettings.brightness = value
|
||||||
|
value: appSettings.brightness
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
text: qsTr("Contrast")
|
||||||
|
}
|
||||||
|
SimpleSlider {
|
||||||
|
onValueChanged: appSettings.contrast = value
|
||||||
|
value: appSettings.contrast
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
text: qsTr("Margin")
|
||||||
|
}
|
||||||
|
SimpleSlider {
|
||||||
|
onValueChanged: appSettings._margin = value
|
||||||
|
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 ////////////////////////////////////////////////////////////////
|
||||||
|
InsertNameDialog {
|
||||||
|
id: insertname
|
||||||
|
onNameSelected: {
|
||||||
|
appSettings.appendCustomProfile(name,
|
||||||
|
appSettings.composeProfileString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MessageDialog {
|
||||||
|
id: messageDialog
|
||||||
|
title: qsTr("File Error")
|
||||||
|
onAccepted: {
|
||||||
|
messageDialog.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loader {
|
||||||
|
property var callBack
|
||||||
|
property bool selectExisting: false
|
||||||
|
id: fileDialog
|
||||||
|
|
||||||
|
sourceComponent: FileDialog {
|
||||||
|
nameFilters: ["Json files (*.json)"]
|
||||||
|
selectMultiple: false
|
||||||
|
selectFolder: false
|
||||||
|
selectExisting: fileDialog.selectExisting
|
||||||
|
onAccepted: callBack(fileUrl)
|
||||||
|
}
|
||||||
|
|
||||||
|
onSelectExistingChanged: reload()
|
||||||
|
|
||||||
|
function open() {
|
||||||
|
item.open()
|
||||||
|
}
|
||||||
|
|
||||||
|
function reload() {
|
||||||
|
active = false
|
||||||
|
active = true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,118 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
|
||||||
*
|
|
||||||
* This file is part of cool-retro-term.
|
|
||||||
*
|
|
||||||
* cool-retro-term is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
import QtQuick 2.2
|
|
||||||
import QtQuick.Controls 1.1
|
|
||||||
import QtQuick.Layouts 1.1
|
|
||||||
|
|
||||||
import "Components"
|
|
||||||
|
|
||||||
Tab{
|
|
||||||
ColumnLayout{
|
|
||||||
anchors.fill: parent
|
|
||||||
GroupBox{
|
|
||||||
title: qsTr("General")
|
|
||||||
Layout.fillWidth: true
|
|
||||||
GridLayout{
|
|
||||||
anchors.fill: parent
|
|
||||||
rows: 2
|
|
||||||
columns: 3
|
|
||||||
Label{text: qsTr("Effects FPS")}
|
|
||||||
Slider{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
id: fpsSlider
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SizedLabel{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")}
|
|
||||||
Label{text: qsTr("Texture Quality")}
|
|
||||||
Slider{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
id: txtslider
|
|
||||||
onValueChanged: if (enabled) appSettings.windowScaling = value;
|
|
||||||
stepSize: 0.05
|
|
||||||
enabled: false
|
|
||||||
Component.onCompleted: {
|
|
||||||
minimumValue = 0.25 //Without this value gets set to 0.5
|
|
||||||
value = appSettings.windowScaling;
|
|
||||||
enabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SizedLabel{text: Math.round(txtslider.value * 100) + "%"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GroupBox{
|
|
||||||
title: qsTr("Bloom")
|
|
||||||
Layout.fillWidth: true
|
|
||||||
GridLayout{
|
|
||||||
id: bloomQualityContainer
|
|
||||||
anchors.fill: parent
|
|
||||||
Label{text: qsTr("Bloom Quality")}
|
|
||||||
Slider{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
id: bloomSlider
|
|
||||||
onValueChanged: if (enabled) appSettings.bloomQuality = value;
|
|
||||||
stepSize: 0.05
|
|
||||||
enabled: false
|
|
||||||
Component.onCompleted: {
|
|
||||||
minimumValue = 0.25
|
|
||||||
value = appSettings.bloomQuality;
|
|
||||||
enabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GroupBox{
|
|
||||||
title: qsTr("BurnIn")
|
|
||||||
Layout.fillWidth: true
|
|
||||||
GridLayout{
|
|
||||||
id: blurQualityContainer
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
Label{text: qsTr("BurnIn Quality")}
|
|
||||||
Slider{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
id: burnInSlider
|
|
||||||
onValueChanged: if (enabled) appSettings.burnInQuality = value;
|
|
||||||
stepSize: 0.05
|
|
||||||
enabled: false
|
|
||||||
Component.onCompleted: {
|
|
||||||
minimumValue = 0.25
|
|
||||||
value = appSettings.burnInQuality;
|
|
||||||
enabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -17,138 +17,166 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 2.1
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
|
import QtQml 2.0
|
||||||
|
|
||||||
import "Components"
|
import "Components"
|
||||||
|
|
||||||
Tab{
|
ColumnLayout {
|
||||||
ColumnLayout{
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
GroupBox{
|
GroupBox {
|
||||||
title: qsTr("Font")
|
title: qsTr("Font")
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
GridLayout{
|
GridLayout {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
columns: 2
|
columns: 2
|
||||||
Label { text: qsTr("Rasterization") }
|
Label {
|
||||||
ComboBox {
|
text: qsTr("Rasterization")
|
||||||
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")]
|
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels"), qsTr("Sub-Pixels")]
|
||||||
currentIndex: appSettings.rasterization
|
currentIndex: appSettings.rasterization
|
||||||
onCurrentIndexChanged: {
|
onCurrentIndexChanged: {
|
||||||
appSettings.rasterization = currentIndex
|
appSettings.rasterization = currentIndex
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
text: qsTr("Name")
|
||||||
|
}
|
||||||
|
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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Label{ text: qsTr("Name") }
|
Component.onCompleted: updateIndex()
|
||||||
ComboBox{
|
}
|
||||||
id: fontChanger
|
Label {
|
||||||
|
text: qsTr("Scaling")
|
||||||
|
}
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Slider {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
model: appSettings.fontlist
|
id: fontScalingChanger
|
||||||
onActivated: {
|
onValueChanged: appSettings.fontScaling = value
|
||||||
var name = appSettings.fontlist.get(index).name;
|
value: appSettings.fontScaling
|
||||||
appSettings.fontNames[appSettings.rasterization] = name;
|
stepSize: 0.05
|
||||||
appSettings.handleFontChanged();
|
from: appSettings.minimumFontScaling
|
||||||
}
|
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();
|
|
||||||
}
|
}
|
||||||
Label{ text: qsTr("Scaling") }
|
SizedLabel {
|
||||||
RowLayout{
|
text: Math.round(fontScalingChanger.value * 100) + "%"
|
||||||
Layout.fillWidth: true
|
|
||||||
Slider{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
id: fontScalingChanger
|
|
||||||
onValueChanged: if(enabled) appSettings.fontScaling = value
|
|
||||||
stepSize: 0.05
|
|
||||||
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) + "%"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Label{ text: qsTr("Font Width") }
|
}
|
||||||
RowLayout{
|
Label {
|
||||||
|
text: qsTr("Font Width")
|
||||||
|
}
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Slider {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Slider{
|
id: widthChanger
|
||||||
Layout.fillWidth: true
|
onValueChanged: appSettings.fontWidth = value
|
||||||
id: widthChanger
|
value: appSettings.fontWidth
|
||||||
onValueChanged: appSettings.fontWidth = value;
|
stepSize: 0.05
|
||||||
value: appSettings.fontWidth
|
from: 0.5
|
||||||
stepSize: 0.05
|
to: 1.5
|
||||||
Component.onCompleted: {
|
}
|
||||||
// This is needed to avoid unnecessary chnaged events.
|
SizedLabel {
|
||||||
minimumValue = 0.5;
|
text: Math.round(widthChanger.value * 100) + "%"
|
||||||
maximumValue = 1.5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SizedLabel{
|
|
||||||
text: Math.round(widthChanger.value * 100) + "%"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GroupBox{
|
}
|
||||||
title: qsTr("Colors")
|
GroupBox {
|
||||||
Layout.fillWidth: true
|
title: qsTr("Cursor")
|
||||||
ColumnLayout{
|
Layout.fillWidth: true
|
||||||
anchors.fill: parent
|
ColumnLayout {
|
||||||
ColumnLayout{
|
anchors.fill: parent
|
||||||
Layout.fillWidth: true
|
CheckBox {
|
||||||
CheckableSlider{
|
id: blinkingCursor
|
||||||
name: qsTr("Chroma Color")
|
text: qsTr("Blinking Cursor")
|
||||||
onNewValue: appSettings.chromaColor = newValue
|
checked: appSettings.blinkingCursor
|
||||||
value: appSettings.chromaColor
|
onCheckedChanged: appSettings.blinkingCursor = checked
|
||||||
}
|
}
|
||||||
CheckableSlider{
|
Binding {
|
||||||
name: qsTr("Saturation Color")
|
target: blinkingCursor
|
||||||
onNewValue: appSettings.saturationColor = newValue
|
property: "checked"
|
||||||
value: appSettings.saturationColor
|
value: appSettings.blinkingCursor
|
||||||
enabled: appSettings.chromaColor !== 0
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
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
|
||||||
}
|
}
|
||||||
RowLayout{
|
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
|
||||||
ColorButton{
|
onColorSelected: appSettings._fontColor = color
|
||||||
name: qsTr("Font")
|
color: appSettings._fontColor
|
||||||
height: 50
|
}
|
||||||
Layout.fillWidth: true
|
ColorButton {
|
||||||
onColorSelected: appSettings._fontColor = color;
|
name: qsTr("Background")
|
||||||
color: appSettings._fontColor
|
height: 50
|
||||||
}
|
Layout.fillWidth: true
|
||||||
ColorButton{
|
onColorSelected: appSettings._backgroundColor = color
|
||||||
name: qsTr("Background")
|
color: appSettings._backgroundColor
|
||||||
height: 50
|
}
|
||||||
Layout.fillWidth: true
|
ColorButton {
|
||||||
onColorSelected: appSettings._backgroundColor = color;
|
name: qsTr("Frame")
|
||||||
color: appSettings._backgroundColor
|
height: 50
|
||||||
}
|
Layout.fillWidth: true
|
||||||
|
onColorSelected: appSettings._frameColor = color
|
||||||
|
color: appSettings._frameColor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -19,46 +19,57 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 2.1
|
||||||
import QtQuick.Window 2.1
|
import QtQuick.Window 2.1
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.3
|
||||||
import QtQuick.Dialogs 1.1
|
import QtQuick.Dialogs 1.1
|
||||||
|
|
||||||
Window {
|
Window {
|
||||||
id: settings_window
|
id: settings_window
|
||||||
title: qsTr("Settings")
|
title: qsTr("Settings")
|
||||||
width: 580
|
width: 640
|
||||||
height: 500
|
height: 640
|
||||||
|
|
||||||
property int tabmargins: 15
|
property int tabmargins: 15
|
||||||
|
|
||||||
TabView{
|
Item {
|
||||||
id: tabView
|
anchors { fill: parent; margins: tabmargins }
|
||||||
anchors.fill: parent
|
|
||||||
anchors.margins: 10
|
TabBar {
|
||||||
SettingsGeneralTab{
|
id: bar
|
||||||
id: generalTab
|
anchors { left: parent.left; right: parent.right; top: parent.top; }
|
||||||
title: qsTr("General")
|
TabButton {
|
||||||
anchors.fill: parent
|
text: qsTr("General")
|
||||||
anchors.margins: tabmargins
|
}
|
||||||
|
TabButton {
|
||||||
|
text: qsTr("Terminal")
|
||||||
|
}
|
||||||
|
TabButton {
|
||||||
|
text: qsTr("Effects")
|
||||||
|
}
|
||||||
|
TabButton {
|
||||||
|
text: qsTr("Advanced")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
SettingsTerminalTab{
|
|
||||||
id: terminalTab
|
Frame {
|
||||||
title: qsTr("Terminal")
|
anchors {
|
||||||
anchors.fill: parent
|
top: bar.bottom
|
||||||
anchors.margins: tabmargins
|
left: parent.left
|
||||||
}
|
right: parent.right
|
||||||
SettingsEffectsTab{
|
bottom: parent.bottom
|
||||||
id: effectsTab
|
}
|
||||||
title: qsTr("Effects")
|
|
||||||
anchors.fill: parent
|
StackLayout {
|
||||||
anchors.margins: tabmargins
|
anchors.fill: parent
|
||||||
}
|
|
||||||
SettingsPerformanceTab{
|
currentIndex: bar.currentIndex
|
||||||
id: performanceTab
|
|
||||||
title: qsTr("Performance")
|
SettingsGeneralTab { }
|
||||||
anchors.fill: parent
|
SettingsTerminalTab { }
|
||||||
anchors.margins: tabmargins
|
SettingsEffectsTab { }
|
||||||
|
SettingsAdvancedTab { }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
91
app/qml/ShaderLibrary.qml
Normal file
91
app/qml/ShaderLibrary.qml
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
import QtQuick 2.0
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
property string rasterizationShader:
|
||||||
|
(appSettings.rasterization === appSettings.no_rasterization ? "
|
||||||
|
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
|
||||||
|
return texel;
|
||||||
|
}" : "") +
|
||||||
|
|
||||||
|
(appSettings.rasterization === appSettings.scanline_rasterization ? "
|
||||||
|
#define INTENSITY 0.30
|
||||||
|
#define BRIGHTBOOST 0.30
|
||||||
|
|
||||||
|
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
|
||||||
|
lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel;
|
||||||
|
lowp vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * texel)) * texel;
|
||||||
|
|
||||||
|
vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0);
|
||||||
|
lowp float mask = 1.0 - abs(coords.y);
|
||||||
|
|
||||||
|
lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask);
|
||||||
|
return mix(texel, rasterizationColor, intensity);
|
||||||
|
}" : "") +
|
||||||
|
|
||||||
|
(appSettings.rasterization === appSettings.pixel_rasterization ? "
|
||||||
|
#define INTENSITY 0.30
|
||||||
|
#define BRIGHTBOOST 0.30
|
||||||
|
|
||||||
|
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
|
||||||
|
lowp vec3 result = texel;
|
||||||
|
|
||||||
|
lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel;
|
||||||
|
lowp vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * texel)) * texel;
|
||||||
|
|
||||||
|
vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0);
|
||||||
|
coords = coords * coords;
|
||||||
|
lowp float mask = 1.0 - coords.x - coords.y;
|
||||||
|
|
||||||
|
lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask);
|
||||||
|
return mix(texel, rasterizationColor, intensity);
|
||||||
|
}" : "") +
|
||||||
|
|
||||||
|
(appSettings.rasterization === appSettings.subpixel_rasterization ? "
|
||||||
|
#define INTENSITY 0.30
|
||||||
|
#define BRIGHTBOOST 0.30
|
||||||
|
#define SUBPIXELS 3.0
|
||||||
|
const vec3 offsets = vec3(3.141592654) * vec3(1.0/2.0,1.0/2.0 - 2.0/3.0,1.0/2.0-4.0/3.0);
|
||||||
|
|
||||||
|
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
|
||||||
|
vec2 omega = vec2(3.141592654) * vec2(2.0) * virtualResolution;
|
||||||
|
vec2 angle = screenCoords * omega;
|
||||||
|
vec3 xfactors = (SUBPIXELS + sin(angle.x + offsets)) / (SUBPIXELS + 1.0);
|
||||||
|
|
||||||
|
lowp vec3 result = texel * xfactors;
|
||||||
|
lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * result)) * result;
|
||||||
|
lowp vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * result)) * result;
|
||||||
|
|
||||||
|
vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0);
|
||||||
|
lowp float mask = 1.0 - abs(coords.y);
|
||||||
|
|
||||||
|
lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask);
|
||||||
|
return mix(texel, rasterizationColor, intensity);
|
||||||
|
}" : "") +
|
||||||
|
|
||||||
|
"\n\n"
|
||||||
|
|
||||||
|
property string min2: "
|
||||||
|
float min2(vec2 v) {
|
||||||
|
return min(v.x, v.y);
|
||||||
|
}\n\n"
|
||||||
|
|
||||||
|
property string rgb2grey: "
|
||||||
|
float rgb2grey(vec3 v) {
|
||||||
|
return dot(v, vec3(0.21, 0.72, 0.04));
|
||||||
|
}\n\n"
|
||||||
|
|
||||||
|
property string max2: "
|
||||||
|
float max2(vec2 v) {
|
||||||
|
return max(v.x, v.y);
|
||||||
|
}\n\n"
|
||||||
|
|
||||||
|
property string prod2: "
|
||||||
|
float prod2(vec2 v) {
|
||||||
|
return v.x * v.y;
|
||||||
|
}\n\n"
|
||||||
|
|
||||||
|
property string sum2: "
|
||||||
|
float sum2(vec2 v) {
|
||||||
|
return v.x + v.y;
|
||||||
|
}\n\n"
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -37,34 +37,56 @@ Item {
|
|||||||
|
|
||||||
property real ambientLight: appSettings.ambientLight * 0.2
|
property real ambientLight: appSettings.ambientLight * 0.2
|
||||||
|
|
||||||
property size virtual_resolution
|
property real frameGloss: appSettings.frameGloss
|
||||||
|
|
||||||
|
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 color fontColor: parent.fontColor
|
property color fontColor: parent.fontColor
|
||||||
property color backgroundColor: parent.backgroundColor
|
property color backgroundColor: parent.backgroundColor
|
||||||
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 * 0.5
|
property real horizontalSync: appSettings.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) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
|
property size scaleNoiseSize: Qt.size((width * 0.75) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
|
||||||
(height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
|
(height * 0.75) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
|
||||||
|
|
||||||
property size virtual_resolution: parent.virtual_resolution
|
property size virtualResolution: parent.virtualResolution
|
||||||
|
|
||||||
|
// Rasterization might display oversamping issues if virtual resolution is close to physical display resolution.
|
||||||
|
// We progressively disable rasterization from 4x up to 2x resolution.
|
||||||
|
property real rasterizationIntensity: Utils.smoothstep(2.0, 4.0, _screenDensity)
|
||||||
|
|
||||||
|
property real displayTerminalFrame: appSettings._frameMargin > 0 || appSettings.screenCurvature > 0
|
||||||
|
|
||||||
property real time: timeManager.time
|
property real time: timeManager.time
|
||||||
property ShaderEffectSource noiseSource: noiseShaderSource
|
property ShaderEffectSource noiseSource: noiseShaderSource
|
||||||
@ -76,7 +98,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
|
||||||
@ -84,7 +106,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
|
||||||
@ -114,7 +136,7 @@ Item {
|
|||||||
uniform lowp float flickering;" : "") +
|
uniform lowp float flickering;" : "") +
|
||||||
|
|
||||||
(!fallBack && horizontalSync !== 0.0 ?"
|
(!fallBack && horizontalSync !== 0.0 ?"
|
||||||
uniform lowp float horizontalSync;
|
uniform lowp float horizontalSyncStrength;
|
||||||
varying lowp float distortionScale;
|
varying lowp float distortionScale;
|
||||||
varying lowp float distortionFreq;" : "") +
|
varying lowp float distortionFreq;" : "") +
|
||||||
|
|
||||||
@ -132,8 +154,8 @@ Item {
|
|||||||
: "") +
|
: "") +
|
||||||
|
|
||||||
(!fallBack && horizontalSync !== 0.0 ? "
|
(!fallBack && horizontalSync !== 0.0 ? "
|
||||||
float randval = horizontalSync - initialNoiseTexel.r;
|
float randval = horizontalSyncStrength - initialNoiseTexel.r;
|
||||||
distortionScale = step(0.0, randval) * randval * horizontalSync;
|
distortionScale = step(0.0, randval) * randval * horizontalSyncStrength;
|
||||||
distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
|
distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
|
||||||
: "") +
|
: "") +
|
||||||
|
|
||||||
@ -153,8 +175,10 @@ 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 virtual_resolution;" +
|
uniform highp vec2 virtualResolution;
|
||||||
|
uniform lowp float rasterizationIntensity;\n" +
|
||||||
|
|
||||||
(burnIn !== 0 ? "
|
(burnIn !== 0 ? "
|
||||||
uniform sampler2D burnInSource;
|
uniform sampler2D burnInSource;
|
||||||
@ -162,10 +186,11 @@ 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)
|
(((staticNoise !== 0 || jitter !== 0) ||(fallBack && (flickering || horizontalSync))) ? "
|
||||||
||(fallBack && (flickering || horizontalSync))) ? "
|
|
||||||
uniform lowp sampler2D noiseSource;
|
uniform lowp sampler2D noiseSource;
|
||||||
uniform highp vec2 scaleNoiseSize;" : "") +
|
uniform highp vec2 scaleNoiseSize;" : "") +
|
||||||
|
(displayTerminalFrame ? "
|
||||||
|
uniform lowp sampler2D frameSource;" : "") +
|
||||||
(screenCurvature !== 0 ? "
|
(screenCurvature !== 0 ? "
|
||||||
uniform highp float screenCurvature;" : "") +
|
uniform highp float screenCurvature;" : "") +
|
||||||
(glowingLine !== 0 ? "
|
(glowingLine !== 0 ? "
|
||||||
@ -178,7 +203,7 @@ Item {
|
|||||||
uniform lowp float ambientLight;" : "") +
|
uniform lowp float ambientLight;" : "") +
|
||||||
|
|
||||||
(fallBack && horizontalSync !== 0 ? "
|
(fallBack && horizontalSync !== 0 ? "
|
||||||
uniform lowp float horizontalSync;" : "") +
|
uniform lowp float horizontalSyncStrength;" : "") +
|
||||||
(fallBack && flickering !== 0.0 ?"
|
(fallBack && flickering !== 0.0 ?"
|
||||||
uniform lowp float flickering;" : "") +
|
uniform lowp float flickering;" : "") +
|
||||||
(!fallBack && flickering !== 0 ? "
|
(!fallBack && flickering !== 0 ? "
|
||||||
@ -190,17 +215,14 @@ Item {
|
|||||||
|
|
||||||
(glowingLine !== 0 ? "
|
(glowingLine !== 0 ? "
|
||||||
float randomPass(vec2 coords){
|
float randomPass(vec2 coords){
|
||||||
return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015)));
|
return fract(smoothstep(-120.0, 0.0, coords.y - (virtualResolution.y + 120.0) * fract(time * 0.00015)));
|
||||||
}" : "") +
|
}" : "") +
|
||||||
|
|
||||||
"float min2(vec2 v) {
|
shaderLibrary.min2 +
|
||||||
return min(v.x, v.y);
|
shaderLibrary.rgb2grey +
|
||||||
}
|
shaderLibrary.rasterizationShader +
|
||||||
|
|
||||||
float rgb2grey(vec3 v){
|
|
||||||
return dot(v, vec3(0.21, 0.72, 0.04));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
"
|
||||||
float isInScreen(vec2 v) {
|
float isInScreen(vec2 v) {
|
||||||
return min2(step(0.0, v) - step(1.0, v));
|
return min2(step(0.0, v) - step(1.0, v));
|
||||||
}
|
}
|
||||||
@ -225,6 +247,17 @@ 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);" +
|
||||||
@ -238,8 +271,8 @@ Item {
|
|||||||
float brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
|
float brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
|
||||||
: "") +
|
: "") +
|
||||||
(fallBack && horizontalSync !== 0.0 ? "
|
(fallBack && horizontalSync !== 0.0 ? "
|
||||||
float randval = horizontalSync - initialNoiseTexel.r;
|
float randval = horizontalSyncStrength - initialNoiseTexel.r;
|
||||||
float distortionScale = step(0.0, randval) * randval * horizontalSync;
|
float distortionScale = step(0.0, randval) * randval * horizontalSyncStrength;
|
||||||
float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
|
float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
|
||||||
: "") +
|
: "") +
|
||||||
|
|
||||||
@ -247,12 +280,9 @@ Item {
|
|||||||
float noise = staticNoise;" : "") +
|
float noise = staticNoise;" : "") +
|
||||||
|
|
||||||
(screenCurvature !== 0 ? "
|
(screenCurvature !== 0 ? "
|
||||||
vec2 curvatureCoords = barrel(qt_TexCoord0, cc);
|
vec2 staticCoords = barrel(qt_TexCoord0, cc);"
|
||||||
float staticInScreen = min2(step(0.0, curvatureCoords) - step(1.0, curvatureCoords));
|
|
||||||
vec2 staticCoords = curvatureCoords;"
|
|
||||||
:"
|
:"
|
||||||
vec2 staticCoords = qt_TexCoord0;
|
vec2 staticCoords = qt_TexCoord0;") +
|
||||||
float staticInScreen = 1.0;") +
|
|
||||||
|
|
||||||
"vec2 coords = qt_TexCoord0;" +
|
"vec2 coords = qt_TexCoord0;" +
|
||||||
|
|
||||||
@ -266,7 +296,11 @@ Item {
|
|||||||
: "") +
|
: "") +
|
||||||
|
|
||||||
(jitter !== 0 || staticNoise !== 0 ?
|
(jitter !== 0 || staticNoise !== 0 ?
|
||||||
"vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));"
|
"vec4 noiseTexel = texture2D(
|
||||||
|
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 ? "
|
||||||
@ -281,12 +315,9 @@ Item {
|
|||||||
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
|
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
|
||||||
|
|
||||||
(glowingLine !== 0 ? "
|
(glowingLine !== 0 ? "
|
||||||
color += randomPass(coords * virtual_resolution) * glowingLine;" : "") +
|
color += randomPass(coords * virtualResolution) * glowingLine;" : "") +
|
||||||
|
|
||||||
"txt_coords = mix(qt_TexCoord0, txt_coords, staticInScreen);
|
"vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" +
|
||||||
float inScreen2 = isInScreen(barrel(txt_coords, cc));
|
|
||||||
vec3 origTxtColor = texture2D(screenBuffer, txt_coords).rgb;
|
|
||||||
vec3 txt_color = mix(backgroundColor.rgb, origTxtColor, inScreen2);" +
|
|
||||||
|
|
||||||
(burnIn !== 0 ? "
|
(burnIn !== 0 ? "
|
||||||
vec4 txt_blur = texture2D(burnInSource, staticCoords);
|
vec4 txt_blur = texture2D(burnInSource, staticCoords);
|
||||||
@ -297,6 +328,8 @@ Item {
|
|||||||
|
|
||||||
"txt_color += fontColor.rgb * vec3(color);" +
|
"txt_color += fontColor.rgb * vec3(color);" +
|
||||||
|
|
||||||
|
"txt_color = applyRasterization(staticCoords, txt_color, virtualResolution, rasterizationIntensity);\n" +
|
||||||
|
|
||||||
"vec3 finalColor = txt_color;" +
|
"vec3 finalColor = txt_color;" +
|
||||||
|
|
||||||
(flickering !== 0 ? "
|
(flickering !== 0 ? "
|
||||||
@ -305,13 +338,12 @@ Item {
|
|||||||
(ambientLight !== 0 ? "
|
(ambientLight !== 0 ? "
|
||||||
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
|
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
|
||||||
|
|
||||||
|
(displayTerminalFrame ?
|
||||||
|
"vec4 frameColor = texture2D(frameSource, qt_TexCoord0);
|
||||||
|
finalColor = mix(finalColor, frameColor.rgb + (finalColor*frameGloss), frameColor.a);"
|
||||||
|
: "") +
|
||||||
|
|
||||||
"float inShadow = 1.0 - min2(smoothstep(0.0, shadowLength, staticCoords) - smoothstep(1.0 - shadowLength, 1.0, staticCoords));
|
"gl_FragColor = vec4(finalColor, qt_Opacity);" +
|
||||||
inShadow = pow(inShadow, 100.0) + 0.35 * inShadow * inShadow; // Inner shadow and antialiasing when screen background is bright.
|
|
||||||
finalColor = mix(finalColor, vec3(0.0), inShadow);
|
|
||||||
|
|
||||||
finalColor = mix(origTxtColor, finalColor, staticInScreen);
|
|
||||||
gl_FragColor = vec4(finalColor, qt_Opacity);" +
|
|
||||||
"}"
|
"}"
|
||||||
|
|
||||||
onStatusChanged: {
|
onStatusChanged: {
|
||||||
@ -326,6 +358,33 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loader {
|
||||||
|
id: terminalFrameLoader
|
||||||
|
|
||||||
|
active: dynamicShader.displayTerminalFrame
|
||||||
|
|
||||||
|
width: staticShader.width
|
||||||
|
height: staticShader.height
|
||||||
|
|
||||||
|
sourceComponent: ShaderEffectSource {
|
||||||
|
|
||||||
|
sourceItem: terminalFrame
|
||||||
|
hideSource: true
|
||||||
|
visible: false
|
||||||
|
format: ShaderEffectSource.RGBA
|
||||||
|
|
||||||
|
TerminalFrame {
|
||||||
|
id: terminalFrame
|
||||||
|
blending: false
|
||||||
|
anchors.fill: parent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ShaderLibrary {
|
||||||
|
id: shaderLibrary
|
||||||
|
}
|
||||||
|
|
||||||
ShaderEffect {
|
ShaderEffect {
|
||||||
id: staticShader
|
id: staticShader
|
||||||
|
|
||||||
@ -351,7 +410,7 @@ Item {
|
|||||||
|
|
||||||
property real ambientLight: parent.ambientLight
|
property real ambientLight: parent.ambientLight
|
||||||
|
|
||||||
property size virtual_resolution: parent.virtual_resolution
|
property size virtualResolution: parent.virtualResolution
|
||||||
|
|
||||||
blending: false
|
blending: false
|
||||||
visible: false
|
visible: false
|
||||||
@ -374,7 +433,7 @@ Item {
|
|||||||
uniform highp vec4 backgroundColor;
|
uniform highp vec4 backgroundColor;
|
||||||
uniform lowp float screen_brightness;
|
uniform lowp float screen_brightness;
|
||||||
|
|
||||||
uniform highp vec2 virtual_resolution;" +
|
uniform highp vec2 virtualResolution;" +
|
||||||
|
|
||||||
(bloom !== 0 ? "
|
(bloom !== 0 ? "
|
||||||
uniform highp sampler2D bloomSource;
|
uniform highp sampler2D bloomSource;
|
||||||
@ -392,32 +451,9 @@ Item {
|
|||||||
(ambientLight !== 0 ? "
|
(ambientLight !== 0 ? "
|
||||||
uniform lowp float ambientLight;" : "") +
|
uniform lowp float ambientLight;" : "") +
|
||||||
|
|
||||||
"highp float getScanlineIntensity(vec2 coords) {
|
shaderLibrary.min2 +
|
||||||
float result = 1.0;" +
|
shaderLibrary.sum2 +
|
||||||
|
shaderLibrary.rgb2grey +
|
||||||
(appSettings.rasterization != appSettings.no_rasterization ?
|
|
||||||
"float val = 0.0;
|
|
||||||
vec2 rasterizationCoords = fract(coords * virtual_resolution);
|
|
||||||
val += smoothstep(0.0, 0.5, rasterizationCoords.y);
|
|
||||||
val -= smoothstep(0.5, 1.0, rasterizationCoords.y);
|
|
||||||
result *= mix(0.5, 1.0, val);" : "") +
|
|
||||||
|
|
||||||
(appSettings.rasterization == appSettings.pixel_rasterization ?
|
|
||||||
"val = 0.0;
|
|
||||||
val += smoothstep(0.0, 0.5, rasterizationCoords.x);
|
|
||||||
val -= smoothstep(0.5, 1.0, rasterizationCoords.x);
|
|
||||||
result *= mix(0.5, 1.0, val);" : "") + "
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
float min2(vec2 v) {
|
|
||||||
return min(v.x, v.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
float 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;" +
|
||||||
@ -430,6 +466,7 @@ Item {
|
|||||||
" return outColor;
|
" return outColor;
|
||||||
}" +
|
}" +
|
||||||
|
|
||||||
|
shaderLibrary.rasterizationShader +
|
||||||
|
|
||||||
"void main() {" +
|
"void main() {" +
|
||||||
"vec2 cc = vec2(0.5) - qt_TexCoord0;" +
|
"vec2 cc = vec2(0.5) - qt_TexCoord0;" +
|
||||||
@ -452,16 +489,20 @@ 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 ? "
|
||||||
|
float reflectionMask = sum2(step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords));
|
||||||
|
reflectionMask = clamp(reflectionMask, 0.0, 1.0);"
|
||||||
|
:
|
||||||
|
"float reflectionMask = 1.0;") +
|
||||||
|
|
||||||
(chromaColor !== 0 ?
|
(chromaColor !== 0 ?
|
||||||
"vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor);
|
"vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor);
|
||||||
vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color);"
|
vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color * reflectionMask);"
|
||||||
:
|
:
|
||||||
"vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color);") +
|
"vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color * reflectionMask);") +
|
||||||
|
|
||||||
(bloom !== 0 ?
|
(bloom !== 0 ?
|
||||||
"vec4 bloomFullColor = texture2D(bloomSource, txt_coords);
|
"vec4 bloomFullColor = texture2D(bloomSource, txt_coords);
|
||||||
@ -473,23 +514,9 @@ Item {
|
|||||||
|
|
||||||
"finalColor *= screen_brightness;" +
|
"finalColor *= screen_brightness;" +
|
||||||
|
|
||||||
(screenCurvature !== 0 ? "
|
|
||||||
vec2 curvatureMask = step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords);
|
|
||||||
finalColor *= clamp(0.0, 1.0, curvatureMask.x + curvatureMask.y);"
|
|
||||||
:"") +
|
|
||||||
|
|
||||||
"gl_FragColor = vec4(finalColor, qt_Opacity);" +
|
"gl_FragColor = vec4(finalColor, qt_Opacity);" +
|
||||||
"}"
|
"}"
|
||||||
|
|
||||||
Loader {
|
|
||||||
anchors.fill: parent
|
|
||||||
active: screenCurvature !== 0
|
|
||||||
|
|
||||||
sourceComponent: NewTerminalFrame {
|
|
||||||
blending: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onStatusChanged: {
|
onStatusChanged: {
|
||||||
// Print warning messages
|
// Print warning messages
|
||||||
if (log) console.log(log);
|
if (log) console.log(log);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -17,9 +17,8 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 2.0
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
|
|
||||||
import "Components"
|
import "Components"
|
||||||
@ -27,18 +26,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.minimumValue
|
property alias minimumValue: slider.from
|
||||||
property alias maximumValue: slider.maximumValue
|
property alias maximumValue: slider.to
|
||||||
property real maxMultiplier: 100
|
property real maxMultiplier: 100
|
||||||
|
|
||||||
id: setting_component
|
id: setting_component
|
||||||
spacing: 10
|
spacing: 10
|
||||||
Slider{
|
Slider {
|
||||||
id: slider
|
id: slider
|
||||||
stepSize: parent.stepSize
|
stepSize: parent.stepSize
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
}
|
}
|
||||||
SizedLabel{
|
SizedLabel {
|
||||||
text: Math.round(value * maxMultiplier) + "%"
|
text: Math.round(value * maxMultiplier) + "%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -17,12 +17,12 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
|
|
||||||
Rectangle{
|
Rectangle {
|
||||||
property size terminalSize
|
property size terminalSize
|
||||||
property real topOpacity: 0.6
|
property real topOpacity: 0.6
|
||||||
|
|
||||||
width: textSize.width * 2
|
width: textSize.width * 2
|
||||||
height: textSize.height * 2
|
height: textSize.height * 2
|
||||||
radius: 5
|
radius: 5
|
||||||
@ -31,17 +31,21 @@ Rectangle{
|
|||||||
color: "black"
|
color: "black"
|
||||||
opacity: sizetimer.running ? 0.6 : 0.0
|
opacity: sizetimer.running ? 0.6 : 0.0
|
||||||
|
|
||||||
Behavior on opacity{NumberAnimation{duration: 200}}
|
Behavior on opacity {
|
||||||
|
NumberAnimation {
|
||||||
|
duration: 200
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onTerminalSizeChanged: sizetimer.restart()
|
onTerminalSizeChanged: sizetimer.restart()
|
||||||
|
|
||||||
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
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -27,7 +27,7 @@ QtObject {
|
|||||||
property bool initialized: false
|
property bool initialized: false
|
||||||
|
|
||||||
function getDatabase() {
|
function getDatabase() {
|
||||||
return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000);
|
return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000)
|
||||||
}
|
}
|
||||||
|
|
||||||
function initialize() {
|
function initialize() {
|
||||||
@ -35,43 +35,47 @@ 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(function(tx) {
|
db.transaction(
|
||||||
var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]);
|
function(tx) {
|
||||||
//console.log(rs.rowsAffected)
|
var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]);
|
||||||
if (rs.rowsAffected > 0) {
|
//console.log(rs.rowsAffected)
|
||||||
|
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(function(tx) {
|
db.transaction(
|
||||||
var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]);
|
function(tx) {
|
||||||
if (rs.rows.length > 0) {
|
var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]);
|
||||||
res = rs.rows.item(0).value;
|
if (rs.rows.length > 0) {
|
||||||
} else {
|
res = rs.rows.item(0).value;
|
||||||
res = undefined;
|
} else {
|
||||||
}
|
res = undefined;
|
||||||
})
|
}
|
||||||
return res
|
}
|
||||||
|
)
|
||||||
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
function dropSettings(){
|
function dropSettings(){
|
||||||
@ -79,6 +83,7 @@ QtObject {
|
|||||||
db.transaction(
|
db.transaction(
|
||||||
function(tx) {
|
function(tx) {
|
||||||
tx.executeSql('DROP TABLE settings');
|
tx.executeSql('DROP TABLE settings');
|
||||||
});
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,22 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
|
*
|
||||||
|
* This file is part of cool-retro-term.
|
||||||
|
*
|
||||||
|
* cool-retro-term is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*******************************************************************************/
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtGraphicalEffects 1.0
|
import QtGraphicalEffects 1.0
|
||||||
|
|
||||||
@ -7,43 +26,48 @@ 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
|
||||||
virtual_resolution: terminal.virtualResolution
|
virtualResolution: terminal.virtualResolution
|
||||||
|
screenResolution: Qt.size(
|
||||||
|
terminalWindow.width * devicePixelRatio * appSettings.windowScaling,
|
||||||
|
terminalWindow.height * devicePixelRatio * appSettings.windowScaling
|
||||||
|
)
|
||||||
|
|
||||||
TimeManager{
|
TimeManager {
|
||||||
id: timeManager
|
id: timeManager
|
||||||
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
|
||||||
@ -53,71 +77,4 @@ ShaderTerminal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bloomSource: bloomSourceLoader.item
|
bloomSource: bloomSourceLoader.item
|
||||||
|
|
||||||
// NewTerminalFrame {
|
|
||||||
// id: terminalFrame
|
|
||||||
// anchors.fill: parent
|
|
||||||
// blending: true
|
|
||||||
// }
|
|
||||||
|
|
||||||
// This shader might be useful in the future. Since we used it only for a couple
|
|
||||||
// of calculations is probably best to move those in the main shader. If in the future
|
|
||||||
// we need to store another fullScreen channel this might be handy.
|
|
||||||
|
|
||||||
// ShaderEffect {
|
|
||||||
// id: rasterizationEffect
|
|
||||||
// width: parent.width
|
|
||||||
// height: parent.height
|
|
||||||
// property real outColor: 0.0
|
|
||||||
// property real dispX: (5 / width) * appSettings.windowScaling
|
|
||||||
// property real dispY: (5 / height) * appSettings.windowScaling
|
|
||||||
// property size virtual_resolution: terminal.virtualResolution
|
|
||||||
|
|
||||||
// blending: false
|
|
||||||
|
|
||||||
// fragmentShader:
|
|
||||||
// "uniform lowp float qt_Opacity;" +
|
|
||||||
|
|
||||||
// "varying highp vec2 qt_TexCoord0;
|
|
||||||
// uniform highp vec2 virtual_resolution;
|
|
||||||
// uniform highp float dispX;
|
|
||||||
// uniform highp float dispY;
|
|
||||||
// uniform mediump float outColor;
|
|
||||||
|
|
||||||
// highp float getScanlineIntensity(vec2 coords) {
|
|
||||||
// highp float result = 1.0;" +
|
|
||||||
|
|
||||||
// (appSettings.rasterization != appSettings.no_rasterization ?
|
|
||||||
// "result *= abs(sin(coords.y * virtual_resolution.y * "+Math.PI+"));" : "") +
|
|
||||||
// (appSettings.rasterization == appSettings.pixel_rasterization ?
|
|
||||||
// "result *= abs(sin(coords.x * virtual_resolution.x * "+Math.PI+"));" : "") + "
|
|
||||||
|
|
||||||
// return result;
|
|
||||||
// }" +
|
|
||||||
|
|
||||||
// "void main() {" +
|
|
||||||
// "highp float color = getScanlineIntensity(qt_TexCoord0);" +
|
|
||||||
|
|
||||||
// "float distance = length(vec2(0.5) - qt_TexCoord0);" +
|
|
||||||
// "color = mix(color, 0.0, 1.2 * distance * distance);" +
|
|
||||||
|
|
||||||
// "color *= outColor + smoothstep(0.00, dispX, qt_TexCoord0.x) * (1.0 - outColor);" +
|
|
||||||
// "color *= outColor + smoothstep(0.00, dispY, qt_TexCoord0.y) * (1.0 - outColor);" +
|
|
||||||
// "color *= outColor + (1.0 - smoothstep(1.00 - dispX, 1.00, qt_TexCoord0.x)) * (1.0 - outColor);" +
|
|
||||||
// "color *= outColor + (1.0 - smoothstep(1.00 - dispY, 1.00, qt_TexCoord0.y)) * (1.0 - outColor);" +
|
|
||||||
|
|
||||||
// "gl_FragColor.a = color;" +
|
|
||||||
// "}"
|
|
||||||
|
|
||||||
// onStatusChanged: if (log) console.log(log) //Print warning messages
|
|
||||||
// }
|
|
||||||
|
|
||||||
// rasterizationSource: ShaderEffectSource{
|
|
||||||
// id: rasterizationEffectSource
|
|
||||||
// sourceItem: rasterizationEffect
|
|
||||||
// hideSource: true
|
|
||||||
// smooth: true
|
|
||||||
// wrapMode: ShaderEffectSource.ClampToEdge
|
|
||||||
// visible: false
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
104
app/qml/TerminalFrame.qml
Normal file
104
app/qml/TerminalFrame.qml
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
|
*
|
||||||
|
* This file is part of cool-retro-term.
|
||||||
|
*
|
||||||
|
* cool-retro-term is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*******************************************************************************/
|
||||||
|
import QtQuick 2.0
|
||||||
|
|
||||||
|
import "utils.js" as Utils
|
||||||
|
|
||||||
|
ShaderEffect {
|
||||||
|
property color _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
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -17,10 +17,9 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
|
|
||||||
Timer{
|
Timer {
|
||||||
default property bool enableTimer: false
|
default property bool enableTimer: false
|
||||||
property real time
|
property real time
|
||||||
|
|
||||||
|
BIN
app/qml/fonts/1971-ibm-3278/3270-Regular.ttf
Normal file
BIN
app/qml/fonts/1971-ibm-3278/3270-Regular.ttf
Normal file
Binary file not shown.
Binary file not shown.
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@ -17,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 1.1
|
import QtQuick.Controls 2.3
|
||||||
import QtGraphicalEffects 1.0
|
|
||||||
|
|
||||||
ApplicationWindow{
|
import "menus"
|
||||||
|
|
||||||
|
ApplicationWindow {
|
||||||
id: terminalWindow
|
id: terminalWindow
|
||||||
|
|
||||||
width: 1024
|
width: 1024
|
||||||
@ -36,9 +36,7 @@ ApplicationWindow{
|
|||||||
onHeightChanged: appSettings.height = height
|
onHeightChanged: appSettings.height = height
|
||||||
|
|
||||||
// Load saved window geometry and show the window
|
// Load saved window geometry and show the window
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
appSettings.handleFontChanged();
|
|
||||||
|
|
||||||
x = appSettings.x
|
x = appSettings.x
|
||||||
y = appSettings.y
|
y = appSettings.y
|
||||||
width = appSettings.width
|
width = appSettings.width
|
||||||
@ -55,22 +53,30 @@ ApplicationWindow{
|
|||||||
property bool fullscreen: appSettings.fullscreen
|
property bool fullscreen: appSettings.fullscreen
|
||||||
onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed)
|
onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed)
|
||||||
|
|
||||||
//Workaround: Without __contentItem a ugly thin border is visible.
|
menuBar: qtquickMenuLoader.item
|
||||||
menuBar: CRTMainMenuBar{
|
|
||||||
id: mainMenu
|
Loader {
|
||||||
visible: (Qt.platform.os === "osx" || appSettings.showMenubar)
|
id: qtquickMenuLoader
|
||||||
__contentItem.visible: mainMenu.visible
|
active: !appSettings.isMacOS && appSettings.showMenubar
|
||||||
|
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: Qt.platform.os !== "osx"
|
enabled: !appSettings.isMacOS
|
||||||
shortcut: "Ctrl+Shift+M"
|
shortcut: "Ctrl+Shift+M"
|
||||||
checkable: true
|
checkable: true
|
||||||
checked: appSettings.showMenubar
|
checked: appSettings.showMenubar
|
||||||
@ -79,9 +85,9 @@ ApplicationWindow{
|
|||||||
Action {
|
Action {
|
||||||
id: fullscreenAction
|
id: fullscreenAction
|
||||||
text: qsTr("Fullscreen")
|
text: qsTr("Fullscreen")
|
||||||
enabled: Qt.platform.os !== "osx"
|
enabled: !appSettings.isMacOS
|
||||||
shortcut: "Alt+F11"
|
shortcut: "Alt+F11"
|
||||||
onTriggered: appSettings.fullscreen = !appSettings.fullscreen;
|
onTriggered: appSettings.fullscreen = !appSettings.fullscreen
|
||||||
checkable: true
|
checkable: true
|
||||||
checked: appSettings.fullscreen
|
checked: appSettings.fullscreen
|
||||||
}
|
}
|
||||||
@ -89,69 +95,73 @@ 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
|
||||||
}
|
}
|
||||||
@ -159,7 +169,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 (Qt.platform.os === "osx")
|
if (appSettings.isMacOS)
|
||||||
Qt.quit()
|
Qt.quit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
95
app/qml/menus/FullContextMenu.qml
Normal file
95
app/qml/menus/FullContextMenu.qml
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
|
*
|
||||||
|
* This file is part of cool-retro-term.
|
||||||
|
*
|
||||||
|
* cool-retro-term is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*******************************************************************************/
|
||||||
|
import QtQuick 2.2
|
||||||
|
import QtQuick.Controls 2.3
|
||||||
|
|
||||||
|
Menu {
|
||||||
|
id: contextmenu
|
||||||
|
MenuItem {
|
||||||
|
action: copyAction
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
action: pasteAction
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
action: showsettingsAction
|
||||||
|
}
|
||||||
|
|
||||||
|
MenuSeparator {}
|
||||||
|
|
||||||
|
Menu {
|
||||||
|
title: qsTr("File")
|
||||||
|
MenuItem {
|
||||||
|
action: quitAction
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Menu {
|
||||||
|
title: qsTr("Edit")
|
||||||
|
MenuItem {
|
||||||
|
action: copyAction
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
action: pasteAction
|
||||||
|
}
|
||||||
|
MenuSeparator {}
|
||||||
|
MenuItem {
|
||||||
|
action: showsettingsAction
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Menu {
|
||||||
|
title: qsTr("View")
|
||||||
|
MenuItem {
|
||||||
|
action: fullscreenAction
|
||||||
|
visible: fullscreenAction.enabled
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
action: showMenubarAction
|
||||||
|
visible: showMenubarAction.enabled
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
action: zoomIn
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
action: zoomOut
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Menu {
|
||||||
|
id: profilesMenu
|
||||||
|
title: qsTr("Profiles")
|
||||||
|
Instantiator {
|
||||||
|
model: appSettings.profilesList
|
||||||
|
delegate: MenuItem {
|
||||||
|
text: model.text
|
||||||
|
onTriggered: {
|
||||||
|
appSettings.loadProfileString(obj_string)
|
||||||
|
appSettings.handleFontChanged()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onObjectAdded: profilesMenu.insertItem(index, object)
|
||||||
|
onObjectRemoved: profilesMenu.removeItem(object)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Menu {
|
||||||
|
title: qsTr("Help")
|
||||||
|
MenuItem {
|
||||||
|
action: showAboutAction
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
89
app/qml/menus/OSXMenu.qml
Normal file
89
app/qml/menus/OSXMenu.qml
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
31
app/qml/menus/ShortContextMenu.qml
Normal file
31
app/qml/menus/ShortContextMenu.qml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
|
*
|
||||||
|
* This file is part of cool-retro-term.
|
||||||
|
*
|
||||||
|
* cool-retro-term is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*******************************************************************************/
|
||||||
|
import QtQuick 2.2
|
||||||
|
import QtQuick.Controls 2.3
|
||||||
|
|
||||||
|
Menu {
|
||||||
|
id: contextmenu
|
||||||
|
MenuItem {
|
||||||
|
action: copyAction
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
action: pasteAction
|
||||||
|
}
|
||||||
|
}
|
85
app/qml/menus/WindowMenu.qml
Normal file
85
app/qml/menus/WindowMenu.qml
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
|
*
|
||||||
|
* This file is part of cool-retro-term.
|
||||||
|
*
|
||||||
|
* cool-retro-term is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*******************************************************************************/
|
||||||
|
import QtQuick 2.2
|
||||||
|
import QtQuick.Controls 2.3
|
||||||
|
|
||||||
|
MenuBar {
|
||||||
|
id: defaultMenuBar
|
||||||
|
visible: appSettings.showMenubar
|
||||||
|
|
||||||
|
Menu {
|
||||||
|
title: qsTr("File")
|
||||||
|
MenuItem {
|
||||||
|
action: quitAction
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Menu {
|
||||||
|
title: qsTr("Edit")
|
||||||
|
MenuItem {
|
||||||
|
action: copyAction
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
action: pasteAction
|
||||||
|
}
|
||||||
|
MenuSeparator {}
|
||||||
|
MenuItem {
|
||||||
|
action: showsettingsAction
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Menu {
|
||||||
|
title: qsTr("View")
|
||||||
|
MenuItem {
|
||||||
|
action: fullscreenAction
|
||||||
|
visible: fullscreenAction.enabled
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
action: showMenubarAction
|
||||||
|
visible: showMenubarAction.enabled
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
action: zoomIn
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
action: zoomOut
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Menu {
|
||||||
|
id: profilesMenu
|
||||||
|
title: qsTr("Profiles")
|
||||||
|
Instantiator {
|
||||||
|
model: appSettings.profilesList
|
||||||
|
delegate: MenuItem {
|
||||||
|
text: model.text
|
||||||
|
onTriggered: {
|
||||||
|
appSettings.loadProfileString(obj_string)
|
||||||
|
appSettings.handleFontChanged()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onObjectAdded: profilesMenu.insertItem(index, object)
|
||||||
|
onObjectRemoved: profilesMenu.removeItem(object)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Menu {
|
||||||
|
title: qsTr("Help")
|
||||||
|
MenuItem {
|
||||||
|
action: showAboutAction
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -12,7 +12,6 @@
|
|||||||
<file>TimeManager.qml</file>
|
<file>TimeManager.qml</file>
|
||||||
<file>SimpleSlider.qml</file>
|
<file>SimpleSlider.qml</file>
|
||||||
<file>ColorButton.qml</file>
|
<file>ColorButton.qml</file>
|
||||||
<file>Glossy.qml</file>
|
|
||||||
<file>AboutDialog.qml</file>
|
<file>AboutDialog.qml</file>
|
||||||
<file>InsertNameDialog.qml</file>
|
<file>InsertNameDialog.qml</file>
|
||||||
<file>SettingsEffectsTab.qml</file>
|
<file>SettingsEffectsTab.qml</file>
|
||||||
@ -20,10 +19,9 @@
|
|||||||
<file>SettingsTerminalTab.qml</file>
|
<file>SettingsTerminalTab.qml</file>
|
||||||
<file>FontScanlines.qml</file>
|
<file>FontScanlines.qml</file>
|
||||||
<file>fonts/1977-apple2/PrintChar21.ttf</file>
|
<file>fonts/1977-apple2/PrintChar21.ttf</file>
|
||||||
<file>fonts/1971-ibm-3278/3270Medium.ttf</file>
|
<file>fonts/1971-ibm-3278/3270-Regular.ttf</file>
|
||||||
<file>Storage.qml</file>
|
<file>Storage.qml</file>
|
||||||
<file>CRTMainMenuBar.qml</file>
|
<file>SettingsAdvancedTab.qml</file>
|
||||||
<file>SettingsPerformanceTab.qml</file>
|
|
||||||
<file>TerminalContainer.qml</file>
|
<file>TerminalContainer.qml</file>
|
||||||
<file>images/crt256.png</file>
|
<file>images/crt256.png</file>
|
||||||
<file>utils.js</file>
|
<file>utils.js</file>
|
||||||
@ -42,6 +40,11 @@
|
|||||||
<file>fonts/1977-commodore-pet/PetMe.ttf</file>
|
<file>fonts/1977-commodore-pet/PetMe.ttf</file>
|
||||||
<file>BurnInEffect.qml</file>
|
<file>BurnInEffect.qml</file>
|
||||||
<file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file>
|
<file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file>
|
||||||
<file>NewTerminalFrame.qml</file>
|
<file>TerminalFrame.qml</file>
|
||||||
|
<file>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>
|
||||||
|
@ -1,3 +1,23 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
|
*
|
||||||
|
* This file is part of cool-retro-term.
|
||||||
|
*
|
||||||
|
* cool-retro-term is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
.pragma library
|
.pragma library
|
||||||
function clamp(x, min, max) {
|
function clamp(x, min, max) {
|
||||||
if (x <= min)
|
if (x <= min)
|
||||||
@ -6,15 +26,23 @@ function clamp(x, min, max) {
|
|||||||
return max;
|
return max;
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
function lint(a, b, t) {
|
function lint(a, b, t) {
|
||||||
return (1 - t) * a + (t) * b;
|
return (1 - t) * a + (t) * b;
|
||||||
}
|
}
|
||||||
function mix(c1, c2, alpha){
|
|
||||||
|
function mix(c1, c2, alpha) {
|
||||||
return Qt.rgba(c1.r * alpha + c2.r * (1-alpha),
|
return Qt.rgba(c1.r * alpha + c2.r * (1-alpha),
|
||||||
c1.g * alpha + c2.g * (1-alpha),
|
c1.g * alpha + c2.g * (1-alpha),
|
||||||
c1.b * alpha + c2.b * (1-alpha),
|
c1.b * alpha + c2.b * (1-alpha),
|
||||||
c1.a * alpha + c2.a * (1-alpha))
|
c1.a * alpha + c2.a * (1-alpha))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function smoothstep(min, max, value) {
|
||||||
|
let x = Math.max(0, Math.min(1, (value - min) / (max - min)));
|
||||||
|
return x * x * (3 - 2 * x);
|
||||||
|
}
|
||||||
|
|
||||||
function strToColor(s){
|
function strToColor(s){
|
||||||
var r = parseInt(s.substring(1,3), 16) / 256;
|
var r = parseInt(s.substring(1,3), 16) / 256;
|
||||||
var g = parseInt(s.substring(3,5), 16) / 256;
|
var g = parseInt(s.substring(3,5), 16) / 256;
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 48274c75660e28d44af7c195e79accdf1bd44963
|
Subproject commit 63228027e1f97c24abb907550b22ee91836929c5
|
@ -1,39 +1,53 @@
|
|||||||
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.0' # this is freakin' awesome
|
version: '1.1.1' # this is freakin' awesome
|
||||||
summary: cool-retro-term is a terminal emulator. # 79 char long summary
|
summary: cool-retro-term is a cool and retro 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: strict # use 'strict' once you have the right plugs
|
confinement: classic # use 'strict' once you have the right plugs
|
||||||
|
|
||||||
|
base: core18
|
||||||
|
|
||||||
apps:
|
apps:
|
||||||
cool-retro-term:
|
cool-retro-term:
|
||||||
command: desktop-launch $SNAP/usr/bin/cool-retro-term
|
command: bin/desktop-launch $SNAP/usr/bin/cool-retro-term
|
||||||
desktop: usr/share/applications/cool-retro-term.desktop
|
desktop: usr/share/applications/cool-retro-term.desktop
|
||||||
plugs:
|
environment:
|
||||||
- unity7
|
QML2_IMPORT_PATH: $SNAP/usr/lib/x86_64-linux-gnu/qt5/qml
|
||||||
- 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
|
||||||
plugin: qmake # See 'snapcraft plugins'
|
plugin: qmake # See 'snapcraft plugins'
|
||||||
qt-version: qt5
|
qt-version: qt5
|
||||||
after: [desktop-qt5]
|
after: [desktop-qt5]
|
||||||
|
|
||||||
build-packages:
|
build-packages:
|
||||||
- build-essential
|
- build-essential
|
||||||
- qmlscene
|
- qmlscene
|
||||||
@ -44,11 +58,14 @@ parts:
|
|||||||
stage-packages:
|
stage-packages:
|
||||||
- qmlscene
|
- qmlscene
|
||||||
- qml-module-qtquick-controls
|
- qml-module-qtquick-controls
|
||||||
- qtdeclarative5-qtquick2-plugin
|
- qml-module-qtquick2
|
||||||
- libqt5qml-graphicaleffects
|
- qml-module-qtgraphicaleffects
|
||||||
- qml-module-qtquick-dialogs
|
- qml-module-qtquick-dialogs
|
||||||
- qtdeclarative5-localstorage-plugin
|
- qml-module-qtquick-localstorage
|
||||||
- qtdeclarative5-window-plugin
|
- qml-module-qtquick-window2
|
||||||
- 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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user