mirror of
https://github.com/Swordfish90/cool-retro-term.git
synced 2026-02-08 00:32:27 +00:00
Compare commits
198 Commits
framebuffe
...
rolling
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fe92fa7330 | ||
|
|
eba69d3a54 | ||
|
|
403bb11e7e | ||
|
|
9f05d729a7 | ||
|
|
25695c0a9f | ||
|
|
b77a1b5962 | ||
|
|
29dc67d96b | ||
|
|
2e4536ecdf | ||
|
|
8cf303132f | ||
|
|
55ef7cb7e0 | ||
|
|
77434e463e | ||
|
|
6bcb54114d | ||
|
|
09f813a7e0 | ||
|
|
a6a7768e42 | ||
|
|
33878dae24 | ||
|
|
0313a00b4f | ||
|
|
be4b1f366c | ||
|
|
c54dcb1c1c | ||
|
|
5795aeb6b7 | ||
|
|
e70268bb73 | ||
|
|
e72faa1d2c | ||
|
|
e1fc767431 | ||
|
|
737d289a19 | ||
|
|
a0a16fc300 | ||
|
|
f99ccf97dc | ||
|
|
2d2749cb20 | ||
|
|
471ec29f5d | ||
|
|
56144f757d | ||
|
|
1c49b02763 | ||
|
|
60784c47d9 | ||
|
|
bd89df3564 | ||
|
|
b4e1077cb1 | ||
|
|
f518345430 | ||
|
|
f02c93c8c8 | ||
|
|
d10fe84c3a | ||
|
|
e9c818242e | ||
|
|
0bec01bfb4 | ||
|
|
9abe78ce5f | ||
|
|
f809041f85 | ||
|
|
f58710c76f | ||
|
|
267b39bc9d | ||
|
|
11ad932965 | ||
|
|
048cfcce81 | ||
|
|
33adf4106f | ||
|
|
a8ec5d6f16 | ||
|
|
384fb1da7c | ||
|
|
8e44e0f41a | ||
|
|
f851dd0a72 | ||
|
|
7038c02173 | ||
|
|
6747b8dd7c | ||
|
|
cf68aca735 | ||
|
|
265caf0df7 | ||
|
|
477621dd3e | ||
|
|
f77dad0c47 | ||
|
|
4faa6d522d | ||
|
|
ef11a4b7ef | ||
|
|
3bcf11264b | ||
|
|
68af947687 | ||
|
|
002c85e35f | ||
|
|
fed2bf21fe | ||
|
|
3f51308057 | ||
|
|
70d7d1b9ce | ||
|
|
c1082f2e3e | ||
|
|
7038b30381 | ||
|
|
1d73abda51 | ||
|
|
f157648d1e | ||
|
|
d4baaeccfc | ||
|
|
d412b66c6e | ||
|
|
74ae511f92 | ||
|
|
a3fbafe4ae | ||
|
|
8a45fbe9ed | ||
|
|
01c7929ee3 | ||
|
|
2261af17d7 | ||
|
|
41f34c3992 | ||
|
|
36b1cd2dde | ||
|
|
80374b3ec6 | ||
|
|
bc00d1e45f | ||
|
|
6ddb507247 | ||
|
|
b0f3b8f3d0 | ||
|
|
06e7191056 | ||
|
|
997131ba64 | ||
|
|
ef9f412e5f | ||
|
|
7b69d41c60 | ||
|
|
552947f507 | ||
|
|
f69f2df63c | ||
|
|
aa270067f6 | ||
|
|
28977313da | ||
|
|
cfe35d7795 | ||
|
|
4abbe332db | ||
|
|
3104abd4ad | ||
|
|
7714f7b503 | ||
|
|
9d06f10a9b | ||
|
|
8c27f7683b | ||
|
|
bf1a491789 | ||
|
|
701cb540e5 | ||
|
|
0f18a0349a | ||
|
|
205a152350 | ||
|
|
dae1a56691 | ||
|
|
39181f42cf | ||
|
|
3d706ad1a7 | ||
|
|
a31b77e5bc | ||
|
|
b417643415 | ||
|
|
dac2b4ff16 | ||
|
|
2d12b0c747 | ||
|
|
5fe26edaa6 | ||
|
|
a736cfd548 | ||
|
|
5af4214daa | ||
|
|
98ef7b329a | ||
|
|
b0e1962fa7 | ||
|
|
83684e8882 | ||
|
|
1ed7d077a9 | ||
|
|
ba4b36618f | ||
|
|
af647a4bad | ||
|
|
b719530ef0 | ||
|
|
530d61d67e | ||
|
|
3d76bcb48c | ||
|
|
70ce2f1f3c | ||
|
|
21a190a1aa | ||
|
|
a88d222709 | ||
|
|
b2defceae5 | ||
|
|
8d7565ffc4 | ||
|
|
9960b25dff | ||
|
|
411c116deb | ||
|
|
64e007f1fd | ||
|
|
c62fc365db | ||
|
|
e7e630bd5d | ||
|
|
7d77175fbb | ||
|
|
f033553972 | ||
|
|
ae1ed044ba | ||
|
|
35d601c7a7 | ||
|
|
f89aeec374 | ||
|
|
42c3b4b42e | ||
|
|
322fc31396 | ||
|
|
6e4d5cfddd | ||
|
|
d81485a8bf | ||
|
|
a9260d956c | ||
|
|
025bb560bc | ||
|
|
cdd1488e13 | ||
|
|
b8b2644969 | ||
|
|
09b5c0a5d0 | ||
|
|
1ed66f3aa2 | ||
|
|
3b4d5d1c3f | ||
|
|
f98fd5a7ad | ||
|
|
b961109623 | ||
|
|
8f0d1023a4 | ||
|
|
79773ba95c | ||
|
|
ff3f02fb8c | ||
|
|
0af2b20b3a | ||
|
|
b026fe357e | ||
|
|
ade36c013b | ||
|
|
54a6a7f590 | ||
|
|
20728e4a0f | ||
|
|
afa456f6b3 | ||
|
|
3fbfb77430 | ||
|
|
051bcb62c6 | ||
|
|
d2c57eed6d | ||
|
|
f2f38c0e0d | ||
|
|
4046bdbc6a | ||
|
|
c83cc206fd | ||
|
|
41ac14fbd3 | ||
|
|
e4c1cad1a7 | ||
|
|
863c1ac27a | ||
|
|
c85eba617c | ||
|
|
dcb7b7c309 | ||
|
|
3cee186663 | ||
|
|
06afe507f6 | ||
|
|
4268d4d770 | ||
|
|
d61dae5ab4 | ||
|
|
b5f39c1d53 | ||
|
|
767a61b86e | ||
|
|
0d3c0a2233 | ||
|
|
0431103a1d | ||
|
|
633e4e642c | ||
|
|
db7a7f38f7 | ||
|
|
4bff6efe97 | ||
|
|
c514dc7a24 | ||
|
|
24754edb6a | ||
|
|
79fbb76524 | ||
|
|
b85aede966 | ||
|
|
c66ca6e44f | ||
|
|
a192024fef | ||
|
|
918df9098a | ||
|
|
c9271bfa36 | ||
|
|
fa162c818b | ||
|
|
ff976e3ec2 | ||
|
|
17c5651305 | ||
|
|
7c7b049ba1 | ||
|
|
0823fe8b3d | ||
|
|
e787fd0fb5 | ||
|
|
650497bff4 | ||
|
|
2f25bd30b0 | ||
|
|
d58157a450 | ||
|
|
9d049bd041 | ||
|
|
988222b711 | ||
|
|
f42bd3036f | ||
|
|
297239fb5c | ||
|
|
dbd46d44aa | ||
|
|
254f4d6e92 |
4
.github/FUNDING.yml
vendored
Normal file
4
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
patreon: swordfish90
|
||||||
|
custom: ['https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=flscogna%40gmail.com&item_name=Support+CRT¤cy_code=EUR&source=url']
|
||||||
129
.github/workflows/release.yml
vendored
Normal file
129
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
name: Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- master
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-appimage:
|
||||||
|
name: Build (Linux, AppImage)
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Install build deps
|
||||||
|
run: |
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y build-essential rsync wget
|
||||||
|
|
||||||
|
- name: Install Qt
|
||||||
|
uses: jurplel/install-qt-action@v4
|
||||||
|
with:
|
||||||
|
version: 6.10.0
|
||||||
|
dir: ..
|
||||||
|
modules: qt5compat qtshadertools
|
||||||
|
setup-python: false
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- name: Build AppImage
|
||||||
|
run: |
|
||||||
|
./scripts/build-appimage.sh
|
||||||
|
|
||||||
|
- name: Collect artifact
|
||||||
|
run: |
|
||||||
|
mkdir -p release
|
||||||
|
mv ./*.AppImage release/
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: cool-retro-term-appimage
|
||||||
|
path: ./release/*
|
||||||
|
|
||||||
|
build-dmg:
|
||||||
|
name: Build (macOS, DMG)
|
||||||
|
runs-on: macos-14
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Install Qt
|
||||||
|
uses: jurplel/install-qt-action@v4
|
||||||
|
with:
|
||||||
|
version: 6.10.*
|
||||||
|
modules: qt5compat qtshadertools
|
||||||
|
setup-python: true
|
||||||
|
python-version: '3.11'
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- name: Build DMG
|
||||||
|
run: |
|
||||||
|
JOBS="$(sysctl -n hw.ncpu)"
|
||||||
|
./scripts/build-dmg.sh
|
||||||
|
|
||||||
|
- name: Collect artifact
|
||||||
|
run: |
|
||||||
|
mkdir -p release
|
||||||
|
mv ./*.dmg release/
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: cool-retro-term-dmg
|
||||||
|
path: ./release/*
|
||||||
|
|
||||||
|
release:
|
||||||
|
name: Create Release
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
needs:
|
||||||
|
- build-appimage
|
||||||
|
- build-dmg
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Download AppImage
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: cool-retro-term-appimage
|
||||||
|
path: ./release
|
||||||
|
|
||||||
|
- name: Download DMG
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: cool-retro-term-dmg
|
||||||
|
path: ./release
|
||||||
|
|
||||||
|
- name: Update rolling tag
|
||||||
|
if: startsWith(github.ref, 'refs/heads/')
|
||||||
|
run: |
|
||||||
|
git tag -f rolling
|
||||||
|
git push -f origin rolling
|
||||||
|
|
||||||
|
- name: Publish rolling release
|
||||||
|
if: startsWith(github.ref, 'refs/heads/')
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
tag_name: rolling
|
||||||
|
name: Rolling Release
|
||||||
|
prerelease: true
|
||||||
|
files: ./release/*
|
||||||
|
|
||||||
|
- name: Publish tagged release
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
tag_name: ${{ github.ref_name }}
|
||||||
|
files: ./release/*
|
||||||
8
.gitignore
vendored
8
.gitignore
vendored
@@ -18,6 +18,7 @@
|
|||||||
*.pro.user.*
|
*.pro.user.*
|
||||||
*.moc
|
*.moc
|
||||||
moc_*.cpp
|
moc_*.cpp
|
||||||
|
moc_*.h
|
||||||
qrc_*.cpp
|
qrc_*.cpp
|
||||||
ui_*.h
|
ui_*.h
|
||||||
Makefile*
|
Makefile*
|
||||||
@@ -40,10 +41,17 @@ Makefile*
|
|||||||
*.json
|
*.json
|
||||||
|
|
||||||
# Excludes compiled files
|
# Excludes compiled files
|
||||||
|
|
||||||
imports
|
imports
|
||||||
cool-retro-term
|
cool-retro-term
|
||||||
|
build
|
||||||
|
|
||||||
|
# Linux
|
||||||
|
|
||||||
|
*.AppImage
|
||||||
|
|
||||||
# Mac OSX
|
# Mac OSX
|
||||||
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
*.app
|
*.app
|
||||||
|
*.dmg
|
||||||
|
|||||||
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -2,3 +2,6 @@
|
|||||||
path = qmltermwidget
|
path = qmltermwidget
|
||||||
url = https://github.com/Swordfish90/qmltermwidget
|
url = https://github.com/Swordfish90/qmltermwidget
|
||||||
branch = unstable
|
branch = unstable
|
||||||
|
[submodule "KDSingleApplication"]
|
||||||
|
path = KDSingleApplication
|
||||||
|
url = https://github.com/KDAB/KDSingleApplication.git
|
||||||
|
|||||||
1
KDSingleApplication
Submodule
1
KDSingleApplication
Submodule
Submodule KDSingleApplication added at 1848dd64e8
173
README.md
173
README.md
@@ -8,172 +8,23 @@
|
|||||||
cool-retro-term is a terminal emulator which mimics the look and feel of the old cathode tube screens.
|
cool-retro-term is a terminal emulator which mimics the look and feel of the old cathode tube screens.
|
||||||
It has been designed to be eye-candy, customizable, and reasonably lightweight.
|
It has been designed to be eye-candy, customizable, and reasonably lightweight.
|
||||||
|
|
||||||
It uses the QML port of qtermwidget (Konsole) developed by me: https://github.com/Swordfish90/qmltermwidget .
|
It uses the QML port of qtermwidget (Konsole): https://github.com/Swordfish90/qmltermwidget.
|
||||||
|
|
||||||
This terminal emulator works under Linux and macOS and requires Qt 5.2 or higher.
|
This terminal emulator works under Linux and macOS and requires Qt6.
|
||||||
|
|
||||||
|
Settings such as colors, fonts, and effects can be accessed via context menu.
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
## Get cool-retro-term
|
## Install
|
||||||
You can either build cool-retro-term yourself (see below) or walk the easy way and install one of these packages:
|
|
||||||
|
|
||||||
Fedora has the `cool-retro-term` in the offcial repositories. All you have to do is `sudo dnf install cool-retro-term`.
|
If you want to get a hold of the latest version, just go to the Releases page and grab the latest AppImage (Linux) or dmg (macOS).
|
||||||
|
|
||||||
Users of openSUSE can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term).
|
Alternatively, most distributions such as Ubuntu, Fedora or Arch already package cool-retro-term in their official repositories.
|
||||||
|
|
||||||
Arch users can install this [package](https://aur.archlinux.org/packages/cool-retro-term-git/) directly via the [AUR](https://aur.archlinux.org):
|
## Building
|
||||||
|
|
||||||
yaourt -S aur/cool-retro-term-git
|
Check out the wiki and follow the instructions on how to build it on [Linux](https://github.com/Swordfish90/cool-retro-term/wiki/Build-Instructions-(Linux)) and [macOS](https://github.com/Swordfish90/cool-retro-term/wiki/Build-Instructions-(macOS)).
|
||||||
|
|
||||||
or use:
|
|
||||||
|
|
||||||
pacman -S cool-retro-term
|
|
||||||
|
|
||||||
to install precompiled from community repository.
|
|
||||||
|
|
||||||
Gentoo users can now install the second release "1.0.1" from a 3rd-party repository preferably via layman:
|
|
||||||
|
|
||||||
USE="git" emerge app-portage/layman
|
|
||||||
wget https://www.gerczei.eu/files/gerczei.xml -O /etc/layman/overlays/gerczei.xml
|
|
||||||
layman -f -a qt -a gerczei # those who've added the repo before 27/08/17 should remove, update and add it again as its source has changed
|
|
||||||
ACCEPT_KEYWORDS="~*" emerge =x11-terms/cool-retro-term-1.0.1::gerczei
|
|
||||||
|
|
||||||
The live ebuild (version 9999-r1) tracking the bleeding-edge WIP codebase also remains available.
|
|
||||||
|
|
||||||
A word of warning: USE flags and keywords are to be added to portage's configuration files and every emerge operation should be executed with '-p' (short option for --pretend) appended to the command line first as per best practice!
|
|
||||||
|
|
||||||
Ubuntu users of 14.04 LTS (Trusty) up to 15.10 (Wily) can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb).
|
|
||||||
|
|
||||||
Ubuntu 17.10 can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term)
|
|
||||||
|
|
||||||
macOS users can grab the latest dmg from the release page: https://github.com/Swordfish90/cool-retro-term/releases
|
|
||||||
|
|
||||||
## Build instructions (Linux)
|
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
Make sure to install these first.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Ubuntu 14.04**
|
|
||||||
|
|
||||||
sudo apt-get install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qtdeclarative5-controls-plugin qtdeclarative5-qtquick2-plugin libqt5qml-graphicaleffects qtdeclarative5-dialogs-plugin qtdeclarative5-localstorage-plugin qtdeclarative5-window-plugin
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Ubuntu 16.10**
|
|
||||||
|
|
||||||
sudo apt-get install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qml-module-qtquick-controls qtdeclarative5-qtquick2-plugin libqt5qml-graphicaleffects qml-module-qtquick-dialogs qtdeclarative5-localstorage-plugin qtdeclarative5-window-plugin
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Ubuntu 17.04**
|
|
||||||
|
|
||||||
sudo apt install build-essential libqt5qml-graphicaleffects qml-module-qt-labs-folderlistmodel qml-module-qt-labs-settings qml-module-qtquick-controls qml-module-qtquick-dialogs qmlscene qt5-default qt5-qmake qtdeclarative5-dev qtdeclarative5-localstorage-plugin qtdeclarative5-qtquick2-plugin qtdeclarative5-window-plugin
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Ubuntu 17.10**
|
|
||||||
|
|
||||||
sudo apt-get install build-essential qml-module-qtgraphicaleffects qml-module-qt-labs-folderlistmodel qml-module-qt-labs-settings qml-module-qtquick-controls qml-module-qtquick-dialogs qmlscene qt5-default qt5-qmake qtdeclarative5-dev qtdeclarative5-localstorage-plugin qtdeclarative5-qtquick2-plugin qtdeclarative5-window-plugin
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Debian Jessie and above**
|
|
||||||
|
|
||||||
sudo apt install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtgraphicaleffects qml-module-qtquick-dialogs qml-module-qtquick-localstorage qml-module-qtquick-window2 qml-module-qt-labs-settings qml-module-qt-labs-folderlistmodel
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Fedora**
|
|
||||||
This command should install the known fedora dependencies:
|
|
||||||
|
|
||||||
sudo yum -y install qt5-qtbase qt5-qtbase-devel qt5-qtdeclarative qt5-qtdeclarative-devel qt5-qtgraphicaleffects qt5-qtquickcontrols redhat-rpm-config
|
|
||||||
|
|
||||||
or:
|
|
||||||
|
|
||||||
sudo dnf -y install qt5-qtbase qt5-qtbase-devel qt5-qtdeclarative qt5-qtdeclarative-devel qt5-qtgraphicaleffects qt5-qtquickcontrols redhat-rpm-config
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Arch Linux**
|
|
||||||
|
|
||||||
sudo pacman -S qt5-base qt5-declarative qt5-quickcontrols qt5-graphicaleffects
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**openSUSE**
|
|
||||||
|
|
||||||
Add repository with latest Qt 5 (this is only needed on openSUSE 13.1, Factory already has it):
|
|
||||||
|
|
||||||
sudo zypper ar http://download.opensuse.org/repositories/KDE:/Qt5/openSUSE_13.1/ KDE:Qt5
|
|
||||||
|
|
||||||
Install dependencies:
|
|
||||||
|
|
||||||
sudo zypper install libqt5-qtbase-devel libqt5-qtdeclarative-devel libqt5-qtquickcontrols libqt5-qtgraphicaleffects
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Anyone else**
|
|
||||||
|
|
||||||
Install Qt directly from here http://qt-project.org/downloads . Once done export them in you path (replace "_/opt/Qt5.3.1/5.3/gcc_64/bin_" with your correct folder):
|
|
||||||
|
|
||||||
export PATH=/opt/Qt5.3.1/5.3/gcc_64/bin/:$PATH
|
|
||||||
---
|
|
||||||
|
|
||||||
### Compile
|
|
||||||
Once you installed all dependencies (Qt is installed and in your path) you need to compile and run the application:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Get it from GitHub
|
|
||||||
git clone --recursive https://github.com/Swordfish90/cool-retro-term.git
|
|
||||||
|
|
||||||
# Build it
|
|
||||||
cd cool-retro-term
|
|
||||||
|
|
||||||
# Compile (Fedora and OpenSUSE user should use qmake-qt5 instead of qmake)
|
|
||||||
qmake && make
|
|
||||||
|
|
||||||
# Have fun!
|
|
||||||
./cool-retro-term
|
|
||||||
```
|
|
||||||
|
|
||||||
## Build instructions (macOS)
|
|
||||||
|
|
||||||
1. Install [Xcode](https://developer.apple.com/xcode/) and agree to the licence agreement
|
|
||||||
2. Enter the following commands into the terminal:
|
|
||||||
|
|
||||||
**Brew**
|
|
||||||
|
|
||||||
```sh
|
|
||||||
brew install qt5
|
|
||||||
git clone --recursive https://github.com/Swordfish90/cool-retro-term.git
|
|
||||||
export CPPFLAGS="-I/usr/local/opt/qt5/include"
|
|
||||||
export LDFLAGS="-L/usr/local/opt/qt5/lib"
|
|
||||||
export PATH=/usr/local/opt/qt5/bin:$PATH
|
|
||||||
cd cool-retro-term
|
|
||||||
qmake && make
|
|
||||||
mkdir cool-retro-term.app/Contents/PlugIns
|
|
||||||
cp -r qmltermwidget/QMLTermWidget cool-retro-term.app/Contents/PlugIns
|
|
||||||
open cool-retro-term.app
|
|
||||||
```
|
|
||||||
|
|
||||||
**MacPorts**
|
|
||||||
|
|
||||||
```sh
|
|
||||||
sudo port install qt5
|
|
||||||
git clone --recursive https://github.com/Swordfish90/cool-retro-term.git
|
|
||||||
cd cool-retro-term
|
|
||||||
/opt/local/libexec/qt5/bin/qmake && make
|
|
||||||
mkdir cool-retro-term.app/Contents/PlugIns
|
|
||||||
cp -r qmltermwidget/QMLTermWidget cool-retro-term.app/Contents/PlugIns
|
|
||||||
open cool-retro-term.app
|
|
||||||
```
|
|
||||||
|
|
||||||
## Donations
|
|
||||||
I made this project in my spare time because I love what I'm doing. If you are enjoying it and you want to buy me a beer click [here](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=flscogna%40gmail%2ecom&lc=IT&item_name=Filippo%20Scognamiglio¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted).
|
|
||||||
|
|
||||||
You can also add "bounties" on your favourite issues. More information on the [Bountysource](https://www.bountysource.com/teams/crt/issues) page.
|
|
||||||
|
|||||||
89
app/app.pro
89
app/app.pro
@@ -1,20 +1,99 @@
|
|||||||
QT += qml quick widgets sql
|
QT += qml quick widgets sql quickcontrols2
|
||||||
TARGET = cool-retro-term
|
TARGET = cool-retro-term
|
||||||
|
APP_VERSION = $$system(git -C $$PWD/.. describe --tags --always --dirty=-dirty)
|
||||||
|
isEmpty(APP_VERSION): APP_VERSION = "unknown"
|
||||||
|
DEFINES += APP_VERSION=\\\"$$APP_VERSION\\\"
|
||||||
|
|
||||||
|
# TODO: When migrating to CMake, use KDSingleApplication's CMakeLists.txt instead of these manual sources.
|
||||||
|
INCLUDEPATH += $$PWD/../KDSingleApplication/src
|
||||||
|
HEADERS += \
|
||||||
|
$$PWD/../KDSingleApplication/src/kdsingleapplication.h \
|
||||||
|
$$PWD/../KDSingleApplication/src/kdsingleapplication_lib.h \
|
||||||
|
$$PWD/../KDSingleApplication/src/kdsingleapplication_localsocket_p.h
|
||||||
|
SOURCES += \
|
||||||
|
$$PWD/../KDSingleApplication/src/kdsingleapplication.cpp \
|
||||||
|
$$PWD/../KDSingleApplication/src/kdsingleapplication_localsocket.cpp
|
||||||
|
DEFINES += KDSINGLEAPPLICATION_STATIC_BUILD
|
||||||
|
|
||||||
DESTDIR = $$OUT_PWD/../
|
DESTDIR = $$OUT_PWD/../
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
fileio.h \
|
fileio.h \
|
||||||
monospacefontmanager.h
|
fontmanager.h \
|
||||||
|
fontlistmodel.h
|
||||||
|
|
||||||
SOURCES = main.cpp \
|
SOURCES += main.cpp \
|
||||||
fileio.cpp \
|
fileio.cpp \
|
||||||
monospacefontmanager.cpp
|
fontmanager.cpp \
|
||||||
|
fontlistmodel.cpp
|
||||||
|
|
||||||
macx:ICON = icons/crt.icns
|
macx:ICON = icons/crt.icns
|
||||||
|
|
||||||
RESOURCES += qml/resources.qrc
|
RESOURCES += qml/resources.qrc
|
||||||
|
|
||||||
|
# Shader compilation (Qt Shader Baker)
|
||||||
|
QSB_BIN = $$[QT_HOST_BINS]/qsb
|
||||||
|
isEmpty(QSB_BIN): QSB_BIN = $$[QT_INSTALL_BINS]/qsb
|
||||||
|
|
||||||
|
SHADERS_DIR = $${_PRO_FILE_PWD_}/shaders
|
||||||
|
SHADERS += $$files($$SHADERS_DIR/*.frag) $$files($$SHADERS_DIR/*.vert)
|
||||||
|
SHADERS -= $$SHADERS_DIR/terminal_dynamic.frag
|
||||||
|
SHADERS -= $$SHADERS_DIR/terminal_static.frag
|
||||||
|
SHADERS -= $$SHADERS_DIR/passthrough.vert
|
||||||
|
|
||||||
|
qsb.input = SHADERS
|
||||||
|
qsb.output = ../../app/shaders/${QMAKE_FILE_NAME}.qsb
|
||||||
|
qsb.commands = $$QSB_BIN --glsl \"100 es,120,150\" --hlsl 50 --msl 12 --qt6 -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
|
||||||
|
qsb.clean = $$qsb.output
|
||||||
|
qsb.name = qsb ${QMAKE_FILE_IN}
|
||||||
|
qsb.variable_out = QSB_FILES
|
||||||
|
QMAKE_EXTRA_COMPILERS += qsb
|
||||||
|
PRE_TARGETDEPS += $$QSB_FILES
|
||||||
|
OTHER_FILES += $$SHADERS $$QSB_FILES
|
||||||
|
|
||||||
|
DYNAMIC_SHADER = $$SHADERS_DIR/terminal_dynamic.frag
|
||||||
|
STATIC_SHADER = $$SHADERS_DIR/terminal_static.frag
|
||||||
|
|
||||||
|
RASTER_MODES = 0 1 2 3 4
|
||||||
|
BINARY_FLAGS = 0 1
|
||||||
|
VARIANT_SHADER_DIR = $$relative_path($$PWD/shaders, $$OUT_PWD)
|
||||||
|
VARIANT_OUTPUTS =
|
||||||
|
|
||||||
|
for(raster_mode, RASTER_MODES) {
|
||||||
|
for(burn_in, BINARY_FLAGS) {
|
||||||
|
for(display_frame, BINARY_FLAGS) {
|
||||||
|
for(chroma_on, BINARY_FLAGS) {
|
||||||
|
dynamic_variant = terminal_dynamic_raster$${raster_mode}_burn$${burn_in}_frame$${display_frame}_chroma$${chroma_on}
|
||||||
|
dynamic_output = $${VARIANT_SHADER_DIR}/$${dynamic_variant}.frag.qsb
|
||||||
|
dynamic_target = shader_variant_$${dynamic_variant}
|
||||||
|
$${dynamic_target}.target = $${dynamic_output}
|
||||||
|
$${dynamic_target}.depends = $$DYNAMIC_SHADER
|
||||||
|
$${dynamic_target}.commands = $$QSB_BIN --glsl \"100 es,120,150\" --hlsl 50 --msl 12 --qt6 -DCRT_RASTER_MODE=$${raster_mode} -DCRT_BURN_IN=$${burn_in} -DCRT_DISPLAY_FRAME=$${display_frame} -DCRT_CHROMA=$${chroma_on} -o $${dynamic_output} $$DYNAMIC_SHADER
|
||||||
|
QMAKE_EXTRA_TARGETS += $${dynamic_target}
|
||||||
|
VARIANT_OUTPUTS += $${dynamic_output}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(rgb_shift, BINARY_FLAGS) {
|
||||||
|
for(bloom_on, BINARY_FLAGS) {
|
||||||
|
for(curve_on, BINARY_FLAGS) {
|
||||||
|
for(shine_on, BINARY_FLAGS) {
|
||||||
|
static_variant = terminal_static_rgb$${rgb_shift}_bloom$${bloom_on}_curve$${curve_on}_shine$${shine_on}
|
||||||
|
static_output = $${VARIANT_SHADER_DIR}/$${static_variant}.frag.qsb
|
||||||
|
static_target = shader_variant_$${static_variant}
|
||||||
|
$${static_target}.target = $${static_output}
|
||||||
|
$${static_target}.depends = $$STATIC_SHADER
|
||||||
|
$${static_target}.commands = $$QSB_BIN --glsl \"100 es,120,150\" --hlsl 50 --msl 12 --qt6 -DCRT_RGB_SHIFT=$${rgb_shift} -DCRT_BLOOM=$${bloom_on} -DCRT_CURVATURE=$${curve_on} -DCRT_FRAME_SHININESS=$${shine_on} -o $${static_output} $$STATIC_SHADER
|
||||||
|
QMAKE_EXTRA_TARGETS += $${static_target}
|
||||||
|
VARIANT_OUTPUTS += $${static_output}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PRE_TARGETDEPS += $${VARIANT_OUTPUTS}
|
||||||
|
|
||||||
#########################################
|
#########################################
|
||||||
## INTALLS
|
## INTALLS
|
||||||
#########################################
|
#########################################
|
||||||
|
|||||||
94
app/fontlistmodel.cpp
Normal file
94
app/fontlistmodel.cpp
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
#include "fontlistmodel.h"
|
||||||
|
|
||||||
|
FontListModel::FontListModel(QObject *parent)
|
||||||
|
: QAbstractListModel(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int FontListModel::rowCount(const QModelIndex &parent) const
|
||||||
|
{
|
||||||
|
if (parent.isValid()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return m_fonts.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant FontListModel::data(const QModelIndex &index, int role) const
|
||||||
|
{
|
||||||
|
if (!index.isValid() || index.row() < 0 || index.row() >= m_fonts.size()) {
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
const FontEntry &font = m_fonts.at(index.row());
|
||||||
|
|
||||||
|
switch (role) {
|
||||||
|
case NameRole:
|
||||||
|
return font.name;
|
||||||
|
case TextRole:
|
||||||
|
return font.text;
|
||||||
|
case SourceRole:
|
||||||
|
return font.source;
|
||||||
|
case BaseWidthRole:
|
||||||
|
return font.baseWidth;
|
||||||
|
case PixelSizeRole:
|
||||||
|
return font.pixelSize;
|
||||||
|
case LowResolutionRole:
|
||||||
|
return font.lowResolutionFont;
|
||||||
|
case IsSystemRole:
|
||||||
|
return font.isSystemFont;
|
||||||
|
case FamilyRole:
|
||||||
|
return font.family;
|
||||||
|
case FallbackNameRole:
|
||||||
|
return font.fallbackName;
|
||||||
|
default:
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QHash<int, QByteArray> FontListModel::roleNames() const
|
||||||
|
{
|
||||||
|
QHash<int, QByteArray> roles;
|
||||||
|
roles[NameRole] = "name";
|
||||||
|
roles[TextRole] = "text";
|
||||||
|
roles[SourceRole] = "source";
|
||||||
|
roles[BaseWidthRole] = "baseWidth";
|
||||||
|
roles[PixelSizeRole] = "pixelSize";
|
||||||
|
roles[LowResolutionRole] = "lowResolutionFont";
|
||||||
|
roles[IsSystemRole] = "isSystemFont";
|
||||||
|
roles[FamilyRole] = "family";
|
||||||
|
roles[FallbackNameRole] = "fallbackName";
|
||||||
|
return roles;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontListModel::setFonts(const QVector<FontEntry> &fonts)
|
||||||
|
{
|
||||||
|
beginResetModel();
|
||||||
|
m_fonts = fonts;
|
||||||
|
endResetModel();
|
||||||
|
emit countChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
const QVector<FontEntry> &FontListModel::fonts() const
|
||||||
|
{
|
||||||
|
return m_fonts;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantMap FontListModel::get(int index) const
|
||||||
|
{
|
||||||
|
QVariantMap map;
|
||||||
|
if (index < 0 || index >= m_fonts.size()) {
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FontEntry &font = m_fonts.at(index);
|
||||||
|
map.insert("name", font.name);
|
||||||
|
map.insert("text", font.text);
|
||||||
|
map.insert("source", font.source);
|
||||||
|
map.insert("baseWidth", font.baseWidth);
|
||||||
|
map.insert("pixelSize", font.pixelSize);
|
||||||
|
map.insert("lowResolutionFont", font.lowResolutionFont);
|
||||||
|
map.insert("isSystemFont", font.isSystemFont);
|
||||||
|
map.insert("family", font.family);
|
||||||
|
map.insert("fallbackName", font.fallbackName);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
59
app/fontlistmodel.h
Normal file
59
app/fontlistmodel.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
#ifndef FONTLISTMODEL_H
|
||||||
|
#define FONTLISTMODEL_H
|
||||||
|
|
||||||
|
#include <QAbstractListModel>
|
||||||
|
#include <QVector>
|
||||||
|
#include <QVariant>
|
||||||
|
#include <QVariantMap>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
struct FontEntry
|
||||||
|
{
|
||||||
|
QString name;
|
||||||
|
QString text;
|
||||||
|
QString source;
|
||||||
|
qreal baseWidth = 1.0;
|
||||||
|
int pixelSize = 0;
|
||||||
|
bool lowResolutionFont = false;
|
||||||
|
bool isSystemFont = false;
|
||||||
|
QString family;
|
||||||
|
QString fallbackName;
|
||||||
|
};
|
||||||
|
|
||||||
|
class FontListModel : public QAbstractListModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit FontListModel(QObject *parent = nullptr);
|
||||||
|
|
||||||
|
enum Roles {
|
||||||
|
NameRole = Qt::UserRole + 1,
|
||||||
|
TextRole,
|
||||||
|
SourceRole,
|
||||||
|
BaseWidthRole,
|
||||||
|
PixelSizeRole,
|
||||||
|
LowResolutionRole,
|
||||||
|
IsSystemRole,
|
||||||
|
FamilyRole,
|
||||||
|
FallbackNameRole
|
||||||
|
};
|
||||||
|
|
||||||
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||||
|
QVariant data(const QModelIndex &index, int role) const override;
|
||||||
|
QHash<int, QByteArray> roleNames() const override;
|
||||||
|
|
||||||
|
void setFonts(const QVector<FontEntry> &fonts);
|
||||||
|
const QVector<FontEntry> &fonts() const;
|
||||||
|
|
||||||
|
Q_INVOKABLE QVariantMap get(int index) const;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void countChanged();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QVector<FontEntry> m_fonts;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // FONTLISTMODEL_H
|
||||||
584
app/fontmanager.cpp
Normal file
584
app/fontmanager.cpp
Normal file
@@ -0,0 +1,584 @@
|
|||||||
|
#include "fontmanager.h"
|
||||||
|
|
||||||
|
#include <QFont>
|
||||||
|
#include <QFontDatabase>
|
||||||
|
#include <QFontMetricsF>
|
||||||
|
#include <QtGlobal>
|
||||||
|
#include <QtMath>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
constexpr int kModernRasterization = 4;
|
||||||
|
constexpr int kBaseFontPixelHeight = 32;
|
||||||
|
constexpr int kSystemFontPixelSize = 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
FontManager::FontManager(QObject *parent)
|
||||||
|
: QObject(parent)
|
||||||
|
, m_fontListModel(this)
|
||||||
|
, m_filteredFontListModel(this)
|
||||||
|
{
|
||||||
|
populateBundledFonts();
|
||||||
|
populateSystemFonts();
|
||||||
|
m_fontListModel.setFonts(m_allFonts);
|
||||||
|
updateFilteredFonts();
|
||||||
|
updateComputedFont();
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList FontManager::retrieveMonospaceFonts()
|
||||||
|
{
|
||||||
|
QStringList result;
|
||||||
|
|
||||||
|
QFontDatabase fontDatabase;
|
||||||
|
const QStringList fontFamilies = fontDatabase.families();
|
||||||
|
|
||||||
|
for (const QString &fontFamily : fontFamilies) {
|
||||||
|
QFont font(fontFamily);
|
||||||
|
if (fontDatabase.isFixedPitch(font.family())) {
|
||||||
|
result.append(fontFamily);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::refresh()
|
||||||
|
{
|
||||||
|
updateFilteredFonts();
|
||||||
|
updateComputedFont();
|
||||||
|
}
|
||||||
|
|
||||||
|
FontListModel *FontManager::fontList()
|
||||||
|
{
|
||||||
|
return &m_fontListModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
FontListModel *FontManager::filteredFontList()
|
||||||
|
{
|
||||||
|
return &m_filteredFontListModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FontManager::fontSource() const
|
||||||
|
{
|
||||||
|
return m_fontSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::setFontSource(int fontSource)
|
||||||
|
{
|
||||||
|
if (m_fontSource == fontSource) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_fontSource = fontSource;
|
||||||
|
emit fontSourceChanged();
|
||||||
|
updateFilteredFonts();
|
||||||
|
updateComputedFont();
|
||||||
|
}
|
||||||
|
|
||||||
|
int FontManager::rasterization() const
|
||||||
|
{
|
||||||
|
return m_rasterization;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::setRasterization(int rasterization)
|
||||||
|
{
|
||||||
|
if (m_rasterization == rasterization) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_rasterization = rasterization;
|
||||||
|
emit rasterizationChanged();
|
||||||
|
updateFilteredFonts();
|
||||||
|
updateComputedFont();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FontManager::fontName() const
|
||||||
|
{
|
||||||
|
return m_fontName;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::setFontName(const QString &fontName)
|
||||||
|
{
|
||||||
|
if (m_fontName == fontName) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_fontName = fontName;
|
||||||
|
emit fontNameChanged();
|
||||||
|
updateFilteredFonts();
|
||||||
|
updateComputedFont();
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal FontManager::fontScaling() const
|
||||||
|
{
|
||||||
|
return m_fontScaling;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::setFontScaling(qreal fontScaling)
|
||||||
|
{
|
||||||
|
if (qFuzzyCompare(m_fontScaling, fontScaling)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_fontScaling = fontScaling;
|
||||||
|
emit fontScalingChanged();
|
||||||
|
updateComputedFont();
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal FontManager::fontWidth() const
|
||||||
|
{
|
||||||
|
return m_fontWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::setFontWidth(qreal fontWidth)
|
||||||
|
{
|
||||||
|
if (qFuzzyCompare(m_fontWidth, fontWidth)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_fontWidth = fontWidth;
|
||||||
|
emit fontWidthChanged();
|
||||||
|
updateComputedFont();
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal FontManager::lineSpacing() const
|
||||||
|
{
|
||||||
|
return m_lineSpacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::setLineSpacing(qreal lineSpacing)
|
||||||
|
{
|
||||||
|
if (qFuzzyCompare(m_lineSpacing, lineSpacing)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_lineSpacing = lineSpacing;
|
||||||
|
emit lineSpacingChanged();
|
||||||
|
updateComputedFont();
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal FontManager::baseFontScaling() const
|
||||||
|
{
|
||||||
|
return m_baseFontScaling;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::setBaseFontScaling(qreal baseFontScaling)
|
||||||
|
{
|
||||||
|
if (qFuzzyCompare(m_baseFontScaling, baseFontScaling)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_baseFontScaling = baseFontScaling;
|
||||||
|
emit baseFontScalingChanged();
|
||||||
|
updateComputedFont();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FontManager::lowResolutionFont() const
|
||||||
|
{
|
||||||
|
return m_lowResolutionFont;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::setFontSubstitutions(const QString &family, const QStringList &substitutes)
|
||||||
|
{
|
||||||
|
if (family.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QFont::removeSubstitutions(family);
|
||||||
|
|
||||||
|
if (substitutes.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QFont::insertSubstitutions(family, substitutes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::removeFontSubstitution(const QString &family)
|
||||||
|
{
|
||||||
|
if (family.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QFont::removeSubstitutions(family);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::populateBundledFonts()
|
||||||
|
{
|
||||||
|
m_allFonts.clear();
|
||||||
|
|
||||||
|
addBundledFont(
|
||||||
|
"TERMINESS_SCALED",
|
||||||
|
"Terminess",
|
||||||
|
":/fonts/terminus/TerminessNerdFontMono-Regular.ttf",
|
||||||
|
1.0,
|
||||||
|
12,
|
||||||
|
true);
|
||||||
|
addBundledFont(
|
||||||
|
"BIGBLUE_TERMINAL_SCALED",
|
||||||
|
"BigBlue Terminal",
|
||||||
|
":/fonts/bigblue-terminal/BigBlueTerm437NerdFontMono-Regular.ttf",
|
||||||
|
1.0,
|
||||||
|
12,
|
||||||
|
true);
|
||||||
|
addBundledFont(
|
||||||
|
"EXCELSIOR_SCALED",
|
||||||
|
"Fixedsys Excelsior",
|
||||||
|
":/fonts/fixedsys-excelsior/FSEX301-L2.ttf",
|
||||||
|
1.0,
|
||||||
|
16,
|
||||||
|
true,
|
||||||
|
"UNSCII_16_SCALED");
|
||||||
|
addBundledFont(
|
||||||
|
"GREYBEARD_SCALED",
|
||||||
|
"Greybeard",
|
||||||
|
":/fonts/greybeard/Greybeard-16px.ttf",
|
||||||
|
1.0,
|
||||||
|
16,
|
||||||
|
true,
|
||||||
|
"UNSCII_16_SCALED");
|
||||||
|
addBundledFont(
|
||||||
|
"COMMODORE_PET_SCALED",
|
||||||
|
"Commodore PET",
|
||||||
|
":/fonts/pet-me/PetMe.ttf",
|
||||||
|
0.5,
|
||||||
|
8,
|
||||||
|
true,
|
||||||
|
"UNSCII_8_SCALED");
|
||||||
|
addBundledFont(
|
||||||
|
"GOHU_11_SCALED",
|
||||||
|
"Gohu 11",
|
||||||
|
":/fonts/gohu/GohuFont11NerdFontMono-Regular.ttf",
|
||||||
|
1.0,
|
||||||
|
11,
|
||||||
|
true);
|
||||||
|
addBundledFont(
|
||||||
|
"COZETTE_SCALED",
|
||||||
|
"Cozette",
|
||||||
|
":/fonts/cozette/CozetteVector.ttf",
|
||||||
|
1.0,
|
||||||
|
13,
|
||||||
|
true);
|
||||||
|
addBundledFont(
|
||||||
|
"UNSCII_8_SCALED",
|
||||||
|
"Unscii 8",
|
||||||
|
":/fonts/unscii/unscii-8.ttf",
|
||||||
|
0.5,
|
||||||
|
8,
|
||||||
|
true,
|
||||||
|
"UNSCII_8_SCALED");
|
||||||
|
addBundledFont(
|
||||||
|
"UNSCII_8_THIN_SCALED",
|
||||||
|
"Unscii 8 Thin",
|
||||||
|
":/fonts/unscii/unscii-8-thin.ttf",
|
||||||
|
0.5,
|
||||||
|
8,
|
||||||
|
true,
|
||||||
|
"UNSCII_8_SCALED");
|
||||||
|
addBundledFont(
|
||||||
|
"UNSCII_16_SCALED",
|
||||||
|
"Unscii 16",
|
||||||
|
":/fonts/unscii/unscii-16-full.ttf",
|
||||||
|
1.0,
|
||||||
|
16,
|
||||||
|
true,
|
||||||
|
"UNSCII_16_SCALED");
|
||||||
|
addBundledFont(
|
||||||
|
"APPLE_II_SCALED",
|
||||||
|
"Apple ][",
|
||||||
|
":/fonts/apple2/PrintChar21.ttf",
|
||||||
|
0.5,
|
||||||
|
8,
|
||||||
|
true,
|
||||||
|
"UNSCII_8_SCALED");
|
||||||
|
addBundledFont(
|
||||||
|
"ATARI_400_SCALED",
|
||||||
|
"Atari 400-800",
|
||||||
|
":/fonts/atari-400-800/AtariClassic-Regular.ttf",
|
||||||
|
0.5,
|
||||||
|
8,
|
||||||
|
true,
|
||||||
|
"UNSCII_8_SCALED");
|
||||||
|
addBundledFont(
|
||||||
|
"COMMODORE_64_SCALED",
|
||||||
|
"Commodore 64",
|
||||||
|
":/fonts/pet-me/PetMe64.ttf",
|
||||||
|
0.5,
|
||||||
|
8,
|
||||||
|
true,
|
||||||
|
"UNSCII_8_SCALED");
|
||||||
|
addBundledFont(
|
||||||
|
"IBM_EGA_8x8",
|
||||||
|
"IBM EGA 8x8",
|
||||||
|
":/fonts/oldschool-pc-fonts/PxPlus_IBM_EGA_8x8.ttf",
|
||||||
|
0.5,
|
||||||
|
8,
|
||||||
|
true,
|
||||||
|
"UNSCII_8_SCALED");
|
||||||
|
addBundledFont(
|
||||||
|
"IBM_VGA_8x16",
|
||||||
|
"IBM VGA 8x16",
|
||||||
|
":/fonts/oldschool-pc-fonts/PxPlus_IBM_VGA_8x16.ttf",
|
||||||
|
1.0,
|
||||||
|
16,
|
||||||
|
true,
|
||||||
|
"UNSCII_16_SCALED");
|
||||||
|
|
||||||
|
addBundledFont(
|
||||||
|
"TERMINESS",
|
||||||
|
"Terminess",
|
||||||
|
":/fonts/terminus/TerminessNerdFontMono-Regular.ttf",
|
||||||
|
1.0,
|
||||||
|
32,
|
||||||
|
false);
|
||||||
|
addBundledFont(
|
||||||
|
"HACK",
|
||||||
|
"Hack",
|
||||||
|
":/fonts/hack/HackNerdFontMono-Regular.ttf",
|
||||||
|
1.0,
|
||||||
|
32,
|
||||||
|
false);
|
||||||
|
addBundledFont(
|
||||||
|
"FIRA_CODE",
|
||||||
|
"Fira Code",
|
||||||
|
":/fonts/fira-code/FiraCodeNerdFontMono-Regular.ttf",
|
||||||
|
1.0,
|
||||||
|
32,
|
||||||
|
false);
|
||||||
|
addBundledFont(
|
||||||
|
"IOSEVKA",
|
||||||
|
"Iosevka",
|
||||||
|
":/fonts/iosevka/IosevkaTermNerdFontMono-Regular.ttf",
|
||||||
|
1.0,
|
||||||
|
32,
|
||||||
|
false);
|
||||||
|
addBundledFont(
|
||||||
|
"JETBRAINS_MONO",
|
||||||
|
"JetBrains Mono",
|
||||||
|
":/fonts/jetbrains-mono/JetBrainsMonoNerdFontMono-Regular.ttf",
|
||||||
|
1.0,
|
||||||
|
32,
|
||||||
|
false);
|
||||||
|
addBundledFont(
|
||||||
|
"IBM_3278",
|
||||||
|
"IBM 3278",
|
||||||
|
":/fonts/ibm-3278/3270NerdFontMono-Regular.ttf",
|
||||||
|
1.0,
|
||||||
|
32,
|
||||||
|
false);
|
||||||
|
addBundledFont(
|
||||||
|
"SOURCE_CODE_PRO",
|
||||||
|
"Source Code Pro",
|
||||||
|
":/fonts/source-code-pro/SauceCodeProNerdFontMono-Regular.ttf",
|
||||||
|
1.0,
|
||||||
|
32,
|
||||||
|
false);
|
||||||
|
addBundledFont(
|
||||||
|
"DEPARTURE_MONO_SCALED",
|
||||||
|
"Departure Mono",
|
||||||
|
":/fonts/departure-mono/DepartureMonoNerdFontMono-Regular.otf",
|
||||||
|
1.0,
|
||||||
|
11,
|
||||||
|
true);
|
||||||
|
addBundledFont(
|
||||||
|
"OPENDYSLEXIC",
|
||||||
|
"OpenDyslexic",
|
||||||
|
":/fonts/opendyslexic/OpenDyslexicMNerdFontMono-Regular.otf",
|
||||||
|
1.0,
|
||||||
|
32,
|
||||||
|
false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::addBundledFont(const QString &name,
|
||||||
|
const QString &text,
|
||||||
|
const QString &source,
|
||||||
|
qreal baseWidth,
|
||||||
|
int pixelSize,
|
||||||
|
bool lowResolutionFont,
|
||||||
|
const QString &fallbackName)
|
||||||
|
{
|
||||||
|
FontEntry entry;
|
||||||
|
entry.name = name;
|
||||||
|
entry.text = text;
|
||||||
|
entry.source = source;
|
||||||
|
entry.pixelSize = pixelSize;
|
||||||
|
entry.lowResolutionFont = lowResolutionFont;
|
||||||
|
entry.isSystemFont = false;
|
||||||
|
entry.fallbackName = fallbackName;
|
||||||
|
entry.family = resolveFontFamily(source);
|
||||||
|
entry.baseWidth = lowResolutionFont
|
||||||
|
? computeBaseWidth(entry.family, pixelSize, baseWidth)
|
||||||
|
: baseWidth;
|
||||||
|
m_allFonts.append(entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::populateSystemFonts()
|
||||||
|
{
|
||||||
|
const QStringList families = retrieveMonospaceFonts();
|
||||||
|
for (const QString &family : families) {
|
||||||
|
if (m_bundledFamilies.contains(family)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
FontEntry entry;
|
||||||
|
entry.name = family;
|
||||||
|
entry.text = family;
|
||||||
|
entry.source = QString();
|
||||||
|
entry.baseWidth = 1.0;
|
||||||
|
entry.pixelSize = kSystemFontPixelSize;
|
||||||
|
entry.lowResolutionFont = false;
|
||||||
|
entry.isSystemFont = true;
|
||||||
|
entry.family = family;
|
||||||
|
m_allFonts.append(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::updateFilteredFonts()
|
||||||
|
{
|
||||||
|
QVector<FontEntry> filtered;
|
||||||
|
bool fontNameFound = false;
|
||||||
|
const bool modernMode = (m_rasterization == kModernRasterization);
|
||||||
|
|
||||||
|
for (const FontEntry &font : m_allFonts) {
|
||||||
|
const bool isBundled = !font.isSystemFont;
|
||||||
|
const bool matchesSource = (m_fontSource == 0 && isBundled)
|
||||||
|
|| (m_fontSource == 1 && font.isSystemFont);
|
||||||
|
|
||||||
|
if (!matchesSource) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool matchesRasterization = font.isSystemFont
|
||||||
|
|| (modernMode == !font.lowResolutionFont);
|
||||||
|
|
||||||
|
if (!matchesRasterization) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
filtered.append(font);
|
||||||
|
if (font.name == m_fontName) {
|
||||||
|
fontNameFound = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fontNameFound && !filtered.isEmpty()) {
|
||||||
|
if (m_fontName != filtered.first().name) {
|
||||||
|
m_fontName = filtered.first().name;
|
||||||
|
emit fontNameChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_filteredFontListModel.setFonts(filtered);
|
||||||
|
emit filteredFontListChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::updateComputedFont()
|
||||||
|
{
|
||||||
|
const FontEntry *font = findFontByName(m_fontName);
|
||||||
|
if (!font) {
|
||||||
|
const QVector<FontEntry> &filteredFonts = m_filteredFontListModel.fonts();
|
||||||
|
if (!filteredFonts.isEmpty()) {
|
||||||
|
font = &filteredFonts.first();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!font) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const qreal totalFontScaling = m_baseFontScaling * m_fontScaling;
|
||||||
|
const qreal targetPixelHeight = kBaseFontPixelHeight * totalFontScaling;
|
||||||
|
const qreal lineSpacingFactor = m_lineSpacing;
|
||||||
|
|
||||||
|
const int lineSpacing = qRound(targetPixelHeight * lineSpacingFactor);
|
||||||
|
const int pixelSize = font->lowResolutionFont
|
||||||
|
? font->pixelSize
|
||||||
|
: static_cast<int>(targetPixelHeight);
|
||||||
|
|
||||||
|
const qreal nativeLineHeight = font->pixelSize + qRound(font->pixelSize * lineSpacingFactor);
|
||||||
|
const qreal targetLineHeight = targetPixelHeight + lineSpacing;
|
||||||
|
const qreal screenScaling = font->lowResolutionFont
|
||||||
|
? (nativeLineHeight > 0 ? targetLineHeight / nativeLineHeight : 1.0)
|
||||||
|
: 1.0;
|
||||||
|
|
||||||
|
const qreal fontWidth = font->baseWidth * m_fontWidth;
|
||||||
|
|
||||||
|
QString fontFamily = font->family.isEmpty() ? font->name : font->family;
|
||||||
|
QString fallbackFontFamily;
|
||||||
|
|
||||||
|
if (!font->fallbackName.isEmpty() && font->fallbackName != font->name) {
|
||||||
|
const FontEntry *fallback = findFontByName(font->fallbackName);
|
||||||
|
if (fallback) {
|
||||||
|
fallbackFontFamily = fallback->family.isEmpty() ? fallback->name : fallback->family;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList fallbackChain;
|
||||||
|
if (!fallbackFontFamily.isEmpty()) {
|
||||||
|
fallbackChain.append(fallbackFontFamily);
|
||||||
|
}
|
||||||
|
#if defined(Q_OS_MAC)
|
||||||
|
fallbackChain.append(QStringLiteral("Menlo"));
|
||||||
|
#else
|
||||||
|
fallbackChain.append(QStringLiteral("Monospace"));
|
||||||
|
#endif
|
||||||
|
setFontSubstitutions(fontFamily, fallbackChain);
|
||||||
|
|
||||||
|
if (m_lowResolutionFont != font->lowResolutionFont) {
|
||||||
|
m_lowResolutionFont = font->lowResolutionFont;
|
||||||
|
emit lowResolutionFontChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
emit terminalFontChanged(fontFamily,
|
||||||
|
pixelSize,
|
||||||
|
lineSpacing,
|
||||||
|
screenScaling,
|
||||||
|
fontWidth,
|
||||||
|
fallbackFontFamily,
|
||||||
|
font->lowResolutionFont);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FontEntry *FontManager::findFontByName(const QString &name) const
|
||||||
|
{
|
||||||
|
for (const FontEntry &font : m_allFonts) {
|
||||||
|
if (font.name == name) {
|
||||||
|
return &font;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FontManager::resolveFontFamily(const QString &sourcePath)
|
||||||
|
{
|
||||||
|
const auto cached = m_loadedFamilies.constFind(sourcePath);
|
||||||
|
if (cached != m_loadedFamilies.constEnd()) {
|
||||||
|
return cached.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
const int fontId = QFontDatabase::addApplicationFont(sourcePath);
|
||||||
|
QString family;
|
||||||
|
if (fontId != -1) {
|
||||||
|
const QStringList families = QFontDatabase::applicationFontFamilies(fontId);
|
||||||
|
if (!families.isEmpty()) {
|
||||||
|
family = families.first();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!family.isEmpty()) {
|
||||||
|
m_bundledFamilies.insert(family);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_loadedFamilies.insert(sourcePath, family);
|
||||||
|
return family;
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal FontManager::computeBaseWidth(const QString &family, int pixelSize, qreal fallbackWidth) const
|
||||||
|
{
|
||||||
|
if (family.isEmpty()) {
|
||||||
|
return fallbackWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
QFont font(family);
|
||||||
|
font.setPixelSize(pixelSize);
|
||||||
|
QFontMetricsF metrics(font);
|
||||||
|
|
||||||
|
const qreal glyphWidth = metrics.horizontalAdvance(QLatin1String("M"));
|
||||||
|
const qreal glyphHeight = metrics.height();
|
||||||
|
if (glyphWidth <= 0.0 || glyphHeight <= 0.0) {
|
||||||
|
return fallbackWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
const qreal targetRatio = 0.5;
|
||||||
|
qreal computedWidth = (targetRatio * glyphHeight) / glyphWidth;
|
||||||
|
return qBound(0.25, computedWidth, 2.0);
|
||||||
|
}
|
||||||
111
app/fontmanager.h
Normal file
111
app/fontmanager.h
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
#ifndef FONTMANAGER_H
|
||||||
|
#define FONTMANAGER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QHash>
|
||||||
|
#include <QSet>
|
||||||
|
|
||||||
|
#include "fontlistmodel.h"
|
||||||
|
|
||||||
|
class FontManager : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(FontListModel *fontList READ fontList CONSTANT)
|
||||||
|
Q_PROPERTY(FontListModel *filteredFontList READ filteredFontList NOTIFY filteredFontListChanged)
|
||||||
|
Q_PROPERTY(int fontSource READ fontSource WRITE setFontSource NOTIFY fontSourceChanged)
|
||||||
|
Q_PROPERTY(int rasterization READ rasterization WRITE setRasterization NOTIFY rasterizationChanged)
|
||||||
|
Q_PROPERTY(QString fontName READ fontName WRITE setFontName NOTIFY fontNameChanged)
|
||||||
|
Q_PROPERTY(qreal fontScaling READ fontScaling WRITE setFontScaling NOTIFY fontScalingChanged)
|
||||||
|
Q_PROPERTY(qreal fontWidth READ fontWidth WRITE setFontWidth NOTIFY fontWidthChanged)
|
||||||
|
Q_PROPERTY(qreal lineSpacing READ lineSpacing WRITE setLineSpacing NOTIFY lineSpacingChanged)
|
||||||
|
Q_PROPERTY(qreal baseFontScaling READ baseFontScaling WRITE setBaseFontScaling NOTIFY baseFontScalingChanged)
|
||||||
|
Q_PROPERTY(bool lowResolutionFont READ lowResolutionFont NOTIFY lowResolutionFontChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit FontManager(QObject *parent = nullptr);
|
||||||
|
|
||||||
|
Q_INVOKABLE void refresh();
|
||||||
|
|
||||||
|
FontListModel *fontList();
|
||||||
|
FontListModel *filteredFontList();
|
||||||
|
|
||||||
|
int fontSource() const;
|
||||||
|
void setFontSource(int fontSource);
|
||||||
|
|
||||||
|
int rasterization() const;
|
||||||
|
void setRasterization(int rasterization);
|
||||||
|
|
||||||
|
QString fontName() const;
|
||||||
|
void setFontName(const QString &fontName);
|
||||||
|
|
||||||
|
qreal fontScaling() const;
|
||||||
|
void setFontScaling(qreal fontScaling);
|
||||||
|
|
||||||
|
qreal fontWidth() const;
|
||||||
|
void setFontWidth(qreal fontWidth);
|
||||||
|
|
||||||
|
qreal lineSpacing() const;
|
||||||
|
void setLineSpacing(qreal lineSpacing);
|
||||||
|
|
||||||
|
qreal baseFontScaling() const;
|
||||||
|
void setBaseFontScaling(qreal baseFontScaling);
|
||||||
|
|
||||||
|
bool lowResolutionFont() const;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void fontSourceChanged();
|
||||||
|
void rasterizationChanged();
|
||||||
|
void fontNameChanged();
|
||||||
|
void fontScalingChanged();
|
||||||
|
void fontWidthChanged();
|
||||||
|
void lineSpacingChanged();
|
||||||
|
void baseFontScalingChanged();
|
||||||
|
void lowResolutionFontChanged();
|
||||||
|
void filteredFontListChanged();
|
||||||
|
|
||||||
|
void terminalFontChanged(QString fontFamily,
|
||||||
|
int pixelSize,
|
||||||
|
int lineSpacing,
|
||||||
|
qreal screenScaling,
|
||||||
|
qreal fontWidth,
|
||||||
|
QString fallbackFontFamily,
|
||||||
|
bool lowResolutionFont);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QStringList retrieveMonospaceFonts();
|
||||||
|
void populateBundledFonts();
|
||||||
|
void populateSystemFonts();
|
||||||
|
void addBundledFont(const QString &name,
|
||||||
|
const QString &text,
|
||||||
|
const QString &source,
|
||||||
|
qreal baseWidth,
|
||||||
|
int pixelSize,
|
||||||
|
bool lowResolutionFont,
|
||||||
|
const QString &fallbackName = QString());
|
||||||
|
void setFontSubstitutions(const QString &family, const QStringList &substitutes);
|
||||||
|
void removeFontSubstitution(const QString &family);
|
||||||
|
void updateFilteredFonts();
|
||||||
|
void updateComputedFont();
|
||||||
|
const FontEntry *findFontByName(const QString &name) const;
|
||||||
|
QString resolveFontFamily(const QString &sourcePath);
|
||||||
|
qreal computeBaseWidth(const QString &family, int pixelSize, qreal fallbackWidth) const;
|
||||||
|
|
||||||
|
FontListModel m_fontListModel;
|
||||||
|
FontListModel m_filteredFontListModel;
|
||||||
|
QVector<FontEntry> m_allFonts;
|
||||||
|
|
||||||
|
int m_fontSource = 0;
|
||||||
|
int m_rasterization = 0;
|
||||||
|
QString m_fontName = QStringLiteral("TERMINESS_SCALED");
|
||||||
|
qreal m_fontScaling = 1.0;
|
||||||
|
qreal m_fontWidth = 1.0;
|
||||||
|
qreal m_lineSpacing = 0.1;
|
||||||
|
qreal m_baseFontScaling = 0.75;
|
||||||
|
bool m_lowResolutionFont = false;
|
||||||
|
|
||||||
|
QHash<QString, QString> m_loadedFamilies;
|
||||||
|
QSet<QString> m_bundledFamilies;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // FONTMANAGER_H
|
||||||
123
app/main.cpp
123
app/main.cpp
@@ -6,14 +6,25 @@
|
|||||||
|
|
||||||
#include <QtWidgets/QApplication>
|
#include <QtWidgets/QApplication>
|
||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
|
#include <QQuickStyle>
|
||||||
|
#include <QtQml/qqml.h>
|
||||||
|
|
||||||
|
#include <kdsingleapplication.h>
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <QFontDatabase>
|
#include <QLoggingCategory>
|
||||||
|
|
||||||
#include <fileio.h>
|
#include <fileio.h>
|
||||||
#include <monospacefontmanager.h>
|
#include <fontlistmodel.h>
|
||||||
|
#include <fontmanager.h>
|
||||||
|
|
||||||
|
#if defined(Q_OS_MAC)
|
||||||
|
#include <CoreFoundation/CoreFoundation.h>
|
||||||
|
#include <QStyleFactory>
|
||||||
|
#include <QMenu>
|
||||||
|
#endif
|
||||||
|
|
||||||
QString getNamedArgument(QStringList args, QString name, QString defaultName)
|
QString getNamedArgument(QStringList args, QString name, QString defaultName)
|
||||||
{
|
{
|
||||||
@@ -29,51 +40,79 @@ QString getNamedArgument(QStringList args, QString name)
|
|||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
// Some environmental variable are necessary on certain platforms.
|
// Some environmental variable are necessary on certain platforms.
|
||||||
|
// Disable Connections slot warnings
|
||||||
|
QLoggingCategory::setFilterRules("qt.qml.connections.warning=false");
|
||||||
|
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Round);
|
||||||
|
|
||||||
// This disables QT appmenu under Ubuntu, which is not working with QML apps.
|
// #if defined (Q_OS_LINUX)
|
||||||
setenv("QT_QPA_PLATFORMTHEME", "", 1);
|
// 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);
|
||||||
|
|
||||||
|
// Ensure key repeat works for letter keys (disable macOS press-and-hold for this app).
|
||||||
|
CFPreferencesSetAppValue(CFSTR("ApplePressAndHoldEnabled"), kCFBooleanFalse, kCFPreferencesCurrentApplication);
|
||||||
|
CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
|
||||||
|
|
||||||
|
// Qt6 macOS default look is still lacking, so let's force Fusion for now
|
||||||
|
QQuickStyle::setStyle(QStringLiteral("Fusion"));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (argc>1 && (!strcmp(argv[1],"-h") || !strcmp(argv[1],"--help"))) {
|
||||||
|
QTextStream cout(stdout, QIODevice::WriteOnly);
|
||||||
|
cout << "Usage: " << argv[0] << " [--default-settings] [--workdir <dir>] [--program <prog>] [-p|--profile <prof>] [--fullscreen] [-h|--help]" << Qt::endl;
|
||||||
|
cout << " --default-settings Run cool-retro-term with the default settings" << Qt::endl;
|
||||||
|
cout << " --workdir <dir> Change working directory to 'dir'" << Qt::endl;
|
||||||
|
cout << " -e <cmd> Command to execute. This option will catch all following arguments, so use it as the last option." << Qt::endl;
|
||||||
|
cout << " --fullscreen Run cool-retro-term in fullscreen." << Qt::endl;
|
||||||
|
cout << " -p|--profile <prof> Run cool-retro-term with the given profile." << Qt::endl;
|
||||||
|
cout << " -h|--help Print this help." << Qt::endl;
|
||||||
|
cout << " --verbose Print additional information such as profiles and settings." << Qt::endl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString appVersion(QStringLiteral(APP_VERSION));
|
||||||
|
|
||||||
|
if (argc>1 && (!strcmp(argv[1],"-v") || !strcmp(argv[1],"--version"))) {
|
||||||
|
QTextStream cout(stdout, QIODevice::WriteOnly);
|
||||||
|
cout << "cool-retro-term " << appVersion << Qt::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.setApplicationName(QStringLiteral("cool-retro-term"));
|
||||||
// app.setAttribute(Qt::AA_MacDontSwapCtrlAndMeta, true);
|
app.setOrganizationName(QStringLiteral("cool-retro-term"));
|
||||||
|
app.setOrganizationDomain(QStringLiteral("cool-retro-term"));
|
||||||
|
app.setApplicationVersion(appVersion);
|
||||||
|
|
||||||
|
KDSingleApplication singleApp(QStringLiteral("cool-retro-term"));
|
||||||
|
|
||||||
|
if (!singleApp.isPrimaryInstance()) {
|
||||||
|
if (singleApp.sendMessage("new-window"))
|
||||||
|
return 0;
|
||||||
|
qWarning() << "KDSingleApplication: primary not reachable, continuing as independent instance.";
|
||||||
|
}
|
||||||
|
|
||||||
QQmlApplicationEngine engine;
|
QQmlApplicationEngine engine;
|
||||||
FileIO fileIO;
|
FileIO fileIO;
|
||||||
MonospaceFontManager monospaceFontManager;
|
|
||||||
|
qmlRegisterType<FontManager>("CoolRetroTerm", 1, 0, "FontManager");
|
||||||
|
qmlRegisterUncreatableType<FontListModel>("CoolRetroTerm", 1, 0, "FontListModel", "FontListModel is created by FontManager");
|
||||||
|
|
||||||
#if !defined(Q_OS_MAC)
|
#if !defined(Q_OS_MAC)
|
||||||
app.setWindowIcon(QIcon::fromTheme("cool-retro-term", QIcon(":../icons/32x32/cool-retro-term.png")));
|
app.setWindowIcon(QIcon::fromTheme("cool-retro-term", QIcon(":../icons/32x32/cool-retro-term.png")));
|
||||||
|
#if defined(Q_OS_LINUX)
|
||||||
|
QGuiApplication::setDesktopFileName(QStringLiteral("cool-retro-term"));
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
app.setWindowIcon(QIcon(":../icons/32x32/cool-retro-term.png"));
|
app.setWindowIcon(QIcon(":../icons/32x32/cool-retro-term.png"));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 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,20 +121,18 @@ 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);
|
||||||
|
|
||||||
engine.rootContext()->setContextProperty("workdir", getNamedArgument(args, "--workdir", "$HOME"));
|
engine.rootContext()->setContextProperty("workdir", getNamedArgument(args, "--workdir", "$HOME"));
|
||||||
engine.rootContext()->setContextProperty("fileIO", &fileIO);
|
engine.rootContext()->setContextProperty("fileIO", &fileIO);
|
||||||
engine.rootContext()->setContextProperty("monospaceSystemFonts", monospaceFontManager.retrieveMonospaceFonts());
|
|
||||||
|
|
||||||
engine.rootContext()->setContextProperty("devicePixelRatio", app.devicePixelRatio());
|
|
||||||
|
|
||||||
// Manage import paths for Linux and OSX.
|
// Manage import paths for Linux and OSX.
|
||||||
QStringList importPathList = engine.importPathList();
|
QStringList importPathList = engine.importPathList();
|
||||||
importPathList.prepend(QCoreApplication::applicationDirPath() + "/qmltermwidget");
|
importPathList.append(QCoreApplication::applicationDirPath() + "/qmltermwidget");
|
||||||
importPathList.prepend(QCoreApplication::applicationDirPath() + "/../PlugIns");
|
importPathList.append(QCoreApplication::applicationDirPath() + "/../PlugIns");
|
||||||
importPathList.prepend(QCoreApplication::applicationDirPath() + "/../../../qmltermwidget");
|
importPathList.append(QCoreApplication::applicationDirPath() + "/../../../qmltermwidget");
|
||||||
engine.setImportPathList(importPathList);
|
engine.setImportPathList(importPathList);
|
||||||
|
|
||||||
engine.load(QUrl(QStringLiteral ("qrc:/main.qml")));
|
engine.load(QUrl(QStringLiteral ("qrc:/main.qml")));
|
||||||
@@ -108,5 +145,25 @@ int main(int argc, char *argv[])
|
|||||||
// Quit the application when the engine closes.
|
// Quit the application when the engine closes.
|
||||||
QObject::connect((QObject*) &engine, SIGNAL(quit()), (QObject*) &app, SLOT(quit()));
|
QObject::connect((QObject*) &engine, SIGNAL(quit()), (QObject*) &app, SLOT(quit()));
|
||||||
|
|
||||||
|
auto requestNewWindow = [&engine]() {
|
||||||
|
if (engine.rootObjects().isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
QObject *rootObject = engine.rootObjects().constFirst();
|
||||||
|
QMetaObject::invokeMethod(rootObject, "createWindow", Qt::QueuedConnection);
|
||||||
|
};
|
||||||
|
|
||||||
|
QObject::connect(&singleApp, &KDSingleApplication::messageReceived, &app,
|
||||||
|
[&requestNewWindow](const QByteArray &message) {
|
||||||
|
if (message.isEmpty() || message == QByteArray("new-window"))
|
||||||
|
requestNewWindow();
|
||||||
|
});
|
||||||
|
|
||||||
|
#if defined(Q_OS_MAC)
|
||||||
|
QMenu *dockMenu = new QMenu(nullptr);
|
||||||
|
dockMenu->addAction(QObject::tr("New Window"), [&requestNewWindow]() { requestNewWindow(); });
|
||||||
|
dockMenu->setAsDockMenu();
|
||||||
|
#endif
|
||||||
|
|
||||||
return app.exec();
|
return app.exec();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
#include "monospacefontmanager.h"
|
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
MonospaceFontManager::MonospaceFontManager(QObject *parent) : QObject(parent)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
QStringList MonospaceFontManager::retrieveMonospaceFonts() {
|
|
||||||
QStringList result;
|
|
||||||
|
|
||||||
QFontDatabase fontDatabase;
|
|
||||||
QStringList fontFamilies = fontDatabase.families();
|
|
||||||
|
|
||||||
for (int i = 0; i < fontFamilies.size(); i++) {
|
|
||||||
QString fontFamily = fontFamilies[i];
|
|
||||||
QFont font(fontFamily);
|
|
||||||
if (fontDatabase.isFixedPitch(font.family())) {
|
|
||||||
result.append(fontFamily);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#ifndef MONOSPACEFONTMANAGER_H
|
|
||||||
#define MONOSPACEFONTMANAGER_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QFontDatabase>
|
|
||||||
|
|
||||||
class MonospaceFontManager : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
explicit MonospaceFontManager(QObject *parent = nullptr);
|
|
||||||
Q_INVOKABLE QStringList retrieveMonospaceFonts();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // MONOSPACEFONTMANAGER_H
|
|
||||||
@@ -1,26 +1,47 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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{
|
ApplicationWindow {
|
||||||
id: dialogwindow
|
id: dialogwindow
|
||||||
title: qsTr("About")
|
title: qsTr("About")
|
||||||
width: 600
|
width: 600
|
||||||
height: 400
|
height: 400
|
||||||
|
|
||||||
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}
|
color: palette.text
|
||||||
|
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 +62,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 +96,39 @@ 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" +
|
color: palette.text
|
||||||
qsTr("Author: ") + "Filippo Scognamiglio\n" +
|
text: appSettings.version + "\n" + qsTr(
|
||||||
qsTr("Email: ") + "flscogna@gmail.com\n" +
|
"Author: ") + "Filippo Scognamiglio\n" + qsTr(
|
||||||
qsTr("Source: ") + "https://github.com/Swordfish90/cool-retro-term\n"
|
"Email: ") + "flscogna@gmail.com\n" + qsTr(
|
||||||
|
"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 " +
|
color: palette.text
|
||||||
"it under the terms of the GNU General Public License as published by " +
|
text: "Copyright (c) 2013-2025 Filippo Scognamiglio <flscogna@gmail.com>\n\n"
|
||||||
"the Free Software Foundation, either version 3 of the License, or " +
|
+ "https://github.com/Swordfish90/cool-retro-term\n\n" +
|
||||||
"(at your option) any later version.\n\n" +
|
"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 "
|
||||||
"This program is distributed in the hope that it will be useful, " +
|
+ "the Free Software Foundation, either version 3 of the License, or "
|
||||||
"but WITHOUT ANY WARRANTY; without even the implied warranty of " +
|
+ "(at your option) any later version.\n\n" +
|
||||||
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " +
|
"This program is distributed in the hope that it will be useful, "
|
||||||
"GNU General Public License for more details.\n\n" +
|
+ "but WITHOUT ANY WARRANTY; without even the implied warranty of "
|
||||||
|
+ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the "
|
||||||
"You should have received a copy of the GNU General Public License " +
|
+ "GNU General Public License for more details.\n\n" +
|
||||||
"along with this program. If not, see <http://www.gnu.org/licenses/>."
|
"You should have received a copy of the GNU General Public License "
|
||||||
|
+ "along with this program. If not, see <http://www.gnu.org/licenses/>."
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,22 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
|
*
|
||||||
|
* This file is part of cool-retro-term.
|
||||||
|
*
|
||||||
|
* cool-retro-term is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*******************************************************************************/
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
|
|
||||||
import "utils.js" as Utils
|
import "utils.js" as Utils
|
||||||
@@ -5,44 +24,39 @@ import "utils.js" as Utils
|
|||||||
Loader {
|
Loader {
|
||||||
id: burnInEffect
|
id: burnInEffect
|
||||||
|
|
||||||
property ShaderEffectSource source: item ? item.source : null
|
property ShaderEffectSource effectSource: item ? item.source : null
|
||||||
|
|
||||||
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,86 +66,62 @@ Loader {
|
|||||||
live: false
|
live: false
|
||||||
recursive: true
|
recursive: true
|
||||||
hideSource: true
|
hideSource: true
|
||||||
wrapMode: kterminalSource.wrapMode
|
wrapMode: ShaderEffectSource.ClampToEdge
|
||||||
|
|
||||||
format: ShaderEffectSource.RGBA
|
format: ShaderEffectSource.RGBA
|
||||||
|
smooth: true
|
||||||
// Enabling smooth with a low burnInQuality causes bad artifacts because the FBO
|
|
||||||
// has different values when it's read back. This lowers the quality, but makes it more consistent.
|
|
||||||
smooth: appSettings.burnInQuality === 1.0
|
|
||||||
|
|
||||||
visible: false
|
visible: false
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: kterminal
|
target: kterminal
|
||||||
onImagePainted: completelyUpdate()
|
|
||||||
|
onImagePainted: {
|
||||||
|
completelyUpdate()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Restart blurred source settings change.
|
// Restart blurred source settings change.
|
||||||
Connections{
|
Connections {
|
||||||
target: appSettings
|
target: appSettings.fontManager
|
||||||
onBurnInChanged: burnInEffect.restartBlurSource();
|
|
||||||
onTerminalFontChanged: burnInEffect.restartBlurSource();
|
onTerminalFontChanged: {
|
||||||
onRasterizationChanged: burnInEffect.restartBlurSource();
|
burnInEffect.restartBlurSource()
|
||||||
onBurnInQualityChanged: burnInEffect.restartBlurSource();
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: kterminalScrollbar
|
target: appSettings
|
||||||
onOpacityChanged: completelyUpdate()
|
|
||||||
|
onBurnInChanged: {
|
||||||
|
burnInEffect.restartBlurSource()
|
||||||
|
}
|
||||||
|
|
||||||
|
onRasterizationChanged: {
|
||||||
|
burnInEffect.restartBlurSource()
|
||||||
|
}
|
||||||
|
|
||||||
|
onBurnInQualityChanged: {
|
||||||
|
burnInEffect.restartBlurSource()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ShaderEffect {
|
ShaderEffect {
|
||||||
id: burnInShaderEffect
|
id: burnInShaderEffect
|
||||||
|
|
||||||
|
property real time: timeManager.time
|
||||||
|
|
||||||
property variant txt_source: kterminalSource
|
property variant txt_source: kterminalSource
|
||||||
property variant burnInSource: burnInEffectSource
|
property variant burnInSource: burnInEffectSource
|
||||||
property real burnInTime: burnInFadeTime
|
property real burnInTime: burnInFadeTime
|
||||||
property real lastUpdate: burnInEffect.lastUpdate
|
property real burnInLastUpdate: burnInEffect.lastUpdate
|
||||||
property real prevLastUpdate: burnInEffect.prevLastUpdate
|
property real prevLastUpdate: burnInEffect.prevLastUpdate
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
blending: false
|
blending: false
|
||||||
|
|
||||||
fragmentShader:
|
fragmentShader: "qrc:/shaders/burn_in.frag.qsb"
|
||||||
"#ifdef GL_ES
|
vertexShader: "qrc:/shaders/burn_in.vert.qsb"
|
||||||
precision mediump float;
|
|
||||||
#endif\n" +
|
|
||||||
|
|
||||||
"uniform lowp float qt_Opacity;" +
|
|
||||||
"uniform lowp sampler2D txt_source;" +
|
|
||||||
|
|
||||||
"varying highp vec2 qt_TexCoord0;
|
|
||||||
|
|
||||||
uniform lowp sampler2D burnInSource;
|
|
||||||
uniform highp float burnInTime;
|
|
||||||
|
|
||||||
uniform highp float lastUpdate;
|
|
||||||
|
|
||||||
uniform highp float prevLastUpdate;" +
|
|
||||||
|
|
||||||
"float rgb2grey(vec3 v){
|
|
||||||
return dot(v, vec3(0.21, 0.72, 0.04));
|
|
||||||
}" +
|
|
||||||
|
|
||||||
"void main() {
|
|
||||||
vec2 coords = qt_TexCoord0;
|
|
||||||
|
|
||||||
vec3 txtColor = texture2D(txt_source, coords).rgb;
|
|
||||||
vec4 accColor = texture2D(burnInSource, coords);
|
|
||||||
|
|
||||||
float prevMask = accColor.a;
|
|
||||||
float currMask = rgb2grey(txtColor);
|
|
||||||
|
|
||||||
highp float blurDecay = clamp((lastUpdate - prevLastUpdate) * burnInTime, 0.0, 1.0);
|
|
||||||
blurDecay = max(0.0, blurDecay - prevMask);
|
|
||||||
vec3 blurColor = accColor.rgb - vec3(blurDecay);
|
|
||||||
vec3 color = max(blurColor, txtColor);
|
|
||||||
|
|
||||||
gl_FragColor = vec4(color, currMask);
|
|
||||||
}
|
|
||||||
"
|
|
||||||
|
|
||||||
onStatusChanged: if (log) console.log(log) //Print warning messages
|
onStatusChanged: if (log) console.log(log) //Print warning messages
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,51 +0,0 @@
|
|||||||
import QtQuick 2.2
|
|
||||||
import QtQuick.Controls 1.1
|
|
||||||
|
|
||||||
MenuBar {
|
|
||||||
id: defaultMenuBar
|
|
||||||
property bool visible: true
|
|
||||||
Menu {
|
|
||||||
title: qsTr("File")
|
|
||||||
visible: defaultMenuBar.visible
|
|
||||||
MenuItem {action: quitAction}
|
|
||||||
}
|
|
||||||
Menu {
|
|
||||||
title: qsTr("Edit")
|
|
||||||
visible: defaultMenuBar.visible && appSettings.showMenubar
|
|
||||||
MenuItem {action: copyAction}
|
|
||||||
MenuItem {action: pasteAction}
|
|
||||||
MenuSeparator{visible: Qt.platform.os !== "osx"}
|
|
||||||
MenuItem {action: showsettingsAction}
|
|
||||||
}
|
|
||||||
Menu{
|
|
||||||
title: qsTr("View")
|
|
||||||
visible: defaultMenuBar.visible
|
|
||||||
MenuItem {action: fullscreenAction; visible: fullscreenAction.enabled}
|
|
||||||
MenuItem {action: showMenubarAction; visible: showMenubarAction.enabled}
|
|
||||||
MenuSeparator{visible: showMenubarAction.enabled}
|
|
||||||
MenuItem {action: zoomIn}
|
|
||||||
MenuItem {action: zoomOut}
|
|
||||||
}
|
|
||||||
Menu{
|
|
||||||
id: profilesMenu
|
|
||||||
title: qsTr("Profiles")
|
|
||||||
visible: defaultMenuBar.visible
|
|
||||||
Instantiator{
|
|
||||||
model: appSettings.profilesList
|
|
||||||
delegate: MenuItem {
|
|
||||||
text: model.text
|
|
||||||
onTriggered: {
|
|
||||||
appSettings.loadProfileString(obj_string);
|
|
||||||
appSettings.handleFontChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
onObjectAdded: profilesMenu.insertItem(index, object)
|
|
||||||
onObjectRemoved: profilesMenu.removeItem(object)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Menu{
|
|
||||||
title: qsTr("Help")
|
|
||||||
visible: defaultMenuBar.visible
|
|
||||||
MenuItem {action: showAboutAction}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@@ -17,9 +17,8 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 2.0
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
|
|
||||||
import "Components"
|
import "Components"
|
||||||
@@ -28,46 +27,46 @@ RowLayout {
|
|||||||
property alias name: check.text
|
property alias name: check.text
|
||||||
|
|
||||||
property double value
|
property double value
|
||||||
property alias min_value: slider.minimumValue
|
property alias min_value: slider.from
|
||||||
property alias max_value: slider.maximumValue
|
property alias max_value: slider.to
|
||||||
property alias stepSize: slider.stepSize
|
property alias stepSize: slider.stepSize
|
||||||
|
|
||||||
signal newValue(real newValue);
|
signal newValue(real newValue)
|
||||||
|
|
||||||
id: setting_component
|
id: setting_component
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
|
|
||||||
onValueChanged: {
|
onValueChanged: {
|
||||||
check.checked = !(value == 0);
|
check.checked = !(value == 0)
|
||||||
if(check.checked)
|
if (check.checked)
|
||||||
slider.value = value;
|
slider.value = value
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckBox{
|
CheckBox {
|
||||||
id: check
|
id: check
|
||||||
implicitWidth: 160
|
implicitWidth: 160
|
||||||
onClicked: {
|
onClicked: {
|
||||||
if(!checked){
|
if (!checked) {
|
||||||
checked = false;
|
checked = false
|
||||||
slider.enabled = false;
|
slider.enabled = false
|
||||||
newValue(0);
|
newValue(0)
|
||||||
} else {
|
} else {
|
||||||
checked = true;
|
checked = true
|
||||||
newValue(slider.value);
|
newValue(slider.value)
|
||||||
slider.enabled = true;
|
slider.enabled = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Slider{
|
Slider {
|
||||||
id: slider
|
id: slider
|
||||||
stepSize: parent.stepSize
|
stepSize: parent.stepSize
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
onValueChanged: {
|
onValueChanged: {
|
||||||
newValue(value);
|
newValue(value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SizedLabel {
|
SizedLabel {
|
||||||
Layout.fillHeight: true
|
text: Math.round(
|
||||||
text: Math.round(((value - min_value) / (max_value - min_value)) * 100) + "%"
|
((value - min_value) / (max_value - min_value)) * 100) + "%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@@ -17,14 +17,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Dialogs 1.1
|
import QtQuick.Dialogs
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
@@ -32,18 +31,19 @@ Item {
|
|||||||
id: colorDialog
|
id: colorDialog
|
||||||
title: qsTr("Choose a color")
|
title: qsTr("Choose a color")
|
||||||
modality: Qt.ApplicationModal
|
modality: Qt.ApplicationModal
|
||||||
visible: false
|
selectedColor: rootItem.color
|
||||||
|
|
||||||
//This is a workaround to a Qt 5.2 bug.
|
onSelectedColorChanged: {
|
||||||
onColorChanged: if (Qt.platform.os !== "osx") colorSelected(color)
|
if (!appSettings.isMacOS && visible)
|
||||||
onAccepted: if (Qt.platform.os === "osx") colorSelected(color)
|
colorSelected(selectedColor)
|
||||||
|
}
|
||||||
|
onAccepted: colorSelected(selectedColor)
|
||||||
}
|
}
|
||||||
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 +51,14 @@ Item {
|
|||||||
color: "white"
|
color: "white"
|
||||||
opacity: 0.5
|
opacity: 0.5
|
||||||
}
|
}
|
||||||
Text{
|
Text {
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
z: parent.z + 1
|
z: parent.z + 1
|
||||||
text: name + ": " + rootItem.color
|
text: name + ": " + rootItem.color
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MouseArea{
|
MouseArea {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
onClicked: colorDialog.visible = true;
|
onClicked: colorDialog.open()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@@ -17,19 +19,14 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
import QtQuick.Controls 1.0
|
import QtQuick.Controls 2.0
|
||||||
|
import QtQuick.Layouts 1.0
|
||||||
|
|
||||||
// This component is simply a label with a predefined size.
|
// This component is simply a label with a predefined size.
|
||||||
// Used to improve alignment.
|
// Used to improve alignment.
|
||||||
|
Label {
|
||||||
Item {
|
id: textfield
|
||||||
property alias text: textfield.text
|
Layout.minimumWidth: appSettings.labelWidth
|
||||||
width: appSettings.labelWidth
|
width: appSettings.labelWidth
|
||||||
Label{
|
|
||||||
id: textfield
|
|
||||||
anchors { right: parent.right; verticalCenter: parent.verticalCenter }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,108 +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
|
|
||||||
|
|
||||||
QtObject{
|
|
||||||
property int selectedFontIndex
|
|
||||||
property real scaling
|
|
||||||
property var _font: fontlist.get(selectedFontIndex)
|
|
||||||
property var source: _font.source
|
|
||||||
property int pixelSize: _font.pixelSize
|
|
||||||
property int lineSpacing: _font.lineSpacing
|
|
||||||
property real screenScaling: scaling * _font.baseScaling
|
|
||||||
property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
|
|
||||||
property bool lowResolutionFont: true
|
|
||||||
|
|
||||||
property ListModel fontlist: ListModel{
|
|
||||||
ListElement{
|
|
||||||
name: "COMMODORE_PET"
|
|
||||||
text: "Commodore PET (1977)"
|
|
||||||
source: "fonts/1977-commodore-pet/PetMe.ttf"
|
|
||||||
lineSpacing: 3
|
|
||||||
pixelSize: 8
|
|
||||||
baseScaling: 3.5
|
|
||||||
fontWidth: 0.8
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "IBM_PC"
|
|
||||||
text: "IBM PC (1981)"
|
|
||||||
source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf"
|
|
||||||
lineSpacing: 3
|
|
||||||
pixelSize: 8
|
|
||||||
baseScaling: 3.5
|
|
||||||
fontWidth: 0.8
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "PROGGY_TINY"
|
|
||||||
text: "Proggy Tiny (Modern)"
|
|
||||||
source: "fonts/modern-proggy-tiny/ProggyTiny.ttf"
|
|
||||||
lineSpacing: 1
|
|
||||||
pixelSize: 16
|
|
||||||
baseScaling: 3.3
|
|
||||||
fontWidth: 0.9
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "TERMINUS_SCALED"
|
|
||||||
text: "Terminus (Modern)"
|
|
||||||
source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
|
|
||||||
lineSpacing: 1
|
|
||||||
pixelSize: 12
|
|
||||||
baseScaling: 3.0
|
|
||||||
fontWidth: 1.0
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "PRO_FONT_SCALED"
|
|
||||||
text: "Pro Font (Modern)"
|
|
||||||
source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
|
|
||||||
lineSpacing: 1
|
|
||||||
pixelSize: 12
|
|
||||||
baseScaling: 3.0
|
|
||||||
fontWidth: 1.0
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "APPLE_II"
|
|
||||||
text: "Apple ][ (1977)"
|
|
||||||
source: "fonts/1977-apple2/PrintChar21.ttf"
|
|
||||||
lineSpacing: 2
|
|
||||||
pixelSize: 8
|
|
||||||
baseScaling: 3.5
|
|
||||||
fontWidth: 0.9
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "ATARI_400"
|
|
||||||
text: "Atari 400-800 (1979)"
|
|
||||||
source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf"
|
|
||||||
lineSpacing: 3
|
|
||||||
pixelSize: 8
|
|
||||||
baseScaling: 3.5
|
|
||||||
fontWidth: 0.8
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "COMMODORE_64"
|
|
||||||
text: "Commodore 64 (1982)"
|
|
||||||
source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"
|
|
||||||
lineSpacing: 3
|
|
||||||
pixelSize: 8
|
|
||||||
baseScaling: 3.5
|
|
||||||
fontWidth: 0.8
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,108 +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
|
|
||||||
|
|
||||||
QtObject{
|
|
||||||
property int selectedFontIndex
|
|
||||||
property real scaling
|
|
||||||
property var _font: fontlist.get(selectedFontIndex)
|
|
||||||
property var source: _font.source
|
|
||||||
property int pixelSize: _font.pixelSize
|
|
||||||
property int lineSpacing: _font.lineSpacing
|
|
||||||
property real screenScaling: scaling * _font.baseScaling
|
|
||||||
property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
|
|
||||||
property bool lowResolutionFont: true
|
|
||||||
|
|
||||||
property ListModel fontlist: ListModel{
|
|
||||||
ListElement{
|
|
||||||
name: "COMMODORE_PET"
|
|
||||||
text: "Commodore PET (1977)"
|
|
||||||
source: "fonts/1977-commodore-pet/PetMe.ttf"
|
|
||||||
lineSpacing: 3
|
|
||||||
pixelSize: 8
|
|
||||||
baseScaling: 3.5
|
|
||||||
fontWidth: 0.7
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "IBM_PC"
|
|
||||||
text: "IBM PC (1981)"
|
|
||||||
source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf"
|
|
||||||
lineSpacing: 3
|
|
||||||
pixelSize: 8
|
|
||||||
baseScaling: 3.5
|
|
||||||
fontWidth: 0.8
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "PROGGY_TINY"
|
|
||||||
text: "Proggy Tiny (Modern)"
|
|
||||||
source: "fonts/modern-proggy-tiny/ProggyTiny.ttf"
|
|
||||||
lineSpacing: 1
|
|
||||||
pixelSize: 16
|
|
||||||
baseScaling: 3.3
|
|
||||||
fontWidth: 0.9
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "TERMINUS_SCALED"
|
|
||||||
text: "Terminus (Modern)"
|
|
||||||
source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
|
|
||||||
lineSpacing: 1
|
|
||||||
pixelSize: 12
|
|
||||||
baseScaling: 3.0
|
|
||||||
fontWidth: 1.0
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "PRO_FONT_SCALED"
|
|
||||||
text: "Pro Font (Modern)"
|
|
||||||
source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
|
|
||||||
lineSpacing: 1
|
|
||||||
pixelSize: 12
|
|
||||||
baseScaling: 3.0
|
|
||||||
fontWidth: 1.0
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "APPLE_II"
|
|
||||||
text: "Apple ][ (1977)"
|
|
||||||
source: "fonts/1977-apple2/PrintChar21.ttf"
|
|
||||||
lineSpacing: 3
|
|
||||||
pixelSize: 8
|
|
||||||
baseScaling: 3.5
|
|
||||||
fontWidth: 0.8
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "ATARI_400"
|
|
||||||
text: "Atari 400-800 (1979)"
|
|
||||||
source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf"
|
|
||||||
lineSpacing: 3
|
|
||||||
pixelSize: 8
|
|
||||||
baseScaling: 3.5
|
|
||||||
fontWidth: 0.7
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "COMMODORE_64"
|
|
||||||
text: "Commodore 64 (1982)"
|
|
||||||
source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"
|
|
||||||
lineSpacing: 3
|
|
||||||
pixelSize: 8
|
|
||||||
baseScaling: 3.5
|
|
||||||
fontWidth: 0.7
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,258 +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
|
|
||||||
|
|
||||||
QtObject{
|
|
||||||
property int selectedFontIndex
|
|
||||||
property real scaling
|
|
||||||
property var source: fontlist.get(selectedFontIndex).source
|
|
||||||
property var _font: fontlist.get(selectedFontIndex)
|
|
||||||
property bool lowResolutionFont: _font.lowResolutionFont
|
|
||||||
|
|
||||||
property int pixelSize: lowResolutionFont
|
|
||||||
? _font.pixelSize
|
|
||||||
: _font.pixelSize * scaling
|
|
||||||
|
|
||||||
property int lineSpacing: lowResolutionFont
|
|
||||||
? _font.lineSpacing
|
|
||||||
: pixelSize * _font.lineSpacing
|
|
||||||
|
|
||||||
property real screenScaling: lowResolutionFont
|
|
||||||
? _font.baseScaling * scaling
|
|
||||||
: 1.0
|
|
||||||
|
|
||||||
property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
|
|
||||||
|
|
||||||
property string family: fontlist.get(selectedFontIndex).family
|
|
||||||
|
|
||||||
property bool isSystemFont: fontlist.get(selectedFontIndex).isSystemFont
|
|
||||||
|
|
||||||
// There are two kind of fonts: low resolution and high resolution.
|
|
||||||
// Low resolution font sets the lowResolutionFont property to true.
|
|
||||||
// They are rendered at a fixed pixel size and the texture is upscaled
|
|
||||||
// to fill the screen (they are much faster to render).
|
|
||||||
// High resolution fonts are instead drawn on a texture which has the
|
|
||||||
// size of the screen, and the scaling directly controls their pixels size.
|
|
||||||
// Those are slower to render but are not pixelated.
|
|
||||||
|
|
||||||
property ListModel fontlist: ListModel {
|
|
||||||
ListElement{
|
|
||||||
name: "TERMINUS_SCALED"
|
|
||||||
text: "Terminus (Modern)"
|
|
||||||
source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
|
|
||||||
lineSpacing: 1
|
|
||||||
pixelSize: 12
|
|
||||||
baseScaling: 3.0
|
|
||||||
fontWidth: 1.0
|
|
||||||
lowResolutionFont: true
|
|
||||||
isSystemFont: false
|
|
||||||
family: ""
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "PRO_FONT_SCALED"
|
|
||||||
text: "Pro Font (Modern)"
|
|
||||||
source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
|
|
||||||
lineSpacing: 1
|
|
||||||
pixelSize: 12
|
|
||||||
baseScaling: 3.0
|
|
||||||
fontWidth: 1.0
|
|
||||||
lowResolutionFont: true
|
|
||||||
isSystemFont: false
|
|
||||||
family: ""
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "EXCELSIOR_SCALED"
|
|
||||||
text: "Fixedsys Excelsior (Modern)"
|
|
||||||
source: "fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf"
|
|
||||||
lineSpacing: 0
|
|
||||||
pixelSize: 16
|
|
||||||
baseScaling: 2.4
|
|
||||||
fontWidth: 1.0
|
|
||||||
lowResolutionFont: true
|
|
||||||
isSystemFont: false
|
|
||||||
family: ""
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "COMMODORE_PET_SCALED"
|
|
||||||
text: "Commodore PET (1977)"
|
|
||||||
source: "fonts/1977-commodore-pet/PetMe.ttf"
|
|
||||||
lineSpacing: 3
|
|
||||||
pixelSize: 8
|
|
||||||
baseScaling: 3.5
|
|
||||||
fontWidth: 0.7
|
|
||||||
lowResolutionFont: true
|
|
||||||
isSystemFont: false
|
|
||||||
family: ""
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "PROGGY_TINY_SCALED"
|
|
||||||
text: "Proggy Tiny (Modern)"
|
|
||||||
source: "fonts/modern-proggy-tiny/ProggyTiny.ttf"
|
|
||||||
lineSpacing: 1
|
|
||||||
pixelSize: 16
|
|
||||||
baseScaling: 3.3
|
|
||||||
fontWidth: 0.9
|
|
||||||
lowResolutionFont: true
|
|
||||||
isSystemFont: false
|
|
||||||
family: ""
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "APPLE_II_SCALED"
|
|
||||||
text: "Apple ][ (1977)"
|
|
||||||
source: "fonts/1977-apple2/PrintChar21.ttf"
|
|
||||||
lineSpacing: 3
|
|
||||||
pixelSize: 8
|
|
||||||
baseScaling: 3.5
|
|
||||||
fontWidth: 0.8
|
|
||||||
lowResolutionFont: true
|
|
||||||
isSystemFont: false
|
|
||||||
family: ""
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "ATARI_400_SCALED"
|
|
||||||
text: "Atari 400-800 (1979)"
|
|
||||||
source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf"
|
|
||||||
lineSpacing: 3
|
|
||||||
pixelSize: 8
|
|
||||||
baseScaling: 3.5
|
|
||||||
fontWidth: 0.7
|
|
||||||
lowResolutionFont: true
|
|
||||||
isSystemFont: false
|
|
||||||
family: ""
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "IBM_PC_SCALED"
|
|
||||||
text: "IBM PC (1981)"
|
|
||||||
source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf"
|
|
||||||
lineSpacing: 3
|
|
||||||
pixelSize: 8
|
|
||||||
baseScaling: 3.5
|
|
||||||
fontWidth: 0.8
|
|
||||||
lowResolutionFont: true
|
|
||||||
isSystemFont: false
|
|
||||||
family: ""
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "COMMODORE_64_SCALED"
|
|
||||||
text: "Commodore 64 (1982)"
|
|
||||||
source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"
|
|
||||||
lineSpacing: 3
|
|
||||||
pixelSize: 8
|
|
||||||
baseScaling: 3.5
|
|
||||||
fontWidth: 0.7
|
|
||||||
lowResolutionFont: true
|
|
||||||
isSystemFont: false
|
|
||||||
family: ""
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "IBM_DOS"
|
|
||||||
text: "IBM DOS (1985)"
|
|
||||||
source: "fonts/1985-ibm-pc-vga/PxPlus_IBM_VGA8.ttf"
|
|
||||||
lineSpacing: 3
|
|
||||||
pixelSize: 16
|
|
||||||
baseScaling: 2.0
|
|
||||||
fontWidth: 1.0
|
|
||||||
lowResolutionFont: true
|
|
||||||
isSystemFont: false
|
|
||||||
family: ""
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "HERMIT"
|
|
||||||
text: "HD: Hermit (Modern)"
|
|
||||||
source: "fonts/modern-hermit/Hermit-medium.otf"
|
|
||||||
lineSpacing: 0.05
|
|
||||||
pixelSize: 27
|
|
||||||
fontWidth: 1.0
|
|
||||||
lowResolutionFont: false
|
|
||||||
isSystemFont: false
|
|
||||||
family: ""
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "TERMINUS"
|
|
||||||
text: "HD: Terminus (Modern)"
|
|
||||||
source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
|
|
||||||
lineSpacing: 0.1
|
|
||||||
pixelSize: 35
|
|
||||||
fontWidth: 1.0
|
|
||||||
lowResolutionFont: false
|
|
||||||
isSystemFont: false
|
|
||||||
family: ""
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "PRO_FONT"
|
|
||||||
text: "HD: Pro Font (Modern)"
|
|
||||||
source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
|
|
||||||
lineSpacing: 0.1
|
|
||||||
pixelSize: 35
|
|
||||||
fontWidth: 1.0
|
|
||||||
lowResolutionFont: false
|
|
||||||
isSystemFont: false
|
|
||||||
family: ""
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "INCONSOLATA"
|
|
||||||
text: "HD: Inconsolata (Modern)"
|
|
||||||
source: "fonts/modern-inconsolata/Inconsolata.otf"
|
|
||||||
lineSpacing: 0.1
|
|
||||||
pixelSize: 35
|
|
||||||
fontWidth: 1.0
|
|
||||||
lowResolutionFont: false
|
|
||||||
isSystemFont: false
|
|
||||||
family: ""
|
|
||||||
}
|
|
||||||
ListElement{
|
|
||||||
name: "IBM_3278"
|
|
||||||
text: "HD: IBM 3278 (1971)"
|
|
||||||
source: "fonts/1971-ibm-3278/3270Medium.ttf"
|
|
||||||
lineSpacing: 0.2
|
|
||||||
pixelSize: 32
|
|
||||||
fontWidth: 1.0
|
|
||||||
lowResolutionFont: false
|
|
||||||
isSystemFont: false
|
|
||||||
family: ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component.onCompleted: addSystemFonts()
|
|
||||||
|
|
||||||
function addSystemFonts() {
|
|
||||||
var families = monospaceSystemFonts;
|
|
||||||
for (var i = 0; i < families.length; i++) {
|
|
||||||
console.log("Adding system font: ", families[i])
|
|
||||||
fontlist.append(convertToListElement(families[i]))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function convertToListElement(family) {
|
|
||||||
return {
|
|
||||||
name: "System: " + family,
|
|
||||||
text: qsTr("System: ") + family,
|
|
||||||
source: "",
|
|
||||||
lineSpacing: 0.1,
|
|
||||||
pixelSize: 30,
|
|
||||||
fontWidth: 1.0,
|
|
||||||
baseScaling: 1.0,
|
|
||||||
lowResolutionFont: false,
|
|
||||||
isSystemFont: true,
|
|
||||||
family: family
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
import QtQuick 2.2
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
width: parent.width - parent.border.width
|
|
||||||
height: parent.height - parent.border.width
|
|
||||||
radius:parent.radius - parent.border.width/2
|
|
||||||
smooth: true
|
|
||||||
|
|
||||||
border.width: parent.border.width/2
|
|
||||||
border.color: "#22FFFFFF"
|
|
||||||
|
|
||||||
gradient: Gradient {
|
|
||||||
GradientStop { position: 0; color: "#88FFFFFF" }
|
|
||||||
GradientStop { position: .1; color: "#55FFFFFF" }
|
|
||||||
GradientStop { position: .5; color: "#33FFFFFF" }
|
|
||||||
GradientStop { position: .501; color: "#11000000" }
|
|
||||||
GradientStop { position: .8; color: "#11FFFFFF" }
|
|
||||||
GradientStop { position: 1; color: "#55FFFFFF" }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@@ -17,14 +17,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Window 2.0
|
import QtQuick.Window 2.0
|
||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 2.0
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
import QtQuick.Dialogs 1.1
|
import QtQuick.Dialogs
|
||||||
|
|
||||||
Window{
|
Window {
|
||||||
id: insertnamedialog
|
id: insertnamedialog
|
||||||
width: 400
|
width: 400
|
||||||
height: 100
|
height: 100
|
||||||
@@ -39,50 +38,53 @@ Window{
|
|||||||
title: qsTr("Error")
|
title: qsTr("Error")
|
||||||
visible: false
|
visible: false
|
||||||
|
|
||||||
function showError(message){
|
function showError(message) {
|
||||||
text = message;
|
text = message
|
||||||
open();
|
open()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function validateName(name){
|
function validateName(name) {
|
||||||
var profile_list = appSettings.profilesList;
|
var profile_list = appSettings.profilesList
|
||||||
if (name === "")
|
if (name === "")
|
||||||
return 1;
|
return 1
|
||||||
return 0;
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnLayout{
|
ColumnLayout {
|
||||||
anchors.margins: 10
|
anchors.margins: 10
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
RowLayout{
|
RowLayout {
|
||||||
Label{text: qsTr("Name")}
|
Label {
|
||||||
TextField{
|
text: qsTr("Name")
|
||||||
|
}
|
||||||
|
TextField {
|
||||||
id: namefield
|
id: namefield
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Component.onCompleted: forceActiveFocus()
|
Component.onCompleted: forceActiveFocus()
|
||||||
onAccepted: okbutton.clickAction()
|
onAccepted: okbutton.clickAction()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RowLayout{
|
RowLayout {
|
||||||
Layout.alignment: Qt.AlignBottom | Qt.AlignRight
|
Layout.alignment: Qt.AlignBottom | Qt.AlignRight
|
||||||
Button{
|
Button {
|
||||||
id: okbutton
|
id: okbutton
|
||||||
text: qsTr("OK")
|
text: qsTr("OK")
|
||||||
onClicked: clickAction()
|
onClicked: clickAction()
|
||||||
function clickAction(){
|
function clickAction() {
|
||||||
var name = namefield.text;
|
var name = namefield.text
|
||||||
switch(validateName(name)){
|
switch (validateName(name)) {
|
||||||
case 1:
|
case 1:
|
||||||
errorDialog.showError(qsTr("The name you inserted is empty. Please choose a different one."));
|
errorDialog.showError(
|
||||||
break;
|
qsTr("The name you inserted is empty. Please choose a different one."))
|
||||||
|
break
|
||||||
default:
|
default:
|
||||||
nameSelected(name);
|
nameSelected(name)
|
||||||
close();
|
close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Button{
|
Button {
|
||||||
text: qsTr("Cancel")
|
text: qsTr("Cancel")
|
||||||
onClicked: close()
|
onClicked: close()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,66 +0,0 @@
|
|||||||
import QtQuick 2.0
|
|
||||||
|
|
||||||
import "utils.js" as Utils
|
|
||||||
|
|
||||||
ShaderEffect {
|
|
||||||
property color _staticFrameColor: "#dedede"
|
|
||||||
property color _backgroundColor: appSettings.backgroundColor
|
|
||||||
property color _fontColor: appSettings.fontColor
|
|
||||||
property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2)
|
|
||||||
property real _ambientLight: Utils.lint(0.2, 0.8, appSettings.ambientLight)
|
|
||||||
|
|
||||||
property color frameColor: Utils.mix(_staticFrameColor, _lightColor, _ambientLight)
|
|
||||||
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
|
|
||||||
property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight)
|
|
||||||
|
|
||||||
fragmentShader: "
|
|
||||||
#ifdef GL_ES
|
|
||||||
precision mediump float;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
uniform lowp float screenCurvature;
|
|
||||||
uniform lowp float shadowLength;
|
|
||||||
uniform highp float qt_Opacity;
|
|
||||||
uniform lowp vec4 frameColor;
|
|
||||||
|
|
||||||
varying highp vec2 qt_TexCoord0;
|
|
||||||
|
|
||||||
vec2 distortCoordinates(vec2 coords){
|
|
||||||
vec2 cc = (coords - vec2(0.5));
|
|
||||||
float dist = dot(cc, cc) * screenCurvature;
|
|
||||||
return (coords + cc * (1.0 + dist) * dist);
|
|
||||||
}
|
|
||||||
|
|
||||||
float max2(vec2 v) {
|
|
||||||
return max(v.x, v.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
float min2(vec2 v) {
|
|
||||||
return min(v.x, v.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
float sum2(vec2 v) {
|
|
||||||
return v.x + v.y;
|
|
||||||
}
|
|
||||||
|
|
||||||
void main(){
|
|
||||||
vec2 staticCoords = qt_TexCoord0;
|
|
||||||
vec2 coords = distortCoordinates(staticCoords);
|
|
||||||
|
|
||||||
vec3 color = vec3(0.0);
|
|
||||||
float alpha = 0.0;
|
|
||||||
|
|
||||||
float outShadowLength = shadowLength;
|
|
||||||
|
|
||||||
float outShadow = max2(1.0 - smoothstep(vec2(-outShadowLength), vec2(0.0), coords) + smoothstep(vec2(1.0), vec2(1.0 + outShadowLength), coords));
|
|
||||||
outShadow = clamp(0.0, 1.0, outShadow);
|
|
||||||
color += frameColor.rgb * sqrt(outShadow);
|
|
||||||
alpha = sum2(1.0 - step(0.0, coords) + step(1.0, coords));
|
|
||||||
alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, sqrt(outShadow));
|
|
||||||
|
|
||||||
gl_FragColor = vec4(color * alpha, alpha);
|
|
||||||
}
|
|
||||||
"
|
|
||||||
|
|
||||||
onStatusChanged: if (log) console.log(log) //Print warning messages
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@@ -19,16 +19,18 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 2.0
|
||||||
|
|
||||||
import QMLTermWidget 1.0
|
import QMLTermWidget 2.0
|
||||||
|
|
||||||
|
import "menus"
|
||||||
import "utils.js" as Utils
|
import "utils.js" as Utils
|
||||||
|
|
||||||
Item{
|
Item{
|
||||||
id: terminalContainer
|
id: terminalContainer
|
||||||
|
signal sessionFinished()
|
||||||
|
|
||||||
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,46 +45,80 @@ Item{
|
|||||||
property size fontMetrics: kterminal.fontMetrics
|
property size fontMetrics: kterminal.fontMetrics
|
||||||
|
|
||||||
// Manage copy and paste
|
// Manage copy and paste
|
||||||
Connections{
|
Connections {
|
||||||
target: copyAction
|
target: copyAction
|
||||||
onTriggered: kterminal.copyClipboard();
|
|
||||||
|
onTriggered: {
|
||||||
|
kterminal.copyClipboard()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Connections{
|
Connections {
|
||||||
target: pasteAction
|
target: pasteAction
|
||||||
onTriggered: kterminal.pasteClipboard()
|
|
||||||
|
onTriggered: {
|
||||||
|
kterminal.pasteClipboard()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//When settings are updated sources need to be redrawn.
|
//When settings are updated sources need to be redrawn.
|
||||||
Connections{
|
Connections {
|
||||||
target: appSettings
|
target: appSettings
|
||||||
onFontScalingChanged: terminalContainer.updateSources();
|
|
||||||
onFontWidthChanged: terminalContainer.updateSources();
|
onFontScalingChanged: {
|
||||||
|
terminalContainer.updateSources()
|
||||||
|
}
|
||||||
|
|
||||||
|
onFontWidthChanged: {
|
||||||
|
terminalContainer.updateSources()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Connections{
|
Connections {
|
||||||
target: terminalContainer
|
target: terminalContainer
|
||||||
onWidthChanged: terminalContainer.updateSources();
|
|
||||||
onHeightChanged: terminalContainer.updateSources();
|
onWidthChanged: {
|
||||||
|
terminalContainer.updateSources()
|
||||||
|
}
|
||||||
|
|
||||||
|
onHeightChanged: {
|
||||||
|
terminalContainer.updateSources()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 ? Screen.devicePixelRatio : 1
|
||||||
|
property int margin: appSettings.margin / 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, Screen.devicePixelRatio)
|
||||||
|
height: ensureMultiple(rawHeight, Screen.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;
|
||||||
|
}
|
||||||
|
|
||||||
|
fullCursorHeight: true
|
||||||
|
blinkingCursor: appSettings.blinkingCursor
|
||||||
|
|
||||||
colorScheme: "cool-retro-term"
|
colorScheme: "cool-retro-term"
|
||||||
|
|
||||||
smooth: !appSettings.lowResolutionFont
|
|
||||||
enableBold: false
|
|
||||||
fullCursorHeight: true
|
|
||||||
|
|
||||||
session: QMLTermSession {
|
session: QMLTermSession {
|
||||||
id: ksession
|
id: ksession
|
||||||
|
|
||||||
onFinished: {
|
onFinished: {
|
||||||
Qt.quit()
|
terminalContainer.sessionFinished()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,26 +132,36 @@ Item{
|
|||||||
anchors.topMargin: 1
|
anchors.topMargin: 1
|
||||||
anchors.bottomMargin: 1
|
anchors.bottomMargin: 1
|
||||||
color: "white"
|
color: "white"
|
||||||
radius: width * 0.25
|
|
||||||
opacity: 0.7
|
opacity: 0.7
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleFontChanged(fontFamily, pixelSize, lineSpacing, screenScaling, fontWidth) {
|
function handleFontChanged(fontFamily, pixelSize, lineSpacing, screenScaling, fontWidth, fallbackFontFamily, lowResolutionFont) {
|
||||||
kterminal.antialiasText = !appSettings.lowResolutionFont;
|
kterminal.lineSpacing = lineSpacing;
|
||||||
font.pixelSize = pixelSize;
|
kterminal.antialiasText = !lowResolutionFont;
|
||||||
font.family = fontFamily;
|
kterminal.smooth = !lowResolutionFont;
|
||||||
|
kterminal.enableBold = !lowResolutionFont;
|
||||||
|
kterminal.enableItalic = !lowResolutionFont;
|
||||||
|
|
||||||
|
kterminal.font = Qt.font({
|
||||||
|
family: fontFamily,
|
||||||
|
pixelSize: pixelSize
|
||||||
|
});
|
||||||
|
|
||||||
terminalContainer.fontWidth = fontWidth;
|
terminalContainer.fontWidth = fontWidth;
|
||||||
terminalContainer.screenScaling = screenScaling;
|
terminalContainer.screenScaling = screenScaling;
|
||||||
scaleTexture = Math.max(1.0, Math.floor(screenScaling * appSettings.windowScaling));
|
scaleTexture = Math.max(1.0, Math.floor(screenScaling * appSettings.windowScaling));
|
||||||
|
}
|
||||||
|
|
||||||
kterminal.lineSpacing = lineSpacing;
|
Connections {
|
||||||
|
target: appSettings
|
||||||
|
|
||||||
|
onWindowScalingChanged: {
|
||||||
|
scaleTexture = Math.max(1.0, Math.floor(terminalContainer.screenScaling * appSettings.windowScaling));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function startSession() {
|
function startSession() {
|
||||||
appSettings.initializedSettings.disconnect(startSession);
|
|
||||||
|
|
||||||
// Retrieve the variable set in main.cpp if arguments are passed.
|
// Retrieve the variable set in main.cpp if arguments are passed.
|
||||||
if (defaultCmd) {
|
if (defaultCmd) {
|
||||||
ksession.setShellProgram(defaultCmd);
|
ksession.setShellProgram(defaultCmd);
|
||||||
@@ -124,7 +170,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"]);
|
||||||
}
|
}
|
||||||
@@ -136,78 +182,82 @@ Item{
|
|||||||
forceActiveFocus();
|
forceActiveFocus();
|
||||||
}
|
}
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
appSettings.terminalFontChanged.connect(handleFontChanged);
|
appSettings.fontManager.terminalFontChanged.connect(handleFontChanged);
|
||||||
appSettings.initializedSettings.connect(startSession);
|
appSettings.fontManager.refresh()
|
||||||
|
startSession();
|
||||||
|
}
|
||||||
|
Component.onDestruction: {
|
||||||
|
appSettings.fontManager.terminalFontChanged.disconnect(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 && !terminalWindow.fullscreen) ? shortContextMenu : fullContextMenu)
|
||||||
}
|
}
|
||||||
property alias contextmenu: menuLoader.item
|
property alias contextmenu: menuLoader.item
|
||||||
|
|
||||||
MouseArea{
|
MouseArea {
|
||||||
|
property real margin: appSettings.margin
|
||||||
|
property real frameSize: appSettings.frameSize * terminalWindow.normalizedWindowScale
|
||||||
|
|
||||||
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
|
||||||
onWheel:{
|
onWheel: function(wheel) {
|
||||||
if(wheel.modifiers & Qt.ControlModifier){
|
if (wheel.modifiers & Qt.ControlModifier) {
|
||||||
wheel.angleDelta.y > 0 ? zoomIn.trigger() : zoomOut.trigger();
|
wheel.angleDelta.y > 0 ? zoomIn.trigger() : zoomOut.trigger();
|
||||||
} else {
|
} else {
|
||||||
var coord = correctDistortion(wheel.x, wheel.y);
|
var coord = correctDistortion(wheel.x, wheel.y);
|
||||||
kterminal.simulateWheel(coord.x, coord.y, wheel.buttons, wheel.modifiers, wheel.angleDelta);
|
kterminal.simulateWheel(coord.x, coord.y, wheel.buttons, wheel.modifiers, wheel.angleDelta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
onDoubleClicked: {
|
onDoubleClicked: function(mouse) {
|
||||||
var coord = correctDistortion(mouse.x, mouse.y);
|
var coord = correctDistortion(mouse.x, mouse.y);
|
||||||
kterminal.simulateMouseDoubleClick(coord.x, coord.y, mouse.button, mouse.buttons, mouse.modifiers);
|
kterminal.simulateMouseDoubleClick(coord.x, coord.y, mouse.button, mouse.buttons, mouse.modifiers);
|
||||||
}
|
}
|
||||||
onPressed: {
|
onPressed: function(mouse) {
|
||||||
if((!kterminal.terminalUsesMouse || mouse.modifiers & Qt.ShiftModifier) && mouse.button == Qt.RightButton) {
|
kterminal.forceActiveFocus()
|
||||||
|
if ((!kterminal.terminalUsesMouse || mouse.modifiers & Qt.ShiftModifier) && mouse.button == Qt.RightButton) {
|
||||||
contextmenu.popup();
|
contextmenu.popup();
|
||||||
} else {
|
} else {
|
||||||
var coord = correctDistortion(mouse.x, mouse.y);
|
var coord = correctDistortion(mouse.x, mouse.y);
|
||||||
kterminal.simulateMousePress(coord.x, coord.y, mouse.button, mouse.buttons, mouse.modifiers)
|
kterminal.simulateMousePress(coord.x, coord.y, mouse.button, mouse.buttons, mouse.modifiers)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
onReleased: {
|
onReleased: function(mouse) {
|
||||||
var coord = correctDistortion(mouse.x, mouse.y);
|
var coord = correctDistortion(mouse.x, mouse.y);
|
||||||
kterminal.simulateMouseRelease(coord.x, coord.y, mouse.button, mouse.buttons, mouse.modifiers);
|
kterminal.simulateMouseRelease(coord.x, coord.y, mouse.button, mouse.buttons, mouse.modifiers);
|
||||||
}
|
}
|
||||||
onPositionChanged: {
|
onPositionChanged: function(mouse) {
|
||||||
var coord = correctDistortion(mouse.x, mouse.y);
|
var coord = correctDistortion(mouse.x, mouse.y);
|
||||||
kterminal.simulateMouseMove(coord.x, coord.y, mouse.button, mouse.buttons, mouse.modifiers);
|
kterminal.simulateMouseMove(coord.x, coord.y, mouse.button, mouse.buttons, mouse.modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
function correctDistortion(x, y){
|
function correctDistortion(x, y) {
|
||||||
x = x / width;
|
x = (x - margin) / width;
|
||||||
y = y / height;
|
y = (y - margin) / height;
|
||||||
|
|
||||||
|
x = x * (1 + frameSize * 2) - frameSize;
|
||||||
|
y = y * (1 + frameSize * 2) - frameSize;
|
||||||
|
|
||||||
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
|
||||||
|
* terminalWindow.normalizedWindowScale;
|
||||||
|
|
||||||
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 +266,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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
151
app/qml/SettingsAdvancedTab.qml
Normal file
151
app/qml/SettingsAdvancedTab.qml
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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
|
||||||
|
Layout.fillHeight: true
|
||||||
|
title: qsTr("Miscellaneous")
|
||||||
|
padding: appSettings.defaultMargin
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
CheckBox {
|
||||||
|
id: useCustomCommand
|
||||||
|
text: qsTr("Use custom command instead of shell at startup")
|
||||||
|
checked: appSettings.useCustomCommand
|
||||||
|
onCheckedChanged: appSettings.useCustomCommand = checked
|
||||||
|
}
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
CheckBox {
|
||||||
|
id: blinkingCursor
|
||||||
|
text: qsTr("Blinking Cursor")
|
||||||
|
checked: appSettings.blinkingCursor
|
||||||
|
onCheckedChanged: appSettings.blinkingCursor = checked
|
||||||
|
}
|
||||||
|
CheckBox {
|
||||||
|
id: showMenubar
|
||||||
|
text: qsTr("Show Menubar")
|
||||||
|
enabled: !appSettings.isMacOS
|
||||||
|
checked: appSettings.showMenubar
|
||||||
|
onCheckedChanged: appSettings.showMenubar = checked
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GroupBox {
|
||||||
|
title: qsTr("Performance")
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
padding: appSettings.defaultMargin
|
||||||
|
GridLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
columns: 4
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: qsTr("Effects FPS")
|
||||||
|
}
|
||||||
|
Slider {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
id: effectsFpsSlider
|
||||||
|
onValueChanged: appSettings.effectsFrameSkip = Math.round(value)
|
||||||
|
stepSize: 1
|
||||||
|
enabled: true
|
||||||
|
from: 5
|
||||||
|
to: 1
|
||||||
|
value: appSettings.effectsFrameSkip
|
||||||
|
}
|
||||||
|
|
||||||
|
SizedLabel {
|
||||||
|
text: Math.round(100 / Math.max(1, Math.round(effectsFpsSlider.value))) + "%"
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
text: qsTr("Texture Quality")
|
||||||
|
}
|
||||||
|
Slider {
|
||||||
|
id: txtslider
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
onValueChanged: appSettings.windowScaling = value
|
||||||
|
stepSize: 0.05
|
||||||
|
enabled: true
|
||||||
|
from: 0.25
|
||||||
|
value: appSettings.windowScaling
|
||||||
|
}
|
||||||
|
SizedLabel {
|
||||||
|
text: Math.round(txtslider.value * 100) + "%"
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: qsTr("Bloom Quality")
|
||||||
|
}
|
||||||
|
Slider {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
id: bloomSlider
|
||||||
|
onValueChanged: appSettings.bloomQuality = value
|
||||||
|
stepSize: 0.05
|
||||||
|
enabled: true
|
||||||
|
from: 0.25
|
||||||
|
value: appSettings.bloomQuality
|
||||||
|
}
|
||||||
|
SizedLabel {
|
||||||
|
text: Math.round(bloomSlider.value * 100) + "%"
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: qsTr("BurnIn Quality")
|
||||||
|
}
|
||||||
|
Slider {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
id: burnInSlider
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
onValueChanged: appSettings.burnInQuality = value
|
||||||
|
stepSize: 0.05
|
||||||
|
enabled: true
|
||||||
|
from: 0.25
|
||||||
|
value: appSettings.burnInQuality
|
||||||
|
}
|
||||||
|
SizedLabel {
|
||||||
|
text: Math.round(burnInSlider.value * 100) + "%"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@@ -17,98 +17,79 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 2.0
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
|
|
||||||
Tab{
|
ColumnLayout {
|
||||||
ColumnLayout{
|
Layout.fillWidth: true
|
||||||
anchors.fill: parent
|
Layout.fillHeight: true
|
||||||
spacing: 2
|
spacing: 2
|
||||||
|
|
||||||
GroupBox{
|
GroupBox {
|
||||||
title: qsTr("Effects")
|
title: qsTr("Effects")
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
padding: appSettings.defaultMargin
|
||||||
|
|
||||||
ColumnLayout {
|
ColumnLayout {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
CheckableSlider{
|
CheckableSlider {
|
||||||
name: qsTr("Bloom")
|
name: qsTr("Bloom")
|
||||||
onNewValue: appSettings.bloom = newValue
|
onNewValue: function(newValue) { appSettings.bloom = newValue }
|
||||||
value: appSettings.bloom
|
value: appSettings.bloom
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("BurnIn")
|
|
||||||
onNewValue: appSettings.burnIn = newValue
|
|
||||||
value: appSettings.burnIn
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("Static Noise")
|
|
||||||
onNewValue: appSettings.staticNoise = newValue
|
|
||||||
value: appSettings.staticNoise
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("Jitter")
|
|
||||||
onNewValue: appSettings.jitter = newValue
|
|
||||||
value: appSettings.jitter
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("Glow Line")
|
|
||||||
onNewValue: appSettings.glowingLine = newValue;
|
|
||||||
value: appSettings.glowingLine
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("Screen Curvature")
|
|
||||||
onNewValue: appSettings.screenCurvature = newValue;
|
|
||||||
value: appSettings.screenCurvature;
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("Ambient Light")
|
|
||||||
onNewValue: appSettings.ambientLight = newValue;
|
|
||||||
value: appSettings.ambientLight
|
|
||||||
enabled: appSettings.framesIndex !== 0
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("Flickering")
|
|
||||||
onNewValue: appSettings.flickering = newValue;
|
|
||||||
value: appSettings.flickering;
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("Horizontal Sync")
|
|
||||||
onNewValue: appSettings.horizontalSync = newValue;
|
|
||||||
value: appSettings.horizontalSync;
|
|
||||||
}
|
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("RGB Shift")
|
|
||||||
onNewValue: appSettings.rbgShift = newValue;
|
|
||||||
value: appSettings.rbgShift;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
CheckableSlider {
|
||||||
|
name: qsTr("BurnIn")
|
||||||
GroupBox{
|
onNewValue: function(newValue) { appSettings.burnIn = newValue }
|
||||||
title: qsTr("Lights")
|
value: appSettings.burnIn
|
||||||
Layout.fillWidth: true
|
}
|
||||||
GridLayout{
|
CheckableSlider {
|
||||||
anchors.fill: parent
|
name: qsTr("Static Noise")
|
||||||
columns: 2
|
onNewValue: function(newValue) { appSettings.staticNoise = newValue }
|
||||||
Label{ text: qsTr("Brightness") }
|
value: appSettings.staticNoise
|
||||||
SimpleSlider{
|
}
|
||||||
onValueChanged: appSettings.brightness = value
|
CheckableSlider {
|
||||||
value: appSettings.brightness
|
name: qsTr("Jitter")
|
||||||
}
|
onNewValue: function(newValue) { appSettings.jitter = newValue }
|
||||||
Label{ text: qsTr("Contrast") }
|
value: appSettings.jitter
|
||||||
SimpleSlider{
|
}
|
||||||
onValueChanged: appSettings.contrast = value
|
CheckableSlider {
|
||||||
value: appSettings.contrast
|
name: qsTr("Glow Line")
|
||||||
}
|
onNewValue: function(newValue) { appSettings.glowingLine = newValue }
|
||||||
Label{ text: qsTr("Opacity") }
|
value: appSettings.glowingLine
|
||||||
SimpleSlider{
|
}
|
||||||
onValueChanged: appSettings.windowOpacity = value
|
CheckableSlider {
|
||||||
value: appSettings.windowOpacity
|
name: qsTr("Screen Curvature")
|
||||||
}
|
onNewValue: function(newValue) { appSettings.screenCurvature = newValue }
|
||||||
|
value: appSettings.screenCurvature
|
||||||
|
}
|
||||||
|
CheckableSlider {
|
||||||
|
name: qsTr("Ambient Light")
|
||||||
|
onNewValue: function(newValue) { appSettings.ambientLight = newValue }
|
||||||
|
value: appSettings.ambientLight
|
||||||
|
enabled: appSettings.framesIndex !== 0
|
||||||
|
}
|
||||||
|
CheckableSlider {
|
||||||
|
name: qsTr("Flickering")
|
||||||
|
onNewValue: function(newValue) { appSettings.flickering = newValue }
|
||||||
|
value: appSettings.flickering
|
||||||
|
}
|
||||||
|
CheckableSlider {
|
||||||
|
name: qsTr("Horizontal Sync")
|
||||||
|
onNewValue: function(newValue) { appSettings.horizontalSync = newValue }
|
||||||
|
value: appSettings.horizontalSync
|
||||||
|
}
|
||||||
|
CheckableSlider {
|
||||||
|
name: qsTr("RGB Shift")
|
||||||
|
onNewValue: function(newValue) { appSettings.rgbShift = newValue }
|
||||||
|
value: appSettings.rgbShift
|
||||||
|
}
|
||||||
|
CheckableSlider {
|
||||||
|
name: qsTr("Frame Shininess")
|
||||||
|
onNewValue: function(newValue) { appSettings._frameShininess = newValue }
|
||||||
|
value: appSettings._frameShininess
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,262 @@
|
|||||||
* 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
|
||||||
|
|
||||||
Tab{
|
ColumnLayout {
|
||||||
ColumnLayout{
|
GroupBox {
|
||||||
anchors.fill: parent
|
Layout.fillWidth: true
|
||||||
GroupBox{
|
Layout.fillHeight: true
|
||||||
Layout.fillWidth: true
|
title: qsTr("Profile")
|
||||||
Layout.fillHeight: true
|
padding: appSettings.defaultMargin
|
||||||
title: qsTr("Profile")
|
RowLayout {
|
||||||
RowLayout {
|
anchors.fill: parent
|
||||||
anchors.fill: parent
|
ListView {
|
||||||
TableView {
|
id: profilesView
|
||||||
id: profilesView
|
Layout.fillWidth: true
|
||||||
Layout.fillWidth: true
|
Layout.fillHeight: true
|
||||||
Layout.fillHeight: true
|
model: appSettings.profilesList
|
||||||
model: appSettings.profilesList
|
clip: true
|
||||||
headerVisible: false
|
delegate: Rectangle {
|
||||||
TableViewColumn {
|
width: label.width
|
||||||
title: qsTr("Profile")
|
height: label.height
|
||||||
role: "text"
|
color: (index == profilesView.currentIndex) ? palette.highlight : palette.base
|
||||||
width: parent.width * 0.5
|
Label {
|
||||||
}
|
id: label
|
||||||
onActivated: {
|
text: appSettings.profilesList.get(index).text
|
||||||
appSettings.loadProfile(row);
|
MouseArea {
|
||||||
}
|
anchors.fill: parent
|
||||||
}
|
onClicked: profilesView.currentIndex = index
|
||||||
ColumnLayout {
|
onDoubleClicked: appSettings.loadProfile(index)
|
||||||
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
|
||||||
|
Layout.fillHeight: true
|
||||||
|
padding: appSettings.defaultMargin
|
||||||
|
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("Radius")
|
||||||
|
}
|
||||||
|
SimpleSlider {
|
||||||
|
onValueChanged: appSettings._screenRadius = value
|
||||||
|
value: appSettings._screenRadius
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
text: qsTr("Frame size")
|
||||||
|
}
|
||||||
|
SimpleSlider {
|
||||||
|
onValueChanged: appSettings._frameSize = value
|
||||||
|
value: appSettings._frameSize
|
||||||
|
}
|
||||||
|
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")
|
||||||
|
buttons: MessageDialog.Ok
|
||||||
|
onAccepted: {
|
||||||
|
messageDialog.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loader {
|
||||||
|
property var callBack
|
||||||
|
property bool selectExisting: false
|
||||||
|
id: fileDialog
|
||||||
|
|
||||||
|
sourceComponent: FileDialog {
|
||||||
|
nameFilters: ["Json files (*.json)"]
|
||||||
|
fileMode: fileDialog.selectExisting ? FileDialog.OpenFile : FileDialog.SaveFile
|
||||||
|
onAccepted: callBack(selectedFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
onSelectExistingChanged: reload()
|
||||||
|
|
||||||
|
function open() {
|
||||||
|
item.open()
|
||||||
|
}
|
||||||
|
|
||||||
|
function reload() {
|
||||||
|
active = false
|
||||||
|
active = true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,118 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
|
||||||
*
|
|
||||||
* This file is part of cool-retro-term.
|
|
||||||
*
|
|
||||||
* cool-retro-term is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
import QtQuick 2.2
|
|
||||||
import QtQuick.Controls 1.1
|
|
||||||
import QtQuick.Layouts 1.1
|
|
||||||
|
|
||||||
import "Components"
|
|
||||||
|
|
||||||
Tab{
|
|
||||||
ColumnLayout{
|
|
||||||
anchors.fill: parent
|
|
||||||
GroupBox{
|
|
||||||
title: qsTr("General")
|
|
||||||
Layout.fillWidth: true
|
|
||||||
GridLayout{
|
|
||||||
anchors.fill: parent
|
|
||||||
rows: 2
|
|
||||||
columns: 3
|
|
||||||
Label{text: qsTr("Effects FPS")}
|
|
||||||
Slider{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
id: fpsSlider
|
|
||||||
onValueChanged: {
|
|
||||||
if (enabled) {
|
|
||||||
appSettings.fps = value !== 60 ? value + 1 : 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stepSize: 1
|
|
||||||
enabled: false
|
|
||||||
Component.onCompleted: {
|
|
||||||
minimumValue = 0;
|
|
||||||
maximumValue = 60;
|
|
||||||
value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60;
|
|
||||||
enabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SizedLabel{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")}
|
|
||||||
Label{text: qsTr("Texture Quality")}
|
|
||||||
Slider{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
id: txtslider
|
|
||||||
onValueChanged: if (enabled) appSettings.windowScaling = value;
|
|
||||||
stepSize: 0.05
|
|
||||||
enabled: false
|
|
||||||
Component.onCompleted: {
|
|
||||||
minimumValue = 0.25 //Without this value gets set to 0.5
|
|
||||||
value = appSettings.windowScaling;
|
|
||||||
enabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SizedLabel{text: Math.round(txtslider.value * 100) + "%"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GroupBox{
|
|
||||||
title: qsTr("Bloom")
|
|
||||||
Layout.fillWidth: true
|
|
||||||
GridLayout{
|
|
||||||
id: bloomQualityContainer
|
|
||||||
anchors.fill: parent
|
|
||||||
Label{text: qsTr("Bloom Quality")}
|
|
||||||
Slider{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
id: bloomSlider
|
|
||||||
onValueChanged: if (enabled) appSettings.bloomQuality = value;
|
|
||||||
stepSize: 0.05
|
|
||||||
enabled: false
|
|
||||||
Component.onCompleted: {
|
|
||||||
minimumValue = 0.25
|
|
||||||
value = appSettings.bloomQuality;
|
|
||||||
enabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GroupBox{
|
|
||||||
title: qsTr("BurnIn")
|
|
||||||
Layout.fillWidth: true
|
|
||||||
GridLayout{
|
|
||||||
id: blurQualityContainer
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
Label{text: qsTr("BurnIn Quality")}
|
|
||||||
Slider{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
id: burnInSlider
|
|
||||||
onValueChanged: if (enabled) appSettings.burnInQuality = value;
|
|
||||||
stepSize: 0.05
|
|
||||||
enabled: false
|
|
||||||
Component.onCompleted: {
|
|
||||||
minimumValue = 0.25
|
|
||||||
value = appSettings.burnInQuality;
|
|
||||||
enabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@@ -17,138 +17,204 @@
|
|||||||
* 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{
|
GroupBox {
|
||||||
anchors.fill: parent
|
title: qsTr("Font")
|
||||||
|
Layout.fillWidth: true
|
||||||
GroupBox{
|
Layout.fillHeight: true
|
||||||
title: qsTr("Font")
|
padding: appSettings.defaultMargin
|
||||||
Layout.fillWidth: true
|
GridLayout {
|
||||||
GridLayout{
|
anchors.fill: parent
|
||||||
anchors.fill: parent
|
columns: 2
|
||||||
columns: 2
|
Label {
|
||||||
Label { text: qsTr("Rasterization") }
|
text: qsTr("Source")
|
||||||
ComboBox {
|
}
|
||||||
id: rasterizationBox
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
property string selectedElement: model[currentIndex]
|
RadioButton {
|
||||||
|
text: qsTr("Bundled")
|
||||||
Layout.fillWidth: true
|
checked: appSettings.fontSource === appSettings.bundled_fonts
|
||||||
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")]
|
onClicked: {
|
||||||
currentIndex: appSettings.rasterization
|
appSettings.fontSource = appSettings.bundled_fonts
|
||||||
onCurrentIndexChanged: {
|
|
||||||
appSettings.rasterization = currentIndex
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Label{ text: qsTr("Name") }
|
RadioButton {
|
||||||
ComboBox{
|
text: qsTr("System")
|
||||||
id: fontChanger
|
checked: appSettings.fontSource === appSettings.system_fonts
|
||||||
Layout.fillWidth: true
|
onClicked: {
|
||||||
model: appSettings.fontlist
|
appSettings.fontSource = appSettings.system_fonts
|
||||||
onActivated: {
|
|
||||||
var name = appSettings.fontlist.get(index).name;
|
|
||||||
appSettings.fontNames[appSettings.rasterization] = name;
|
|
||||||
appSettings.handleFontChanged();
|
|
||||||
}
|
|
||||||
function updateIndex(){
|
|
||||||
var name = appSettings.fontNames[appSettings.rasterization];
|
|
||||||
var index = appSettings.getIndexByName(name);
|
|
||||||
if (index !== undefined)
|
|
||||||
currentIndex = index;
|
|
||||||
}
|
|
||||||
Connections{
|
|
||||||
target: appSettings
|
|
||||||
onTerminalFontChanged: fontChanger.updateIndex();
|
|
||||||
}
|
|
||||||
Component.onCompleted: updateIndex();
|
|
||||||
}
|
|
||||||
Label{ text: qsTr("Scaling") }
|
|
||||||
RowLayout{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Slider{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
id: fontScalingChanger
|
|
||||||
onValueChanged: if(enabled) appSettings.fontScaling = value
|
|
||||||
stepSize: 0.05
|
|
||||||
enabled: false // Another trick to fix initial bad behavior.
|
|
||||||
Component.onCompleted: {
|
|
||||||
minimumValue = appSettings.minimumFontScaling;
|
|
||||||
maximumValue = appSettings.maximumFontScaling;
|
|
||||||
value = appSettings.fontScaling;
|
|
||||||
enabled = true;
|
|
||||||
}
|
|
||||||
Connections{
|
|
||||||
target: appSettings
|
|
||||||
onFontScalingChanged: fontScalingChanger.value = appSettings.fontScaling;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SizedLabel{
|
|
||||||
text: Math.round(fontScalingChanger.value * 100) + "%"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Label{ text: qsTr("Font Width") }
|
|
||||||
RowLayout{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Slider{
|
|
||||||
Layout.fillWidth: true
|
|
||||||
id: widthChanger
|
|
||||||
onValueChanged: appSettings.fontWidth = value;
|
|
||||||
value: appSettings.fontWidth
|
|
||||||
stepSize: 0.05
|
|
||||||
Component.onCompleted: {
|
|
||||||
// This is needed to avoid unnecessary chnaged events.
|
|
||||||
minimumValue = 0.5;
|
|
||||||
maximumValue = 1.5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SizedLabel{
|
|
||||||
text: Math.round(widthChanger.value * 100) + "%"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
Label {
|
||||||
GroupBox{
|
text: qsTr("Rendering")
|
||||||
title: qsTr("Colors")
|
enabled: appSettings.fontSource === appSettings.bundled_fonts
|
||||||
Layout.fillWidth: true
|
}
|
||||||
ColumnLayout{
|
ComboBox {
|
||||||
anchors.fill: parent
|
id: renderingBox
|
||||||
ColumnLayout{
|
|
||||||
Layout.fillWidth: true
|
property string selectedElement: model[currentIndex]
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("Chroma Color")
|
Layout.fillWidth: true
|
||||||
onNewValue: appSettings.chromaColor = newValue
|
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels"), qsTr("Sub-Pixels"), qsTr("Modern")]
|
||||||
value: appSettings.chromaColor
|
currentIndex: appSettings.rasterization
|
||||||
|
onCurrentIndexChanged: {
|
||||||
|
appSettings.rasterization = currentIndex
|
||||||
|
}
|
||||||
|
enabled: appSettings.fontSource === appSettings.bundled_fonts
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
text: qsTr("Name")
|
||||||
|
}
|
||||||
|
ComboBox {
|
||||||
|
id: fontChanger
|
||||||
|
Layout.fillWidth: true
|
||||||
|
model: appSettings.filteredFontList
|
||||||
|
textRole: "text"
|
||||||
|
onActivated: {
|
||||||
|
var font = appSettings.filteredFontList.get(currentIndex)
|
||||||
|
|
||||||
|
// If selecting a high-res font while not in Modern mode,
|
||||||
|
// switch to Modern to render at full resolution.
|
||||||
|
if (!font.lowResolutionFont && appSettings.rasterization !== appSettings.modern_rasterization) {
|
||||||
|
appSettings.rasterization = appSettings.modern_rasterization
|
||||||
}
|
}
|
||||||
CheckableSlider{
|
// If selecting a low-res font while in Modern mode, switch back to default.
|
||||||
name: qsTr("Saturation Color")
|
if (font.lowResolutionFont && appSettings.rasterization === appSettings.modern_rasterization) {
|
||||||
onNewValue: appSettings.saturationColor = newValue
|
appSettings.rasterization = appSettings.no_rasterization
|
||||||
value: appSettings.saturationColor
|
}
|
||||||
enabled: appSettings.chromaColor !== 0
|
|
||||||
|
appSettings.fontName = font.name
|
||||||
|
}
|
||||||
|
function updateIndex() {
|
||||||
|
for (var i = 0; i < appSettings.filteredFontList.count; i++) {
|
||||||
|
var font = appSettings.filteredFontList.get(i)
|
||||||
|
if (font.name === appSettings.fontName) {
|
||||||
|
currentIndex = i
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
currentIndex = 0
|
||||||
|
}
|
||||||
|
Connections {
|
||||||
|
target: appSettings.fontManager
|
||||||
|
|
||||||
|
onTerminalFontChanged: {
|
||||||
|
fontChanger.updateIndex()
|
||||||
|
}
|
||||||
|
|
||||||
|
onFilteredFontListChanged: {
|
||||||
|
fontChanger.updateIndex()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RowLayout{
|
Component.onCompleted: updateIndex()
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
text: qsTr("Scaling")
|
||||||
|
}
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Slider {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
ColorButton{
|
id: fontScalingChanger
|
||||||
name: qsTr("Font")
|
onValueChanged: appSettings.fontScaling = value
|
||||||
height: 50
|
value: appSettings.fontScaling
|
||||||
Layout.fillWidth: true
|
stepSize: 0.05
|
||||||
onColorSelected: appSettings._fontColor = color;
|
from: appSettings.minimumFontScaling
|
||||||
color: appSettings._fontColor
|
to: appSettings.maximumFontScaling
|
||||||
}
|
}
|
||||||
ColorButton{
|
SizedLabel {
|
||||||
name: qsTr("Background")
|
text: Math.round(fontScalingChanger.value * 100) + "%"
|
||||||
height: 50
|
}
|
||||||
Layout.fillWidth: true
|
}
|
||||||
onColorSelected: appSettings._backgroundColor = color;
|
Label {
|
||||||
color: appSettings._backgroundColor
|
text: qsTr("Font Width")
|
||||||
}
|
}
|
||||||
|
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) + "%"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
text: qsTr("Line Spacing")
|
||||||
|
}
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Slider {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
id: lineSpacingChanger
|
||||||
|
onValueChanged: appSettings.lineSpacing = value
|
||||||
|
value: appSettings.lineSpacing
|
||||||
|
stepSize: 0.01
|
||||||
|
from: 0.0
|
||||||
|
to: 1.0
|
||||||
|
}
|
||||||
|
SizedLabel {
|
||||||
|
text: Math.round(lineSpacingChanger.value * 100) + "%"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GroupBox {
|
||||||
|
title: qsTr("Colors")
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
padding: appSettings.defaultMargin
|
||||||
|
ColumnLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
ColumnLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
CheckableSlider {
|
||||||
|
name: qsTr("Chroma Color")
|
||||||
|
onNewValue: function(newValue) { appSettings.chromaColor = newValue }
|
||||||
|
value: appSettings.chromaColor
|
||||||
|
}
|
||||||
|
CheckableSlider {
|
||||||
|
name: qsTr("Saturation Color")
|
||||||
|
onNewValue: function(newValue) { appSettings.saturationColor = newValue }
|
||||||
|
value: appSettings.saturationColor
|
||||||
|
enabled: appSettings.chromaColor !== 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
ColorButton {
|
||||||
|
name: qsTr("Font")
|
||||||
|
height: 50
|
||||||
|
Layout.fillWidth: true
|
||||||
|
onColorSelected: appSettings._fontColor = color
|
||||||
|
color: appSettings._fontColor
|
||||||
|
}
|
||||||
|
ColorButton {
|
||||||
|
name: qsTr("Background")
|
||||||
|
height: 50
|
||||||
|
Layout.fillWidth: true
|
||||||
|
onColorSelected: appSettings._backgroundColor = color
|
||||||
|
color: appSettings._backgroundColor
|
||||||
|
}
|
||||||
|
ColorButton {
|
||||||
|
name: qsTr("Frame")
|
||||||
|
height: 50
|
||||||
|
Layout.fillWidth: true
|
||||||
|
onColorSelected: appSettings._frameColor = color
|
||||||
|
color: appSettings._frameColor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@@ -19,46 +19,58 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
ApplicationWindow {
|
||||||
|
readonly property real tabButtonPadding: 10
|
||||||
|
|
||||||
Window {
|
|
||||||
id: settings_window
|
id: settings_window
|
||||||
title: qsTr("Settings")
|
title: qsTr("Settings")
|
||||||
width: 580
|
width: 640
|
||||||
height: 500
|
height: 520
|
||||||
|
|
||||||
property int tabmargins: 15
|
Item {
|
||||||
|
anchors { fill: parent; }
|
||||||
|
|
||||||
TabView{
|
TabBar {
|
||||||
id: tabView
|
id: bar
|
||||||
anchors.fill: parent
|
anchors { left: parent.left; right: parent.right; top: parent.top; }
|
||||||
anchors.margins: 10
|
TabButton {
|
||||||
SettingsGeneralTab{
|
padding: tabButtonPadding
|
||||||
id: generalTab
|
text: qsTr("General")
|
||||||
title: qsTr("General")
|
}
|
||||||
anchors.fill: parent
|
TabButton {
|
||||||
anchors.margins: tabmargins
|
padding: tabButtonPadding
|
||||||
|
text: qsTr("Terminal")
|
||||||
|
}
|
||||||
|
TabButton {
|
||||||
|
padding: tabButtonPadding
|
||||||
|
text: qsTr("Effects")
|
||||||
|
}
|
||||||
|
TabButton {
|
||||||
|
padding: tabButtonPadding
|
||||||
|
text: qsTr("Advanced")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
SettingsTerminalTab{
|
|
||||||
id: terminalTab
|
StackLayout {
|
||||||
title: qsTr("Terminal")
|
anchors {
|
||||||
anchors.fill: parent
|
top: bar.bottom
|
||||||
anchors.margins: tabmargins
|
left: parent.left
|
||||||
}
|
right: parent.right
|
||||||
SettingsEffectsTab{
|
bottom: parent.bottom
|
||||||
id: effectsTab
|
margins: 16
|
||||||
title: qsTr("Effects")
|
}
|
||||||
anchors.fill: parent
|
|
||||||
anchors.margins: tabmargins
|
currentIndex: bar.currentIndex
|
||||||
}
|
|
||||||
SettingsPerformanceTab{
|
SettingsGeneralTab { }
|
||||||
id: performanceTab
|
SettingsTerminalTab { }
|
||||||
title: qsTr("Performance")
|
SettingsEffectsTab { }
|
||||||
anchors.fill: parent
|
SettingsAdvancedTab { }
|
||||||
anchors.margins: tabmargins
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,11 +19,34 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtGraphicalEffects 1.0
|
|
||||||
|
|
||||||
import "utils.js" as Utils
|
import "utils.js" as Utils
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
|
function dynamicFragmentPath() {
|
||||||
|
var rasterMode = appSettings.rasterization;
|
||||||
|
var burnInOn = appSettings.burnIn > 0 ? 1 : 0;
|
||||||
|
var frameOn = appSettings.frameEnabled ? 1 : 0;
|
||||||
|
var chromaOn = appSettings.chromaColor > 0 ? 1 : 0;
|
||||||
|
return "qrc:/shaders/terminal_dynamic_raster" + rasterMode +
|
||||||
|
"_burn" + burnInOn +
|
||||||
|
"_frame" + frameOn +
|
||||||
|
"_chroma" + chromaOn +
|
||||||
|
".frag.qsb";
|
||||||
|
}
|
||||||
|
|
||||||
|
function staticFragmentPath() {
|
||||||
|
var rgbShiftOn = appSettings.rgbShift > 0 ? 1 : 0;
|
||||||
|
var bloomOn = appSettings.bloom > 0 ? 1 : 0;
|
||||||
|
var curvatureOn = (appSettings.screenCurvature > 0 || appSettings.frameSize > 0) ? 1 : 0;
|
||||||
|
var shineOn = appSettings.frameShininess > 0 ? 1 : 0;
|
||||||
|
return "qrc:/shaders/terminal_static_rgb" + rgbShiftOn +
|
||||||
|
"_bloom" + bloomOn +
|
||||||
|
"_curve" + curvatureOn +
|
||||||
|
"_shine" + shineOn +
|
||||||
|
".frag.qsb";
|
||||||
|
}
|
||||||
|
|
||||||
property ShaderEffectSource source
|
property ShaderEffectSource source
|
||||||
property BurnInEffect burnInEffect
|
property BurnInEffect burnInEffect
|
||||||
property ShaderEffectSource bloomSource
|
property ShaderEffectSource bloomSource
|
||||||
@@ -31,475 +54,147 @@ Item {
|
|||||||
property color fontColor: appSettings.fontColor
|
property color fontColor: appSettings.fontColor
|
||||||
property color backgroundColor: appSettings.backgroundColor
|
property color backgroundColor: appSettings.backgroundColor
|
||||||
|
|
||||||
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
|
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize * terminalWindow.normalizedWindowScale
|
||||||
|
property real frameSize: appSettings.frameSize * terminalWindow.normalizedWindowScale
|
||||||
|
|
||||||
property real chromaColor: appSettings.chromaColor
|
property real chromaColor: appSettings.chromaColor
|
||||||
|
|
||||||
property real ambientLight: appSettings.ambientLight * 0.2
|
property real ambientLight: appSettings.ambientLight * 0.2
|
||||||
|
|
||||||
property size virtual_resolution
|
property size virtualResolution
|
||||||
|
property size screenResolution
|
||||||
ShaderEffect {
|
|
||||||
id: dynamicShader
|
property real _screenDensity: Math.min(
|
||||||
|
screenResolution.width / virtualResolution.width,
|
||||||
property ShaderEffectSource screenBuffer: frameBuffer
|
screenResolution.height / virtualResolution.height
|
||||||
property ShaderEffectSource burnInSource: burnInEffect.source
|
)
|
||||||
|
|
||||||
property color fontColor: parent.fontColor
|
ShaderEffect {
|
||||||
property color backgroundColor: parent.backgroundColor
|
id: dynamicShader
|
||||||
property real screenCurvature: parent.screenCurvature
|
|
||||||
property real chromaColor: parent.chromaColor
|
property ShaderEffectSource screenBuffer: frameBuffer
|
||||||
property real ambientLight: parent.ambientLight
|
property ShaderEffectSource burnInSource: burnInEffect.effectSource
|
||||||
|
property ShaderEffectSource frameSource: terminalFrameLoader.item
|
||||||
property real flickering: appSettings.flickering
|
|
||||||
property real horizontalSync: appSettings.horizontalSync * 0.5
|
|
||||||
property real glowingLine: appSettings.glowingLine * 0.2
|
|
||||||
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 shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight)
|
|
||||||
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 size virtual_resolution: parent.virtual_resolution
|
|
||||||
|
|
||||||
property real time: timeManager.time
|
|
||||||
property ShaderEffectSource noiseSource: noiseShaderSource
|
|
||||||
|
|
||||||
// If something goes wrong activate the fallback version of the shader.
|
|
||||||
property bool fallBack: false
|
|
||||||
|
|
||||||
anchors.fill: parent
|
|
||||||
blending: false
|
|
||||||
|
|
||||||
//Smooth random texture used for flickering effect.
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
//Print the number with a reasonable precision for the shader.
|
|
||||||
function str(num){
|
|
||||||
return num.toFixed(8);
|
|
||||||
}
|
|
||||||
|
|
||||||
vertexShader: "
|
|
||||||
uniform highp mat4 qt_Matrix;
|
|
||||||
uniform highp float time;
|
|
||||||
|
|
||||||
attribute highp vec4 qt_Vertex;
|
|
||||||
attribute highp vec2 qt_MultiTexCoord0;
|
|
||||||
|
|
||||||
varying highp vec2 qt_TexCoord0;" +
|
|
||||||
|
|
||||||
(!fallBack ? "
|
|
||||||
uniform sampler2D noiseSource;" : "") +
|
|
||||||
|
|
||||||
(!fallBack && flickering !== 0.0 ?"
|
|
||||||
varying lowp float brightness;
|
|
||||||
uniform lowp float flickering;" : "") +
|
|
||||||
|
|
||||||
(!fallBack && horizontalSync !== 0.0 ?"
|
|
||||||
uniform lowp float horizontalSync;
|
|
||||||
varying lowp float distortionScale;
|
|
||||||
varying lowp float distortionFreq;" : "") +
|
|
||||||
|
|
||||||
"
|
|
||||||
void main() {
|
|
||||||
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) ?
|
|
||||||
"vec4 initialNoiseTexel = texture2D(noiseSource, coords);"
|
|
||||||
: "") +
|
|
||||||
|
|
||||||
(!fallBack && flickering !== 0.0 ? "
|
|
||||||
brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
|
|
||||||
: "") +
|
|
||||||
|
|
||||||
(!fallBack && horizontalSync !== 0.0 ? "
|
|
||||||
float randval = horizontalSync - initialNoiseTexel.r;
|
|
||||||
distortionScale = step(0.0, randval) * randval * horizontalSync;
|
|
||||||
distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
|
|
||||||
: "") +
|
|
||||||
|
|
||||||
"gl_Position = qt_Matrix * qt_Vertex;
|
|
||||||
}"
|
|
||||||
|
|
||||||
fragmentShader: "
|
|
||||||
#ifdef GL_ES
|
|
||||||
precision mediump float;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
uniform sampler2D screenBuffer;
|
|
||||||
uniform highp float qt_Opacity;
|
|
||||||
uniform highp float time;
|
|
||||||
varying highp vec2 qt_TexCoord0;
|
|
||||||
|
|
||||||
uniform highp vec4 fontColor;
|
|
||||||
uniform highp vec4 backgroundColor;
|
|
||||||
uniform lowp float shadowLength;
|
|
||||||
|
|
||||||
uniform highp vec2 virtual_resolution;" +
|
|
||||||
|
|
||||||
(burnIn !== 0 ? "
|
|
||||||
uniform sampler2D burnInSource;
|
|
||||||
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;" : "") +
|
|
||||||
(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 && horizontalSync !== 0 ? "
|
|
||||||
uniform lowp float horizontalSync;" : "") +
|
|
||||||
(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;" : "") +
|
|
||||||
|
|
||||||
(glowingLine !== 0 ? "
|
|
||||||
float randomPass(vec2 coords){
|
|
||||||
return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015)));
|
|
||||||
}" : "") +
|
|
||||||
|
|
||||||
"float min2(vec2 v) {
|
|
||||||
return min(v.x, v.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
float rgb2grey(vec3 v){
|
|
||||||
return dot(v, vec3(0.21, 0.72, 0.04));
|
|
||||||
}
|
|
||||||
|
|
||||||
float isInScreen(vec2 v) {
|
|
||||||
return min2(step(0.0, v) - step(1.0, v));
|
|
||||||
}
|
|
||||||
|
|
||||||
vec2 barrel(vec2 v, vec2 cc) {" +
|
|
||||||
|
|
||||||
(screenCurvature !== 0 ? "
|
|
||||||
float distortion = dot(cc, cc) * screenCurvature;
|
|
||||||
return (v - cc * (1.0 + distortion) * distortion);"
|
|
||||||
:
|
|
||||||
"return v;") +
|
|
||||||
"}" +
|
|
||||||
|
|
||||||
"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;
|
|
||||||
}" +
|
|
||||||
|
|
||||||
"void main() {" +
|
|
||||||
"vec2 cc = vec2(0.5) - qt_TexCoord0;" +
|
|
||||||
"float distance = length(cc);" +
|
|
||||||
|
|
||||||
//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 = horizontalSync - initialNoiseTexel.r;
|
|
||||||
float distortionScale = step(0.0, randval) * randval * horizontalSync;
|
|
||||||
float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
|
|
||||||
: "") +
|
|
||||||
|
|
||||||
(staticNoise ? "
|
|
||||||
float noise = staticNoise;" : "") +
|
|
||||||
|
|
||||||
(screenCurvature !== 0 ? "
|
|
||||||
vec2 curvatureCoords = barrel(qt_TexCoord0, cc);
|
|
||||||
float staticInScreen = min2(step(0.0, curvatureCoords) - step(1.0, curvatureCoords));
|
|
||||||
vec2 staticCoords = curvatureCoords;"
|
|
||||||
:"
|
|
||||||
vec2 staticCoords = qt_TexCoord0;
|
|
||||||
float staticInScreen = 1.0;") +
|
|
||||||
|
|
||||||
"vec2 coords = qt_TexCoord0;" +
|
|
||||||
|
|
||||||
(horizontalSync !== 0 ? "
|
|
||||||
float dst = sin((coords.y + time * 0.001) * distortionFreq);
|
|
||||||
coords.x += dst * distortionScale;" +
|
|
||||||
|
|
||||||
(staticNoise ? "
|
|
||||||
noise += distortionScale * 7.0;" : "")
|
|
||||||
|
|
||||||
: "") +
|
|
||||||
|
|
||||||
(jitter !== 0 || staticNoise !== 0 ?
|
|
||||||
"vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));"
|
|
||||||
: "") +
|
|
||||||
|
|
||||||
(jitter !== 0 ? "
|
|
||||||
vec2 offset = vec2(noiseTexel.b, noiseTexel.a) - vec2(0.5);
|
|
||||||
vec2 txt_coords = coords + offset * jitterDisplacement;"
|
|
||||||
: "vec2 txt_coords = coords;") +
|
|
||||||
|
|
||||||
"float color = 0.0001;" +
|
property color fontColor: parent.fontColor
|
||||||
|
property color backgroundColor: parent.backgroundColor
|
||||||
|
property real screenCurvature: parent.screenCurvature
|
||||||
|
property real chromaColor: parent.chromaColor
|
||||||
|
property real ambientLight: parent.ambientLight
|
||||||
|
|
||||||
(staticNoise !== 0 ? "
|
property real flickering: appSettings.flickering
|
||||||
float noiseVal = noiseTexel.a;
|
property real horizontalSync: appSettings.horizontalSync
|
||||||
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
|
property real horizontalSyncStrength: Utils.lint(0.05, 0.35, horizontalSync)
|
||||||
|
property real glowingLine: appSettings.glowingLine * 0.2
|
||||||
|
|
||||||
(glowingLine !== 0 ? "
|
// Fast burnin properties
|
||||||
color += randomPass(coords * virtual_resolution) * glowingLine;" : "") +
|
property real burnIn: appSettings.burnIn
|
||||||
|
property real burnInLastUpdate: burnInEffect.lastUpdate
|
||||||
|
property real burnInTime: burnInEffect.burnInFadeTime
|
||||||
|
|
||||||
"txt_coords = mix(qt_TexCoord0, txt_coords, staticInScreen);
|
property real jitter: appSettings.jitter
|
||||||
float inScreen2 = isInScreen(barrel(txt_coords, cc));
|
property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter)
|
||||||
vec3 origTxtColor = texture2D(screenBuffer, txt_coords).rgb;
|
property real staticNoise: appSettings.staticNoise
|
||||||
vec3 txt_color = mix(backgroundColor.rgb, origTxtColor, inScreen2);" +
|
property size scaleNoiseSize: Qt.size((width * 0.75) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
|
||||||
|
(height * 0.75) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
|
||||||
|
|
||||||
|
property size virtualResolution: parent.virtualResolution
|
||||||
|
|
||||||
|
// Rasterization might display oversamping issues if virtual resolution is close to physical display resolution.
|
||||||
|
// We progressively disable rasterization from 4x up to 2x resolution.
|
||||||
|
property real rasterizationIntensity: Utils.smoothstep(2.0, 4.0, _screenDensity)
|
||||||
|
|
||||||
|
property real time: timeManager ? timeManager.time : 0
|
||||||
|
property ShaderEffectSource noiseSource: noiseShaderSource
|
||||||
|
|
||||||
|
property real frameSize: parent.frameSize
|
||||||
|
property real frameShininess: appSettings.frameShininess
|
||||||
|
property real bloom: parent.bloomSource ? appSettings.bloom * 2.5 : 0
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
blending: false
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
vertexShader: "qrc:/shaders/terminal_dynamic.vert.qsb"
|
||||||
|
fragmentShader: dynamicFragmentPath()
|
||||||
|
|
||||||
|
onStatusChanged: if (log) console.log(log)
|
||||||
|
}
|
||||||
|
|
||||||
|
Loader {
|
||||||
|
id: terminalFrameLoader
|
||||||
|
|
||||||
|
active: appSettings.frameEnabled
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ShaderEffect {
|
||||||
|
id: staticShader
|
||||||
|
|
||||||
|
width: parent.width * appSettings.windowScaling
|
||||||
|
height: parent.height * appSettings.windowScaling
|
||||||
|
|
||||||
|
property ShaderEffectSource source: parent.source
|
||||||
|
property ShaderEffectSource bloomSource: parent.bloomSource
|
||||||
|
|
||||||
(burnIn !== 0 ? "
|
property color fontColor: parent.fontColor
|
||||||
vec4 txt_blur = texture2D(burnInSource, staticCoords);
|
property color backgroundColor: parent.backgroundColor
|
||||||
float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0);
|
property real bloom: bloomSource ? appSettings.bloom * 2.5 : 0
|
||||||
vec3 burnInColor = 0.65 * (txt_blur.rgb - vec3(blurDecay));
|
|
||||||
txt_color = max(txt_color, convertWithChroma(burnInColor));"
|
|
||||||
: "") +
|
|
||||||
|
|
||||||
"txt_color += fontColor.rgb * vec3(color);" +
|
property real screenCurvature: parent.screenCurvature
|
||||||
|
|
||||||
|
property real chromaColor: appSettings.chromaColor;
|
||||||
|
|
||||||
"vec3 finalColor = txt_color;" +
|
property real rgbShift: appSettings.rgbShift * (4.0 / width) * appSettings.totalFontScaling
|
||||||
|
|
||||||
|
property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness)
|
||||||
|
property real frameShininess: appSettings.frameShininess
|
||||||
|
property real frameSize: parent.frameSize
|
||||||
|
|
||||||
(flickering !== 0 ? "
|
blending: false
|
||||||
finalColor *= brightness;" : "") +
|
visible: false
|
||||||
|
|
||||||
(ambientLight !== 0 ? "
|
vertexShader: "qrc:/shaders/terminal_static.vert.qsb"
|
||||||
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
|
fragmentShader: staticFragmentPath()
|
||||||
|
|
||||||
|
onStatusChanged: if (log) console.log(log)
|
||||||
|
}
|
||||||
|
|
||||||
"float inShadow = 1.0 - min2(smoothstep(0.0, shadowLength, staticCoords) - smoothstep(1.0 - shadowLength, 1.0, staticCoords));
|
ShaderEffectSource {
|
||||||
inShadow = pow(inShadow, 100.0) + 0.35 * inShadow * inShadow; // Inner shadow and antialiasing when screen background is bright.
|
id: frameBuffer
|
||||||
finalColor = mix(finalColor, vec3(0.0), inShadow);
|
visible: false
|
||||||
|
sourceItem: staticShader
|
||||||
finalColor = mix(origTxtColor, finalColor, staticInScreen);
|
hideSource: true
|
||||||
gl_FragColor = vec4(finalColor, qt_Opacity);" +
|
}
|
||||||
"}"
|
|
||||||
|
|
||||||
onStatusChanged: {
|
|
||||||
// Print warning messages
|
|
||||||
if (log)
|
|
||||||
console.log(log);
|
|
||||||
|
|
||||||
// Activate fallback mode
|
|
||||||
if (status == ShaderEffect.Error) {
|
|
||||||
fallBack = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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 virtual_resolution: parent.virtual_resolution
|
|
||||||
|
|
||||||
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 virtual_resolution;" +
|
|
||||||
|
|
||||||
(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;" : "") +
|
|
||||||
|
|
||||||
"highp float getScanlineIntensity(vec2 coords) {
|
|
||||||
float result = 1.0;" +
|
|
||||||
|
|
||||||
(appSettings.rasterization != appSettings.no_rasterization ?
|
|
||||||
"float val = 0.0;
|
|
||||||
vec2 rasterizationCoords = fract(coords * virtual_resolution);
|
|
||||||
val += smoothstep(0.0, 0.5, rasterizationCoords.y);
|
|
||||||
val -= smoothstep(0.5, 1.0, rasterizationCoords.y);
|
|
||||||
result *= mix(0.5, 1.0, val);" : "") +
|
|
||||||
|
|
||||||
(appSettings.rasterization == appSettings.pixel_rasterization ?
|
|
||||||
"val = 0.0;
|
|
||||||
val += smoothstep(0.0, 0.5, rasterizationCoords.x);
|
|
||||||
val -= smoothstep(0.5, 1.0, rasterizationCoords.x);
|
|
||||||
result *= mix(0.5, 1.0, val);" : "") + "
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
float min2(vec2 v) {
|
|
||||||
return min(v.x, v.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
float rgb2grey(vec3 v){
|
|
||||||
return dot(v, vec3(0.21, 0.72, 0.04));
|
|
||||||
}" +
|
|
||||||
|
|
||||||
"vec3 convertWithChroma(vec3 inColor) {
|
|
||||||
vec3 outColor = inColor;" +
|
|
||||||
|
|
||||||
(chromaColor !== 0 ?
|
|
||||||
"outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor);"
|
|
||||||
:
|
|
||||||
"outColor = fontColor.rgb * rgb2grey(inColor);") +
|
|
||||||
|
|
||||||
" return outColor;
|
|
||||||
}" +
|
|
||||||
|
|
||||||
|
|
||||||
"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 *= getScanlineIntensity(txt_coords);" +
|
|
||||||
|
|
||||||
"txt_color += vec3(0.0001);" +
|
|
||||||
"float greyscale_color = rgb2grey(txt_color);" +
|
|
||||||
|
|
||||||
(chromaColor !== 0 ?
|
|
||||||
"vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor);
|
|
||||||
vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color);"
|
|
||||||
:
|
|
||||||
"vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color);") +
|
|
||||||
|
|
||||||
(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;" +
|
|
||||||
|
|
||||||
(screenCurvature !== 0 ? "
|
|
||||||
vec2 curvatureMask = step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords);
|
|
||||||
finalColor *= clamp(0.0, 1.0, curvatureMask.x + curvatureMask.y);"
|
|
||||||
:"") +
|
|
||||||
|
|
||||||
"gl_FragColor = vec4(finalColor, qt_Opacity);" +
|
|
||||||
"}"
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
anchors.fill: parent
|
|
||||||
active: screenCurvature !== 0
|
|
||||||
|
|
||||||
sourceComponent: NewTerminalFrame {
|
|
||||||
blending: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onStatusChanged: {
|
|
||||||
// Print warning messages
|
|
||||||
if (log) console.log(log);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ShaderEffectSource {
|
|
||||||
id: frameBuffer
|
|
||||||
visible: false
|
|
||||||
sourceItem: staticShader
|
|
||||||
hideSource: true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@@ -17,9 +17,8 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 2.0
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
|
|
||||||
import "Components"
|
import "Components"
|
||||||
@@ -27,18 +26,18 @@ import "Components"
|
|||||||
RowLayout {
|
RowLayout {
|
||||||
property alias value: slider.value
|
property alias value: slider.value
|
||||||
property alias stepSize: slider.stepSize
|
property alias stepSize: slider.stepSize
|
||||||
property alias minimumValue: slider.minimumValue
|
property alias minimumValue: slider.from
|
||||||
property alias maximumValue: slider.maximumValue
|
property alias maximumValue: slider.to
|
||||||
property real maxMultiplier: 100
|
property real maxMultiplier: 100
|
||||||
|
|
||||||
id: setting_component
|
id: setting_component
|
||||||
spacing: 10
|
spacing: 10
|
||||||
Slider{
|
Slider {
|
||||||
id: slider
|
id: slider
|
||||||
stepSize: parent.stepSize
|
stepSize: parent.stepSize
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
}
|
}
|
||||||
SizedLabel{
|
SizedLabel {
|
||||||
text: Math.round(value * maxMultiplier) + "%"
|
text: Math.round(value * maxMultiplier) + "%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@@ -17,31 +17,33 @@
|
|||||||
* 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.5
|
||||||
|
|
||||||
width: textSize.width * 2
|
width: textSize.width * 2
|
||||||
height: textSize.height * 2
|
height: textSize.height * 2
|
||||||
radius: 5
|
radius: 5
|
||||||
border.width: 2
|
|
||||||
border.color: "white"
|
|
||||||
color: "black"
|
color: "black"
|
||||||
opacity: sizetimer.running ? 0.6 : 0.0
|
opacity: sizetimer.running ? 0.5 : 0.0
|
||||||
|
|
||||||
Behavior on opacity{NumberAnimation{duration: 200}}
|
Behavior on opacity {
|
||||||
|
NumberAnimation {
|
||||||
|
duration: 200
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onTerminalSizeChanged: sizetimer.restart()
|
onTerminalSizeChanged: sizetimer.restart()
|
||||||
|
|
||||||
Text{
|
Text {
|
||||||
id: textSize
|
id: textSize
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
color: "white"
|
color: "white"
|
||||||
text: terminalSize.width + "x" + terminalSize.height
|
text: terminalSize.width + "x" + terminalSize.height
|
||||||
}
|
}
|
||||||
Timer{
|
Timer {
|
||||||
id: sizetimer
|
id: sizetimer
|
||||||
interval: 1000
|
interval: 1000
|
||||||
running: false
|
running: false
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
*
|
*
|
||||||
* This file is part of cool-retro-term.
|
* This file is part of cool-retro-term.
|
||||||
@@ -22,12 +22,12 @@ import QtQuick 2.2
|
|||||||
import QtQuick.LocalStorage 2.0
|
import QtQuick.LocalStorage 2.0
|
||||||
|
|
||||||
QtObject {
|
QtObject {
|
||||||
readonly property string dbMajorVersion: "1"
|
readonly property string dbMajorVersion: "2"
|
||||||
readonly property string dbMinorVersion: "1.0"
|
readonly property string dbMinorVersion: "1.0"
|
||||||
property bool initialized: false
|
property bool initialized: false
|
||||||
|
|
||||||
function getDatabase() {
|
function getDatabase() {
|
||||||
return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000);
|
return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000)
|
||||||
}
|
}
|
||||||
|
|
||||||
function initialize() {
|
function initialize() {
|
||||||
@@ -35,43 +35,47 @@ QtObject {
|
|||||||
db.transaction(
|
db.transaction(
|
||||||
function(tx) {
|
function(tx) {
|
||||||
tx.executeSql('CREATE TABLE IF NOT EXISTS settings(setting TEXT UNIQUE, value TEXT)');
|
tx.executeSql('CREATE TABLE IF NOT EXISTS settings(setting TEXT UNIQUE, value TEXT)');
|
||||||
});
|
}
|
||||||
|
)
|
||||||
|
|
||||||
initialized = true;
|
initialized = true
|
||||||
}
|
}
|
||||||
|
|
||||||
function setSetting(setting, value) {
|
function setSetting(setting, value) {
|
||||||
if(!initialized) initialize();
|
if(!initialized) initialize();
|
||||||
|
|
||||||
var db = getDatabase();
|
var db = getDatabase();
|
||||||
var res = "";
|
var res = "";
|
||||||
db.transaction(function(tx) {
|
db.transaction(
|
||||||
var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]);
|
function(tx) {
|
||||||
//console.log(rs.rowsAffected)
|
var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]);
|
||||||
if (rs.rowsAffected > 0) {
|
//console.log(rs.rowsAffected)
|
||||||
|
if (rs.rowsAffected > 0) {
|
||||||
res = "OK";
|
res = "OK";
|
||||||
} else {
|
} else {
|
||||||
res = "Error";
|
res = "Error";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
// The function returns “OK” if it was successful, or “Error” if it wasn't
|
// The function returns “OK” if it was successful, or “Error” if it wasn't
|
||||||
return res;
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSetting(setting) {
|
function getSetting(setting) {
|
||||||
if(!initialized) initialize();
|
if(!initialized) initialize();
|
||||||
var db = getDatabase();
|
var db = getDatabase();
|
||||||
var res="";
|
var res = "";
|
||||||
db.transaction(function(tx) {
|
db.transaction(
|
||||||
var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]);
|
function(tx) {
|
||||||
if (rs.rows.length > 0) {
|
var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]);
|
||||||
res = rs.rows.item(0).value;
|
if (rs.rows.length > 0) {
|
||||||
} else {
|
res = rs.rows.item(0).value;
|
||||||
res = undefined;
|
} else {
|
||||||
}
|
res = undefined;
|
||||||
})
|
}
|
||||||
return res
|
}
|
||||||
|
)
|
||||||
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
function dropSettings(){
|
function dropSettings(){
|
||||||
@@ -79,6 +83,7 @@ QtObject {
|
|||||||
db.transaction(
|
db.transaction(
|
||||||
function(tx) {
|
function(tx) {
|
||||||
tx.executeSql('DROP TABLE settings');
|
tx.executeSql('DROP TABLE settings');
|
||||||
});
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,123 +1,81 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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 Qt5Compat.GraphicalEffects
|
||||||
|
|
||||||
import "utils.js" as Utils
|
import "utils.js" as Utils
|
||||||
|
|
||||||
ShaderTerminal {
|
ShaderTerminal {
|
||||||
property alias title: terminal.title
|
property alias title: terminal.title
|
||||||
property alias terminalSize: terminal.terminalSize
|
property alias terminalSize: terminal.terminalSize
|
||||||
|
signal sessionFinished()
|
||||||
|
|
||||||
|
property bool loadBloomEffect: appSettings.bloom > 0 || appSettings._frameShininess > 0
|
||||||
|
|
||||||
id: mainShader
|
id: mainShader
|
||||||
opacity: appSettings.windowOpacity * 0.3 + 0.7
|
opacity: appSettings.windowOpacity * 0.3 + 0.7
|
||||||
|
|
||||||
source: terminal.mainSource
|
source: terminal.mainSource
|
||||||
burnInEffect: terminal.burnInEffect
|
burnInEffect: terminal.burnInEffect
|
||||||
virtual_resolution: terminal.virtualResolution
|
virtualResolution: terminal.virtualResolution
|
||||||
|
screenResolution: Qt.size(
|
||||||
|
terminalWindow.width * Screen.devicePixelRatio * appSettings.windowScaling,
|
||||||
|
terminalWindow.height * Screen.devicePixelRatio * appSettings.windowScaling
|
||||||
|
)
|
||||||
|
bloomSource: bloomSourceLoader.item
|
||||||
|
|
||||||
TimeManager{
|
PreprocessedTerminal {
|
||||||
id: timeManager
|
|
||||||
enableTimer: terminalWindow.visible
|
|
||||||
}
|
|
||||||
|
|
||||||
PreprocessedTerminal{
|
|
||||||
id: terminal
|
id: terminal
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
onSessionFinished: mainShader.sessionFinished()
|
||||||
|
}
|
||||||
|
|
||||||
|
function activate() {
|
||||||
|
terminal.mainTerminal.forceActiveFocus()
|
||||||
}
|
}
|
||||||
|
|
||||||
// EFFECTS ////////////////////////////////////////////////////////////////
|
// EFFECTS ////////////////////////////////////////////////////////////////
|
||||||
|
Loader {
|
||||||
Loader{
|
|
||||||
id: bloomEffectLoader
|
id: bloomEffectLoader
|
||||||
active: appSettings.bloom
|
active: loadBloomEffect
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
width: parent.width * appSettings.bloomQuality
|
width: parent.width * appSettings.bloomQuality
|
||||||
height: parent.height * appSettings.bloomQuality
|
height: parent.height * appSettings.bloomQuality
|
||||||
|
|
||||||
sourceComponent: FastBlur{
|
sourceComponent: FastBlur {
|
||||||
radius: Utils.lint(16, 64, appSettings.bloomQuality);
|
radius: Utils.lint(16, 64, appSettings.bloomQuality)
|
||||||
source: terminal.mainSource
|
source: terminal.mainSource
|
||||||
transparentBorder: true
|
transparentBorder: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loader{
|
Loader {
|
||||||
id: bloomSourceLoader
|
id: bloomSourceLoader
|
||||||
active: appSettings.bloom !== 0
|
active: loadBloomEffect
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
sourceComponent: ShaderEffectSource{
|
sourceComponent: ShaderEffectSource {
|
||||||
id: _bloomEffectSource
|
id: _bloomEffectSource
|
||||||
sourceItem: bloomEffectLoader.item
|
sourceItem: bloomEffectLoader.item
|
||||||
|
wrapMode: ShaderEffectSource.Repeat
|
||||||
hideSource: true
|
hideSource: true
|
||||||
smooth: true
|
smooth: true
|
||||||
visible: false
|
visible: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|||||||
52
app/qml/TerminalFrame.qml
Normal file
52
app/qml/TerminalFrame.qml
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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: Utils.sum(appSettings.frameColor, Qt.rgba(0.1, 0.1, 0.1, 1.0))
|
||||||
|
property color _backgroundColor: appSettings.backgroundColor
|
||||||
|
property color _fontColor: appSettings.fontColor
|
||||||
|
property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2)
|
||||||
|
|
||||||
|
property color frameColor: Utils.mix(
|
||||||
|
Utils.scaleColor(_lightColor, 0.2),
|
||||||
|
_staticFrameColor,
|
||||||
|
0.125 + 0.750 * ambientLight
|
||||||
|
)
|
||||||
|
|
||||||
|
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize * terminalWindow.normalizedWindowScale
|
||||||
|
|
||||||
|
property real frameShininess: appSettings.frameShininess
|
||||||
|
|
||||||
|
property real frameSize: appSettings.frameSize * terminalWindow.normalizedWindowScale
|
||||||
|
|
||||||
|
property real screenRadius: appSettings.screenRadius
|
||||||
|
|
||||||
|
property size viewportSize: Qt.size(width / appSettings.windowScaling, height / appSettings.windowScaling)
|
||||||
|
|
||||||
|
property real ambientLight: appSettings.ambientLight
|
||||||
|
|
||||||
|
vertexShader: "qrc:/shaders/terminal_frame.vert.qsb"
|
||||||
|
fragmentShader: "qrc:/shaders/terminal_frame.frag.qsb"
|
||||||
|
|
||||||
|
onStatusChanged: if (log) console.log(log) //Print warning messages
|
||||||
|
}
|
||||||
155
app/qml/TerminalTabs.qml
Normal file
155
app/qml/TerminalTabs.qml
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import QtQml.Models
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: tabsRoot
|
||||||
|
|
||||||
|
readonly property int innerPadding: 6
|
||||||
|
readonly property string currentTitle: tabsModel.get(currentIndex).title ?? "cool-retro-term"
|
||||||
|
property alias currentIndex: tabBar.currentIndex
|
||||||
|
readonly property int count: tabsModel.count
|
||||||
|
property size terminalSize: Qt.size(0, 0)
|
||||||
|
|
||||||
|
function normalizeTitle(rawTitle) {
|
||||||
|
if (rawTitle === undefined || rawTitle === null) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return String(rawTitle).trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
function addTab() {
|
||||||
|
tabsModel.append({ title: "" })
|
||||||
|
tabBar.currentIndex = tabsModel.count - 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeTab(index) {
|
||||||
|
if (tabsModel.count <= 1) {
|
||||||
|
terminalWindow.close()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
tabsModel.remove(index)
|
||||||
|
tabBar.currentIndex = Math.min(tabBar.currentIndex, tabsModel.count - 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
ListModel {
|
||||||
|
id: tabsModel
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: addTab()
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
spacing: 0
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: tabRow
|
||||||
|
Layout.fillWidth: true
|
||||||
|
height: rowLayout.implicitHeight
|
||||||
|
color: palette.window
|
||||||
|
visible: tabsModel.count > 1
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
id: rowLayout
|
||||||
|
anchors.fill: parent
|
||||||
|
spacing: 0
|
||||||
|
|
||||||
|
TabBar {
|
||||||
|
id: tabBar
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
focusPolicy: Qt.NoFocus
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
model: tabsModel
|
||||||
|
TabButton {
|
||||||
|
id: tabButton
|
||||||
|
contentItem: RowLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors { leftMargin: innerPadding; rightMargin: innerPadding }
|
||||||
|
spacing: innerPadding
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: model.title
|
||||||
|
elide: Text.ElideRight
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.alignment: Qt.AlignVCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
ToolButton {
|
||||||
|
text: "\u00d7"
|
||||||
|
focusPolicy: Qt.NoFocus
|
||||||
|
padding: innerPadding
|
||||||
|
Layout.alignment: Qt.AlignVCenter
|
||||||
|
onClicked: tabsRoot.closeTab(index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ToolButton {
|
||||||
|
id: addTabButton
|
||||||
|
text: "+"
|
||||||
|
focusPolicy: Qt.NoFocus
|
||||||
|
Layout.fillHeight: true
|
||||||
|
padding: innerPadding
|
||||||
|
Layout.alignment: Qt.AlignVCenter
|
||||||
|
onClicked: tabsRoot.addTab()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StackLayout {
|
||||||
|
id: stack
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
currentIndex: tabBar.currentIndex
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
model: tabsModel
|
||||||
|
TerminalContainer {
|
||||||
|
property bool shouldHaveFocus: terminalWindow.active && StackLayout.isCurrentItem
|
||||||
|
onShouldHaveFocusChanged: {
|
||||||
|
if (shouldHaveFocus) {
|
||||||
|
activate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onTitleChanged: tabsModel.setProperty(index, "title", normalizeTitle(title))
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
onSessionFinished: tabsRoot.closeTab(index)
|
||||||
|
onTerminalSizeChanged: updateTerminalSize()
|
||||||
|
|
||||||
|
function updateTerminalSize() {
|
||||||
|
// Every tab will have the same size so we can simply take the first one.
|
||||||
|
if (index == 0) {
|
||||||
|
tabsRoot.terminalSize = terminalSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
136
app/qml/TerminalWindow.qml
Normal file
136
app/qml/TerminalWindow.qml
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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.Window 2.1
|
||||||
|
import QtQuick.Controls 2.3
|
||||||
|
|
||||||
|
import "menus"
|
||||||
|
|
||||||
|
ApplicationWindow {
|
||||||
|
id: terminalWindow
|
||||||
|
|
||||||
|
width: 1024
|
||||||
|
height: 768
|
||||||
|
|
||||||
|
// Show the window once it is ready.
|
||||||
|
Component.onCompleted: {
|
||||||
|
visible = true
|
||||||
|
}
|
||||||
|
|
||||||
|
minimumWidth: 320
|
||||||
|
minimumHeight: 240
|
||||||
|
|
||||||
|
visible: false
|
||||||
|
|
||||||
|
property bool fullscreen: false
|
||||||
|
onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed)
|
||||||
|
|
||||||
|
menuBar: WindowMenu { }
|
||||||
|
|
||||||
|
property real normalizedWindowScale: 1024 / ((0.5 * width + 0.5 * height))
|
||||||
|
|
||||||
|
color: "#00000000"
|
||||||
|
|
||||||
|
title: terminalTabs.currentTitle
|
||||||
|
|
||||||
|
Action {
|
||||||
|
id: fullscreenAction
|
||||||
|
text: qsTr("Fullscreen")
|
||||||
|
enabled: !appSettings.isMacOS
|
||||||
|
shortcut: StandardKey.FullScreen
|
||||||
|
onTriggered: fullscreen = !fullscreen
|
||||||
|
checkable: true
|
||||||
|
checked: fullscreen
|
||||||
|
}
|
||||||
|
Action {
|
||||||
|
id: newWindowAction
|
||||||
|
text: qsTr("New Window")
|
||||||
|
shortcut: appSettings.isMacOS ? "Meta+N" : "Ctrl+Shift+N"
|
||||||
|
onTriggered: appRoot.createWindow()
|
||||||
|
}
|
||||||
|
Action {
|
||||||
|
id: quitAction
|
||||||
|
text: qsTr("Quit")
|
||||||
|
shortcut: appSettings.isMacOS ? StandardKey.Close : "Ctrl+Shift+Q"
|
||||||
|
onTriggered: terminalWindow.close()
|
||||||
|
}
|
||||||
|
Action {
|
||||||
|
id: showsettingsAction
|
||||||
|
text: qsTr("Settings")
|
||||||
|
onTriggered: {
|
||||||
|
settingsWindow.show()
|
||||||
|
settingsWindow.requestActivate()
|
||||||
|
settingsWindow.raise()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Action {
|
||||||
|
id: copyAction
|
||||||
|
text: qsTr("Copy")
|
||||||
|
shortcut: appSettings.isMacOS ? StandardKey.Copy : "Ctrl+Shift+C"
|
||||||
|
}
|
||||||
|
Action {
|
||||||
|
id: pasteAction
|
||||||
|
text: qsTr("Paste")
|
||||||
|
shortcut: appSettings.isMacOS ? StandardKey.Paste : "Ctrl+Shift+V"
|
||||||
|
}
|
||||||
|
Action {
|
||||||
|
id: zoomIn
|
||||||
|
text: qsTr("Zoom In")
|
||||||
|
shortcut: StandardKey.ZoomIn
|
||||||
|
onTriggered: appSettings.incrementScaling()
|
||||||
|
}
|
||||||
|
Action {
|
||||||
|
id: zoomOut
|
||||||
|
text: qsTr("Zoom Out")
|
||||||
|
shortcut: StandardKey.ZoomOut
|
||||||
|
onTriggered: appSettings.decrementScaling()
|
||||||
|
}
|
||||||
|
Action {
|
||||||
|
id: showAboutAction
|
||||||
|
text: qsTr("About")
|
||||||
|
onTriggered: {
|
||||||
|
aboutDialog.show()
|
||||||
|
aboutDialog.requestActivate()
|
||||||
|
aboutDialog.raise()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Action {
|
||||||
|
id: newTabAction
|
||||||
|
text: qsTr("New Tab")
|
||||||
|
shortcut: appSettings.isMacOS ? StandardKey.AddTab : "Ctrl+Shift+T"
|
||||||
|
onTriggered: terminalTabs.addTab()
|
||||||
|
}
|
||||||
|
TerminalTabs {
|
||||||
|
id: terminalTabs
|
||||||
|
width: parent.width
|
||||||
|
height: (parent.height + Math.abs(y))
|
||||||
|
}
|
||||||
|
Loader {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
active: appSettings.showTerminalSize
|
||||||
|
sourceComponent: SizeOverlay {
|
||||||
|
z: 3
|
||||||
|
terminalSize: terminalTabs.terminalSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onClosing: {
|
||||||
|
appRoot.closeWindow(terminalWindow)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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,23 +17,29 @@
|
|||||||
* 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
|
||||||
|
|
||||||
import QtQuick 2.2
|
QtObject {
|
||||||
|
id: timeManager
|
||||||
|
|
||||||
Timer{
|
property bool enableTimer: false
|
||||||
default property bool enableTimer: false
|
property real time: 0
|
||||||
property real time
|
|
||||||
|
|
||||||
NumberAnimation on time {
|
property int framesPerUpdate: Math.max(1, appSettings.effectsFrameSkip)
|
||||||
from: 0
|
property int _frameCounter: 0
|
||||||
to: 100000
|
|
||||||
running: appSettings.fps === 0 && enableTimer
|
property var frameDriver: FrameAnimation {
|
||||||
duration: 100000
|
running: enableTimer
|
||||||
loops: Animation.Infinite
|
onTriggered: {
|
||||||
|
timeManager._frameCounter += 1
|
||||||
|
|
||||||
|
if (timeManager._frameCounter >= timeManager.framesPerUpdate) {
|
||||||
|
time = elapsedTime
|
||||||
|
timeManager._frameCounter = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onTriggered: time += interval
|
onEnableTimerChanged: if (!enableTimer) _frameCounter = 0
|
||||||
running: appSettings.fps !== 0 && enableTimer
|
onFramesPerUpdateChanged: _frameCounter = 0
|
||||||
interval: Math.round(1000 / appSettings.fps)
|
|
||||||
repeat: true
|
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,8 +0,0 @@
|
|||||||
|
|
||||||
Fonts in this package are (c) 2010-2014 Style.
|
|
||||||
|
|
||||||
This license is applicable to each font file included in this package in all their variants (ttf, eot, woff, woff2, svg).
|
|
||||||
|
|
||||||
You MAY NOT: sell this font; include/redistribute the font in any font collection regardless of pricing; provide the font for direct download from any web site, modify or rename the font. You MAY: link to "http://style64.org/c64-truetype" in order for others to download and install the font; embed the font (without any modification or file renaming) for display on any web site using @font-face rules; use this font in static images and vector art; include this font (without any modification or file renaming) as part of a software package but ONLY if said software package is freely provided to end users. You may also contact us to negotiate a (possibly commercial) license for your use outside of these guidelines at "http://style64.org/contact-style".
|
|
||||||
|
|
||||||
At all times the most recent version of this license can be found at "http://style64.org/c64-truetype/license".
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
app/qml/fonts/cozette/CozetteVector.ttf
Normal file
BIN
app/qml/fonts/cozette/CozetteVector.ttf
Normal file
Binary file not shown.
Binary file not shown.
93
app/qml/fonts/departure-mono/LICENSE
Normal file
93
app/qml/fonts/departure-mono/LICENSE
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
Copyright 2022–2024 Helena Zhang (helenazhang.com).
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
https://openfontlicense.org
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
BIN
app/qml/fonts/fira-code/FiraCodeNerdFontMono-Regular.ttf
Normal file
BIN
app/qml/fonts/fira-code/FiraCodeNerdFontMono-Regular.ttf
Normal file
Binary file not shown.
187
app/qml/fonts/modern-hermit/LICENSE → app/qml/fonts/fira-code/LICENSE.txt
Executable file → Normal file
187
app/qml/fonts/modern-hermit/LICENSE → app/qml/fonts/fira-code/LICENSE.txt
Executable file → Normal file
@@ -1,94 +1,93 @@
|
|||||||
Copyright (c) 2013, Pablo Caro <me AT pcaro DOT es> - http://pcaro.es/
|
Copyright (c) 2014, The Fira Code Project Authors (https://github.com/tonsky/FiraCode)
|
||||||
with Reserved Font Name Hermit.
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
This license is copied below, and is also available with a FAQ at:
|
||||||
This license is copied below, and is also available with a FAQ at:
|
http://scripts.sil.org/OFL
|
||||||
http://scripts.sil.org/OFL
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
-----------------------------------------------------------
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
-----------------------------------------------------------
|
||||||
-----------------------------------------------------------
|
|
||||||
|
PREAMBLE
|
||||||
PREAMBLE
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
development of collaborative font projects, to support the font creation
|
||||||
development of collaborative font projects, to support the font creation
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
efforts of academic and linguistic communities, and to provide a free and
|
open framework in which fonts may be shared and improved in partnership
|
||||||
open framework in which fonts may be shared and improved in partnership
|
with others.
|
||||||
with others.
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
The OFL allows the licensed fonts to be used, studied, modified and
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
redistributed freely as long as they are not sold by themselves. The
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
fonts, including any derivative works, can be bundled, embedded,
|
redistributed and/or sold with any software provided that any reserved
|
||||||
redistributed and/or sold with any software provided that any reserved
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
names are not used by derivative works. The fonts and derivatives,
|
however, cannot be released under any other type of license. The
|
||||||
however, cannot be released under any other type of license. The
|
requirement for fonts to remain under this license does not apply
|
||||||
requirement for fonts to remain under this license does not apply
|
to any document created using the fonts or their derivatives.
|
||||||
to any document created using the fonts or their derivatives.
|
|
||||||
|
DEFINITIONS
|
||||||
DEFINITIONS
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
"Font Software" refers to the set of files released by the Copyright
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
Holder(s) under this license and clearly marked as such. This may
|
include source files, build scripts and documentation.
|
||||||
include source files, build scripts and documentation.
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
"Reserved Font Name" refers to any names specified as such after the
|
copyright statement(s).
|
||||||
copyright statement(s).
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
"Original Version" refers to the collection of Font Software components as
|
distributed by the Copyright Holder(s).
|
||||||
distributed by the Copyright Holder(s).
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
or substituting -- in part or in whole -- any of the components of the
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
Original Version, by changing formats or by porting the Font Software to a
|
new environment.
|
||||||
new environment.
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
"Author" refers to any designer, engineer, programmer, technical
|
writer or other person who contributed to the Font Software.
|
||||||
writer or other person who contributed to the Font Software.
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
PERMISSION & CONDITIONS
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
redistribute, and sell modified and unmodified copies of the Font
|
Software, subject to the following conditions:
|
||||||
Software, subject to the following conditions:
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
1) Neither the Font Software nor any of its individual components,
|
in Original or Modified Versions, may be sold by itself.
|
||||||
in Original or Modified Versions, may be sold by itself.
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
2) Original or Modified Versions of the Font Software may be bundled,
|
redistributed and/or sold with any software, provided that each copy
|
||||||
redistributed and/or sold with any software, provided that each copy
|
contains the above copyright notice and this license. These can be
|
||||||
contains the above copyright notice and this license. These can be
|
included either as stand-alone text files, human-readable headers or
|
||||||
included either as stand-alone text files, human-readable headers or
|
in the appropriate machine-readable metadata fields within text or
|
||||||
in the appropriate machine-readable metadata fields within text or
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
binary files as long as those fields can be easily viewed by the user.
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
3) No Modified Version of the Font Software may use the Reserved Font
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
Name(s) unless explicit written permission is granted by the corresponding
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
Copyright Holder. This restriction only applies to the primary font name as
|
presented to the users.
|
||||||
presented to the users.
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
Software shall not be used to promote, endorse or advertise any
|
||||||
Software shall not be used to promote, endorse or advertise any
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
Modified Version, except to acknowledge the contribution(s) of the
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
permission.
|
||||||
permission.
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
5) The Font Software, modified or unmodified, in part or in whole,
|
must be distributed entirely under this license, and must not be
|
||||||
must be distributed entirely under this license, and must not be
|
distributed under any other license. The requirement for fonts to
|
||||||
distributed under any other license. The requirement for fonts to
|
remain under this license does not apply to any document created
|
||||||
remain under this license does not apply to any document created
|
using the Font Software.
|
||||||
using the Font Software.
|
|
||||||
|
TERMINATION
|
||||||
TERMINATION
|
This license becomes null and void if any of the above conditions are
|
||||||
This license becomes null and void if any of the above conditions are
|
not met.
|
||||||
not met.
|
|
||||||
|
DISCLAIMER
|
||||||
DISCLAIMER
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
||||||
BIN
app/qml/fonts/gohu/GohuFont11NerdFontMono-Regular.ttf
Normal file
BIN
app/qml/fonts/gohu/GohuFont11NerdFontMono-Regular.ttf
Normal file
Binary file not shown.
13
app/qml/fonts/gohu/LICENSE
Normal file
13
app/qml/fonts/gohu/LICENSE
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||||
|
Version 2, December 2004
|
||||||
|
|
||||||
|
Copyright (C) 2004 Sam Hocevar
|
||||||
|
14 rue de Plaisance, 75014 Paris, France
|
||||||
|
Everyone is permitted to copy and distribute verbatim or modified
|
||||||
|
copies of this license document, and changing it is allowed as long
|
||||||
|
as the name is changed.
|
||||||
|
|
||||||
|
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. You just DO WHAT THE FUCK YOU WANT TO.
|
||||||
BIN
app/qml/fonts/greybeard/Greybeard-12px.ttf
Normal file
BIN
app/qml/fonts/greybeard/Greybeard-12px.ttf
Normal file
Binary file not shown.
BIN
app/qml/fonts/greybeard/Greybeard-16px.ttf
Normal file
BIN
app/qml/fonts/greybeard/Greybeard-16px.ttf
Normal file
Binary file not shown.
@@ -1,7 +1,7 @@
|
|||||||
ProFont
|
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2014 Carl Osterwald, Stephen C. Gilardi, Andrew Welch
|
Copyright (c) 2012-2015 Uwe Waldmann
|
||||||
|
Modified work Copyright 2018 Andy Walker
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -10,13 +10,13 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|||||||
copies of the Software, and to permit persons to whom the Software is
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
furnished to do so, subject to the following conditions:
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
The above copyright notice and this permission notice shall be included in all
|
||||||
all copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
THE SOFTWARE.
|
SOFTWARE.
|
||||||
BIN
app/qml/fonts/hack/HackNerdFontMono-Regular.ttf
Normal file
BIN
app/qml/fonts/hack/HackNerdFontMono-Regular.ttf
Normal file
Binary file not shown.
45
app/qml/fonts/hack/LICENSE.txt
Normal file
45
app/qml/fonts/hack/LICENSE.txt
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
The work in the Hack project is Copyright 2018 Source Foundry Authors and licensed under the MIT License
|
||||||
|
|
||||||
|
The work in the DejaVu project was committed to the public domain.
|
||||||
|
|
||||||
|
Bitstream Vera Sans Mono Copyright 2003 Bitstream Inc. and licensed under the Bitstream Vera License with Reserved Font Names "Bitstream" and "Vera"
|
||||||
|
|
||||||
|
### MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2018 Source Foundry Authors
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
### BITSTREAM VERA LICENSE
|
||||||
|
|
||||||
|
Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces.
|
||||||
|
|
||||||
|
The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera".
|
||||||
|
|
||||||
|
This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names.
|
||||||
|
|
||||||
|
The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself.
|
||||||
|
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
|
|
||||||
|
Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.
|
||||||
BIN
app/qml/fonts/ibm-3278/3270NerdFontMono-Regular.ttf
Normal file
BIN
app/qml/fonts/ibm-3278/3270NerdFontMono-Regular.ttf
Normal file
Binary file not shown.
@@ -1,4 +1,6 @@
|
|||||||
Copyright (c) 2011-2017, Ricardo Banffy.
|
Copyright 2022 The 3270font Authors (https://github.com/rbanffy/3270font)
|
||||||
|
|
||||||
|
Copyright (c) 2011-2022, Ricardo Banffy.
|
||||||
Copyright (c) 1993-2011, Paul Mattes.
|
Copyright (c) 1993-2011, Paul Mattes.
|
||||||
Copyright (c) 2004-2005, Don Russell.
|
Copyright (c) 2004-2005, Don Russell.
|
||||||
Copyright (c) 2004, Dick Altenbern.
|
Copyright (c) 2004, Dick Altenbern.
|
||||||
@@ -10,27 +12,27 @@ Redistribution and use in source and binary forms, with or without
|
|||||||
modification, are permitted provided that the following conditions are
|
modification, are permitted provided that the following conditions are
|
||||||
met:
|
met:
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice,
|
* Redistributions of source code must retain the above copyright notice,
|
||||||
this list of conditions and the following disclaimer.
|
this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
this list of conditions and the following disclaimer in the documentation
|
this list of conditions and the following disclaimer in the documentation
|
||||||
and/or other materials provided with the distribution.
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
* Neither the name of Ricardo Banffy, Paul Mattes, Don Russell,
|
* Neither the name of Ricardo Banffy, Paul Mattes, Don Russell,
|
||||||
Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors
|
Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors
|
||||||
may be used to endorse or promote products derived from this software
|
may be used to endorse or promote products derived from this software
|
||||||
without specific prior written permission.
|
without specific prior written permission.
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
IN NO EVENT SHALL RICARDO BANFFY, PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF
|
IN NO EVENT SHALL RICARDO BANFFY, PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF
|
||||||
SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||||
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
The Debian Logo glyph is based on the Debian Open Use Logo and is
|
The Debian Logo glyph is based on the Debian Open Use Logo and is
|
||||||
BIN
app/qml/fonts/iosevka/IosevkaTermNerdFontMono-Regular.ttf
Normal file
BIN
app/qml/fonts/iosevka/IosevkaTermNerdFontMono-Regular.ttf
Normal file
Binary file not shown.
110
app/qml/fonts/iosevka/LICENSE.txt
Normal file
110
app/qml/fonts/iosevka/LICENSE.txt
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
Copyright (c) 2015-2023, Renzhi Li (aka. Belleve Invis, belleve@typeof.net)
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
|
||||||
|
SIL Open Font License v1.1
|
||||||
|
====================================================
|
||||||
|
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
----------
|
||||||
|
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
|
||||||
|
Definitions
|
||||||
|
-------------
|
||||||
|
|
||||||
|
`"Font Software"` refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
`"Reserved Font Name"` refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
`"Original Version"` refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
`"Modified Version"` refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
`"Author"` refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
|
||||||
|
Permission & Conditions
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1. Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2. Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3. No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4. The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5. The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Termination
|
||||||
|
-----------
|
||||||
|
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
Binary file not shown.
93
app/qml/fonts/jetbrains-mono/LICENSE.txt
Normal file
93
app/qml/fonts/jetbrains-mono/LICENSE.txt
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
https://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
dopustz:-480
|
|
||||||
Binary file not shown.
@@ -1,31 +0,0 @@
|
|||||||
WHAT IS THIS?
|
|
||||||
|
|
||||||
This is ProFont TrueType, converted to Windows TrueType format
|
|
||||||
by Mike Smith, with some tweaks added by "ardu".
|
|
||||||
|
|
||||||
Modifications include:
|
|
||||||
- A Euro character
|
|
||||||
- Missing characters from the Latin 1 code page
|
|
||||||
- Full support for CodePage 850. These are mostly the famous
|
|
||||||
block/box characters you know from DOS. Very useful if you use
|
|
||||||
Mightnight Commander through PuTTY.
|
|
||||||
- Fixed metrics so that point size of 9 works correctly. Until now
|
|
||||||
you had to select 7 to obtain the native point size of 9.
|
|
||||||
- Added some quick&dirty hinting for point size of 9. Most characters
|
|
||||||
now match closely the look of the bitmap version.
|
|
||||||
Don't expect it to look good on anything else than Windows...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
To get the full original Distribution, other ProFont builds
|
|
||||||
and more information
|
|
||||||
go to <http://tobiasjung.name/profont/>
|
|
||||||
|
|
||||||
|
|
||||||
DISCLAIMER
|
|
||||||
See LICENSE file
|
|
||||||
|
|
||||||
|
|
||||||
Tobias Jung
|
|
||||||
January 2014
|
|
||||||
profont@tobiasjung.name
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
Copyright (c) 2004, 2005 Tristan Grimmer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
Binary file not shown.
Binary file not shown.
BIN
app/qml/fonts/oldschool-pc-fonts/PxPlus_IBM_EGA_8x8.ttf
Normal file
BIN
app/qml/fonts/oldschool-pc-fonts/PxPlus_IBM_EGA_8x8.ttf
Normal file
Binary file not shown.
BIN
app/qml/fonts/oldschool-pc-fonts/PxPlus_IBM_VGA_8x16.ttf
Normal file
BIN
app/qml/fonts/oldschool-pc-fonts/PxPlus_IBM_VGA_8x16.ttf
Normal file
Binary file not shown.
22
app/qml/fonts/opendyslexic/LICENSE.txt
Normal file
22
app/qml/fonts/opendyslexic/LICENSE.txt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
License
|
||||||
|
-------
|
||||||
|
The license for this font is:
|
||||||
|
|
||||||
|
♡ Copying is an act of love. Please copy.
|
||||||
|
Bitstream License:
|
||||||
|
|
||||||
|
Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license (“Fonts”) and associated documentation files (the “Font Software”), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces.
|
||||||
|
|
||||||
|
The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words “Bitstream” or the word “Vera”.
|
||||||
|
|
||||||
|
This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the “Bitstream Vera” names.
|
||||||
|
|
||||||
|
The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself.
|
||||||
|
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
|
|
||||||
|
Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.
|
||||||
BIN
app/qml/fonts/opendyslexic/OpenDyslexicMNerdFontMono-Regular.otf
Normal file
BIN
app/qml/fonts/opendyslexic/OpenDyslexicMNerdFontMono-Regular.otf
Normal file
Binary file not shown.
Binary file not shown.
BIN
app/qml/fonts/pet-me/PetMe64.ttf
Normal file
BIN
app/qml/fonts/pet-me/PetMe64.ttf
Normal file
Binary file not shown.
93
app/qml/fonts/source-code-pro/LICENSE.txt
Normal file
93
app/qml/fonts/source-code-pro/LICENSE.txt
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
Copyright 2010-2020 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries.
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
|
||||||
|
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
Binary file not shown.
@@ -1,7 +1,7 @@
|
|||||||
Copyright (c) 2010 Dimitar Toshkov Zhekov,
|
Copyright (c) 2010 Dimitar Toshkov Zhekov,
|
||||||
with Reserved Font Name "Terminus Font".
|
with Reserved Font Name "Terminus Font".
|
||||||
|
|
||||||
Copyright (c) 2011 Tilman Blumenbach,
|
Copyright (c) 2011-2021 Tilman Blumenbach,
|
||||||
with Reserved Font Name "Terminus (TTF)".
|
with Reserved Font Name "Terminus (TTF)".
|
||||||
|
|
||||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
BIN
app/qml/fonts/terminus/TerminessNerdFontMono-Regular.ttf
Normal file
BIN
app/qml/fonts/terminus/TerminessNerdFontMono-Regular.ttf
Normal file
Binary file not shown.
1
app/qml/fonts/unscii/LICENSE
Normal file
1
app/qml/fonts/unscii/LICENSE
Normal file
@@ -0,0 +1 @@
|
|||||||
|
You can consider it Public Domain (or CC-0) except for the files derived from or containing parts of Roman Czyborra's Unifont project (unifont.hex, hex2bdf.pl, unscii-16-full.*) which fall under GPL. See https://savannah.gnu.org/projects/unifont/ for more.
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user