136 Commits

Author SHA1 Message Date
Filippo Scognamiglio
36b1cd2dde Add github funding links. 2022-01-09 15:11:08 +01:00
Filippo Scognamiglio
80374b3ec6 Update README.md 2022-01-09 15:08:15 +01:00
Filippo Scognamiglio
bc00d1e45f Bump version. 2022-01-09 14:08:36 +01:00
Filippo Scognamiglio
6ddb507247 Merge pull request #694 from Swordfish90/osx-fixes
MacOS improvements
2022-01-09 10:56:30 +01:00
Filippo Scognamiglio
b0f3b8f3d0 Update QMLTermWidget submodule. 2022-01-09 10:53:35 +01:00
Filippo Scognamiglio
06e7191056 Disable Qt5 Connections warnings. 2022-01-09 10:47:02 +01:00
Filippo Scognamiglio
997131ba64 Tiny fixes to burn-in. 2022-01-08 23:15:29 +01:00
Filippo Scognamiglio
ef9f412e5f Clip profiles list. 2022-01-08 22:36:02 +01:00
Filippo Scognamiglio
7b69d41c60 Remove slow burn-in effect. 2022-01-08 22:32:42 +01:00
Filippo Scognamiglio
552947f507 Improve burn-in timings. 2022-01-08 22:20:44 +01:00
Filippo Scognamiglio
f69f2df63c More Connections refactorings. 2022-01-03 21:06:33 +01:00
Filippo Scognamiglio
aa270067f6 Improve settings window. 2022-01-03 20:56:49 +01:00
Filippo Scognamiglio
28977313da UI/UX fixes for OSX version. 2022-01-03 18:43:07 +01:00
Filippo Scognamiglio
cfe35d7795 Merge pull request #665 from Swordfish90/unstable
Improve rasterization and terminal frame. Some refactoring.
2021-07-15 23:43:06 +02:00
Filippo Scognamiglio
4abbe332db Improve terminal frame and expose frame size setting. 2021-07-15 23:20:42 +02:00
Filippo Scognamiglio
3104abd4ad Add subpixel rasterization. 2021-07-07 00:09:10 +02:00
Filippo Scognamiglio
7714f7b503 Improve rasterization rendering and add LCD rasterization (with subpixels). 2021-07-03 16:14:02 +02:00
Dmytro Pashchenko
9d06f10a9b some grammar fixes (#636) 2021-07-01 23:14:53 +02:00
Mizumoto Ryohei
8c27f7683b update brew command (#664)
* update brew command

* Update README.md
2021-07-01 23:12:26 +02:00
Filippo Scognamiglio
bf1a491789 Merge pull request #638 from amake/patch-1
Mention MacPorts in readme
2021-07-01 23:10:42 +02:00
Filippo Scognamiglio
701cb540e5 Improve QML syntax and update license headers. 2021-06-30 22:49:03 +02:00
Filippo Scognamiglio
0f18a0349a Merge pull request #589 from rbanffy/master
Update 3270 font to 2.3.1
2021-06-30 08:49:39 +02:00
Filippo Scognamiglio
205a152350 Merge pull request #662 from Swordfish90/unstable
Migrate to QtQuick.Controls 2.x
2021-06-30 08:45:24 +02:00
Filippo Scognamiglio
dae1a56691 Migrate from QtQuick.Controls 1.x to QtQuick.Controls 2.x. Updated QMLTermWidget submodule. 2021-06-30 08:33:31 +02:00
Ricardo Bánffy
39181f42cf Update font version to 2.3.1 2021-03-25 09:52:21 +00:00
Aaron Madlon-Kay
3d706ad1a7 Mention MacPorts in readme 2021-01-27 14:42:57 +09:00
Ricardo Bánffy
a31b77e5bc Update 3270 font with version 2.0.4.
See https://github.com/rbanffy/3270font/tree/v2.0.4 for changes.
2020-05-17 12:29:24 +01:00
Ricardo Bánffy
b417643415 Renamed 3270 font to latest binary version 2020-05-17 12:21:13 +01:00
Filippo Scognamiglio
dac2b4ff16 Merge pull request #560 from ayazhafiz/docs/homebrew
Add installation instructions using Homebrew
2020-05-09 17:00:35 +02:00
Filippo Scognamiglio
2d12b0c747 Bump qmltermwidget submodule. 2020-05-09 16:51:36 +02:00
Filippo Scognamiglio
5fe26edaa6 Merge pull request #540 from kklemon/support-blinking-cursor
Add blinking cursor support
2020-05-09 16:37:49 +02:00
Filippo Scognamiglio
a736cfd548 Merge pull request #569 from barak/master
get --help and --version to write to stdout
2020-05-09 16:36:45 +02:00
Filippo Scognamiglio
5af4214daa Merge pull request #566 from tgerczei/master
now packaged in the official repository
2020-05-09 16:32:14 +02:00
Barak A. Pearlmutter
98ef7b329a allow --help/-h/--version/-v options without graphics 2020-05-08 16:29:51 +01:00
Barak A. Pearlmutter
b0e1962fa7 send cool-retro-term --help and --version to stdout 2020-05-08 16:29:51 +01:00
Barak A. Pearlmutter
83684e8882 squelch ugly quotes on 1st line of cool-retro-term --usage 2020-05-08 16:29:51 +01:00
Barak A. Pearlmutter
1ed7d077a9 git ignore app/moc_predefs.h 2020-05-08 16:29:51 +01:00
Filippo Scognamiglio
ba4b36618f Merge pull request #546 from jayk/master
Yaourt is deprecated, use trizen instead for arch instructions
2020-05-06 18:44:52 +02:00
Filippo Scognamiglio
af647a4bad Merge pull request #584 from pwwiur/patch-1
Adding snap install method
2020-05-06 18:34:41 +02:00
Filippo Scognamiglio
b719530ef0 Merge pull request #576 from AutumnalAntlers/ReadMe-Changes
Update Readme.md to include directions to settings
2020-05-06 18:33:33 +02:00
Amir Fo
530d61d67e Adding snap install method
Adding snap install method which is supported in most of the distros and is easy!
2020-05-04 20:58:13 +04:30
AutumnalAntlers
3d76bcb48c Update Readme.md to include directions to settings
Several users of OS's without titlebars or window decor have expressed confusion at how one change's their theme (in this case, via the context menu). Mentioning how to access the menu in the Readme will make the settings more accessible and prevent any future confusion. It might be more appropriate to create a "Use" heading exploring features such as Performance settings, but for the sake of brevity, I've just inserted a mention at the end of the description, before more OS-specific install instructions.
2020-03-22 11:40:40 -07:00
Tamás Gérczei
70ce2f1f3c now packaged in the official repository 2019-12-28 09:35:08 +01:00
ayazhafiz
21a190a1aa Add installation instructions using Homebrew
I was not aware there was a [Homebrew cask](https://github.com/Homebrew/homebrew-cask/blob/master/Casks/cool-retro-term.rb) for this
project, which simplifies installation on macOS. This commit adds
documentation for installing the app via Homebrew.
2019-11-25 10:20:36 -06:00
Jay Kuri
a88d222709 Merge pull request #1 from jayk/trizen-not-yaourt
Update Readme - Trizen for Arch - Yaourt is deprecated.
2019-08-23 13:47:44 -06:00
Jay Kuri
b2defceae5 Update Readme - Trizen for Arch - Yaourt is deprecated.
yaourt is deprecated.  Use trizen instead.  The command line arguments are identical to yaourt, for easy migration.
2019-08-23 13:47:28 -06:00
Kristian
8d7565ffc4 Disable blinking cursor by default 2019-07-20 16:51:10 +02:00
Kristian
9960b25dff Add support for blinking cursor 2019-07-08 15:21:17 +02:00
Kristian
411c116deb Update qmltermwidget submodule 2019-07-08 15:20:56 +02:00
Filippo Scognamiglio
64e007f1fd Update qmltermwidget submodule with CTRL+SPACE fix. 2019-06-18 22:16:23 +02:00
Filippo Scognamiglio
c62fc365db Merge pull request #509 from 0mp/patch-2
Add FreeBSD installation instructions
2019-04-20 23:14:23 +02:00
Filippo Scognamiglio
e7e630bd5d Merge pull request #524 from Haradric/patch-1
Update README.md
2019-04-20 23:13:34 +02:00
Filippo Scognamiglio
7d77175fbb Merge pull request #521 from tgerczei/master
new ebuild available for 1.1.1
2019-04-20 23:12:46 +02:00
Haradric
f033553972 Update README.md
added installation method via Hombrew
2019-04-16 12:27:22 +03:00
Tamás Gérczei
ae1ed044ba new ebuild available for 1.1.1 2019-04-01 21:07:15 +02:00
Filippo Scognamiglio
35d601c7a7 Add two missing qt dependencies to snapcraft.yaml 2019-03-27 18:56:44 +01:00
Filippo Scognamiglio
f89aeec374 Merge pull request #512 from timm0e/patch-1
Fix typo in README.md
2019-02-17 17:35:20 +01:00
timm0e
42c3b4b42e Fix typo in README.md 2019-02-17 15:32:08 +01:00
Mateusz Piotrowski
322fc31396 Add FreeBSD installation instructions 2019-02-12 10:44:58 +01:00
Filippo Scognamiglio
6e4d5cfddd Merge pull request #503 from mclang/patch-1
Adds installation instruction for Solus
2019-02-02 17:44:58 +01:00
mclang
d81485a8bf Adds installation instruction for Solus 2019-02-01 15:09:17 +02:00
Filippo Scognamiglio
a9260d956c Remove snapcraft plugs. Not used for classic confinement. 2019-01-30 20:05:53 +01:00
Filippo Scognamiglio
025bb560bc Update README.md 2019-01-22 21:49:21 +01:00
Filippo Scognamiglio
cdd1488e13 Print system font log only when verbose is enabled. 2019-01-19 21:08:57 +01:00
Filippo Scognamiglio
b8b2644969 Fix snap package launcher and expose in path qml directory. 2019-01-19 15:03:58 +01:00
Filippo Scognamiglio
09b5c0a5d0 Update snap package to use core18. 2019-01-18 00:34:34 +01:00
Filippo Scognamiglio
1ed66f3aa2 Update snapcraft file. 2019-01-17 22:47:38 +01:00
Filippo Scognamiglio
3b4d5d1c3f Bump version number. 2019-01-17 22:24:32 +01:00
Filippo Scognamiglio
f98fd5a7ad Fix font slider misbehaving. 2019-01-17 22:23:54 +01:00
Filippo Scognamiglio
b961109623 Use a single version name. 2019-01-17 22:03:25 +01:00
Filippo Scognamiglio
8f0d1023a4 Use threaded renderer by default in linux. This improves performances. 2019-01-17 21:47:59 +01:00
Filippo Scognamiglio
79773ba95c Merge pull request #499 from Swordfish90/old-burnin
Reintroduce optional old burnin and improve highdpi support.
2019-01-17 21:35:24 +01:00
Filippo Scognamiglio
ff3f02fb8c Improve highdpi support. 2019-01-09 19:26:02 +01:00
Filippo Scognamiglio
0af2b20b3a Settings optin for old burinin version. It seems to be working better on osx. 2019-01-09 19:01:11 +01:00
Filippo Scognamiglio
b026fe357e Merge pull request #495 from refacto/master
correct version number output with --version
2019-01-07 21:33:47 +01:00
Sascha Paunovic
ade36c013b correct version number output with --version 2019-01-07 12:24:53 +01:00
Filippo Scognamiglio
54a6a7f590 Merge pull request #494 from probonopd/patch-2
Update usr/share/metainfo
2019-01-04 22:46:58 +01:00
probonopd
20728e4a0f usr/share/metainfo
As per https://www.freedesktop.org/software/appstream/docs/chap-Quickstart.html#sect-Quickstart-DesktopApps, usr/share/metainfo should be used
2019-01-04 18:53:09 +00:00
Filippo Scognamiglio
afa456f6b3 Merge pull request #493 from probonopd/patch-2
Fix #336 and upload to GitHub Releases
2019-01-04 19:29:25 +01:00
probonopd
3fbfb77430 Upload to GitHub Releases
Need to set a GITHUB_TOKEN environment variable in https://travis-ci.org/Swordfish90/cool-retro-term/settings
2019-01-03 11:04:35 +00:00
probonopd
051bcb62c6 Fix #336 2019-01-03 10:54:43 +00:00
Filippo Scognamiglio
d2c57eed6d Merge pull request #336 from probonopd/patch-1
Generate AppImage of each build on Travis CI
2019-01-02 23:58:39 +01:00
Filippo Scognamiglio
f2f38c0e0d Fixes issue #491. 2019-01-02 22:01:57 +01:00
Filippo Scognamiglio
4046bdbc6a Merge pull request #488 from tgerczei/master
new ebuild available for 1.1.0
2018-12-19 21:56:50 +01:00
Tamás Gérczei
c83cc206fd new ebuild available for 1.1.0 2018-12-19 18:15:10 +01:00
Filippo Scognamiglio
41ac14fbd3 Merge pull request #482 from dagostinelli/patch-1
Update README.md
2018-12-19 09:30:27 +01:00
Filippo Scognamiglio
e4c1cad1a7 Update README.md 2018-12-18 23:40:24 +01:00
Filippo Scognamiglio
863c1ac27a Reduce horizontal sync possible minimum value. 2018-12-18 23:09:06 +01:00
Filippo Scognamiglio
c85eba617c Revert "Change burnin masking function to max. Should preseve darker colors."
This reverts commit 3cee186663.
2018-12-18 23:03:52 +01:00
Filippo Scognamiglio
dcb7b7c309 Reduce horizontal sync maximum strength. 2018-12-17 19:44:28 +01:00
Filippo Scognamiglio
3cee186663 Change burnin masking function to max. Should preseve darker colors. 2018-12-17 19:21:26 +01:00
Filippo Scognamiglio
06afe507f6 Change the way margin is used. This slightly improves quality. 2018-12-17 19:09:19 +01:00
Filippo Scognamiglio
4268d4d770 Remove comment. 2018-12-17 19:06:49 +01:00
Filippo Scognamiglio
d61dae5ab4 Let's reenable smoothing in burnin to see which artifact is actually better. 2018-12-17 00:36:22 +01:00
Filippo Scognamiglio
b5f39c1d53 Force integer values for new margins. 2018-12-17 00:10:26 +01:00
Filippo Scognamiglio
767a61b86e Improve settings layout. 2018-12-16 23:46:05 +01:00
Filippo Scognamiglio
0d3c0a2233 Allow screen margin customization. 2018-12-16 22:30:03 +01:00
Filippo Scognamiglio
0431103a1d Move frame to separate framebuffer. This fixes some glitches in terminal
frame.
2018-12-15 18:27:35 +01:00
Filippo Scognamiglio
633e4e642c Merge pull request #487 from Swordfish90/framebuffer
Separate dynamic effects (the one based on time) from static ones. This caches a lot of computations and reduce resource consumption.
2018-12-03 22:18:43 +01:00
Filippo Scognamiglio
77dc82a381 Unload frame when not needed. 2018-12-03 19:28:50 +01:00
Filippo Scognamiglio
44a63d4aaa Change default curvature values. 2018-12-03 17:12:41 +01:00
Filippo Scognamiglio
5b3297f916 Tweak some shader constants. 2018-12-03 16:55:44 +01:00
Filippo Scognamiglio
41413d4712 Rearrange settings window. 2018-12-03 16:39:20 +01:00
Filippo Scognamiglio
fd2e5ce71e Reduce default fps to 20. It looks good with new burnin and saves some gpu. 2018-12-03 16:06:48 +01:00
Filippo Scognamiglio
e9ddd7d3b8 Split effects into static (cached) and dynamic computed at every frame. 2018-12-03 14:58:34 +01:00
Filippo Scognamiglio
da6795f002 Use window scaling parameter for framebuffer size. 2018-12-03 12:43:40 +01:00
Filippo Scognamiglio
f497bb4b44 First wrong framebuffer implementation. 2018-12-02 19:57:24 +01:00
Filippo Scognamiglio
4aea85649f Merge branch 'master' of https://github.com/Swordfish90/cool-retro-term 2018-12-01 19:56:13 +01:00
Filippo Scognamiglio
b9ffae25e3 Merge pull request #427 from suve/add-T-option-to-man-page
Add the -T option to the debian man page
2018-11-26 22:55:03 +01:00
Darryl T. Agostinelli
db7a7f38f7 Update README.md
Make it easier for the eye to pick up the instructions for the various Linux distros.  Presently, the eye skips over them and all you see are the Ubuntu things.  Also adjusted the help text a little.
2018-11-23 19:13:39 -06:00
suve
e2c4392c6d Fix alphabetically incorrect ordering of options in man page 2018-02-25 12:40:46 +01:00
suve
7e771b1cfc Add a description of the -T option to the man page 2018-02-25 12:40:42 +01:00
probonopd
4bff6efe97 Update .travis.yml 2017-04-03 23:07:30 +02:00
probonopd
c514dc7a24 See if we still need 2 runs 2017-04-03 22:55:45 +02:00
probonopd
24754edb6a Use linuxdeployqt-continuous-x86_64.AppImage for now 2017-03-17 21:05:44 +01:00
probonopd
79fbb76524 Try to reduce workarounds fpr 2017-03-17 21:02:20 +01:00
probonopd
b85aede966 Update .travis.yml 2017-02-25 01:27:19 +01:00
probonopd
c66ca6e44f Update .travis.yml 2017-02-25 01:20:00 +01:00
probonopd
a192024fef Update .travis.yml 2017-02-25 01:12:13 +01:00
probonopd
918df9098a Update .travis.yml 2017-02-25 01:06:42 +01:00
probonopd
c9271bfa36 Update .travis.yml 2017-02-25 01:01:39 +01:00
probonopd
fa162c818b Update .travis.yml 2017-02-25 00:56:00 +01:00
probonopd
ff976e3ec2 Update .travis.yml 2017-02-25 00:55:46 +01:00
probonopd
17c5651305 Update .travis.yml 2017-02-25 00:50:41 +01:00
probonopd
7c7b049ba1 Update .travis.yml 2017-02-25 00:49:16 +01:00
probonopd
0823fe8b3d find /opt/qt58/ | grep QtGraphicalEffects 2017-02-19 21:43:34 +01:00
probonopd
e787fd0fb5 Update .travis.yml 2017-02-19 20:11:53 +01:00
probonopd
650497bff4 Debug why some qml imports do not get deployed 2017-02-19 18:45:29 +01:00
probonopd
2f25bd30b0 linuxdeployqt-3-x86_64.AppImage 2017-02-19 18:38:16 +01:00
probonopd
d58157a450 -qmldir=./app/qml/ -qmldir=./qmltermwidget/ 2017-02-19 18:32:44 +01:00
probonopd
9d049bd041 Use linuxdeployqt-3-x86_64.AppImage 2017-02-19 18:24:35 +01:00
probonopd
988222b711 Upload to transfer.sh 2017-02-19 18:23:31 +01:00
probonopd
f42bd3036f Install libgl1-mesa-dev 2017-02-19 18:08:53 +01:00
probonopd
297239fb5c Install libgl-dev 2017-02-19 18:05:37 +01:00
probonopd
dbd46d44aa Update .travis.yml 2017-02-19 18:01:29 +01:00
probonopd
254f4d6e92 Create .travis.yml 2017-02-19 17:56:57 +01:00
47 changed files with 2690 additions and 1856 deletions

4
.github/FUNDING.yml vendored Normal file
View 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&currency_code=EUR&source=url']

1
.gitignore vendored
View File

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

37
.travis.yml Normal file
View 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)/

View File

@@ -8,25 +8,33 @@
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) developed by me: 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 Qt 5.2 or higher.
Settings such as colors, fonts, and effects can be accessed via context menu.
## Screenshots ## Screenshots
![Image](<http://i.imgur.com/I6wq1cC.png>) ![Image](<https://i.imgur.com/TNumkDn.png>)
![Image](<http://i.imgur.com/12EqlpL.png>) ![Image](<https://i.imgur.com/hfjWOM4.png>)
![Image](<http://i.imgur.com/Lx0acQz.jpg>) ![Image](<https://i.imgur.com/GYRDPzJ.jpg>)
## 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: Walk the easy way and install cool-retro-term using one of these convenient packages:
Fedora has the `cool-retro-term` in the offcial repositories. All you have to do is `sudo dnf install cool-retro-term`. Just grab the latest AppImage from the release page and make it executable and run it:
Users of openSUSE can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term). wget https://github.com/Swordfish90/cool-retro-term/releases/download/1.1.1/Cool-Retro-Term-1.1.1-x86_64.AppImage
chmod a+x Cool-Retro-Term-1.1.1-x86_64.AppImage
./Cool-Retro-Term-1.1.1-x86_64.AppImage
Arch users can install this [package](https://aur.archlinux.org/packages/cool-retro-term-git/) directly via the [AUR](https://aur.archlinux.org): **Fedora** has the `cool-retro-term` in the official repositories. All you have to do is `sudo dnf install cool-retro-term`.
yaourt -S aur/cool-retro-term-git Users of **openSUSE** can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term).
**Arch** users can install this [package](https://aur.archlinux.org/packages/cool-retro-term-git/) directly via the [AUR](https://aur.archlinux.org):
trizen -S aur/cool-retro-term-git
or use: or use:
@@ -34,25 +42,41 @@ or use:
to install precompiled from community repository. 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: Users of **Ubuntu 14.04 LTS (Trusty) up to 15.10 (Wily)** can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb).
USE="git" emerge app-portage/layman **Ubuntu 17.10** can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term)
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. **Solus** users can install using `eopg`:
```
eopkg it cool-retro-term
```
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! **macOS** users can grab the latest dmg from the [release page](https://github.com/Swordfish90/cool-retro-term/releases) or install via Homebrew or MacPorts:
```
brew install cool-retro-term --cask
```
or
```
port install cool-retro-term
```
Ubuntu users of 14.04 LTS (Trusty) up to 15.10 (Wily) can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb). **FreeBSD** users can install cool-retro-term with `pkg`:
Ubuntu 17.10 can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term) pkg install cool-retro-term
macOS users can grab the latest dmg from the release page: https://github.com/Swordfish90/cool-retro-term/releases ## Build instructions (FreeBSD)
Grab a copy of [the FreeBSD Ports Collection](https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html), modify [`/usr/ports/x11/cool-retro-term/Makefile`](https://svnweb.freebsd.org/ports/head/x11/cool-retro-term/Makefile?view=markup) as you like, and then run `make install` to build and install the emulator:
```
cd /usr/ports/x11/cool-retro-term
make install
```
## Build instructions (Linux) ## Build instructions (Linux)
Build cool-retro-term yourself, you know, the retro way.
## Dependencies ## Dependencies
Make sure to install these first. Make sure to install these first.
@@ -82,6 +106,12 @@ Make sure to install these first.
--- ---
**snapcraft (most of distros)**
sudo snap install cool-retro-term --classic
---
**Debian Jessie and above** **Debian Jessie and above**
sudo apt install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtgraphicaleffects qml-module-qtquick-dialogs qml-module-qtquick-localstorage qml-module-qtquick-window2 qml-module-qt-labs-settings qml-module-qt-labs-folderlistmodel sudo apt install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtgraphicaleffects qml-module-qtquick-dialogs qml-module-qtquick-localstorage qml-module-qtquick-window2 qml-module-qt-labs-settings qml-module-qt-labs-folderlistmodel
@@ -173,7 +203,8 @@ cp -r qmltermwidget/QMLTermWidget cool-retro-term.app/Contents/PlugIns
open cool-retro-term.app open cool-retro-term.app
``` ```
## Donations **Homebrew**
I made this project in my spare time because I love what I'm doing. If you are enjoying it and you want to buy me a beer click [here](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=flscogna%40gmail%2ecom&lc=IT&item_name=Filippo%20Scognamiglio&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted).
You can also add "bounties" on your favourite issues. More information on the [Bountysource](https://www.bountysource.com/teams/crt/issues) page. ```sh
brew install cool-retro-term --cask
```

View File

@@ -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/../

View File

@@ -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,45 @@ 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
// Force fusion style on every platform
QQuickStyle::setStyle("Fusion");
if (argc>1 && (!strcmp(argv[1],"-h") || !strcmp(argv[1],"--help"))) {
QTextStream cout(stdout, QIODevice::WriteOnly);
cout << "Usage: " << argv[0] << " [--default-settings] [--workdir <dir>] [--program <prog>] [-p|--profile <prof>] [--fullscreen] [-h|--help]" << endl;
cout << " --default-settings Run cool-retro-term with the default settings" << endl;
cout << " --workdir <dir> Change working directory to 'dir'" << endl;
cout << " -e <cmd> Command to execute. This option will catch all following arguments, so use it as the last option." << endl;
cout << " -T <title> Set window title to 'title'." << endl;
cout << " --fullscreen Run cool-retro-term in fullscreen." << endl;
cout << " -p|--profile <prof> Run cool-retro-term with the given profile." << endl;
cout << " -h|--help Print this help." << endl;
cout << " --verbose Print additional information such as profiles and settings." << endl;
return 0;
}
QString appVersion("1.2.0-beta1");
if (argc>1 && (!strcmp(argv[1],"-v") || !strcmp(argv[1],"--version"))) {
QTextStream cout(stdout, QIODevice::WriteOnly);
cout << "cool-retro-term " << appVersion << endl;
return 0;
}
QApplication app(argc, argv); QApplication app(argc, argv);
// set application attributes 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 +85,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 +98,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);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,73 +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)
visible: screenCurvature != 0
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 inShadowLength = 0.5 * 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));
float inShadow = min2(step(vec2(0.0), coords) - step(vec2(1.0), coords));
inShadow -= min2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords));
alpha += 0.35 * inShadow;
gl_FragColor = vec4(color * alpha, alpha);
}
"
onStatusChanged: if (log) console.log(log) //Print warning messages
}

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -19,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,83 @@ 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();
function onTriggered() {
kterminal.copyClipboard()
}
} }
Connections{ Connections {
target: pasteAction target: pasteAction
onTriggered: kterminal.pasteClipboard()
function onTriggered() {
kterminal.pasteClipboard()
}
} }
//When settings are updated sources need to be redrawn. //When settings are updated sources need to be redrawn.
Connections{ Connections {
target: appSettings target: appSettings
onFontScalingChanged: terminalContainer.updateSources();
onFontWidthChanged: terminalContainer.updateSources(); function onFontScalingChanged() {
terminalContainer.updateSources()
}
function onFontWidthChanged() {
terminalContainer.updateSources()
}
} }
Connections{ Connections {
target: terminalContainer target: terminalContainer
onWidthChanged: terminalContainer.updateSources();
onHeightChanged: terminalContainer.updateSources(); function onWidthChanged() {
terminalContainer.updateSources()
}
function onHeightChanged() {
terminalContainer.updateSources()
}
} }
Connections {
target: terminalWindow
function 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 +168,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 +182,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 +238,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 +254,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
}
} }
} }

View 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
}
}
Label {
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
}
}
Label {
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
}
}
Label {
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
}
}
Label {
text: Math.round(burnInSlider.value * 100) + "%"
}
}
}
}

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,68 +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 {
GroupBox{ spacing: 2
GroupBox {
title: qsTr("Effects") title: qsTr("Effects")
anchors.fill: parent Layout.fillWidth: true
ColumnLayout{
ColumnLayout {
anchors.fill: parent anchors.fill: parent
spacing: 2
CheckableSlider{ CheckableSlider {
name: qsTr("Bloom") name: qsTr("Bloom")
onNewValue: appSettings.bloom = newValue onNewValue: appSettings.bloom = newValue
value: appSettings.bloom value: appSettings.bloom
} }
CheckableSlider{ CheckableSlider {
name: qsTr("BurnIn") name: qsTr("BurnIn")
onNewValue: appSettings.burnIn = newValue onNewValue: appSettings.burnIn = newValue
value: appSettings.burnIn value: appSettings.burnIn
} }
CheckableSlider{ CheckableSlider {
name: qsTr("Static Noise") name: qsTr("Static Noise")
onNewValue: appSettings.staticNoise = newValue onNewValue: appSettings.staticNoise = newValue
value: appSettings.staticNoise value: appSettings.staticNoise
} }
CheckableSlider{ CheckableSlider {
name: qsTr("Jitter") name: qsTr("Jitter")
onNewValue: appSettings.jitter = newValue onNewValue: appSettings.jitter = newValue
value: appSettings.jitter value: appSettings.jitter
} }
CheckableSlider{ CheckableSlider {
name: qsTr("Glow Line") name: qsTr("Glow Line")
onNewValue: appSettings.glowingLine = newValue; onNewValue: appSettings.glowingLine = newValue
value: appSettings.glowingLine value: appSettings.glowingLine
} }
CheckableSlider{ CheckableSlider {
name: qsTr("Screen Curvature") name: qsTr("Screen Curvature")
onNewValue: appSettings.screenCurvature = newValue; onNewValue: appSettings.screenCurvature = newValue
value: appSettings.screenCurvature; value: appSettings.screenCurvature
} }
CheckableSlider{ CheckableSlider {
name: qsTr("Ambient Light") name: qsTr("Ambient Light")
onNewValue: appSettings.ambientLight = newValue; onNewValue: appSettings.ambientLight = newValue
value: appSettings.ambientLight value: appSettings.ambientLight
enabled: appSettings.framesIndex !== 0 enabled: appSettings.framesIndex !== 0
} }
CheckableSlider{ CheckableSlider {
name: qsTr("Flickering") name: qsTr("Flickering")
onNewValue: appSettings.flickering = newValue; onNewValue: appSettings.flickering = newValue
value: appSettings.flickering; value: appSettings.flickering
} }
CheckableSlider{ CheckableSlider {
name: qsTr("Horizontal Sync") name: qsTr("Horizontal Sync")
onNewValue: appSettings.horizontalSync = newValue; onNewValue: appSettings.horizontalSync = newValue
value: appSettings.horizontalSync; value: appSettings.horizontalSync
} }
CheckableSlider{ CheckableSlider {
name: qsTr("RGB Shift") name: qsTr("RGB Shift")
onNewValue: appSettings.rbgShift = newValue; onNewValue: appSettings.rbgShift = newValue
value: appSettings.rbgShift; value: appSettings.rbgShift
} }
} }
} }

View File

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

View File

@@ -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) + "%"}
}
}
}
}

View File

@@ -1,67 +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 QtQuick.Dialogs 1.1
Tab{
ColumnLayout{
anchors.fill: parent
GroupBox{
title: qsTr("Rasterization Mode")
Layout.fillWidth: true
ComboBox {
id: rasterizationBox
property string selectedElement: model[currentIndex]
anchors.fill: parent
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")]
currentIndex: appSettings.rasterization
onCurrentIndexChanged: {
appSettings.rasterization = currentIndex
}
}
}
GroupBox{
title: qsTr("Lights")
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("Opacity") }
SimpleSlider{
onValueChanged: appSettings.windowOpacity = value
value: appSettings.windowOpacity
}
}
}
}
}

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -17,125 +17,154 @@
* 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")
property var rasterization: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")][appSettings.rasterization] Layout.fillWidth: true
title: qsTr("Font " + "(" + rasterization + ")") GridLayout {
Layout.fillWidth: true anchors.fill: parent
GridLayout{ columns: 2
anchors.fill: parent Label {
columns: 2 text: qsTr("Rasterization")
Label{ text: qsTr("Name") } }
ComboBox{ ComboBox {
id: fontChanger id: rasterizationBox
Layout.fillWidth: true
model: appSettings.fontlist property string selectedElement: model[currentIndex]
onActivated: {
var name = appSettings.fontlist.get(index).name; Layout.fillWidth: true
appSettings.fontNames[appSettings.rasterization] = name; model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels"), qsTr("Sub-Pixels")]
appSettings.handleFontChanged(); currentIndex: appSettings.rasterization
} onCurrentIndexChanged: {
function updateIndex(){ appSettings.rasterization = currentIndex
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") } }
RowLayout{ Label {
Layout.fillWidth: true text: qsTr("Name")
Slider{ }
Layout.fillWidth: true ComboBox {
id: fontScalingChanger id: fontChanger
onValueChanged: if(enabled) appSettings.fontScaling = value Layout.fillWidth: true
stepSize: 0.05 model: appSettings.fontlist
enabled: false // Another trick to fix initial bad behavior. textRole: "text"
Component.onCompleted: { onActivated: {
minimumValue = appSettings.minimumFontScaling; var name = appSettings.fontlist.get(index).name
maximumValue = appSettings.maximumFontScaling; appSettings.fontNames[appSettings.rasterization] = name
value = appSettings.fontScaling; appSettings.handleFontChanged()
enabled = true; }
} function updateIndex() {
Connections{ var name = appSettings.fontNames[appSettings.rasterization]
target: appSettings var index = appSettings.getIndexByName(name)
onFontScalingChanged: fontScalingChanger.value = appSettings.fontScaling; if (index !== undefined)
} currentIndex = index
} }
SizedLabel{ Connections {
text: Math.round(fontScalingChanger.value * 100) + "%" target: appSettings
function onTerminalFontChanged() {
fontChanger.updateIndex()
} }
} }
Label{ text: qsTr("Font Width") } Component.onCompleted: updateIndex()
RowLayout{ }
Label {
text: qsTr("Scaling")
}
RowLayout {
Layout.fillWidth: true
Slider {
Layout.fillWidth: true Layout.fillWidth: true
Slider{ id: fontScalingChanger
Layout.fillWidth: true onValueChanged: appSettings.fontScaling = value
id: widthChanger value: appSettings.fontScaling
onValueChanged: appSettings.fontWidth = value; stepSize: 0.05
value: appSettings.fontWidth from: appSettings.minimumFontScaling
stepSize: 0.05 to: appSettings.maximumFontScaling
Component.onCompleted: { }
// This is needed to avoid unnecessary chnaged events. SizedLabel {
minimumValue = 0.5; text: Math.round(fontScalingChanger.value * 100) + "%"
maximumValue = 1.5; }
} }
} Label {
SizedLabel{ text: qsTr("Font Width")
text: Math.round(widthChanger.value * 100) + "%" }
} RowLayout {
Layout.fillWidth: true
Slider {
Layout.fillWidth: true
id: widthChanger
onValueChanged: appSettings.fontWidth = value
value: appSettings.fontWidth
stepSize: 0.05
from: 0.5
to: 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
}
}
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
onColorSelected: appSettings._backgroundColor = color;
color: appSettings._backgroundColor
}
} }
} }
} }

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -19,52 +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: 600
height: 400 height: 480
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")
}
} }
SettingsScreenTab{
id: screenTab Frame {
title: qsTr("Screen") anchors {
anchors.fill: parent top: bar.bottom
anchors.margins: tabmargins left: parent.left
} right: parent.right
SettingsTerminalTab{ bottom: parent.bottom
id: terminalTab }
title: qsTr("Terminal")
anchors.fill: parent StackLayout {
anchors.margins: tabmargins anchors.fill: parent
}
SettingsEffectsTab{ currentIndex: bar.currentIndex
id: effectsTab
title: qsTr("Effects") SettingsGeneralTab { }
anchors.fill: parent SettingsTerminalTab { }
anchors.margins: tabmargins SettingsEffectsTab { }
} SettingsAdvancedTab { }
SettingsPerformanceTab{ }
id: performanceTab
title: qsTr("Performance")
anchors.fill: parent
anchors.margins: tabmargins
} }
} }
} }

91
app/qml/ShaderLibrary.qml Normal file
View 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"
}

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -23,330 +23,491 @@ import QtGraphicalEffects 1.0
import "utils.js" as Utils import "utils.js" as Utils
ShaderEffect { Item {
property ShaderEffectSource source property ShaderEffectSource source
property BurnInEffect burnInEffect property BurnInEffect burnInEffect
property ShaderEffectSource bloomSource property ShaderEffectSource bloomSource
property color fontColor: appSettings.fontColor property color fontColor: appSettings.fontColor
property color backgroundColor: appSettings.backgroundColor property color backgroundColor: appSettings.backgroundColor
property real bloom: appSettings.bloom * 2.5
property ShaderEffectSource burnInSource: burnInEffect.source
property real burnIn: appSettings.burnIn
property real burnInLastUpdate: burnInEffect.lastUpdate
property real burnInTime: burnInEffect.burnInFadeTime
property real jitter: appSettings.jitter
property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter)
property real staticNoise: appSettings.staticNoise
property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
(height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
property real glowingLine: appSettings.glowingLine * 0.2
property real chromaColor: appSettings.chromaColor; property real chromaColor: appSettings.chromaColor
property real rbgShift: (appSettings.rbgShift / width) * appSettings.totalFontScaling
property real flickering: appSettings.flickering
property real horizontalSync: appSettings.horizontalSync * 0.5
property int rasterization: appSettings.rasterization
property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness)
property real ambientLight: appSettings.ambientLight * 0.2 property real ambientLight: appSettings.ambientLight * 0.2
property size virtual_resolution property size virtualResolution
property size screenResolution
property real time: timeManager.time property real _screenDensity: Math.min(
property ShaderEffectSource noiseSource: noiseShaderSource screenResolution.width / virtualResolution.width,
screenResolution.height / virtualResolution.height
)
// If something goes wrong activate the fallback version of the shader. ShaderEffect {
property bool fallBack: false id: dynamicShader
blending: false property ShaderLibrary shaderLibrary: ShaderLibrary { }
//Smooth random texture used for flickering effect. property ShaderEffectSource screenBuffer: frameBuffer
Image{ property ShaderEffectSource burnInSource: burnInEffect.source
id: noiseTexture property ShaderEffectSource frameSource: terminalFrameLoader.item
source: "images/allNoise512.png"
width: 512
height: 512
fillMode: Image.Tile
visible: false
}
ShaderEffectSource{
id: noiseShaderSource
sourceItem: noiseTexture
wrapMode: ShaderEffectSource.Repeat
visible: false
smooth: true
}
//Print the number with a reasonable precision for the shader. property color fontColor: parent.fontColor
function str(num){ property color backgroundColor: parent.backgroundColor
return num.toFixed(8); property real screenCurvature: parent.screenCurvature
} property real chromaColor: parent.chromaColor
property real ambientLight: parent.ambientLight
vertexShader: " property real flickering: appSettings.flickering
uniform highp mat4 qt_Matrix; property real horizontalSync: appSettings.horizontalSync
uniform highp float time; property real horizontalSyncStrength: Utils.lint(0.05, 0.35, horizontalSync)
property real glowingLine: appSettings.glowingLine * 0.2
attribute highp vec4 qt_Vertex; // Fast burnin properties
attribute highp vec2 qt_MultiTexCoord0; property real burnIn: appSettings.burnIn
property real burnInLastUpdate: burnInEffect.lastUpdate
property real burnInTime: burnInEffect.burnInFadeTime
varying highp vec2 qt_TexCoord0;" + property real jitter: appSettings.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 staticNoise: appSettings.staticNoise
property size scaleNoiseSize: Qt.size((width * 0.75) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
(height * 0.75) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
(!fallBack ? " property size virtualResolution: parent.virtualResolution
uniform sampler2D noiseSource;" : "") +
(!fallBack && rbgShift !== 0.0 ?" // Rasterization might display oversamping issues if virtual resolution is close to physical display resolution.
varying lowp vec4 constantNoise;" : "") + // We progressively disable rasterization from 4x up to 2x resolution.
property real rasterizationIntensity: Utils.smoothstep(2.0, 4.0, _screenDensity)
(!fallBack && flickering !== 0.0 ?" property real displayTerminalFrame: appSettings._frameMargin > 0 || appSettings.screenCurvature > 0
varying lowp float brightness;
uniform lowp float flickering;" : "") +
(!fallBack && horizontalSync !== 0.0 ?" property real time: timeManager.time
uniform lowp float horizontalSync; property ShaderEffectSource noiseSource: noiseShaderSource
varying lowp float distortionScale;
varying lowp float distortionFreq;" : "") +
" // If something goes wrong activate the fallback version of the shader.
void main() { property bool fallBack: false
qt_TexCoord0 = qt_MultiTexCoord0;
vec2 coords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" +
(!fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0) ? anchors.fill: parent
"vec4 initialNoiseTexel = texture2D(noiseSource, coords);" blending: false
: "") +
(!fallBack && rbgShift !== 0.0 ?" //Smooth random texture used for flickering effect.
constantNoise = initialNoiseTexel;" : "") + Image {
id: noiseTexture
source: "images/allNoise512.png"
width: 512
height: 512
fillMode: Image.Tile
visible: false
}
ShaderEffectSource {
id: noiseShaderSource
sourceItem: noiseTexture
wrapMode: ShaderEffectSource.Repeat
visible: false
smooth: true
}
(!fallBack && flickering !== 0.0 ? " //Print the number with a reasonable precision for the shader.
brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" function str(num){
: "") + return num.toFixed(8);
}
(!fallBack && horizontalSync !== 0.0 ? " vertexShader: "
float randval = horizontalSync - initialNoiseTexel.r; uniform highp mat4 qt_Matrix;
distortionScale = step(0.0, randval) * randval * horizontalSync; uniform highp float time;
distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
: "") +
"gl_Position = qt_Matrix * qt_Vertex; attribute highp vec4 qt_Vertex;
}" attribute highp vec2 qt_MultiTexCoord0;
fragmentShader: " varying highp vec2 qt_TexCoord0;" +
#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D source; (!fallBack ? "
uniform highp float qt_Opacity; uniform sampler2D noiseSource;" : "") +
uniform highp float time;
varying highp vec2 qt_TexCoord0;
uniform highp vec4 fontColor; (!fallBack && flickering !== 0.0 ?"
uniform highp vec4 backgroundColor; varying lowp float brightness;
uniform lowp float screen_brightness; uniform lowp float flickering;" : "") +
uniform highp vec2 virtual_resolution;" + (!fallBack && horizontalSync !== 0.0 ?"
uniform lowp float horizontalSyncStrength;
varying lowp float distortionScale;
varying lowp float distortionFreq;" : "") +
(bloom !== 0 ? " "
uniform highp sampler2D bloomSource; void main() {
uniform lowp float bloom;" : "") + qt_TexCoord0 = qt_MultiTexCoord0;
(burnIn !== 0 ? " vec2 coords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" +
uniform sampler2D burnInSource;
uniform highp float burnInLastUpdate;
uniform highp float burnInTime;" : "") +
(staticNoise !== 0 ? "
uniform highp float staticNoise;" : "") +
(((staticNoise !== 0 || jitter !== 0 || rbgShift)
||(fallBack && (flickering || horizontalSync))) ? "
uniform lowp sampler2D noiseSource;
uniform highp vec2 scaleNoiseSize;" : "") +
(screenCurvature !== 0 ? "
uniform highp float screenCurvature;" : "") +
(glowingLine !== 0 ? "
uniform highp float glowingLine;" : "") +
(chromaColor !== 0 ? "
uniform lowp float chromaColor;" : "") +
(jitter !== 0 ? "
uniform lowp vec2 jitterDisplacement;" : "") +
(rbgShift !== 0 ? "
uniform lowp float rbgShift;" : "") +
(ambientLight !== 0 ? "
uniform lowp float ambientLight;" : "") +
(fallBack && horizontalSync !== 0 ? " (!fallBack && (flickering !== 0.0 || horizontalSync !== 0.0) ?
uniform lowp float horizontalSync;" : "") + "vec4 initialNoiseTexel = texture2D(noiseSource, coords);"
(fallBack && flickering !== 0.0 ?" : "") +
uniform lowp float flickering;" : "") +
(!fallBack && flickering !== 0 ? "
varying lowp float brightness;"
: "") +
(!fallBack && horizontalSync !== 0 ? "
varying lowp float distortionScale;
varying lowp float distortionFreq;" : "") +
(!fallBack && rbgShift !== 0.0 ?" (!fallBack && flickering !== 0.0 ? "
varying lowp vec4 constantNoise;" : "") + brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
: "") +
(glowingLine !== 0 ? " (!fallBack && horizontalSync !== 0.0 ? "
float randomPass(vec2 coords){ float randval = horizontalSyncStrength - initialNoiseTexel.r;
return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015))); distortionScale = step(0.0, randval) * randval * horizontalSyncStrength;
}" : "") + distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
: "") +
"highp float getScanlineIntensity(vec2 coords) { "gl_Position = qt_Matrix * qt_Vertex;
float result = 1.0;" + }"
(appSettings.rasterization != appSettings.no_rasterization ? fragmentShader: "
"float val = 0.0; #ifdef GL_ES
vec2 rasterizationCoords = fract(coords * virtual_resolution); precision mediump float;
val += smoothstep(0.0, 0.5, rasterizationCoords.y); #endif
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; uniform sampler2D screenBuffer;
} uniform highp float qt_Opacity;
uniform highp float time;
varying highp vec2 qt_TexCoord0;
float min2(vec2 v) { uniform highp vec4 fontColor;
return min(v.x, v.y); uniform highp vec4 backgroundColor;
} uniform lowp float shadowLength;
float rgb2grey(vec3 v){ uniform highp vec2 virtualResolution;
return dot(v, vec3(0.21, 0.72, 0.04)); uniform lowp float rasterizationIntensity;\n" +
}" +
"void main() {" + (burnIn !== 0 ? "
"vec2 cc = vec2(0.5) - qt_TexCoord0;" + uniform sampler2D burnInSource;
"float distance = length(cc);" + uniform highp float burnInLastUpdate;
uniform highp float burnInTime;" : "") +
(staticNoise !== 0 ? "
uniform highp float staticNoise;" : "") +
(((staticNoise !== 0 || jitter !== 0) ||(fallBack && (flickering || horizontalSync))) ? "
uniform lowp sampler2D noiseSource;
uniform highp vec2 scaleNoiseSize;" : "") +
(displayTerminalFrame ? "
uniform lowp sampler2D frameSource;" : "") +
(screenCurvature !== 0 ? "
uniform highp float screenCurvature;" : "") +
(glowingLine !== 0 ? "
uniform highp float glowingLine;" : "") +
(chromaColor !== 0 ? "
uniform lowp float chromaColor;" : "") +
(jitter !== 0 ? "
uniform lowp vec2 jitterDisplacement;" : "") +
(ambientLight !== 0 ? "
uniform lowp float ambientLight;" : "") +
//FallBack if there are problems (fallBack && horizontalSync !== 0 ? "
(fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0.0) ? uniform lowp float horizontalSyncStrength;" : "") +
"vec2 initialCoords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0))); (fallBack && flickering !== 0.0 ?"
vec4 initialNoiseTexel = texture2D(noiseSource, initialCoords);" uniform lowp float flickering;" : "") +
: "") + (!fallBack && flickering !== 0 ? "
(fallBack && flickering !== 0.0 ? " varying lowp float brightness;"
float brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" : "") +
: "") + (!fallBack && horizontalSync !== 0 ? "
(fallBack && horizontalSync !== 0.0 ? " varying lowp float distortionScale;
float randval = horizontalSync - initialNoiseTexel.r; varying lowp float distortionFreq;" : "") +
float distortionScale = step(0.0, randval) * randval * horizontalSync;
float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
: "") +
(fallBack && rbgShift !== 0.0 ?"
lowp vec4 constantNoise = initialNoiseTexel;" : "") +
(staticNoise ? " (glowingLine !== 0 ? "
float noise = staticNoise;" : "") + float randomPass(vec2 coords){
return fract(smoothstep(-120.0, 0.0, coords.y - (virtualResolution.y + 120.0) * fract(time * 0.00015)));
}" : "") +
(screenCurvature !== 0 ? " shaderLibrary.min2 +
float distortion = dot(cc, cc) * screenCurvature; shaderLibrary.rgb2grey +
vec2 curvatureCoords = (qt_TexCoord0 - cc * (1.0 + distortion) * distortion); shaderLibrary.rasterizationShader +
vec2 staticCoords = - 2.0 * curvatureCoords + 3.0 * step(vec2(0.0), curvatureCoords) * curvatureCoords - 3.0 * step(vec2(1.0), curvatureCoords) * curvatureCoords;"
:"
vec2 staticCoords = qt_TexCoord0;") +
"vec2 coords = staticCoords;" + "
float isInScreen(vec2 v) {
return min2(step(0.0, v) - step(1.0, v));
}
(horizontalSync !== 0 ? " vec2 barrel(vec2 v, vec2 cc) {" +
float dst = sin((coords.y + time * 0.001) * distortionFreq);
coords.x += dst * distortionScale;" +
(staticNoise ? "
noise += distortionScale * 7.0;" : "")
: "") +
(jitter !== 0 || staticNoise !== 0 || rbgShift !== 0 ? (screenCurvature !== 0 ? "
"vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));" float distortion = dot(cc, cc) * screenCurvature;
: "") + return (v - cc * (1.0 + distortion) * distortion);"
:
"return v;") +
"}" +
(jitter !== 0 ? " "vec3 convertWithChroma(vec3 inColor) {
vec2 offset = vec2(noiseTexel.b, noiseTexel.a) - vec2(0.5); vec3 outColor = inColor;" +
vec2 txt_coords = coords + offset * jitterDisplacement;"
: "vec2 txt_coords = coords;") +
"float color = 0.0001;" + (chromaColor !== 0 ?
"outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor);"
:
"outColor = fontColor.rgb * rgb2grey(inColor);") +
(staticNoise !== 0 ? " " return outColor;
float noiseVal = noiseTexel.a; }" +
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
(glowingLine !== 0 ? " "void main() {" +
color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + "vec2 cc = vec2(0.5) - qt_TexCoord0;" +
"float distance = length(cc);" +
"vec3 txt_color = texture2D(source, txt_coords).rgb;" + //FallBack if there are problems
(fallBack && (flickering !== 0.0 || horizontalSync !== 0.0) ?
"vec2 initialCoords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));
vec4 initialNoiseTexel = texture2D(noiseSource, initialCoords);"
: "") +
(fallBack && flickering !== 0.0 ? "
float brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
: "") +
(fallBack && horizontalSync !== 0.0 ? "
float randval = horizontalSyncStrength - initialNoiseTexel.r;
float distortionScale = step(0.0, randval) * randval * horizontalSyncStrength;
float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
: "") +
(rbgShift !== 0 ? " (staticNoise ? "
vec2 displacement = vec2(12.0, 0.0) * rbgShift * (0.6 * constantNoise.r + 0.4); float noise = staticNoise;" : "") +
vec3 rightColor = texture2D(source, txt_coords + displacement).rgb;
vec3 leftColor = texture2D(source, txt_coords - displacement).rgb;
txt_color.r = leftColor.r * 0.10 + rightColor.r * 0.30 + txt_color.r * 0.60;
txt_color.g = leftColor.g * 0.20 + rightColor.g * 0.20 + txt_color.g * 0.60;
txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60;
" : "") +
(burnIn !== 0 ? " (screenCurvature !== 0 ? "
vec4 txt_blur = texture2D(burnInSource, staticCoords); vec2 staticCoords = barrel(qt_TexCoord0, cc);"
float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0); :"
txt_color = max(txt_color, 0.5 * (txt_blur.rgb - vec3(blurDecay)));" vec2 staticCoords = qt_TexCoord0;") +
: "") +
"txt_color *= getScanlineIntensity(coords);" + "vec2 coords = qt_TexCoord0;" +
"txt_color += vec3(color);" + (horizontalSync !== 0 ? "
"float greyscale_color = rgb2grey(txt_color);" + float dst = sin((coords.y + time * 0.001) * distortionFreq);
coords.x += dst * distortionScale;" +
(chromaColor !== 0 ? (staticNoise ? "
"vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor); noise += distortionScale * 7.0;" : "")
vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color);"
:
"vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color);") +
(bloom !== 0 ? : "") +
"vec4 bloomFullColor = texture2D(bloomSource, coords);
vec3 bloomColor = bloomFullColor.rgb;
float bloomAlpha = bloomFullColor.a;" +
(chromaColor !== 0 ?
"bloomColor = fontColor.rgb * mix(vec3(rgb2grey(bloomColor)), bloomColor, chromaColor);"
:
"bloomColor = fontColor.rgb * rgb2grey(bloomColor);") +
"finalColor += clamp(bloomColor * bloom * bloomAlpha, 0.0, 0.5);"
: "") +
(screenCurvature !== 0 ? " (jitter !== 0 || staticNoise !== 0 ?
vec2 curvatureMask = step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords); "vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));"
finalColor *= clamp(0.0, 1.0, curvatureMask.x + curvatureMask.y);" : "") +
:"") +
(flickering !== 0 ? " (jitter !== 0 ? "
finalColor *= brightness;" : "") + vec2 offset = vec2(noiseTexel.b, noiseTexel.a) - vec2(0.5);
vec2 txt_coords = coords + offset * jitterDisplacement;"
: "vec2 txt_coords = coords;") +
(ambientLight !== 0 ? " "float color = 0.0001;" +
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
(staticNoise !== 0 ? "
float noiseVal = noiseTexel.a;
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
"gl_FragColor = vec4(finalColor * screen_brightness, qt_Opacity);" + (glowingLine !== 0 ? "
"}" color += randomPass(coords * virtualResolution) * glowingLine;" : "") +
onStatusChanged: { "vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" +
// Print warning messages
if (log)
console.log(log);
// Activate fallback mode (burnIn !== 0 ? "
if (status == ShaderEffect.Error) { vec4 txt_blur = texture2D(burnInSource, staticCoords);
fallBack = true; float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0);
vec3 burnInColor = 0.65 * (txt_blur.rgb - vec3(blurDecay));
txt_color = max(txt_color, convertWithChroma(burnInColor));"
: "") +
"txt_color += fontColor.rgb * vec3(color);" +
"txt_color = applyRasterization(staticCoords, txt_color, virtualResolution, rasterizationIntensity);\n" +
"vec3 finalColor = txt_color;" +
(flickering !== 0 ? "
finalColor *= brightness;" : "") +
(ambientLight !== 0 ? "
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
(displayTerminalFrame ?
"vec4 frameColor = texture2D(frameSource, qt_TexCoord0);
finalColor = mix(finalColor, frameColor.rgb, frameColor.a);"
: "") +
"gl_FragColor = vec4(finalColor, qt_Opacity);" +
"}"
onStatusChanged: {
// Print warning messages
if (log)
console.log(log);
// Activate fallback mode
if (status == ShaderEffect.Error) {
fallBack = true;
}
}
}
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 {
id: staticShader
width: parent.width * appSettings.windowScaling
height: parent.height * appSettings.windowScaling
property ShaderEffectSource source: parent.source
property ShaderEffectSource bloomSource: parent.bloomSource
property color fontColor: parent.fontColor
property color backgroundColor: parent.backgroundColor
property real bloom: appSettings.bloom * 2.5
property real screenCurvature: parent.screenCurvature
property real chromaColor: appSettings.chromaColor;
property real rbgShift: (appSettings.rbgShift / width) * appSettings.totalFontScaling // TODO FILIPPO width here is wrong.
property int rasterization: appSettings.rasterization
property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness)
property real ambientLight: parent.ambientLight
property size virtualResolution: parent.virtualResolution
blending: false
visible: false
//Print the number with a reasonable precision for the shader.
function str(num){
return num.toFixed(8);
}
fragmentShader: "
#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D source;
uniform highp float qt_Opacity;
varying highp vec2 qt_TexCoord0;
uniform highp vec4 fontColor;
uniform highp vec4 backgroundColor;
uniform lowp float screen_brightness;
uniform highp vec2 virtualResolution;" +
(bloom !== 0 ? "
uniform highp sampler2D bloomSource;
uniform lowp float bloom;" : "") +
(screenCurvature !== 0 ? "
uniform highp float screenCurvature;" : "") +
(chromaColor !== 0 ? "
uniform lowp float chromaColor;" : "") +
(rbgShift !== 0 ? "
uniform lowp float rbgShift;" : "") +
(ambientLight !== 0 ? "
uniform lowp float ambientLight;" : "") +
shaderLibrary.min2 +
shaderLibrary.sum2 +
shaderLibrary.rgb2grey +
"vec3 convertWithChroma(vec3 inColor) {
vec3 outColor = inColor;" +
(chromaColor !== 0 ?
"outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor);"
:
"outColor = fontColor.rgb * rgb2grey(inColor);") +
" return outColor;
}" +
shaderLibrary.rasterizationShader +
"void main() {" +
"vec2 cc = vec2(0.5) - qt_TexCoord0;" +
(screenCurvature !== 0 ? "
float distortion = dot(cc, cc) * screenCurvature;
vec2 curvatureCoords = (qt_TexCoord0 - cc * (1.0 + distortion) * distortion);
vec2 txt_coords = - 2.0 * curvatureCoords + 3.0 * step(vec2(0.0), curvatureCoords) * curvatureCoords - 3.0 * step(vec2(1.0), curvatureCoords) * curvatureCoords;"
:"
vec2 txt_coords = qt_TexCoord0;") +
"vec3 txt_color = texture2D(source, txt_coords).rgb;" +
(rbgShift !== 0 ? "
vec2 displacement = vec2(12.0, 0.0) * rbgShift;
vec3 rightColor = texture2D(source, txt_coords + displacement).rgb;
vec3 leftColor = texture2D(source, txt_coords - displacement).rgb;
txt_color.r = leftColor.r * 0.10 + rightColor.r * 0.30 + txt_color.r * 0.60;
txt_color.g = leftColor.g * 0.20 + rightColor.g * 0.20 + txt_color.g * 0.60;
txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60;
" : "") +
"txt_color += vec3(0.0001);" +
"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 ?
"vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor);
vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color * reflectionMask);"
:
"vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color * reflectionMask);") +
(bloom !== 0 ?
"vec4 bloomFullColor = texture2D(bloomSource, txt_coords);
vec3 bloomColor = bloomFullColor.rgb;
float bloomAlpha = bloomFullColor.a;
bloomColor = convertWithChroma(bloomColor);
finalColor += clamp(bloomColor * bloom * bloomAlpha, 0.0, 0.5);"
: "") +
"finalColor *= screen_brightness;" +
"gl_FragColor = vec4(finalColor, qt_Opacity);" +
"}"
onStatusChanged: {
// Print warning messages
if (log) console.log(log);
}
}
ShaderEffectSource {
id: frameBuffer
visible: false
sourceItem: staticShader
hideSource: true
}
} }

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio" * Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term * https://github.com/Swordfish90/cool-retro-term
* *
* This file is part of cool-retro-term. * This file is part of cool-retro-term.
@@ -27,7 +27,7 @@ QtObject {
property bool initialized: false property bool initialized: false
function getDatabase() { function getDatabase() {
return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000); return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000)
} }
function initialize() { function initialize() {
@@ -35,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');
}); }
)
} }
} }

View File

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

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

View File

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

Binary file not shown.

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2013 "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
@@ -37,8 +37,6 @@ ApplicationWindow{
// Load saved window geometry and show the window // Load saved window geometry and show the window
Component.onCompleted: { Component.onCompleted: {
appSettings.handleFontChanged();
x = appSettings.x x = appSettings.x
y = appSettings.y y = appSettings.y
width = appSettings.width width = appSettings.width
@@ -55,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,74 +95,68 @@ ApplicationWindow{
id: quitAction id: quitAction
text: qsTr("Quit") text: qsTr("Quit")
shortcut: "Ctrl+Shift+Q" shortcut: "Ctrl+Shift+Q"
onTriggered: Qt.quit(); onTriggered: Qt.quit()
} }
Action{ Action {
id: showsettingsAction id: showsettingsAction
text: qsTr("Settings") text: qsTr("Settings")
onTriggered: { onTriggered: {
settingswindow.show(); settingswindow.show()
settingswindow.requestActivate(); settingswindow.requestActivate()
settingswindow.raise(); settingswindow.raise()
} }
} }
Action{ Action {
id: copyAction id: copyAction
text: qsTr("Copy") text: qsTr("Copy")
shortcut: "Ctrl+Shift+C" shortcut: "Ctrl+Shift+C"
} }
Action{ Action {
id: pasteAction id: pasteAction
text: qsTr("Paste") text: qsTr("Paste")
shortcut: "Ctrl+Shift+V" shortcut: "Ctrl+Shift+V"
} }
Action{ Action {
id: zoomIn id: zoomIn
text: qsTr("Zoom In") text: qsTr("Zoom In")
shortcut: "Ctrl++" shortcut: "Ctrl++"
onTriggered: appSettings.incrementScaling(); onTriggered: appSettings.incrementScaling()
} }
Action{ Action {
id: zoomOut id: zoomOut
text: qsTr("Zoom Out") text: qsTr("Zoom Out")
shortcut: "Ctrl+-" shortcut: "Ctrl+-"
onTriggered: appSettings.decrementScaling(); onTriggered: appSettings.decrementScaling()
} }
Action{ Action {
id: showAboutAction id: showAboutAction
text: qsTr("About") text: qsTr("About")
onTriggered: { onTriggered: {
aboutDialog.show(); aboutDialog.show()
aboutDialog.requestActivate(); aboutDialog.requestActivate()
aboutDialog.raise(); aboutDialog.raise()
} }
} }
ApplicationSettings{ ApplicationSettings {
id: appSettings id: appSettings
} }
TerminalContainer{ TerminalContainer {
id: terminalContainer id: terminalContainer
y: appSettings.showMenubar ? 0 : -2 // Workaroud to hide the margin in the menubar. width: parent.width
width: parent.width * appSettings.windowScaling height: (parent.height + Math.abs(y))
height: (parent.height + Math.abs(y)) * appSettings.windowScaling
transform: Scale {
xScale: 1 / appSettings.windowScaling
yScale: 1 / appSettings.windowScaling
}
} }
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
} }
@@ -164,7 +164,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()
} }
} }

View File

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

89
app/qml/menus/OSXMenu.qml Normal file
View 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()
}
}
}

View File

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

View File

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

View File

@@ -12,7 +12,6 @@
<file>TimeManager.qml</file> <file>TimeManager.qml</file>
<file>SimpleSlider.qml</file> <file>SimpleSlider.qml</file>
<file>ColorButton.qml</file> <file>ColorButton.qml</file>
<file>Glossy.qml</file>
<file>AboutDialog.qml</file> <file>AboutDialog.qml</file>
<file>InsertNameDialog.qml</file> <file>InsertNameDialog.qml</file>
<file>SettingsEffectsTab.qml</file> <file>SettingsEffectsTab.qml</file>
@@ -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>
@@ -32,7 +30,6 @@
<file>fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf</file> <file>fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf</file>
<file>fonts/modern-hermit/Hermit-medium.otf</file> <file>fonts/modern-hermit/Hermit-medium.otf</file>
<file>fonts/modern-inconsolata/Inconsolata.otf</file> <file>fonts/modern-inconsolata/Inconsolata.otf</file>
<file>SettingsScreenTab.qml</file>
<file>fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf</file> <file>fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf</file>
<file>../icons/32x32/cool-retro-term.png</file> <file>../icons/32x32/cool-retro-term.png</file>
<file>Components/SizedLabel.qml</file> <file>Components/SizedLabel.qml</file>
@@ -43,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>

View File

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

View File

@@ -30,14 +30,17 @@ Print a help screen and exit.
\fB\-p\fR \fIPROFILE\fR, \fB\-\-profile\fR \fIPROFILE\fR \fB\-p\fR \fIPROFILE\fR, \fB\-\-profile\fR \fIPROFILE\fR
Run with the given profile. Run with the given profile.
.TP .TP
\fB\-\-workdir\fR \fIDIR\fR \fB\-T\fR \fITITLE\fR
Start with \fIDIR\fR as the working directory. Use \fITITLE\fR as the window title.
.TP .TP
\fB\-\-verbose\fR \fB\-\-verbose\fR
Print additional information such as profiles and settings. Print additional information such as profiles and settings.
.TP .TP
\fB\-v\fR, \fB\-\-version\fR \fB\-v\fR, \fB\-\-version\fR
Print the version number and exit. Print the version number and exit.
.TP
\fB\-\-workdir\fR \fIDIR\fR
Start with \fIDIR\fR as the working directory.
.SH LICENCE .SH LICENCE
This program is available under the terms of the GNU General Public License, This program is available under the terms of the GNU General Public License,
version 3 or any later version, as published by the Free Software Foundation. version 3 or any later version, as published by the Free Software Foundation.

View File

@@ -1,32 +1,46 @@
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
@@ -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