Compare commits
	
		
			137 Commits
		
	
	
		
			1.1.0
			...
			b69610d7f3
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					b69610d7f3 | ||
| 92a768d6f1 | |||
| 
						 | 
					5ecd7d754d | ||
| 
						 | 
					e3161f64f6 | ||
| 
						 | 
					5b0b091ab6 | ||
| 
						 | 
					4fdf28fb79 | ||
| 49213a1cf0 | |||
| e30db231f6 | |||
| 6609c4867f | |||
| 
						 | 
					84c5e8bca6 | ||
| 1a25749315 | |||
| 
						 | 
					3852f5995d | ||
| 9093b7a16e | |||
| afead1c2c0 | |||
| 1b2572f381 | |||
| 
						 | 
					27ca6b3f73 | ||
| 
						 | 
					f157648d1e | ||
| 
						 | 
					d4baaeccfc | ||
| 
						 | 
					d412b66c6e | ||
| 
						 | 
					74ae511f92 | ||
| 
						 | 
					a3fbafe4ae | ||
| 
						 | 
					8a45fbe9ed | ||
| 
						 | 
					01c7929ee3 | ||
| 
						 | 
					2261af17d7 | ||
| 
						 | 
					41f34c3992 | ||
| 
						 | 
					36b1cd2dde | ||
| 
						 | 
					80374b3ec6 | ||
| 
						 | 
					bc00d1e45f | ||
| 
						 | 
					6ddb507247 | ||
| 
						 | 
					b0f3b8f3d0 | ||
| 
						 | 
					06e7191056 | ||
| 
						 | 
					997131ba64 | ||
| 
						 | 
					ef9f412e5f | ||
| 
						 | 
					7b69d41c60 | ||
| 
						 | 
					552947f507 | ||
| 
						 | 
					f69f2df63c | ||
| 
						 | 
					aa270067f6 | ||
| 
						 | 
					28977313da | ||
| 
						 | 
					cfe35d7795 | ||
| 
						 | 
					4abbe332db | ||
| 
						 | 
					3104abd4ad | ||
| 
						 | 
					7714f7b503 | ||
| 
						 | 
					9d06f10a9b | ||
| 
						 | 
					8c27f7683b | ||
| 
						 | 
					bf1a491789 | ||
| 
						 | 
					701cb540e5 | ||
| 
						 | 
					0f18a0349a | ||
| 
						 | 
					205a152350 | ||
| 
						 | 
					dae1a56691 | ||
| 
						 | 
					39181f42cf | ||
| 
						 | 
					3d706ad1a7 | ||
| 
						 | 
					a31b77e5bc | ||
| 
						 | 
					b417643415 | ||
| 
						 | 
					dac2b4ff16 | ||
| 
						 | 
					2d12b0c747 | ||
| 
						 | 
					5fe26edaa6 | ||
| 
						 | 
					a736cfd548 | ||
| 
						 | 
					5af4214daa | ||
| 
						 | 
					98ef7b329a | ||
| 
						 | 
					b0e1962fa7 | ||
| 
						 | 
					83684e8882 | ||
| 
						 | 
					1ed7d077a9 | ||
| 
						 | 
					ba4b36618f | ||
| 
						 | 
					af647a4bad | ||
| 
						 | 
					b719530ef0 | ||
| 
						 | 
					530d61d67e | ||
| 
						 | 
					3d76bcb48c | ||
| 
						 | 
					70ce2f1f3c | ||
| 
						 | 
					21a190a1aa | ||
| 
						 | 
					a88d222709 | ||
| 
						 | 
					b2defceae5 | ||
| 
						 | 
					8d7565ffc4 | ||
| 
						 | 
					9960b25dff | ||
| 
						 | 
					411c116deb | ||
| 
						 | 
					64e007f1fd | ||
| 
						 | 
					c62fc365db | ||
| 
						 | 
					e7e630bd5d | ||
| 
						 | 
					7d77175fbb | ||
| 
						 | 
					f033553972 | ||
| 
						 | 
					ae1ed044ba | ||
| 
						 | 
					35d601c7a7 | ||
| 
						 | 
					f89aeec374 | ||
| 
						 | 
					42c3b4b42e | ||
| 
						 | 
					322fc31396 | ||
| 
						 | 
					6e4d5cfddd | ||
| 
						 | 
					d81485a8bf | ||
| 
						 | 
					a9260d956c | ||
| 
						 | 
					025bb560bc | ||
| 
						 | 
					cdd1488e13 | ||
| 
						 | 
					b8b2644969 | ||
| 
						 | 
					09b5c0a5d0 | ||
| 
						 | 
					1ed66f3aa2 | ||
| 
						 | 
					3b4d5d1c3f | ||
| 
						 | 
					f98fd5a7ad | ||
| 
						 | 
					b961109623 | ||
| 
						 | 
					8f0d1023a4 | ||
| 
						 | 
					79773ba95c | ||
| 
						 | 
					ff3f02fb8c | ||
| 
						 | 
					0af2b20b3a | ||
| 
						 | 
					b026fe357e | ||
| 
						 | 
					ade36c013b | ||
| 
						 | 
					54a6a7f590 | ||
| 
						 | 
					20728e4a0f | ||
| 
						 | 
					afa456f6b3 | ||
| 
						 | 
					3fbfb77430 | ||
| 
						 | 
					051bcb62c6 | ||
| 
						 | 
					d2c57eed6d | ||
| 
						 | 
					f2f38c0e0d | ||
| 
						 | 
					4046bdbc6a | ||
| 
						 | 
					c83cc206fd | ||
| 
						 | 
					41ac14fbd3 | ||
| 
						 | 
					e4c1cad1a7 | ||
| 
						 | 
					db7a7f38f7 | ||
| 
						 | 
					4bff6efe97 | ||
| 
						 | 
					c514dc7a24 | ||
| 
						 | 
					24754edb6a | ||
| 
						 | 
					79fbb76524 | ||
| 
						 | 
					b85aede966 | ||
| 
						 | 
					c66ca6e44f | ||
| 
						 | 
					a192024fef | ||
| 
						 | 
					918df9098a | ||
| 
						 | 
					c9271bfa36 | ||
| 
						 | 
					fa162c818b | ||
| 
						 | 
					ff976e3ec2 | ||
| 
						 | 
					17c5651305 | ||
| 
						 | 
					7c7b049ba1 | ||
| 
						 | 
					0823fe8b3d | ||
| 
						 | 
					e787fd0fb5 | ||
| 
						 | 
					650497bff4 | ||
| 
						 | 
					2f25bd30b0 | ||
| 
						 | 
					d58157a450 | ||
| 
						 | 
					9d049bd041 | ||
| 
						 | 
					988222b711 | ||
| 
						 | 
					f42bd3036f | ||
| 
						 | 
					297239fb5c | ||
| 
						 | 
					dbd46d44aa | ||
| 
						 | 
					254f4d6e92 | 
							
								
								
									
										4
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					# These are supported funding model platforms
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					patreon: swordfish90
 | 
				
			||||||
 | 
					custom: ['https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=flscogna%40gmail.com&item_name=Support+CRT¤cy_code=EUR&source=url']
 | 
				
			||||||
							
								
								
									
										98
									
								
								.github/workflows/appimage.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								.github/workflows/appimage.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,98 @@
 | 
				
			|||||||
 | 
					name: "ci"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  push:
 | 
				
			||||||
 | 
					    tags: "**"
 | 
				
			||||||
 | 
					  workflow_dispatch:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					defaults:
 | 
				
			||||||
 | 
					  run:
 | 
				
			||||||
 | 
					    shell: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  appimage:
 | 
				
			||||||
 | 
					    runs-on: ubuntu-18.04
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					    - name: Checkout repository
 | 
				
			||||||
 | 
					      uses: actions/checkout@v2
 | 
				
			||||||
 | 
					      with:
 | 
				
			||||||
 | 
					        submodules: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Install dependencies
 | 
				
			||||||
 | 
					      run: |
 | 
				
			||||||
 | 
					        sudo add-apt-repository -y ppa:beineri/opt-qt-5.15.2-bionic
 | 
				
			||||||
 | 
					        sudo apt-get update -qq
 | 
				
			||||||
 | 
					        sudo apt-get install -y \
 | 
				
			||||||
 | 
					        build-essential make wget libgl1-mesa-dev \
 | 
				
			||||||
 | 
					        qt515declarative qt515graphicaleffects \
 | 
				
			||||||
 | 
					        qt515quickcontrols qt515quickcontrols2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Download QT appimage builder
 | 
				
			||||||
 | 
					      run: |
 | 
				
			||||||
 | 
					        wget -c -O linuxdeployqt.AppImage \
 | 
				
			||||||
 | 
					        https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
 | 
				
			||||||
 | 
					        chmod a+x linuxdeployqt.AppImage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Build project
 | 
				
			||||||
 | 
					      run: |
 | 
				
			||||||
 | 
					        source /opt/qt*/bin/qt*-env.sh && \
 | 
				
			||||||
 | 
					        qmake -v && \
 | 
				
			||||||
 | 
					        qmake CONFIG+=release PREFIX=/usr && \
 | 
				
			||||||
 | 
					        make -j$(nproc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Install to appdir
 | 
				
			||||||
 | 
					      run: |
 | 
				
			||||||
 | 
					        source /opt/qt*/bin/qt*-env.sh && \
 | 
				
			||||||
 | 
					        make INSTALL_ROOT=appdir -j$(nproc) install
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Extract version number
 | 
				
			||||||
 | 
					      run: |
 | 
				
			||||||
 | 
					        # Extract version for linuxdeployqt to name the file. Use the tag as
 | 
				
			||||||
 | 
					        # release name but remove prefix.
 | 
				
			||||||
 | 
					        echo "VERSION=$(echo '${{ github.ref }}' | sed 's;.*/;;')" >> $GITHUB_ENV
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Build appimage directory
 | 
				
			||||||
 | 
					      run: |
 | 
				
			||||||
 | 
					        mkdir -p \
 | 
				
			||||||
 | 
					        appdir/usr/bin \
 | 
				
			||||||
 | 
					        appdir/usr/lib \
 | 
				
			||||||
 | 
					        appdir/usr/share/applications \
 | 
				
			||||||
 | 
					        appdir/usr/share/metainfo \
 | 
				
			||||||
 | 
					        appdir/usr/share/icons/hicolor/128x128/apps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        cp cool-retro-term appdir/usr/bin/
 | 
				
			||||||
 | 
					        cp cool-retro-term.desktop appdir/usr/share/applications/
 | 
				
			||||||
 | 
					        cp packaging/appdata/cool-retro-term.appdata.xml appdir/usr/share/metainfo/
 | 
				
			||||||
 | 
					        cp app/icons/128x128/cool-retro-term.png appdir/usr/share/icons/hicolor/128x128/apps/
 | 
				
			||||||
 | 
					        cp -r ./app/qml appdir/usr/
 | 
				
			||||||
 | 
					        # Workaround for https://github.com/probonopd/linuxdeployqt/issues/78
 | 
				
			||||||
 | 
					        cp -r ./qmltermwidget/QMLTermWidget appdir/usr/qml/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        find appdir | sort
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Build appimage
 | 
				
			||||||
 | 
					      run: |
 | 
				
			||||||
 | 
					        source /opt/qt*/bin/qt*-env.sh && \
 | 
				
			||||||
 | 
					        ./linuxdeployqt.AppImage appdir/usr/share/applications/cool-retro-term.desktop \
 | 
				
			||||||
 | 
					        -verbose=1 -appimage \
 | 
				
			||||||
 | 
					        -qmldir=./app/qml/ \
 | 
				
			||||||
 | 
					        -qmldir=./qmltermwidget/
 | 
				
			||||||
 | 
					      env:
 | 
				
			||||||
 | 
					        # Unset environment variables
 | 
				
			||||||
 | 
					        QTDIR:
 | 
				
			||||||
 | 
					        QT_PLUGIN_PATH:
 | 
				
			||||||
 | 
					        LD_LIBRARY_PATH:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Upload release
 | 
				
			||||||
 | 
					      uses: softprops/action-gh-release@v1
 | 
				
			||||||
 | 
					      with:
 | 
				
			||||||
 | 
					        body: appimage release
 | 
				
			||||||
 | 
					        files: ./**/Cool_Retro_Term-*-x86_64.AppImage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Clean up
 | 
				
			||||||
 | 
					      if: always()
 | 
				
			||||||
 | 
					      run: |
 | 
				
			||||||
 | 
					        find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq
 | 
				
			||||||
 | 
					        make clean
 | 
				
			||||||
 | 
					        rm -rf appdir
 | 
				
			||||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.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*
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										37
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					sudo: required
 | 
				
			||||||
 | 
					dist: trusty
 | 
				
			||||||
 | 
					language: c++
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install:
 | 
				
			||||||
 | 
					  - sudo add-apt-repository -y ppa:beineri/opt-qt58-trusty
 | 
				
			||||||
 | 
					  - sudo apt-get update -qq
 | 
				
			||||||
 | 
					  - sudo apt-get -y install build-essential qt58declarative qt58graphicaleffects qt58quickcontrols libgl1-mesa-dev
 | 
				
			||||||
 | 
					  - source /opt/qt*/bin/qt*-env.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					script:
 | 
				
			||||||
 | 
					  - qmake CONFIG+=release PREFIX=/usr
 | 
				
			||||||
 | 
					  - make -j$(nproc)
 | 
				
			||||||
 | 
					  - mkdir -p appdir/usr/share/metainfo appdir/usr/bin
 | 
				
			||||||
 | 
					  - cp packaging/appdata/cool-retro-term.appdata.xml appdir/usr/share/metainfo/
 | 
				
			||||||
 | 
					  - cp cool-retro-term appdir/usr/bin/
 | 
				
			||||||
 | 
					  - cp ./cool-retro-term.desktop appdir/
 | 
				
			||||||
 | 
					  - cp ./app/icons/128x128/cool-retro-term.png appdir/
 | 
				
			||||||
 | 
					  - cp -r ./app/qml appdir/usr/
 | 
				
			||||||
 | 
					  - cp -r ./qmltermwidget/QMLTermWidget appdir/usr/qml/ # Workaround for https://github.com/probonopd/linuxdeployqt/issues/78
 | 
				
			||||||
 | 
					  - wget -c https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
 | 
				
			||||||
 | 
					  - chmod a+x linuxdeployqt-*.AppImage 
 | 
				
			||||||
 | 
					  - unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH
 | 
				
			||||||
 | 
					  - export VERSION=$(git rev-parse --short HEAD) # linuxdeployqt uses this for naming the file
 | 
				
			||||||
 | 
					  - ./linuxdeployqt-*.AppImage appdir/usr/bin/cool-retro-term -qmldir=./app/qml/ -qmldir=./qmltermwidget/ # -verbose=3 2>&1 | grep "path:" -C 3
 | 
				
			||||||
 | 
					  - ./linuxdeployqt-*.AppImage appdir/usr/bin/cool-retro-term -qmldir=./app/qml/ -qmldir=./qmltermwidget/ -verbose=2 -appimage
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					after_success:
 | 
				
			||||||
 | 
					  - find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq
 | 
				
			||||||
 | 
					  - # curl --upload-file Cool*.AppImage https://transfer.sh/Cool_Retro_Term-git.$(git rev-parse --short HEAD)-x86_64.AppImage
 | 
				
			||||||
 | 
					  - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh
 | 
				
			||||||
 | 
					  - bash upload.sh Cool*.AppImage*
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					branches:
 | 
				
			||||||
 | 
					  except:
 | 
				
			||||||
 | 
					    - # Do not build tags that we create when we upload to GitHub Releases
 | 
				
			||||||
 | 
					    - /^(?i:continuous)/
 | 
				
			||||||
							
								
								
									
										173
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										173
									
								
								README.md
									
									
									
									
									
								
							@@ -8,172 +8,23 @@
 | 
				
			|||||||
cool-retro-term is a terminal emulator which mimics the look and feel of the old cathode tube screens.
 | 
					cool-retro-term is a terminal emulator which mimics the look and feel of the old cathode tube screens.
 | 
				
			||||||
It has been designed to be eye-candy, customizable, and reasonably lightweight.
 | 
					It has been designed to be eye-candy, customizable, and reasonably lightweight.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
It uses the QML port of qtermwidget (Konsole) developed by me: https://github.com/Swordfish90/qmltermwidget .
 | 
					It uses the QML port of qtermwidget (Konsole): https://github.com/Swordfish90/qmltermwidget.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This terminal emulator works under Linux and macOS and requires Qt 5.2 or higher.
 | 
					This terminal emulator works under Linux and macOS and requires Qt5. It's suggested that you stick to the latest LTS version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Settings such as colors, fonts, and effects can be accessed via context menu.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Screenshots
 | 
					## Screenshots
 | 
				
			||||||

 | 
					
 | 
				
			||||||

 | 
					
 | 
				
			||||||

 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Get cool-retro-term
 | 
					## Install
 | 
				
			||||||
You can either build cool-retro-term yourself (see below) or walk the easy way and install one of these packages:
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Fedora has the `cool-retro-term` in the offcial repositories. All you have to do is `sudo dnf install cool-retro-term`.
 | 
					If you want to get a hold of the latest version, just go to the Releases page and grab the latest AppImage (Linux) or dmg (macOS).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Users of openSUSE can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term).
 | 
					Alternatively, most distributions such as Ubuntu, Fedora or Arch already package cool-retro-term in their official repositories.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Arch users can install this [package](https://aur.archlinux.org/packages/cool-retro-term-git/) directly via the [AUR](https://aur.archlinux.org):
 | 
					## Building
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    yaourt -S aur/cool-retro-term-git
 | 
					Check out the wiki and follow the instructions on how to build it on [Linux](https://github.com/Swordfish90/cool-retro-term/wiki/Build-Instructions-(Linux)) and [macOS](https://github.com/Swordfish90/cool-retro-term/wiki/Build-Instructions-(macOS)).
 | 
				
			||||||
 | 
					 | 
				
			||||||
or use:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pacman -S cool-retro-term
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
to install precompiled from community repository.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Gentoo users can now install the second release "1.0.1" from a 3rd-party repository preferably via layman:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    USE="git" emerge app-portage/layman
 | 
					 | 
				
			||||||
    wget https://www.gerczei.eu/files/gerczei.xml -O /etc/layman/overlays/gerczei.xml
 | 
					 | 
				
			||||||
    layman -f -a qt -a gerczei # those who've added the repo before 27/08/17 should remove, update and add it again as its source has changed
 | 
					 | 
				
			||||||
    ACCEPT_KEYWORDS="~*" emerge =x11-terms/cool-retro-term-1.0.1::gerczei
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The live ebuild (version 9999-r1) tracking the bleeding-edge WIP codebase also remains available.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
A word of warning: USE flags and keywords are to be added to portage's configuration files and every emerge operation should be executed with '-p' (short option for --pretend) appended to the command line first as per best practice!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Ubuntu users of 14.04 LTS (Trusty) up to 15.10 (Wily) can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Ubuntu 17.10 can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
macOS users can grab the latest dmg from the release page: https://github.com/Swordfish90/cool-retro-term/releases
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Build instructions (Linux)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Dependencies
 | 
					 | 
				
			||||||
Make sure to install these first.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**Ubuntu 14.04**
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo apt-get install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qtdeclarative5-controls-plugin qtdeclarative5-qtquick2-plugin libqt5qml-graphicaleffects qtdeclarative5-dialogs-plugin qtdeclarative5-localstorage-plugin qtdeclarative5-window-plugin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**Ubuntu 16.10**
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo apt-get install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qml-module-qtquick-controls qtdeclarative5-qtquick2-plugin libqt5qml-graphicaleffects qml-module-qtquick-dialogs qtdeclarative5-localstorage-plugin qtdeclarative5-window-plugin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**Ubuntu 17.04**
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo apt install build-essential libqt5qml-graphicaleffects qml-module-qt-labs-folderlistmodel qml-module-qt-labs-settings qml-module-qtquick-controls qml-module-qtquick-dialogs qmlscene qt5-default qt5-qmake qtdeclarative5-dev qtdeclarative5-localstorage-plugin qtdeclarative5-qtquick2-plugin qtdeclarative5-window-plugin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**Ubuntu 17.10**
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo apt-get install build-essential qml-module-qtgraphicaleffects qml-module-qt-labs-folderlistmodel qml-module-qt-labs-settings qml-module-qtquick-controls qml-module-qtquick-dialogs qmlscene qt5-default qt5-qmake qtdeclarative5-dev qtdeclarative5-localstorage-plugin qtdeclarative5-qtquick2-plugin qtdeclarative5-window-plugin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**Debian Jessie and above**
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo apt install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtgraphicaleffects qml-module-qtquick-dialogs qml-module-qtquick-localstorage qml-module-qtquick-window2 qml-module-qt-labs-settings qml-module-qt-labs-folderlistmodel
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**Fedora**
 | 
					 | 
				
			||||||
This command should install the known fedora dependencies:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo yum -y install qt5-qtbase qt5-qtbase-devel qt5-qtdeclarative qt5-qtdeclarative-devel qt5-qtgraphicaleffects qt5-qtquickcontrols redhat-rpm-config
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
or:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo dnf -y install qt5-qtbase qt5-qtbase-devel qt5-qtdeclarative qt5-qtdeclarative-devel qt5-qtgraphicaleffects qt5-qtquickcontrols redhat-rpm-config
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**Arch Linux**
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo pacman -S qt5-base qt5-declarative qt5-quickcontrols qt5-graphicaleffects
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**openSUSE**
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Add repository with latest Qt 5 (this is only needed on openSUSE 13.1, Factory already has it):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo zypper ar http://download.opensuse.org/repositories/KDE:/Qt5/openSUSE_13.1/ KDE:Qt5
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Install dependencies:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo zypper install libqt5-qtbase-devel libqt5-qtdeclarative-devel libqt5-qtquickcontrols libqt5-qtgraphicaleffects
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**Anyone else**
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Install Qt directly from here http://qt-project.org/downloads . Once done export them in you path (replace "_/opt/Qt5.3.1/5.3/gcc_64/bin_" with your correct folder):
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    export PATH=/opt/Qt5.3.1/5.3/gcc_64/bin/:$PATH
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Compile
 | 
					 | 
				
			||||||
Once you installed all dependencies (Qt is installed and in your path) you need to compile and run the application: 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```bash
 | 
					 | 
				
			||||||
# Get it from GitHub
 | 
					 | 
				
			||||||
git clone --recursive https://github.com/Swordfish90/cool-retro-term.git
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Build it
 | 
					 | 
				
			||||||
cd cool-retro-term
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Compile (Fedora and OpenSUSE user should use qmake-qt5 instead of qmake)
 | 
					 | 
				
			||||||
qmake && make
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Have fun!
 | 
					 | 
				
			||||||
./cool-retro-term
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Build instructions (macOS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
1. Install [Xcode](https://developer.apple.com/xcode/) and agree to the licence agreement
 | 
					 | 
				
			||||||
2. Enter the following commands into the terminal:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**Brew**
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```sh
 | 
					 | 
				
			||||||
brew install qt5
 | 
					 | 
				
			||||||
git clone --recursive https://github.com/Swordfish90/cool-retro-term.git
 | 
					 | 
				
			||||||
export CPPFLAGS="-I/usr/local/opt/qt5/include"
 | 
					 | 
				
			||||||
export LDFLAGS="-L/usr/local/opt/qt5/lib"
 | 
					 | 
				
			||||||
export PATH=/usr/local/opt/qt5/bin:$PATH
 | 
					 | 
				
			||||||
cd cool-retro-term
 | 
					 | 
				
			||||||
qmake && make
 | 
					 | 
				
			||||||
mkdir cool-retro-term.app/Contents/PlugIns
 | 
					 | 
				
			||||||
cp -r qmltermwidget/QMLTermWidget cool-retro-term.app/Contents/PlugIns
 | 
					 | 
				
			||||||
open cool-retro-term.app
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**MacPorts**
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```sh
 | 
					 | 
				
			||||||
sudo port install qt5
 | 
					 | 
				
			||||||
git clone --recursive https://github.com/Swordfish90/cool-retro-term.git
 | 
					 | 
				
			||||||
cd cool-retro-term
 | 
					 | 
				
			||||||
/opt/local/libexec/qt5/bin/qmake && make
 | 
					 | 
				
			||||||
mkdir cool-retro-term.app/Contents/PlugIns
 | 
					 | 
				
			||||||
cp -r qmltermwidget/QMLTermWidget cool-retro-term.app/Contents/PlugIns
 | 
					 | 
				
			||||||
open cool-retro-term.app
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Donations
 | 
					 | 
				
			||||||
I made this project in my spare time because I love what I'm doing. If you are enjoying it and you want to buy me a beer click [here](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=flscogna%40gmail%2ecom&lc=IT&item_name=Filippo%20Scognamiglio¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
You can also add "bounties" on your favourite issues. More information on the [Bountysource](https://www.bountysource.com/teams/crt/issues) page.
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
QT += qml quick widgets sql
 | 
					QT += qml quick widgets sql quickcontrols2
 | 
				
			||||||
TARGET = cool-retro-term 
 | 
					TARGET = cool-retro-term 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DESTDIR = $$OUT_PWD/../
 | 
					DESTDIR = $$OUT_PWD/../
 | 
				
			||||||
@@ -16,7 +16,7 @@ macx:ICON = icons/crt.icns
 | 
				
			|||||||
RESOURCES += qml/resources.qrc
 | 
					RESOURCES += qml/resources.qrc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#########################################
 | 
					#########################################
 | 
				
			||||||
##              INTALLS
 | 
					##              INSTALLS
 | 
				
			||||||
#########################################
 | 
					#########################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
target.path += /usr/bin/
 | 
					target.path += /usr/bin/
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										58
									
								
								app/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								app/main.cpp
									
									
									
									
									
								
							@@ -6,11 +6,13 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <QtWidgets/QApplication>
 | 
					#include <QtWidgets/QApplication>
 | 
				
			||||||
#include <QIcon>
 | 
					#include <QIcon>
 | 
				
			||||||
 | 
					#include <QQuickStyle>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <QDebug>
 | 
					#include <QDebug>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <QFontDatabase>
 | 
					#include <QFontDatabase>
 | 
				
			||||||
 | 
					#include <QLoggingCategory>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <fileio.h>
 | 
					#include <fileio.h>
 | 
				
			||||||
#include <monospacefontmanager.h>
 | 
					#include <monospacefontmanager.h>
 | 
				
			||||||
@@ -33,15 +35,42 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
    // This disables QT appmenu under Ubuntu, which is not working with QML apps.
 | 
					    // This disables QT appmenu under Ubuntu, which is not working with QML apps.
 | 
				
			||||||
    setenv("QT_QPA_PLATFORMTHEME", "", 1);
 | 
					    setenv("QT_QPA_PLATFORMTHEME", "", 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Disable Connections slot warnings
 | 
				
			||||||
 | 
					    QLoggingCategory::setFilterRules("qt.qml.connections.warning=false");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined (Q_OS_LINUX)
 | 
				
			||||||
 | 
					    setenv("QSG_RENDER_LOOP", "threaded", 0);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(Q_OS_MAC)
 | 
					#if defined(Q_OS_MAC)
 | 
				
			||||||
    // This allows UTF-8 characters usage in OSX.
 | 
					    // This allows UTF-8 characters usage in OSX.
 | 
				
			||||||
    setenv("LC_CTYPE", "UTF-8", 1);
 | 
					    setenv("LC_CTYPE", "UTF-8", 1);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (argc>1 && (!strcmp(argv[1],"-h") || !strcmp(argv[1],"--help"))) {
 | 
				
			||||||
 | 
					        QTextStream cout(stdout, QIODevice::WriteOnly);
 | 
				
			||||||
 | 
					        cout << "Usage: " << argv[0] << " [--default-settings] [--workdir <dir>] [--program <prog>] [-p|--profile <prof>] [--fullscreen] [-h|--help]" << '\n';
 | 
				
			||||||
 | 
					        cout << "  --default-settings  Run cool-retro-term with the default settings" << '\n';
 | 
				
			||||||
 | 
					        cout << "  --workdir <dir>     Change working directory to 'dir'" << '\n';
 | 
				
			||||||
 | 
					        cout << "  -e <cmd>            Command to execute. This option will catch all following arguments, so use it as the last option." << '\n';
 | 
				
			||||||
 | 
					        cout << "  -T <title>          Set window title to 'title'." << '\n';
 | 
				
			||||||
 | 
					        cout << "  --fullscreen        Run cool-retro-term in fullscreen." << '\n';
 | 
				
			||||||
 | 
					        cout << "  -p|--profile <prof> Run cool-retro-term with the given profile." << '\n';
 | 
				
			||||||
 | 
					        cout << "  -h|--help           Print this help." << '\n';
 | 
				
			||||||
 | 
					        cout << "  --verbose           Print additional information such as profiles and settings." << '\n';
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString appVersion("1.2.0");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (argc>1 && (!strcmp(argv[1],"-v") || !strcmp(argv[1],"--version"))) {
 | 
				
			||||||
 | 
					        QTextStream cout(stdout, QIODevice::WriteOnly);
 | 
				
			||||||
 | 
					        cout << "cool-retro-term " << appVersion << '\n';
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QApplication app(argc, argv);
 | 
					    QApplication app(argc, argv);
 | 
				
			||||||
    // set application attributes
 | 
					    app.setAttribute(Qt::AA_MacDontSwapCtrlAndMeta, true);
 | 
				
			||||||
    // Has no effects, see https://bugreports.qt.io/browse/QTBUG-51293
 | 
					 | 
				
			||||||
    // app.setAttribute(Qt::AA_MacDontSwapCtrlAndMeta, true);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QQmlApplicationEngine engine;
 | 
					    QQmlApplicationEngine engine;
 | 
				
			||||||
    FileIO fileIO;
 | 
					    FileIO fileIO;
 | 
				
			||||||
@@ -53,27 +82,11 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
    app.setWindowIcon(QIcon(":../icons/32x32/cool-retro-term.png"));
 | 
					    app.setWindowIcon(QIcon(":../icons/32x32/cool-retro-term.png"));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    app.setOrganizationName("cool-retro-term");
 | 
				
			||||||
 | 
					    app.setOrganizationDomain("cool-retro-term");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Manage command line arguments from the cpp side
 | 
					    // Manage command line arguments from the cpp side
 | 
				
			||||||
    QStringList args = app.arguments();
 | 
					    QStringList args = app.arguments();
 | 
				
			||||||
    if (args.contains("-h") || args.contains("--help")) {
 | 
					 | 
				
			||||||
        // BUG: This usage help text goes to stderr, should go to stdout.
 | 
					 | 
				
			||||||
        // BUG: First line of output is surrounded by double quotes.
 | 
					 | 
				
			||||||
        qDebug() << "Usage: " + args.at(0) + " [--default-settings] [--workdir <dir>] [--program <prog>] [-p|--profile <prof>] [--fullscreen] [-h|--help]";
 | 
					 | 
				
			||||||
        qDebug() << "  --default-settings  Run cool-retro-term with the default settings";
 | 
					 | 
				
			||||||
        qDebug() << "  --workdir <dir>     Change working directory to 'dir'";
 | 
					 | 
				
			||||||
        qDebug() << "  -e <cmd>            Command to execute. This option will catch all following arguments, so use it as the last option.";
 | 
					 | 
				
			||||||
        qDebug() << "  -T <title>          Set window title to 'title'.";
 | 
					 | 
				
			||||||
        qDebug() << "  --fullscreen        Run cool-retro-term in fullscreen.";
 | 
					 | 
				
			||||||
        qDebug() << "  -p|--profile <prof> Run cool-retro-term with the given profile.";
 | 
					 | 
				
			||||||
        qDebug() << "  -h|--help           Print this help.";
 | 
					 | 
				
			||||||
        qDebug() << "  --verbose           Print additional information such as profiles and settings.";
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (args.contains("-v") || args.contains("--version")) {
 | 
					 | 
				
			||||||
        qDebug() << "cool-retro-term 1.0.1";
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Manage default command
 | 
					    // Manage default command
 | 
				
			||||||
    QStringList cmdList;
 | 
					    QStringList cmdList;
 | 
				
			||||||
@@ -82,6 +95,7 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    QVariant command(cmdList.empty() ? QVariant() : cmdList[0]);
 | 
					    QVariant command(cmdList.empty() ? QVariant() : cmdList[0]);
 | 
				
			||||||
    QVariant commandArgs(cmdList.size() <= 1 ? QVariant() : QVariant(cmdList.mid(1)));
 | 
					    QVariant commandArgs(cmdList.size() <= 1 ? QVariant() : QVariant(cmdList.mid(1)));
 | 
				
			||||||
 | 
					    engine.rootContext()->setContextProperty("appVersion", appVersion);
 | 
				
			||||||
    engine.rootContext()->setContextProperty("defaultCmd", command);
 | 
					    engine.rootContext()->setContextProperty("defaultCmd", command);
 | 
				
			||||||
    engine.rootContext()->setContextProperty("defaultCmdArgs", commandArgs);
 | 
					    engine.rootContext()->setContextProperty("defaultCmdArgs", commandArgs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,28 @@
 | 
				
			|||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* cool-retro-term is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					* it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					* the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					* (at your option) any later version.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					* but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					* GNU General Public License for more details.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					*******************************************************************************/
 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 1.1
 | 
					import QtQuick.Controls 2.2
 | 
				
			||||||
import QtQuick.Layouts 1.1
 | 
					import QtQuick.Layouts 1.1
 | 
				
			||||||
import QtQuick.Window 2.0
 | 
					import QtQuick.Window 2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Window{
 | 
					Window {
 | 
				
			||||||
    id: dialogwindow
 | 
					    id: dialogwindow
 | 
				
			||||||
    title: qsTr("About")
 | 
					    title: qsTr("About")
 | 
				
			||||||
    width: 600
 | 
					    width: 600
 | 
				
			||||||
@@ -11,16 +30,19 @@ Window{
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    modality: Qt.ApplicationModal
 | 
					    modality: Qt.ApplicationModal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ColumnLayout{
 | 
					    ColumnLayout {
 | 
				
			||||||
        anchors.fill: parent
 | 
					        anchors.fill: parent
 | 
				
			||||||
        anchors.margins: 15
 | 
					        anchors.margins: 15
 | 
				
			||||||
        spacing: 15
 | 
					        spacing: 15
 | 
				
			||||||
        Text {
 | 
					        Text {
 | 
				
			||||||
            Layout.alignment: Qt.AlignHCenter
 | 
					            Layout.alignment: Qt.AlignHCenter
 | 
				
			||||||
            text: "cool-retro-term"
 | 
					            text: "cool-retro-term"
 | 
				
			||||||
            font {bold: true; pointSize: 18}
 | 
					            font {
 | 
				
			||||||
 | 
					                bold: true
 | 
				
			||||||
 | 
					                pointSize: 18
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Loader{
 | 
					        Loader {
 | 
				
			||||||
            id: mainContent
 | 
					            id: mainContent
 | 
				
			||||||
            Layout.fillHeight: true
 | 
					            Layout.fillHeight: true
 | 
				
			||||||
            Layout.fillWidth: true
 | 
					            Layout.fillWidth: true
 | 
				
			||||||
@@ -41,32 +63,33 @@ Window{
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            ]
 | 
					            ]
 | 
				
			||||||
            Component.onCompleted: mainContent.state = "Default";
 | 
					            Component.onCompleted: mainContent.state = "Default"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Item{
 | 
					        Item {
 | 
				
			||||||
            Layout.fillWidth: true
 | 
					            Layout.fillWidth: true
 | 
				
			||||||
            height: childrenRect.height
 | 
					            height: childrenRect.height
 | 
				
			||||||
            Button{
 | 
					            Button {
 | 
				
			||||||
                anchors.left: parent.left
 | 
					                anchors.left: parent.left
 | 
				
			||||||
                text: qsTr("License")
 | 
					                text: qsTr("License")
 | 
				
			||||||
                onClicked: {
 | 
					                onClicked: {
 | 
				
			||||||
                    mainContent.state == "Default" ? mainContent.state = "License" : mainContent.state = "Default"
 | 
					                    mainContent.state == "Default" ? mainContent.state
 | 
				
			||||||
 | 
					                                                     = "License" : mainContent.state = "Default"
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Button{
 | 
					            Button {
 | 
				
			||||||
                anchors.right: parent.right
 | 
					                anchors.right: parent.right
 | 
				
			||||||
                text: qsTr("Close")
 | 
					                text: qsTr("Close")
 | 
				
			||||||
                onClicked: dialogwindow.close();
 | 
					                onClicked: dialogwindow.close()
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // MAIN COMPONENTS ////////////////////////////////////////////////////////
 | 
					    // MAIN COMPONENTS ////////////////////////////////////////////////////////
 | 
				
			||||||
    Component{
 | 
					    Component {
 | 
				
			||||||
        id: defaultComponent
 | 
					        id: defaultComponent
 | 
				
			||||||
        ColumnLayout{
 | 
					        ColumnLayout {
 | 
				
			||||||
            anchors.fill: parent
 | 
					            anchors.fill: parent
 | 
				
			||||||
            spacing: 10
 | 
					            spacing: 10
 | 
				
			||||||
            Image{
 | 
					            Image {
 | 
				
			||||||
                Layout.fillWidth: true
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
                Layout.fillHeight: true
 | 
					                Layout.fillHeight: true
 | 
				
			||||||
                Layout.alignment: Qt.AlignHCenter
 | 
					                Layout.alignment: Qt.AlignHCenter
 | 
				
			||||||
@@ -74,36 +97,37 @@ Window{
 | 
				
			|||||||
                source: "images/crt256.png"
 | 
					                source: "images/crt256.png"
 | 
				
			||||||
                smooth: true
 | 
					                smooth: true
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Text{
 | 
					            Text {
 | 
				
			||||||
                Layout.alignment: Qt.AlignCenter
 | 
					                Layout.alignment: Qt.AlignCenter
 | 
				
			||||||
                horizontalAlignment: Text.AlignHCenter
 | 
					                horizontalAlignment: Text.AlignHCenter
 | 
				
			||||||
                text: appSettings.version + "\n" +
 | 
					                text: appSettings.version + "\n" + qsTr(
 | 
				
			||||||
                      qsTr("Author: ") + "Filippo Scognamiglio\n" +
 | 
					                          "Author: ") + "Filippo Scognamiglio\n" + qsTr(
 | 
				
			||||||
                      qsTr("Email: ")  + "flscogna@gmail.com\n" +
 | 
					                          "Email: ") + "flscogna@gmail.com\n" + qsTr(
 | 
				
			||||||
                      qsTr("Source: ") + "https://github.com/Swordfish90/cool-retro-term\n"
 | 
					                          "Source: ") + "https://github.com/Swordfish90/cool-retro-term\n"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Component{
 | 
					    Component {
 | 
				
			||||||
        id: licenseComponent
 | 
					        id: licenseComponent
 | 
				
			||||||
        TextArea{
 | 
					        ScrollView {
 | 
				
			||||||
            anchors.fill: parent
 | 
					            anchors.fill: parent
 | 
				
			||||||
            readOnly: true
 | 
					            clip: true
 | 
				
			||||||
            text: "Copyright (c) 2013 Filippo Scognamiglio <flscogna@gmail.com>\n\n" +
 | 
					            TextArea {
 | 
				
			||||||
                  "https://github.com/Swordfish90/cool-retro-term\n\n" +
 | 
					                readOnly: true
 | 
				
			||||||
 | 
					                wrapMode: TextEdit.Wrap
 | 
				
			||||||
                  "cool-retro-term is free software: you can redistribute it and/or modify " +
 | 
					                text: "Copyright (c) 2013-2021 Filippo Scognamiglio <flscogna@gmail.com>\n\n"
 | 
				
			||||||
                  "it under the terms of the GNU General Public License as published by " +
 | 
					                      + "https://github.com/Swordfish90/cool-retro-term\n\n" +
 | 
				
			||||||
                  "the Free Software Foundation, either version 3 of the License, or " +
 | 
					                      "cool-retro-term is free software: you can redistribute it and/or modify "
 | 
				
			||||||
                  "(at your option) any later version.\n\n" +
 | 
					                      + "it under the terms of the GNU General Public License as published by "
 | 
				
			||||||
 | 
					                      + "the Free Software Foundation, either version 3 of the License, or "
 | 
				
			||||||
                  "This program is distributed in the hope that it will be useful, " +
 | 
					                      + "(at your option) any later version.\n\n" +
 | 
				
			||||||
                  "but WITHOUT ANY WARRANTY; without even the implied warranty of " +
 | 
					                      "This program is distributed in the hope that it will be useful, "
 | 
				
			||||||
                  "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the " +
 | 
					                      + "but WITHOUT ANY WARRANTY; without even the implied warranty of "
 | 
				
			||||||
                  "GNU General Public License for more details.\n\n" +
 | 
					                      + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the "
 | 
				
			||||||
 | 
					                      + "GNU General Public License for more details.\n\n" +
 | 
				
			||||||
                  "You should have received a copy of the GNU General Public License " +
 | 
					                      "You should have received a copy of the GNU General Public License "
 | 
				
			||||||
                  "along with this program.  If not, see <http://www.gnu.org/licenses/>."
 | 
					                      + "along with this program.  If not, see <http://www.gnu.org/licenses/>."
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,3 +1,22 @@
 | 
				
			|||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* cool-retro-term is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					* it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					* the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					* (at your option) any later version.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					* but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					* GNU General Public License for more details.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					*******************************************************************************/
 | 
				
			||||||
import QtQuick 2.0
 | 
					import QtQuick 2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "utils.js" as Utils
 | 
					import "utils.js" as Utils
 | 
				
			||||||
@@ -10,39 +29,34 @@ Loader {
 | 
				
			|||||||
    property real lastUpdate: 0
 | 
					    property real lastUpdate: 0
 | 
				
			||||||
    property real prevLastUpdate: 0
 | 
					    property real prevLastUpdate: 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property real delay: (1.0 / appSettings.fps) * 1000
 | 
					    property real burnIn: appSettings.burnIn;
 | 
				
			||||||
    property real burnIn: appSettings.burnIn
 | 
					    property real burnInFadeTime: (1 / Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn))*64
 | 
				
			||||||
    property real burnInFadeTime: 1 / Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn)
 | 
					    property real _minBurnInFadeTime: appSettings.minBurnInFadeTime
 | 
				
			||||||
    property real _minBurnInFadeTime: 160
 | 
					    property real _maxBurnInFadeTime: appSettings.maxBurnInFadeTime
 | 
				
			||||||
    property real _maxBurnInFadeTime: 1600
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    active: appSettings.burnIn !== 0
 | 
					    active: appSettings.burnIn !== 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    anchors.fill: parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function completelyUpdate() {
 | 
					    function completelyUpdate() {
 | 
				
			||||||
        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.totalWidth * Math.max(1, burnInScaling)
 | 
					 | 
				
			||||||
               : kterminal.totalWidth * scaleTexture * appSettings.burnInQuality
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        height: appSettings.lowResolutionFont
 | 
					 | 
				
			||||||
                ? kterminal.totalHeight * Math.max(1, burnInScaling)
 | 
					 | 
				
			||||||
                : kterminal.totalHeight * scaleTexture * appSettings.burnInQuality
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        ShaderEffectSource {
 | 
					        ShaderEffectSource {
 | 
				
			||||||
            id: burnInEffectSource
 | 
					            id: burnInEffectSource
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,23 +75,37 @@ Loader {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            Connections {
 | 
					            Connections {
 | 
				
			||||||
                target: kterminal
 | 
					                target: kterminal
 | 
				
			||||||
                onImagePainted: completelyUpdate()
 | 
					
 | 
				
			||||||
 | 
					                onImagePainted: {
 | 
				
			||||||
 | 
					                    completelyUpdate()
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            // Restart blurred source settings change.
 | 
					            // Restart blurred source settings change.
 | 
				
			||||||
            Connections{
 | 
					 | 
				
			||||||
                target: appSettings
 | 
					 | 
				
			||||||
                onBurnInChanged: burnInEffect.restartBlurSource();
 | 
					 | 
				
			||||||
                onTerminalFontChanged: burnInEffect.restartBlurSource();
 | 
					 | 
				
			||||||
                onRasterizationChanged: burnInEffect.restartBlurSource();
 | 
					 | 
				
			||||||
                onBurnInQualityChanged: burnInEffect.restartBlurSource();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            Connections {
 | 
					            Connections {
 | 
				
			||||||
                target: kterminalScrollbar
 | 
					                target: appSettings
 | 
				
			||||||
                onOpacityChanged: completelyUpdate()
 | 
					
 | 
				
			||||||
 | 
					                onBurnInChanged: {
 | 
				
			||||||
 | 
					                    burnInEffect.restartBlurSource()
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                onTerminalFontChanged: {
 | 
				
			||||||
 | 
					                    burnInEffect.restartBlurSource()
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                onRasterizationChanged: {
 | 
				
			||||||
 | 
					                    burnInEffect.restartBlurSource()
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                onBurnInQualityChanged: {
 | 
				
			||||||
 | 
					                    burnInEffect.restartBlurSource()
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ShaderLibrary {
 | 
				
			||||||
 | 
					            id: shaderLibrary
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ShaderEffect {
 | 
					        ShaderEffect {
 | 
				
			||||||
            id: burnInShaderEffect
 | 
					            id: burnInShaderEffect
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -88,7 +116,6 @@ Loader {
 | 
				
			|||||||
            property real prevLastUpdate: burnInEffect.prevLastUpdate
 | 
					            property real prevLastUpdate: burnInEffect.prevLastUpdate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            anchors.fill: parent
 | 
					            anchors.fill: parent
 | 
				
			||||||
 | 
					 | 
				
			||||||
            blending: false
 | 
					            blending: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            fragmentShader:
 | 
					            fragmentShader:
 | 
				
			||||||
@@ -108,9 +135,7 @@ Loader {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                 uniform highp float prevLastUpdate;" +
 | 
					                 uniform highp float prevLastUpdate;" +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                "float rgb2grey(vec3 v){
 | 
					                shaderLibrary.rgb2grey +
 | 
				
			||||||
                    return dot(v, vec3(0.21, 0.72, 0.04));
 | 
					 | 
				
			||||||
                }" +
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                "void main() {
 | 
					                "void main() {
 | 
				
			||||||
                    vec2 coords = qt_TexCoord0;
 | 
					                    vec2 coords = qt_TexCoord0;
 | 
				
			||||||
@@ -121,9 +146,8 @@ Loader {
 | 
				
			|||||||
                    float prevMask = accColor.a;
 | 
					                    float prevMask = accColor.a;
 | 
				
			||||||
                    float currMask = rgb2grey(txtColor);
 | 
					                    float currMask = rgb2grey(txtColor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    highp float blurDecay = clamp((lastUpdate - prevLastUpdate) * burnInTime, 0.0, 1.0);
 | 
					                    highp float blurDecay = clamp(pow(0.5, burnInTime * (lastUpdate - prevLastUpdate)), 0.0, 1.0);
 | 
				
			||||||
                    blurDecay = max(0.0, blurDecay - prevMask);
 | 
					                    vec3 blurColor = accColor.rgb * vec3(blurDecay);
 | 
				
			||||||
                    vec3 blurColor = accColor.rgb - vec3(blurDecay);
 | 
					 | 
				
			||||||
                    vec3 color = max(blurColor, txtColor);
 | 
					                    vec3 color = max(blurColor, txtColor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    gl_FragColor = vec4(color, currMask);
 | 
					                    gl_FragColor = vec4(color, currMask);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,51 +0,0 @@
 | 
				
			|||||||
import QtQuick 2.2
 | 
					 | 
				
			||||||
import QtQuick.Controls 1.1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
MenuBar {
 | 
					 | 
				
			||||||
    id: defaultMenuBar
 | 
					 | 
				
			||||||
    property bool visible: true
 | 
					 | 
				
			||||||
    Menu {
 | 
					 | 
				
			||||||
        title: qsTr("File")
 | 
					 | 
				
			||||||
        visible: defaultMenuBar.visible
 | 
					 | 
				
			||||||
        MenuItem {action: quitAction}
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    Menu {
 | 
					 | 
				
			||||||
        title: qsTr("Edit")
 | 
					 | 
				
			||||||
        visible: defaultMenuBar.visible && appSettings.showMenubar
 | 
					 | 
				
			||||||
        MenuItem {action: copyAction}
 | 
					 | 
				
			||||||
        MenuItem {action: pasteAction}
 | 
					 | 
				
			||||||
        MenuSeparator{visible: Qt.platform.os !== "osx"}
 | 
					 | 
				
			||||||
        MenuItem {action: showsettingsAction}
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    Menu{
 | 
					 | 
				
			||||||
        title: qsTr("View")
 | 
					 | 
				
			||||||
        visible: defaultMenuBar.visible
 | 
					 | 
				
			||||||
        MenuItem {action: fullscreenAction; visible: fullscreenAction.enabled}
 | 
					 | 
				
			||||||
        MenuItem {action: showMenubarAction; visible: showMenubarAction.enabled}
 | 
					 | 
				
			||||||
        MenuSeparator{visible: showMenubarAction.enabled}
 | 
					 | 
				
			||||||
        MenuItem {action: zoomIn}
 | 
					 | 
				
			||||||
        MenuItem {action: zoomOut}
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    Menu{
 | 
					 | 
				
			||||||
        id: profilesMenu
 | 
					 | 
				
			||||||
        title: qsTr("Profiles")
 | 
					 | 
				
			||||||
        visible: defaultMenuBar.visible
 | 
					 | 
				
			||||||
        Instantiator{
 | 
					 | 
				
			||||||
            model: appSettings.profilesList
 | 
					 | 
				
			||||||
            delegate: MenuItem {
 | 
					 | 
				
			||||||
                text: model.text
 | 
					 | 
				
			||||||
                onTriggered: {
 | 
					 | 
				
			||||||
                    appSettings.loadProfileString(obj_string);
 | 
					 | 
				
			||||||
                    appSettings.handleFontChanged();
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            onObjectAdded: profilesMenu.insertItem(index, object)
 | 
					 | 
				
			||||||
            onObjectRemoved: profilesMenu.removeItem(object)
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    Menu{
 | 
					 | 
				
			||||||
        title: qsTr("Help")
 | 
					 | 
				
			||||||
        visible: defaultMenuBar.visible
 | 
					 | 
				
			||||||
        MenuItem {action: showAboutAction}
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,9 +17,8 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 1.1
 | 
					import QtQuick.Controls 2.0
 | 
				
			||||||
import QtQuick.Layouts 1.1
 | 
					import QtQuick.Layouts 1.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "Components"
 | 
					import "Components"
 | 
				
			||||||
@@ -28,46 +27,46 @@ RowLayout {
 | 
				
			|||||||
    property alias name: check.text
 | 
					    property alias name: check.text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property double value
 | 
					    property double value
 | 
				
			||||||
    property alias min_value: slider.minimumValue
 | 
					    property alias min_value: slider.from
 | 
				
			||||||
    property alias max_value: slider.maximumValue
 | 
					    property alias max_value: slider.to
 | 
				
			||||||
    property alias stepSize: slider.stepSize
 | 
					    property alias stepSize: slider.stepSize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    signal newValue(real newValue);
 | 
					    signal newValue(real newValue)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    id: setting_component
 | 
					    id: setting_component
 | 
				
			||||||
    Layout.fillWidth: true
 | 
					    Layout.fillWidth: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    onValueChanged: {
 | 
					    onValueChanged: {
 | 
				
			||||||
        check.checked = !(value == 0);
 | 
					        check.checked = !(value == 0)
 | 
				
			||||||
        if(check.checked)
 | 
					        if (check.checked)
 | 
				
			||||||
            slider.value = value;
 | 
					            slider.value = value
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    CheckBox{
 | 
					    CheckBox {
 | 
				
			||||||
        id: check
 | 
					        id: check
 | 
				
			||||||
        implicitWidth: 160
 | 
					        implicitWidth: 160
 | 
				
			||||||
        onClicked: {
 | 
					        onClicked: {
 | 
				
			||||||
            if(!checked){
 | 
					            if (!checked) {
 | 
				
			||||||
                checked = false;
 | 
					                checked = false
 | 
				
			||||||
                slider.enabled = false;
 | 
					                slider.enabled = false
 | 
				
			||||||
                newValue(0);
 | 
					                newValue(0)
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                checked = true;
 | 
					                checked = true
 | 
				
			||||||
                newValue(slider.value);
 | 
					                newValue(slider.value)
 | 
				
			||||||
                slider.enabled = true;
 | 
					                slider.enabled = true
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Slider{
 | 
					    Slider {
 | 
				
			||||||
        id: slider
 | 
					        id: slider
 | 
				
			||||||
        stepSize: parent.stepSize
 | 
					        stepSize: parent.stepSize
 | 
				
			||||||
        Layout.fillWidth: true
 | 
					        Layout.fillWidth: true
 | 
				
			||||||
        onValueChanged: {
 | 
					        onValueChanged: {
 | 
				
			||||||
            newValue(value);
 | 
					            newValue(value)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    SizedLabel {
 | 
					    SizedLabel {
 | 
				
			||||||
        Layout.fillHeight: true
 | 
					        text: Math.round(
 | 
				
			||||||
        text: Math.round(((value - min_value) / (max_value - min_value)) * 100) + "%"
 | 
					                  ((value - min_value) / (max_value - min_value)) * 100) + "%"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,14 +17,13 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Dialogs 1.1
 | 
					import QtQuick.Dialogs 1.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Item {
 | 
					Item {
 | 
				
			||||||
    id: rootItem
 | 
					    id: rootItem
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    signal colorSelected (color color)
 | 
					    signal colorSelected(color color)
 | 
				
			||||||
    property color color
 | 
					    property color color
 | 
				
			||||||
    property string name
 | 
					    property string name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -35,15 +34,14 @@ Item {
 | 
				
			|||||||
        visible: false
 | 
					        visible: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //This is a workaround to a Qt 5.2 bug.
 | 
					        //This is a workaround to a Qt 5.2 bug.
 | 
				
			||||||
        onColorChanged: if (Qt.platform.os !== "osx") colorSelected(color)
 | 
					        onColorChanged: if (!appSettings.isMacOS) colorSelected(color)
 | 
				
			||||||
        onAccepted: if (Qt.platform.os === "osx") colorSelected(color)
 | 
					        onAccepted: if (appSettings.isMacOS) colorSelected(color)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Rectangle{
 | 
					    Rectangle {
 | 
				
			||||||
        anchors.fill: parent
 | 
					        anchors.fill: parent
 | 
				
			||||||
        radius: 10
 | 
					        radius: 10
 | 
				
			||||||
        color: rootItem.color
 | 
					        color: rootItem.color
 | 
				
			||||||
        border.color: "black"
 | 
					
 | 
				
			||||||
        Glossy {}
 | 
					 | 
				
			||||||
        Rectangle {
 | 
					        Rectangle {
 | 
				
			||||||
            anchors.fill: parent
 | 
					            anchors.fill: parent
 | 
				
			||||||
            anchors.margins: parent.height * 0.25
 | 
					            anchors.margins: parent.height * 0.25
 | 
				
			||||||
@@ -51,14 +49,14 @@ Item {
 | 
				
			|||||||
            color: "white"
 | 
					            color: "white"
 | 
				
			||||||
            opacity: 0.5
 | 
					            opacity: 0.5
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Text{
 | 
					        Text {
 | 
				
			||||||
            anchors.centerIn: parent
 | 
					            anchors.centerIn: parent
 | 
				
			||||||
            z: parent.z + 1
 | 
					            z: parent.z + 1
 | 
				
			||||||
            text: name + ":  " + rootItem.color
 | 
					            text: name + ":  " + rootItem.color
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    MouseArea{
 | 
					    MouseArea {
 | 
				
			||||||
        anchors.fill: parent
 | 
					        anchors.fill: parent
 | 
				
			||||||
        onClicked: colorDialog.visible = true;
 | 
					        onClicked: colorDialog.visible = true
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,19 +19,14 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.0
 | 
					import QtQuick 2.0
 | 
				
			||||||
import QtQuick.Controls 1.0
 | 
					import QtQuick.Controls 2.0
 | 
				
			||||||
 | 
					import QtQuick.Layouts 1.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This component is simply a label with a predefined size.
 | 
					// This component is simply a label with a predefined size.
 | 
				
			||||||
// Used to improve alignment.
 | 
					// Used to improve alignment.
 | 
				
			||||||
 | 
					Label {
 | 
				
			||||||
Item {
 | 
					    id: textfield
 | 
				
			||||||
    property alias text: textfield.text
 | 
					    Layout.minimumWidth: appSettings.labelWidth
 | 
				
			||||||
    width: appSettings.labelWidth
 | 
					    width: appSettings.labelWidth
 | 
				
			||||||
    Label{
 | 
					 | 
				
			||||||
        id: textfield
 | 
					 | 
				
			||||||
        anchors { right: parent.right; verticalCenter: parent.verticalCenter }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,10 +17,9 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QtObject{
 | 
					QtObject {
 | 
				
			||||||
    property int selectedFontIndex
 | 
					    property int selectedFontIndex
 | 
				
			||||||
    property real scaling
 | 
					    property real scaling
 | 
				
			||||||
    property var _font: fontlist.get(selectedFontIndex)
 | 
					    property var _font: fontlist.get(selectedFontIndex)
 | 
				
			||||||
@@ -31,8 +30,8 @@ QtObject{
 | 
				
			|||||||
    property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
 | 
					    property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
 | 
				
			||||||
    property bool lowResolutionFont: true
 | 
					    property bool lowResolutionFont: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property ListModel fontlist: ListModel{
 | 
					    property ListModel fontlist: ListModel {
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "COMMODORE_PET"
 | 
					            name: "COMMODORE_PET"
 | 
				
			||||||
            text: "Commodore PET (1977)"
 | 
					            text: "Commodore PET (1977)"
 | 
				
			||||||
            source: "fonts/1977-commodore-pet/PetMe.ttf"
 | 
					            source: "fonts/1977-commodore-pet/PetMe.ttf"
 | 
				
			||||||
@@ -41,7 +40,7 @@ QtObject{
 | 
				
			|||||||
            baseScaling: 3.5
 | 
					            baseScaling: 3.5
 | 
				
			||||||
            fontWidth: 0.8
 | 
					            fontWidth: 0.8
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "IBM_PC"
 | 
					            name: "IBM_PC"
 | 
				
			||||||
            text: "IBM PC (1981)"
 | 
					            text: "IBM PC (1981)"
 | 
				
			||||||
            source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf"
 | 
					            source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf"
 | 
				
			||||||
@@ -50,7 +49,7 @@ QtObject{
 | 
				
			|||||||
            baseScaling: 3.5
 | 
					            baseScaling: 3.5
 | 
				
			||||||
            fontWidth: 0.8
 | 
					            fontWidth: 0.8
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "PROGGY_TINY"
 | 
					            name: "PROGGY_TINY"
 | 
				
			||||||
            text: "Proggy Tiny (Modern)"
 | 
					            text: "Proggy Tiny (Modern)"
 | 
				
			||||||
            source: "fonts/modern-proggy-tiny/ProggyTiny.ttf"
 | 
					            source: "fonts/modern-proggy-tiny/ProggyTiny.ttf"
 | 
				
			||||||
@@ -59,7 +58,7 @@ QtObject{
 | 
				
			|||||||
            baseScaling: 3.3
 | 
					            baseScaling: 3.3
 | 
				
			||||||
            fontWidth: 0.9
 | 
					            fontWidth: 0.9
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "TERMINUS_SCALED"
 | 
					            name: "TERMINUS_SCALED"
 | 
				
			||||||
            text: "Terminus (Modern)"
 | 
					            text: "Terminus (Modern)"
 | 
				
			||||||
            source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
 | 
					            source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
 | 
				
			||||||
@@ -68,7 +67,7 @@ QtObject{
 | 
				
			|||||||
            baseScaling: 3.0
 | 
					            baseScaling: 3.0
 | 
				
			||||||
            fontWidth: 1.0
 | 
					            fontWidth: 1.0
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "PRO_FONT_SCALED"
 | 
					            name: "PRO_FONT_SCALED"
 | 
				
			||||||
            text: "Pro Font (Modern)"
 | 
					            text: "Pro Font (Modern)"
 | 
				
			||||||
            source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
 | 
					            source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
 | 
				
			||||||
@@ -77,7 +76,7 @@ QtObject{
 | 
				
			|||||||
            baseScaling: 3.0
 | 
					            baseScaling: 3.0
 | 
				
			||||||
            fontWidth: 1.0
 | 
					            fontWidth: 1.0
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "APPLE_II"
 | 
					            name: "APPLE_II"
 | 
				
			||||||
            text: "Apple ][ (1977)"
 | 
					            text: "Apple ][ (1977)"
 | 
				
			||||||
            source: "fonts/1977-apple2/PrintChar21.ttf"
 | 
					            source: "fonts/1977-apple2/PrintChar21.ttf"
 | 
				
			||||||
@@ -86,7 +85,7 @@ QtObject{
 | 
				
			|||||||
            baseScaling: 3.5
 | 
					            baseScaling: 3.5
 | 
				
			||||||
            fontWidth: 0.9
 | 
					            fontWidth: 0.9
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "ATARI_400"
 | 
					            name: "ATARI_400"
 | 
				
			||||||
            text: "Atari 400-800 (1979)"
 | 
					            text: "Atari 400-800 (1979)"
 | 
				
			||||||
            source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf"
 | 
					            source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf"
 | 
				
			||||||
@@ -95,7 +94,7 @@ QtObject{
 | 
				
			|||||||
            baseScaling: 3.5
 | 
					            baseScaling: 3.5
 | 
				
			||||||
            fontWidth: 0.8
 | 
					            fontWidth: 0.8
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "COMMODORE_64"
 | 
					            name: "COMMODORE_64"
 | 
				
			||||||
            text: "Commodore 64 (1982)"
 | 
					            text: "Commodore 64 (1982)"
 | 
				
			||||||
            source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"
 | 
					            source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,10 +17,9 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QtObject{
 | 
					QtObject {
 | 
				
			||||||
    property int selectedFontIndex
 | 
					    property int selectedFontIndex
 | 
				
			||||||
    property real scaling
 | 
					    property real scaling
 | 
				
			||||||
    property var _font: fontlist.get(selectedFontIndex)
 | 
					    property var _font: fontlist.get(selectedFontIndex)
 | 
				
			||||||
@@ -31,8 +30,8 @@ QtObject{
 | 
				
			|||||||
    property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
 | 
					    property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
 | 
				
			||||||
    property bool lowResolutionFont: true
 | 
					    property bool lowResolutionFont: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property ListModel fontlist: ListModel{
 | 
					    property ListModel fontlist: ListModel {
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "COMMODORE_PET"
 | 
					            name: "COMMODORE_PET"
 | 
				
			||||||
            text: "Commodore PET (1977)"
 | 
					            text: "Commodore PET (1977)"
 | 
				
			||||||
            source: "fonts/1977-commodore-pet/PetMe.ttf"
 | 
					            source: "fonts/1977-commodore-pet/PetMe.ttf"
 | 
				
			||||||
@@ -41,7 +40,7 @@ QtObject{
 | 
				
			|||||||
            baseScaling: 3.5
 | 
					            baseScaling: 3.5
 | 
				
			||||||
            fontWidth: 0.7
 | 
					            fontWidth: 0.7
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "IBM_PC"
 | 
					            name: "IBM_PC"
 | 
				
			||||||
            text: "IBM PC (1981)"
 | 
					            text: "IBM PC (1981)"
 | 
				
			||||||
            source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf"
 | 
					            source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf"
 | 
				
			||||||
@@ -50,7 +49,7 @@ QtObject{
 | 
				
			|||||||
            baseScaling: 3.5
 | 
					            baseScaling: 3.5
 | 
				
			||||||
            fontWidth: 0.8
 | 
					            fontWidth: 0.8
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "PROGGY_TINY"
 | 
					            name: "PROGGY_TINY"
 | 
				
			||||||
            text: "Proggy Tiny (Modern)"
 | 
					            text: "Proggy Tiny (Modern)"
 | 
				
			||||||
            source: "fonts/modern-proggy-tiny/ProggyTiny.ttf"
 | 
					            source: "fonts/modern-proggy-tiny/ProggyTiny.ttf"
 | 
				
			||||||
@@ -59,7 +58,7 @@ QtObject{
 | 
				
			|||||||
            baseScaling: 3.3
 | 
					            baseScaling: 3.3
 | 
				
			||||||
            fontWidth: 0.9
 | 
					            fontWidth: 0.9
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "TERMINUS_SCALED"
 | 
					            name: "TERMINUS_SCALED"
 | 
				
			||||||
            text: "Terminus (Modern)"
 | 
					            text: "Terminus (Modern)"
 | 
				
			||||||
            source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
 | 
					            source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
 | 
				
			||||||
@@ -68,7 +67,7 @@ QtObject{
 | 
				
			|||||||
            baseScaling: 3.0
 | 
					            baseScaling: 3.0
 | 
				
			||||||
            fontWidth: 1.0
 | 
					            fontWidth: 1.0
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "PRO_FONT_SCALED"
 | 
					            name: "PRO_FONT_SCALED"
 | 
				
			||||||
            text: "Pro Font (Modern)"
 | 
					            text: "Pro Font (Modern)"
 | 
				
			||||||
            source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
 | 
					            source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
 | 
				
			||||||
@@ -77,7 +76,7 @@ QtObject{
 | 
				
			|||||||
            baseScaling: 3.0
 | 
					            baseScaling: 3.0
 | 
				
			||||||
            fontWidth: 1.0
 | 
					            fontWidth: 1.0
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "APPLE_II"
 | 
					            name: "APPLE_II"
 | 
				
			||||||
            text: "Apple ][ (1977)"
 | 
					            text: "Apple ][ (1977)"
 | 
				
			||||||
            source: "fonts/1977-apple2/PrintChar21.ttf"
 | 
					            source: "fonts/1977-apple2/PrintChar21.ttf"
 | 
				
			||||||
@@ -86,7 +85,7 @@ QtObject{
 | 
				
			|||||||
            baseScaling: 3.5
 | 
					            baseScaling: 3.5
 | 
				
			||||||
            fontWidth: 0.8
 | 
					            fontWidth: 0.8
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "ATARI_400"
 | 
					            name: "ATARI_400"
 | 
				
			||||||
            text: "Atari 400-800 (1979)"
 | 
					            text: "Atari 400-800 (1979)"
 | 
				
			||||||
            source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf"
 | 
					            source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf"
 | 
				
			||||||
@@ -95,7 +94,7 @@ QtObject{
 | 
				
			|||||||
            baseScaling: 3.5
 | 
					            baseScaling: 3.5
 | 
				
			||||||
            fontWidth: 0.7
 | 
					            fontWidth: 0.7
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "COMMODORE_64"
 | 
					            name: "COMMODORE_64"
 | 
				
			||||||
            text: "Commodore 64 (1982)"
 | 
					            text: "Commodore 64 (1982)"
 | 
				
			||||||
            source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"
 | 
					            source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,27 +17,20 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QtObject{
 | 
					QtObject {
 | 
				
			||||||
    property int selectedFontIndex
 | 
					    property int selectedFontIndex
 | 
				
			||||||
    property real scaling
 | 
					    property real scaling
 | 
				
			||||||
    property var source: fontlist.get(selectedFontIndex).source
 | 
					    property var source: fontlist.get(selectedFontIndex).source
 | 
				
			||||||
    property var _font: fontlist.get(selectedFontIndex)
 | 
					    property var _font: fontlist.get(selectedFontIndex)
 | 
				
			||||||
    property bool lowResolutionFont: _font.lowResolutionFont
 | 
					    property bool lowResolutionFont: _font.lowResolutionFont
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property int pixelSize: lowResolutionFont
 | 
					    property int pixelSize: lowResolutionFont ? _font.pixelSize : _font.pixelSize * scaling
 | 
				
			||||||
                                 ? _font.pixelSize
 | 
					 | 
				
			||||||
                                 : _font.pixelSize * scaling
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property int lineSpacing: lowResolutionFont
 | 
					    property int lineSpacing: lowResolutionFont ? _font.lineSpacing : pixelSize * _font.lineSpacing
 | 
				
			||||||
                                  ? _font.lineSpacing
 | 
					 | 
				
			||||||
                                  : pixelSize * _font.lineSpacing
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property real screenScaling: lowResolutionFont
 | 
					    property real screenScaling: lowResolutionFont ? _font.baseScaling * scaling : 1.0
 | 
				
			||||||
                                     ? _font.baseScaling * scaling
 | 
					 | 
				
			||||||
                                     : 1.0
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
 | 
					    property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -52,9 +45,8 @@ QtObject{
 | 
				
			|||||||
    // High resolution fonts are instead drawn on a texture which has the
 | 
					    // High resolution fonts are instead drawn on a texture which has the
 | 
				
			||||||
    // size of the screen, and the scaling directly controls their pixels size.
 | 
					    // size of the screen, and the scaling directly controls their pixels size.
 | 
				
			||||||
    // Those are slower to render but are not pixelated.
 | 
					    // Those are slower to render but are not pixelated.
 | 
				
			||||||
 | 
					 | 
				
			||||||
    property ListModel fontlist: ListModel {
 | 
					    property ListModel fontlist: ListModel {
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "TERMINUS_SCALED"
 | 
					            name: "TERMINUS_SCALED"
 | 
				
			||||||
            text: "Terminus (Modern)"
 | 
					            text: "Terminus (Modern)"
 | 
				
			||||||
            source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
 | 
					            source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
 | 
				
			||||||
@@ -66,7 +58,7 @@ QtObject{
 | 
				
			|||||||
            isSystemFont: false
 | 
					            isSystemFont: false
 | 
				
			||||||
            family: ""
 | 
					            family: ""
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "PRO_FONT_SCALED"
 | 
					            name: "PRO_FONT_SCALED"
 | 
				
			||||||
            text: "Pro Font (Modern)"
 | 
					            text: "Pro Font (Modern)"
 | 
				
			||||||
            source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
 | 
					            source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
 | 
				
			||||||
@@ -78,7 +70,7 @@ QtObject{
 | 
				
			|||||||
            isSystemFont: false
 | 
					            isSystemFont: false
 | 
				
			||||||
            family: ""
 | 
					            family: ""
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "EXCELSIOR_SCALED"
 | 
					            name: "EXCELSIOR_SCALED"
 | 
				
			||||||
            text: "Fixedsys Excelsior (Modern)"
 | 
					            text: "Fixedsys Excelsior (Modern)"
 | 
				
			||||||
            source: "fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf"
 | 
					            source: "fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf"
 | 
				
			||||||
@@ -90,7 +82,7 @@ QtObject{
 | 
				
			|||||||
            isSystemFont: false
 | 
					            isSystemFont: false
 | 
				
			||||||
            family: ""
 | 
					            family: ""
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "COMMODORE_PET_SCALED"
 | 
					            name: "COMMODORE_PET_SCALED"
 | 
				
			||||||
            text: "Commodore PET (1977)"
 | 
					            text: "Commodore PET (1977)"
 | 
				
			||||||
            source: "fonts/1977-commodore-pet/PetMe.ttf"
 | 
					            source: "fonts/1977-commodore-pet/PetMe.ttf"
 | 
				
			||||||
@@ -102,7 +94,7 @@ QtObject{
 | 
				
			|||||||
            isSystemFont: false
 | 
					            isSystemFont: false
 | 
				
			||||||
            family: ""
 | 
					            family: ""
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "PROGGY_TINY_SCALED"
 | 
					            name: "PROGGY_TINY_SCALED"
 | 
				
			||||||
            text: "Proggy Tiny (Modern)"
 | 
					            text: "Proggy Tiny (Modern)"
 | 
				
			||||||
            source: "fonts/modern-proggy-tiny/ProggyTiny.ttf"
 | 
					            source: "fonts/modern-proggy-tiny/ProggyTiny.ttf"
 | 
				
			||||||
@@ -114,7 +106,7 @@ QtObject{
 | 
				
			|||||||
            isSystemFont: false
 | 
					            isSystemFont: false
 | 
				
			||||||
            family: ""
 | 
					            family: ""
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "APPLE_II_SCALED"
 | 
					            name: "APPLE_II_SCALED"
 | 
				
			||||||
            text: "Apple ][ (1977)"
 | 
					            text: "Apple ][ (1977)"
 | 
				
			||||||
            source: "fonts/1977-apple2/PrintChar21.ttf"
 | 
					            source: "fonts/1977-apple2/PrintChar21.ttf"
 | 
				
			||||||
@@ -126,7 +118,7 @@ QtObject{
 | 
				
			|||||||
            isSystemFont: false
 | 
					            isSystemFont: false
 | 
				
			||||||
            family: ""
 | 
					            family: ""
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "ATARI_400_SCALED"
 | 
					            name: "ATARI_400_SCALED"
 | 
				
			||||||
            text: "Atari 400-800 (1979)"
 | 
					            text: "Atari 400-800 (1979)"
 | 
				
			||||||
            source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf"
 | 
					            source: "fonts/1979-atari-400-800/AtariClassic-Regular.ttf"
 | 
				
			||||||
@@ -138,7 +130,7 @@ QtObject{
 | 
				
			|||||||
            isSystemFont: false
 | 
					            isSystemFont: false
 | 
				
			||||||
            family: ""
 | 
					            family: ""
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "IBM_PC_SCALED"
 | 
					            name: "IBM_PC_SCALED"
 | 
				
			||||||
            text: "IBM PC (1981)"
 | 
					            text: "IBM PC (1981)"
 | 
				
			||||||
            source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf"
 | 
					            source: "fonts/1981-ibm-pc/PxPlus_IBM_BIOS.ttf"
 | 
				
			||||||
@@ -150,7 +142,7 @@ QtObject{
 | 
				
			|||||||
            isSystemFont: false
 | 
					            isSystemFont: false
 | 
				
			||||||
            family: ""
 | 
					            family: ""
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "COMMODORE_64_SCALED"
 | 
					            name: "COMMODORE_64_SCALED"
 | 
				
			||||||
            text: "Commodore 64 (1982)"
 | 
					            text: "Commodore 64 (1982)"
 | 
				
			||||||
            source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"
 | 
					            source: "fonts/1982-commodore64/C64_Pro_Mono-STYLE.ttf"
 | 
				
			||||||
@@ -162,7 +154,7 @@ QtObject{
 | 
				
			|||||||
            isSystemFont: false
 | 
					            isSystemFont: false
 | 
				
			||||||
            family: ""
 | 
					            family: ""
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "IBM_DOS"
 | 
					            name: "IBM_DOS"
 | 
				
			||||||
            text: "IBM DOS (1985)"
 | 
					            text: "IBM DOS (1985)"
 | 
				
			||||||
            source: "fonts/1985-ibm-pc-vga/PxPlus_IBM_VGA8.ttf"
 | 
					            source: "fonts/1985-ibm-pc-vga/PxPlus_IBM_VGA8.ttf"
 | 
				
			||||||
@@ -174,7 +166,7 @@ QtObject{
 | 
				
			|||||||
            isSystemFont: false
 | 
					            isSystemFont: false
 | 
				
			||||||
            family: ""
 | 
					            family: ""
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "HERMIT"
 | 
					            name: "HERMIT"
 | 
				
			||||||
            text: "HD: Hermit (Modern)"
 | 
					            text: "HD: Hermit (Modern)"
 | 
				
			||||||
            source: "fonts/modern-hermit/Hermit-medium.otf"
 | 
					            source: "fonts/modern-hermit/Hermit-medium.otf"
 | 
				
			||||||
@@ -185,7 +177,7 @@ QtObject{
 | 
				
			|||||||
            isSystemFont: false
 | 
					            isSystemFont: false
 | 
				
			||||||
            family: ""
 | 
					            family: ""
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "TERMINUS"
 | 
					            name: "TERMINUS"
 | 
				
			||||||
            text: "HD: Terminus (Modern)"
 | 
					            text: "HD: Terminus (Modern)"
 | 
				
			||||||
            source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
 | 
					            source: "fonts/modern-terminus/TerminusTTF-4.46.0.ttf"
 | 
				
			||||||
@@ -196,7 +188,7 @@ QtObject{
 | 
				
			|||||||
            isSystemFont: false
 | 
					            isSystemFont: false
 | 
				
			||||||
            family: ""
 | 
					            family: ""
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "PRO_FONT"
 | 
					            name: "PRO_FONT"
 | 
				
			||||||
            text: "HD: Pro Font (Modern)"
 | 
					            text: "HD: Pro Font (Modern)"
 | 
				
			||||||
            source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
 | 
					            source: "fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf"
 | 
				
			||||||
@@ -207,7 +199,7 @@ QtObject{
 | 
				
			|||||||
            isSystemFont: false
 | 
					            isSystemFont: false
 | 
				
			||||||
            family: ""
 | 
					            family: ""
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "INCONSOLATA"
 | 
					            name: "INCONSOLATA"
 | 
				
			||||||
            text: "HD: Inconsolata (Modern)"
 | 
					            text: "HD: Inconsolata (Modern)"
 | 
				
			||||||
            source: "fonts/modern-inconsolata/Inconsolata.otf"
 | 
					            source: "fonts/modern-inconsolata/Inconsolata.otf"
 | 
				
			||||||
@@ -218,10 +210,10 @@ QtObject{
 | 
				
			|||||||
            isSystemFont: false
 | 
					            isSystemFont: false
 | 
				
			||||||
            family: ""
 | 
					            family: ""
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ListElement{
 | 
					        ListElement {
 | 
				
			||||||
            name: "IBM_3278"
 | 
					            name: "IBM_3278"
 | 
				
			||||||
            text: "HD: IBM 3278 (1971)"
 | 
					            text: "HD: IBM 3278 (1971)"
 | 
				
			||||||
            source: "fonts/1971-ibm-3278/3270Medium.ttf"
 | 
					            source: "fonts/1971-ibm-3278/3270-Regular.ttf"
 | 
				
			||||||
            lineSpacing: 0.2
 | 
					            lineSpacing: 0.2
 | 
				
			||||||
            pixelSize: 32
 | 
					            pixelSize: 32
 | 
				
			||||||
            fontWidth: 1.0
 | 
					            fontWidth: 1.0
 | 
				
			||||||
@@ -234,25 +226,27 @@ QtObject{
 | 
				
			|||||||
    Component.onCompleted: addSystemFonts()
 | 
					    Component.onCompleted: addSystemFonts()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function addSystemFonts() {
 | 
					    function addSystemFonts() {
 | 
				
			||||||
        var families = monospaceSystemFonts;
 | 
					        var families = monospaceSystemFonts
 | 
				
			||||||
        for (var i = 0; i < families.length; i++) {
 | 
					        for (var i = 0; i < families.length; i++) {
 | 
				
			||||||
            console.log("Adding system font: ", families[i])
 | 
					            if (verbose) {
 | 
				
			||||||
 | 
					                console.log("Adding system font: ", families[i])
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            fontlist.append(convertToListElement(families[i]))
 | 
					            fontlist.append(convertToListElement(families[i]))
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function convertToListElement(family) {
 | 
					    function convertToListElement(family) {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            name: "System: " + family,
 | 
					            "name": "System: " + family,
 | 
				
			||||||
            text: qsTr("System: ") + family,
 | 
					            "text": qsTr("System: ") + family,
 | 
				
			||||||
            source: "",
 | 
					            "source": "",
 | 
				
			||||||
            lineSpacing: 0.1,
 | 
					            "lineSpacing": 0.1,
 | 
				
			||||||
            pixelSize: 30,
 | 
					            "pixelSize": 30,
 | 
				
			||||||
            fontWidth: 1.0,
 | 
					            "fontWidth": 1.0,
 | 
				
			||||||
            baseScaling: 1.0,
 | 
					            "baseScaling": 1.0,
 | 
				
			||||||
            lowResolutionFont: false,
 | 
					            "lowResolutionFont": false,
 | 
				
			||||||
            isSystemFont: true,
 | 
					            "isSystemFont": true,
 | 
				
			||||||
            family: family
 | 
					            "family": family
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,21 +0,0 @@
 | 
				
			|||||||
import QtQuick 2.2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Rectangle {
 | 
					 | 
				
			||||||
    anchors.centerIn: parent
 | 
					 | 
				
			||||||
    width: parent.width - parent.border.width
 | 
					 | 
				
			||||||
    height: parent.height - parent.border.width
 | 
					 | 
				
			||||||
    radius:parent.radius - parent.border.width/2
 | 
					 | 
				
			||||||
    smooth: true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    border.width: parent.border.width/2
 | 
					 | 
				
			||||||
    border.color: "#22FFFFFF"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    gradient: Gradient {
 | 
					 | 
				
			||||||
        GradientStop { position: 0;    color: "#88FFFFFF" }
 | 
					 | 
				
			||||||
        GradientStop { position: .1;   color: "#55FFFFFF" }
 | 
					 | 
				
			||||||
        GradientStop { position: .5;   color: "#33FFFFFF" }
 | 
					 | 
				
			||||||
        GradientStop { position: .501; color: "#11000000" }
 | 
					 | 
				
			||||||
        GradientStop { position: .8;   color: "#11FFFFFF" }
 | 
					 | 
				
			||||||
        GradientStop { position: 1;    color: "#55FFFFFF" }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,14 +17,13 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Window 2.0
 | 
					import QtQuick.Window 2.0
 | 
				
			||||||
import QtQuick.Controls 1.1
 | 
					import QtQuick.Controls 2.0
 | 
				
			||||||
import QtQuick.Layouts 1.1
 | 
					import QtQuick.Layouts 1.1
 | 
				
			||||||
import QtQuick.Dialogs 1.1
 | 
					import QtQuick.Dialogs 1.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Window{
 | 
					Window {
 | 
				
			||||||
    id: insertnamedialog
 | 
					    id: insertnamedialog
 | 
				
			||||||
    width: 400
 | 
					    width: 400
 | 
				
			||||||
    height: 100
 | 
					    height: 100
 | 
				
			||||||
@@ -39,50 +38,53 @@ Window{
 | 
				
			|||||||
        title: qsTr("Error")
 | 
					        title: qsTr("Error")
 | 
				
			||||||
        visible: false
 | 
					        visible: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function showError(message){
 | 
					        function showError(message) {
 | 
				
			||||||
            text = message;
 | 
					            text = message
 | 
				
			||||||
            open();
 | 
					            open()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function validateName(name){
 | 
					    function validateName(name) {
 | 
				
			||||||
        var profile_list = appSettings.profilesList;
 | 
					        var profile_list = appSettings.profilesList
 | 
				
			||||||
        if (name === "")
 | 
					        if (name === "")
 | 
				
			||||||
            return 1;
 | 
					            return 1
 | 
				
			||||||
        return 0;
 | 
					        return 0
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ColumnLayout{
 | 
					    ColumnLayout {
 | 
				
			||||||
        anchors.margins: 10
 | 
					        anchors.margins: 10
 | 
				
			||||||
        anchors.fill: parent
 | 
					        anchors.fill: parent
 | 
				
			||||||
        RowLayout{
 | 
					        RowLayout {
 | 
				
			||||||
            Label{text: qsTr("Name")}
 | 
					            Label {
 | 
				
			||||||
            TextField{
 | 
					                text: qsTr("Name")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            TextField {
 | 
				
			||||||
                id: namefield
 | 
					                id: namefield
 | 
				
			||||||
                Layout.fillWidth: true
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
                Component.onCompleted: forceActiveFocus()
 | 
					                Component.onCompleted: forceActiveFocus()
 | 
				
			||||||
                onAccepted: okbutton.clickAction()
 | 
					                onAccepted: okbutton.clickAction()
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        RowLayout{
 | 
					        RowLayout {
 | 
				
			||||||
            Layout.alignment: Qt.AlignBottom | Qt.AlignRight
 | 
					            Layout.alignment: Qt.AlignBottom | Qt.AlignRight
 | 
				
			||||||
            Button{
 | 
					            Button {
 | 
				
			||||||
                id: okbutton
 | 
					                id: okbutton
 | 
				
			||||||
                text: qsTr("OK")
 | 
					                text: qsTr("OK")
 | 
				
			||||||
                onClicked: clickAction()
 | 
					                onClicked: clickAction()
 | 
				
			||||||
                function clickAction(){
 | 
					                function clickAction() {
 | 
				
			||||||
                    var name = namefield.text;
 | 
					                    var name = namefield.text
 | 
				
			||||||
                    switch(validateName(name)){
 | 
					                    switch (validateName(name)) {
 | 
				
			||||||
                    case 1:
 | 
					                    case 1:
 | 
				
			||||||
                        errorDialog.showError(qsTr("The name you inserted is empty. Please choose a different one."));
 | 
					                        errorDialog.showError(
 | 
				
			||||||
                        break;
 | 
					                                    qsTr("The name you inserted is empty. Please choose a different one."))
 | 
				
			||||||
 | 
					                        break
 | 
				
			||||||
                    default:
 | 
					                    default:
 | 
				
			||||||
                        nameSelected(name);
 | 
					                        nameSelected(name)
 | 
				
			||||||
                        close();
 | 
					                        close()
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Button{
 | 
					            Button {
 | 
				
			||||||
                text: qsTr("Cancel")
 | 
					                text: qsTr("Cancel")
 | 
				
			||||||
                onClicked: close()
 | 
					                onClicked: close()
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,78 +0,0 @@
 | 
				
			|||||||
import QtQuick 2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "utils.js" as Utils
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ShaderEffect {
 | 
					 | 
				
			||||||
    property color _staticFrameColor: "#ffffff"
 | 
					 | 
				
			||||||
    property color _backgroundColor: appSettings.backgroundColor
 | 
					 | 
				
			||||||
    property color _fontColor: appSettings.fontColor
 | 
					 | 
				
			||||||
    property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2)
 | 
					 | 
				
			||||||
    property real _ambientLight: Utils.lint(0.2, 0.8, appSettings.ambientLight)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    property color frameColor: Utils.mix(_staticFrameColor, _lightColor, _ambientLight)
 | 
					 | 
				
			||||||
    property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
 | 
					 | 
				
			||||||
    property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    property size aadelta: Qt.size(1.0 / width, 1.0 / height)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fragmentShader: "
 | 
					 | 
				
			||||||
        #ifdef GL_ES
 | 
					 | 
				
			||||||
            precision mediump float;
 | 
					 | 
				
			||||||
        #endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        uniform lowp float screenCurvature;
 | 
					 | 
				
			||||||
        uniform lowp float shadowLength;
 | 
					 | 
				
			||||||
        uniform highp float qt_Opacity;
 | 
					 | 
				
			||||||
        uniform lowp vec4 frameColor;
 | 
					 | 
				
			||||||
        uniform mediump vec2 aadelta;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        varying highp vec2 qt_TexCoord0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        vec2 distortCoordinates(vec2 coords){
 | 
					 | 
				
			||||||
            vec2 cc = (coords - vec2(0.5));
 | 
					 | 
				
			||||||
            float dist = dot(cc, cc) * screenCurvature;
 | 
					 | 
				
			||||||
            return (coords + cc * (1.0 + dist) * dist);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        float max2(vec2 v) {
 | 
					 | 
				
			||||||
            return max(v.x, v.y);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        float min2(vec2 v) {
 | 
					 | 
				
			||||||
            return min(v.x, v.y);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        float prod2(vec2 v) {
 | 
					 | 
				
			||||||
            return v.x * v.y;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        float sum2(vec2 v) {
 | 
					 | 
				
			||||||
            return v.x + v.y;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        void main(){
 | 
					 | 
				
			||||||
            vec2 staticCoords = qt_TexCoord0;
 | 
					 | 
				
			||||||
            vec2 coords = distortCoordinates(staticCoords);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            vec3 color = vec3(0.0);
 | 
					 | 
				
			||||||
            float alpha = 0.0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            float outShadowLength = shadowLength;
 | 
					 | 
				
			||||||
            float inShadowLength = shadowLength * 0.5;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            float outShadow = max2(1.0 - smoothstep(vec2(-outShadowLength), vec2(0.0), coords) + smoothstep(vec2(1.0), vec2(1.0 + outShadowLength), coords));
 | 
					 | 
				
			||||||
            outShadow = clamp(0.0, 1.0, sqrt(outShadow));
 | 
					 | 
				
			||||||
            color += frameColor.rgb * outShadow;
 | 
					 | 
				
			||||||
            alpha = sum2(1.0 - smoothstep(vec2(0.0), aadelta, coords) + smoothstep(vec2(1.0) - aadelta, vec2(1.0), coords));
 | 
					 | 
				
			||||||
            alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, outShadow);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            float inShadow = 1.0 - prod2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords));
 | 
					 | 
				
			||||||
            inShadow = 0.5 * inShadow * inShadow;
 | 
					 | 
				
			||||||
            alpha = max(alpha, inShadow);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            gl_FragColor = vec4(color * alpha, alpha);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    "
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    onStatusChanged: if (log) console.log(log) //Print warning messages
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -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,10 +19,11 @@
 | 
				
			|||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 1.1
 | 
					import QtQuick.Controls 2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import QMLTermWidget 1.0
 | 
					import QMLTermWidget 1.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "menus"
 | 
				
			||||||
import "utils.js" as Utils
 | 
					import "utils.js" as Utils
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Item{
 | 
					Item{
 | 
				
			||||||
@@ -43,45 +44,83 @@ Item{
 | 
				
			|||||||
    property size fontMetrics: kterminal.fontMetrics
 | 
					    property size fontMetrics: kterminal.fontMetrics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Manage copy and paste
 | 
					    // Manage copy and paste
 | 
				
			||||||
    Connections{
 | 
					    Connections {
 | 
				
			||||||
        target: copyAction
 | 
					        target: copyAction
 | 
				
			||||||
        onTriggered: kterminal.copyClipboard();
 | 
					
 | 
				
			||||||
 | 
					        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()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    Connections {
 | 
				
			||||||
 | 
					        target: terminalWindow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        onActiveChanged: {
 | 
				
			||||||
 | 
					            kterminal.forceActiveFocus()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function updateSources() {
 | 
					    function updateSources() {
 | 
				
			||||||
        kterminal.update();
 | 
					        kterminal.update()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QMLTermWidget {
 | 
					    QMLTermWidget {
 | 
				
			||||||
        id: kterminal
 | 
					        id: kterminal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        property int margin: appSettings.margin / screenScaling
 | 
					        property int textureResolutionScale: appSettings.lowResolutionFont ? devicePixelRatio : 1
 | 
				
			||||||
 | 
					        property int margin: appSettings.totalMargin / screenScaling
 | 
				
			||||||
        property int totalWidth: Math.floor(parent.width / (screenScaling * fontWidth))
 | 
					        property int totalWidth: Math.floor(parent.width / (screenScaling * fontWidth))
 | 
				
			||||||
        property int totalHeight: Math.floor(parent.height / screenScaling)
 | 
					        property int totalHeight: Math.floor(parent.height / screenScaling)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        width: totalWidth - 2 * margin
 | 
					        property int rawWidth: totalWidth - 2 * margin
 | 
				
			||||||
        height: totalHeight - 2 * margin
 | 
					        property int rawHeight: totalHeight - 2 * margin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        textureSize: Qt.size(width / textureResolutionScale, height / textureResolutionScale)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        width: ensureMultiple(rawWidth, devicePixelRatio)
 | 
				
			||||||
 | 
					        height: ensureMultiple(rawHeight, devicePixelRatio)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /** Ensure size is a multiple of factor. This is needed for pixel perfect scaling on highdpi screens. */
 | 
				
			||||||
 | 
					        function ensureMultiple(size, factor) {
 | 
				
			||||||
 | 
					            return Math.round(size / factor) * factor;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        colorScheme: "cool-retro-term"
 | 
					        colorScheme: "cool-retro-term"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        smooth: !appSettings.lowResolutionFont
 | 
					        smooth: !appSettings.lowResolutionFont
 | 
				
			||||||
        enableBold: false
 | 
					        enableBold: false
 | 
				
			||||||
        fullCursorHeight: true
 | 
					        fullCursorHeight: true
 | 
				
			||||||
 | 
					        blinkingCursor: appSettings.blinkingCursor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        session: QMLTermSession {
 | 
					        session: QMLTermSession {
 | 
				
			||||||
            id: ksession
 | 
					            id: ksession
 | 
				
			||||||
@@ -129,7 +168,7 @@ Item{
 | 
				
			|||||||
                var args = Utils.tokenizeCommandLine(appSettings.customCommand);
 | 
					                var args = Utils.tokenizeCommandLine(appSettings.customCommand);
 | 
				
			||||||
                ksession.setShellProgram(args[0]);
 | 
					                ksession.setShellProgram(args[0]);
 | 
				
			||||||
                ksession.setArgs(args.slice(1));
 | 
					                ksession.setArgs(args.slice(1));
 | 
				
			||||||
            } else if (!defaultCmd && Qt.platform.os === "osx") {
 | 
					            } else if (!defaultCmd && appSettings.isMacOS) {
 | 
				
			||||||
                // OSX Requires the following default parameters for auto login.
 | 
					                // OSX Requires the following default parameters for auto login.
 | 
				
			||||||
                ksession.setArgs(["-i", "-l"]);
 | 
					                ksession.setArgs(["-i", "-l"]);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -143,36 +182,28 @@ Item{
 | 
				
			|||||||
        Component.onCompleted: {
 | 
					        Component.onCompleted: {
 | 
				
			||||||
            appSettings.terminalFontChanged.connect(handleFontChanged);
 | 
					            appSettings.terminalFontChanged.connect(handleFontChanged);
 | 
				
			||||||
            appSettings.initializedSettings.connect(startSession);
 | 
					            appSettings.initializedSettings.connect(startSession);
 | 
				
			||||||
 | 
					            appSettings.handleFontChanged()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Component {
 | 
					    Component {
 | 
				
			||||||
        id: linuxContextMenu
 | 
					        id: shortContextMenu
 | 
				
			||||||
        Menu{
 | 
					        ShortContextMenu { }
 | 
				
			||||||
            id: contextmenu
 | 
					 | 
				
			||||||
            MenuItem { action: copyAction }
 | 
					 | 
				
			||||||
            MenuItem { action: pasteAction }
 | 
					 | 
				
			||||||
            MenuSeparator { visible: !appSettings.showMenubar }
 | 
					 | 
				
			||||||
            MenuItem { action: showsettingsAction ; visible: !appSettings.showMenubar}
 | 
					 | 
				
			||||||
            MenuSeparator { visible: !appSettings.showMenubar }
 | 
					 | 
				
			||||||
            CRTMainMenuBar { visible: !appSettings.showMenubar }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Component {
 | 
					    Component {
 | 
				
			||||||
        id: osxContextMenu
 | 
					        id: fullContextMenu
 | 
				
			||||||
        Menu{
 | 
					        FullContextMenu { }
 | 
				
			||||||
            id: contextmenu
 | 
					 | 
				
			||||||
            MenuItem{action: copyAction}
 | 
					 | 
				
			||||||
            MenuItem{action: pasteAction}
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Loader {
 | 
					    Loader {
 | 
				
			||||||
        id: menuLoader
 | 
					        id: menuLoader
 | 
				
			||||||
        sourceComponent: (Qt.platform.os === "osx" ? osxContextMenu : linuxContextMenu)
 | 
					        sourceComponent: (appSettings.isMacOS || appSettings.showMenubar ? shortContextMenu : fullContextMenu)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    property alias contextmenu: menuLoader.item
 | 
					    property alias contextmenu: menuLoader.item
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    MouseArea{
 | 
					    MouseArea {
 | 
				
			||||||
        property real margin: appSettings.margin
 | 
					        property real margin: appSettings.totalMargin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
 | 
					        acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
 | 
				
			||||||
        anchors.fill: parent
 | 
					        anchors.fill: parent
 | 
				
			||||||
@@ -213,8 +244,8 @@ Item{
 | 
				
			|||||||
            var cc = Qt.size(0.5 - x, 0.5 - y);
 | 
					            var cc = Qt.size(0.5 - x, 0.5 - y);
 | 
				
			||||||
            var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize;
 | 
					            var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return Qt.point((x - cc.width  * (1+distortion) * distortion) * kterminal.totalWidth,
 | 
					            return Qt.point((x - cc.width  * (1+distortion) * distortion) * (kterminal.totalWidth),
 | 
				
			||||||
                           (y - cc.height * (1+distortion) * distortion) * kterminal.totalHeight)
 | 
					                           (y - cc.height * (1+distortion) * distortion) * (kterminal.totalHeight))
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ShaderEffectSource{
 | 
					    ShaderEffectSource{
 | 
				
			||||||
@@ -227,7 +258,22 @@ Item{
 | 
				
			|||||||
        sourceRect: Qt.rect(-kterminal.margin, -kterminal.margin, kterminal.totalWidth, kterminal.totalHeight)
 | 
					        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
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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,122 +17,142 @@
 | 
				
			|||||||
* 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 QtQml 2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "Components"
 | 
					import "Components"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Tab{
 | 
					ColumnLayout {
 | 
				
			||||||
    ColumnLayout{
 | 
					    GroupBox {
 | 
				
			||||||
        anchors.fill: parent
 | 
					        Layout.fillWidth: true
 | 
				
			||||||
 | 
					        title: qsTr("Command")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        GroupBox{
 | 
					        ColumnLayout {
 | 
				
			||||||
            Layout.fillWidth: true
 | 
					            anchors.fill: parent
 | 
				
			||||||
            title: qsTr("Command")
 | 
					            CheckBox {
 | 
				
			||||||
            ColumnLayout {
 | 
					                id: useCustomCommand
 | 
				
			||||||
                anchors.fill: parent
 | 
					                text: qsTr("Use custom command instead of shell at startup")
 | 
				
			||||||
                CheckBox{
 | 
					                checked: appSettings.useCustomCommand
 | 
				
			||||||
                    id: useCustomCommand
 | 
					                onCheckedChanged: appSettings.useCustomCommand = checked
 | 
				
			||||||
                    text: qsTr("Use custom command instead of shell at startup")
 | 
					            }
 | 
				
			||||||
                    checked: appSettings.useCustomCommand
 | 
					            // Workaround for QTBUG-31627 for pre 5.3.0
 | 
				
			||||||
                    onCheckedChanged: appSettings.useCustomCommand = checked
 | 
					            Binding {
 | 
				
			||||||
                }
 | 
					                target: useCustomCommand
 | 
				
			||||||
                // Workaround for QTBUG-31627 for pre 5.3.0
 | 
					                property: "checked"
 | 
				
			||||||
                Binding{
 | 
					                value: appSettings.useCustomCommand
 | 
				
			||||||
                    target: useCustomCommand
 | 
					            }
 | 
				
			||||||
                    property: "checked"
 | 
					            TextField {
 | 
				
			||||||
                    value: appSettings.useCustomCommand
 | 
					                id: customCommand
 | 
				
			||||||
                }
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
                TextField{
 | 
					                text: appSettings.customCommand
 | 
				
			||||||
                    id: customCommand
 | 
					                enabled: useCustomCommand.checked
 | 
				
			||||||
                    Layout.fillWidth: true
 | 
					                onEditingFinished: appSettings.customCommand = text
 | 
				
			||||||
                    text: appSettings.customCommand
 | 
					 | 
				
			||||||
                    enabled: useCustomCommand.checked
 | 
					 | 
				
			||||||
                    onEditingFinished: appSettings.customCommand = text
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    // Save text even if user forgets to press enter or unfocus
 | 
					                // Save text even if user forgets to press enter or unfocus
 | 
				
			||||||
                    function saveSetting() {
 | 
					                function saveSetting() {
 | 
				
			||||||
                        appSettings.customCommand = text;
 | 
					                    appSettings.customCommand = text
 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    Component.onCompleted: settings_window.closing.connect(saveSetting)
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                Component.onCompleted: settings_window.closing.connect(
 | 
				
			||||||
 | 
					                                           saveSetting)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        GroupBox{
 | 
					    GroupBox {
 | 
				
			||||||
            title: qsTr("Performance")
 | 
					        title: qsTr("Performance")
 | 
				
			||||||
            Layout.fillWidth: true
 | 
					        Layout.fillWidth: true
 | 
				
			||||||
            GridLayout{
 | 
					        GridLayout {
 | 
				
			||||||
                anchors.fill: parent
 | 
					            anchors.fill: parent
 | 
				
			||||||
                rows: 2
 | 
					            columns: 4
 | 
				
			||||||
                columns: 3
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                Label{text: qsTr("Effects FPS")}
 | 
					            Label {
 | 
				
			||||||
                Slider{
 | 
					                text: qsTr("Effects FPS")
 | 
				
			||||||
                    Layout.fillWidth: true
 | 
					            }
 | 
				
			||||||
                    id: fpsSlider
 | 
					            Slider {
 | 
				
			||||||
                    onValueChanged: {
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
                        if (enabled) {
 | 
					                Layout.columnSpan: 2
 | 
				
			||||||
                            appSettings.fps = value !== 60 ? value + 1 : 0;
 | 
					                id: fpsSlider
 | 
				
			||||||
                        }
 | 
					                onValueChanged: {
 | 
				
			||||||
                    }
 | 
					                    if (enabled) {
 | 
				
			||||||
                    stepSize: 1
 | 
					                        appSettings.fps = value !== 60 ? value + 1 : 0
 | 
				
			||||||
                    enabled: false
 | 
					 | 
				
			||||||
                    Component.onCompleted: {
 | 
					 | 
				
			||||||
                        minimumValue = 0;
 | 
					 | 
				
			||||||
                        maximumValue = 60;
 | 
					 | 
				
			||||||
                        value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60;
 | 
					 | 
				
			||||||
                        enabled = true;
 | 
					 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                stepSize: 1
 | 
				
			||||||
                SizedLabel{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")}
 | 
					                enabled: false
 | 
				
			||||||
                Label{text: qsTr("Texture Quality")}
 | 
					                Component.onCompleted: {
 | 
				
			||||||
                Slider{
 | 
					                    from = 0
 | 
				
			||||||
                    Layout.fillWidth: true
 | 
					                    to = 60
 | 
				
			||||||
                    id: txtslider
 | 
					                    value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60
 | 
				
			||||||
                    onValueChanged: if (enabled) appSettings.windowScaling = value;
 | 
					                    enabled = true
 | 
				
			||||||
                    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) + "%"}
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                Label{text: qsTr("Bloom Quality")}
 | 
					            SizedLabel {
 | 
				
			||||||
                Slider{
 | 
					                text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")
 | 
				
			||||||
                    Layout.fillWidth: true
 | 
					            }
 | 
				
			||||||
                    id: bloomSlider
 | 
					            Label {
 | 
				
			||||||
                    onValueChanged: if (enabled) appSettings.bloomQuality = value;
 | 
					                text: qsTr("Texture Quality")
 | 
				
			||||||
                    stepSize: 0.05
 | 
					            }
 | 
				
			||||||
                    enabled: false
 | 
					            Slider {
 | 
				
			||||||
                    Component.onCompleted: {
 | 
					                id: txtslider
 | 
				
			||||||
                        minimumValue = 0.25
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
                        value = appSettings.bloomQuality;
 | 
					                Layout.columnSpan: 2
 | 
				
			||||||
                        enabled = true;
 | 
					                onValueChanged: if (enabled)
 | 
				
			||||||
                    }
 | 
					                                    appSettings.windowScaling = value
 | 
				
			||||||
 | 
					                stepSize: 0.05
 | 
				
			||||||
 | 
					                enabled: false
 | 
				
			||||||
 | 
					                Component.onCompleted: {
 | 
				
			||||||
 | 
					                    from = 0.25 //Without this value gets set to 0.5
 | 
				
			||||||
 | 
					                    value = appSettings.windowScaling
 | 
				
			||||||
 | 
					                    enabled = true
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"}
 | 
					            }
 | 
				
			||||||
 | 
					            SizedLabel {
 | 
				
			||||||
 | 
					                text: Math.round(txtslider.value * 100) + "%"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                Label{text: qsTr("BurnIn Quality")}
 | 
					            Label {
 | 
				
			||||||
                Slider{
 | 
					                text: qsTr("Bloom Quality")
 | 
				
			||||||
                    Layout.fillWidth: true
 | 
					            }
 | 
				
			||||||
                    id: burnInSlider
 | 
					            Slider {
 | 
				
			||||||
                    onValueChanged: if (enabled) appSettings.burnInQuality = value;
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
                    stepSize: 0.05
 | 
					                Layout.columnSpan: 2
 | 
				
			||||||
                    enabled: false
 | 
					                id: bloomSlider
 | 
				
			||||||
                    Component.onCompleted: {
 | 
					                onValueChanged: if (enabled)
 | 
				
			||||||
                        minimumValue = 0.25
 | 
					                                    appSettings.bloomQuality = value
 | 
				
			||||||
                        value = appSettings.burnInQuality;
 | 
					                stepSize: 0.05
 | 
				
			||||||
                        enabled = true;
 | 
					                enabled: false
 | 
				
			||||||
                    }
 | 
					                Component.onCompleted: {
 | 
				
			||||||
 | 
					                    from = 0.25
 | 
				
			||||||
 | 
					                    value = appSettings.bloomQuality
 | 
				
			||||||
 | 
					                    enabled = true
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"}
 | 
					            }
 | 
				
			||||||
 | 
					            SizedLabel {
 | 
				
			||||||
 | 
					                text: Math.round(bloomSlider.value * 100) + "%"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("BurnIn Quality")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Slider {
 | 
				
			||||||
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
 | 
					                id: burnInSlider
 | 
				
			||||||
 | 
					                Layout.columnSpan: 2
 | 
				
			||||||
 | 
					                onValueChanged: if (enabled)
 | 
				
			||||||
 | 
					                                    appSettings.burnInQuality = value
 | 
				
			||||||
 | 
					                stepSize: 0.05
 | 
				
			||||||
 | 
					                enabled: false
 | 
				
			||||||
 | 
					                Component.onCompleted: {
 | 
				
			||||||
 | 
					                    from = 0.25
 | 
				
			||||||
 | 
					                    value = appSettings.burnInQuality
 | 
				
			||||||
 | 
					                    enabled = true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            SizedLabel {
 | 
				
			||||||
 | 
					                text: Math.round(burnInSlider.value * 100) + "%"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,74 +17,70 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 1.1
 | 
					import QtQuick.Controls 2.0
 | 
				
			||||||
import QtQuick.Layouts 1.1
 | 
					import QtQuick.Layouts 1.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Tab{
 | 
					ColumnLayout {
 | 
				
			||||||
    ColumnLayout{
 | 
					    spacing: 2
 | 
				
			||||||
        anchors.fill: parent
 | 
					 | 
				
			||||||
        spacing: 2
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        GroupBox{
 | 
					    GroupBox {
 | 
				
			||||||
            title: qsTr("Effects")
 | 
					        title: qsTr("Effects")
 | 
				
			||||||
            Layout.fillWidth: true
 | 
					        Layout.fillWidth: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            ColumnLayout {
 | 
					        ColumnLayout {
 | 
				
			||||||
                anchors.fill: parent
 | 
					            anchors.fill: parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                CheckableSlider{
 | 
					            CheckableSlider {
 | 
				
			||||||
                    name: qsTr("Bloom")
 | 
					                name: qsTr("Bloom")
 | 
				
			||||||
                    onNewValue: appSettings.bloom = newValue
 | 
					                onNewValue: appSettings.bloom = newValue
 | 
				
			||||||
                    value: appSettings.bloom
 | 
					                value: appSettings.bloom
 | 
				
			||||||
                }
 | 
					            }
 | 
				
			||||||
                CheckableSlider{
 | 
					            CheckableSlider {
 | 
				
			||||||
                    name: qsTr("BurnIn")
 | 
					                name: qsTr("BurnIn")
 | 
				
			||||||
                    onNewValue: appSettings.burnIn = newValue
 | 
					                onNewValue: appSettings.burnIn = newValue
 | 
				
			||||||
                    value: appSettings.burnIn
 | 
					                value: appSettings.burnIn
 | 
				
			||||||
                }
 | 
					            }
 | 
				
			||||||
                CheckableSlider{
 | 
					            CheckableSlider {
 | 
				
			||||||
                    name: qsTr("Static Noise")
 | 
					                name: qsTr("Static Noise")
 | 
				
			||||||
                    onNewValue: appSettings.staticNoise = newValue
 | 
					                onNewValue: appSettings.staticNoise = newValue
 | 
				
			||||||
                    value: appSettings.staticNoise
 | 
					                value: appSettings.staticNoise
 | 
				
			||||||
                }
 | 
					            }
 | 
				
			||||||
                CheckableSlider{
 | 
					            CheckableSlider {
 | 
				
			||||||
                    name: qsTr("Jitter")
 | 
					                name: qsTr("Jitter")
 | 
				
			||||||
                    onNewValue: appSettings.jitter = newValue
 | 
					                onNewValue: appSettings.jitter = newValue
 | 
				
			||||||
                    value: appSettings.jitter
 | 
					                value: appSettings.jitter
 | 
				
			||||||
                }
 | 
					            }
 | 
				
			||||||
                CheckableSlider{
 | 
					            CheckableSlider {
 | 
				
			||||||
                    name: qsTr("Glow Line")
 | 
					                name: qsTr("Glow Line")
 | 
				
			||||||
                    onNewValue: appSettings.glowingLine = newValue;
 | 
					                onNewValue: appSettings.glowingLine = newValue
 | 
				
			||||||
                    value: appSettings.glowingLine
 | 
					                value: appSettings.glowingLine
 | 
				
			||||||
                }
 | 
					            }
 | 
				
			||||||
                CheckableSlider{
 | 
					            CheckableSlider {
 | 
				
			||||||
                    name: qsTr("Screen Curvature")
 | 
					                name: qsTr("Screen Curvature")
 | 
				
			||||||
                    onNewValue: appSettings.screenCurvature = newValue;
 | 
					                onNewValue: appSettings.screenCurvature = newValue
 | 
				
			||||||
                    value: appSettings.screenCurvature;
 | 
					                value: appSettings.screenCurvature
 | 
				
			||||||
                }
 | 
					            }
 | 
				
			||||||
                CheckableSlider{
 | 
					            CheckableSlider {
 | 
				
			||||||
                    name: qsTr("Ambient Light")
 | 
					                name: qsTr("Ambient Light")
 | 
				
			||||||
                    onNewValue: appSettings.ambientLight = newValue;
 | 
					                onNewValue: appSettings.ambientLight = newValue
 | 
				
			||||||
                    value: appSettings.ambientLight
 | 
					                value: appSettings.ambientLight
 | 
				
			||||||
                    enabled: appSettings.framesIndex !== 0
 | 
					                enabled: appSettings.framesIndex !== 0
 | 
				
			||||||
                }
 | 
					            }
 | 
				
			||||||
                CheckableSlider{
 | 
					            CheckableSlider {
 | 
				
			||||||
                    name: qsTr("Flickering")
 | 
					                name: qsTr("Flickering")
 | 
				
			||||||
                    onNewValue: appSettings.flickering = newValue;
 | 
					                onNewValue: appSettings.flickering = newValue
 | 
				
			||||||
                    value: appSettings.flickering;
 | 
					                value: appSettings.flickering
 | 
				
			||||||
                }
 | 
					            }
 | 
				
			||||||
                CheckableSlider{
 | 
					            CheckableSlider {
 | 
				
			||||||
                    name: qsTr("Horizontal Sync")
 | 
					                name: qsTr("Horizontal Sync")
 | 
				
			||||||
                    onNewValue: appSettings.horizontalSync = newValue;
 | 
					                onNewValue: appSettings.horizontalSync = newValue
 | 
				
			||||||
                    value: appSettings.horizontalSync;
 | 
					                value: appSettings.horizontalSync
 | 
				
			||||||
                }
 | 
					            }
 | 
				
			||||||
                CheckableSlider{
 | 
					            CheckableSlider {
 | 
				
			||||||
                    name: qsTr("RGB Shift")
 | 
					                name: qsTr("RGB Shift")
 | 
				
			||||||
                    onNewValue: appSettings.rbgShift = newValue;
 | 
					                onNewValue: appSettings.rbgShift = newValue
 | 
				
			||||||
                    value: appSettings.rbgShift;
 | 
					                value: appSettings.rbgShift
 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "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,218 +17,252 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 1.1
 | 
					import QtQuick.Controls 2.4
 | 
				
			||||||
import QtQuick.Layouts 1.1
 | 
					import QtQuick.Layouts 1.1
 | 
				
			||||||
import QtQuick.Dialogs 1.1
 | 
					import QtQuick.Dialogs 1.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Tab{
 | 
					ColumnLayout {
 | 
				
			||||||
    ColumnLayout{
 | 
					    GroupBox {
 | 
				
			||||||
        anchors.fill: parent
 | 
					        Layout.fillWidth: true
 | 
				
			||||||
        GroupBox{
 | 
					        title: qsTr("Profile")
 | 
				
			||||||
            Layout.fillWidth: true
 | 
					        RowLayout {
 | 
				
			||||||
            Layout.fillHeight: true
 | 
					            anchors.fill: parent
 | 
				
			||||||
            title: qsTr("Profile")
 | 
					            ListView {
 | 
				
			||||||
            RowLayout {
 | 
					                id: profilesView
 | 
				
			||||||
                anchors.fill: parent
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
                TableView {
 | 
					                Layout.fillHeight: true
 | 
				
			||||||
                    id: profilesView
 | 
					                model: appSettings.profilesList
 | 
				
			||||||
 | 
					                clip: true
 | 
				
			||||||
 | 
					                delegate: Rectangle {
 | 
				
			||||||
 | 
					                    width: label.width
 | 
				
			||||||
 | 
					                    height: label.height
 | 
				
			||||||
 | 
					                    color: (index == profilesView.currentIndex) ? palette.highlight : palette.base
 | 
				
			||||||
 | 
					                    Label {
 | 
				
			||||||
 | 
					                        id: label
 | 
				
			||||||
 | 
					                        text: appSettings.profilesList.get(index).text
 | 
				
			||||||
 | 
					                        MouseArea {
 | 
				
			||||||
 | 
					                            anchors.fill: parent
 | 
				
			||||||
 | 
					                            onClicked: profilesView.currentIndex = index
 | 
				
			||||||
 | 
					                            onDoubleClicked: appSettings.loadProfile(index)
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            ColumnLayout {
 | 
				
			||||||
 | 
					                Layout.fillHeight: true
 | 
				
			||||||
 | 
					                Layout.fillWidth: false
 | 
				
			||||||
 | 
					                Button {
 | 
				
			||||||
                    Layout.fillWidth: true
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
 | 
					                    text: qsTr("Save")
 | 
				
			||||||
 | 
					                    onClicked: {
 | 
				
			||||||
 | 
					                        insertname.profileName = ""
 | 
				
			||||||
 | 
					                        insertname.show()
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                Button {
 | 
				
			||||||
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
 | 
					                    property alias currentIndex: profilesView.currentIndex
 | 
				
			||||||
 | 
					                    enabled: currentIndex >= 0
 | 
				
			||||||
 | 
					                    text: qsTr("Load")
 | 
				
			||||||
 | 
					                    onClicked: {
 | 
				
			||||||
 | 
					                        var index = currentIndex
 | 
				
			||||||
 | 
					                        if (index >= 0)
 | 
				
			||||||
 | 
					                            appSettings.loadProfile(index)
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                Button {
 | 
				
			||||||
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
 | 
					                    text: qsTr("Remove")
 | 
				
			||||||
 | 
					                    property alias currentIndex: profilesView.currentIndex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    enabled: currentIndex >= 0 && !appSettings.profilesList.get(
 | 
				
			||||||
 | 
					                                 currentIndex).builtin
 | 
				
			||||||
 | 
					                    onClicked: {
 | 
				
			||||||
 | 
					                        appSettings.profilesList.remove(currentIndex)
 | 
				
			||||||
 | 
					                        profilesView.selection.clear()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        // TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2.
 | 
				
			||||||
 | 
					                        profilesView.model = 0
 | 
				
			||||||
 | 
					                        profilesView.model = appSettings.profilesList
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                Item {
 | 
				
			||||||
 | 
					                    // Spacing
 | 
				
			||||||
                    Layout.fillHeight: true
 | 
					                    Layout.fillHeight: true
 | 
				
			||||||
                    model: appSettings.profilesList
 | 
					 | 
				
			||||||
                    headerVisible: false
 | 
					 | 
				
			||||||
                    TableViewColumn {
 | 
					 | 
				
			||||||
                        title: qsTr("Profile")
 | 
					 | 
				
			||||||
                        role: "text"
 | 
					 | 
				
			||||||
                        width: parent.width * 0.5
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    onActivated: {
 | 
					 | 
				
			||||||
                        appSettings.loadProfile(row);
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                ColumnLayout {
 | 
					                Button {
 | 
				
			||||||
                    Layout.fillHeight: true
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
                    Layout.fillWidth: false
 | 
					                    text: qsTr("Import")
 | 
				
			||||||
                    Button{
 | 
					                    onClicked: {
 | 
				
			||||||
                        Layout.fillWidth: true
 | 
					                        fileDialog.selectExisting = true
 | 
				
			||||||
                        text: qsTr("Save")
 | 
					                        fileDialog.callBack = function (url) {
 | 
				
			||||||
                        onClicked: {
 | 
					                            loadFile(url)
 | 
				
			||||||
                            insertname.profileName = "";
 | 
					 | 
				
			||||||
                            insertname.show()
 | 
					 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					                        fileDialog.open()
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    Button{
 | 
					                    function loadFile(url) {
 | 
				
			||||||
                        Layout.fillWidth: true
 | 
					                        try {
 | 
				
			||||||
                        property alias currentIndex: profilesView.currentRow
 | 
					                            if (appSettings.verbose)
 | 
				
			||||||
                        enabled: currentIndex >= 0
 | 
					                                console.log("Loading file: " + url)
 | 
				
			||||||
                        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
 | 
					                            var profileObject = JSON.parse(fileIO.read(url))
 | 
				
			||||||
                        onClicked: {
 | 
					                            var name = profileObject.name
 | 
				
			||||||
                            appSettings.profilesList.remove(currentIndex);
 | 
					 | 
				
			||||||
                            profilesView.selection.clear();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            // TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2.
 | 
					                            if (!name)
 | 
				
			||||||
                            profilesView.model = 0;
 | 
					                                throw "Profile doesn't have a name"
 | 
				
			||||||
                            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 version = profileObject.version
 | 
				
			||||||
                                var name = profileObject.name;
 | 
					                                    !== undefined ? profileObject.version : 1
 | 
				
			||||||
 | 
					                            if (version !== appSettings.profileVersion)
 | 
				
			||||||
 | 
					                                throw "This profile is not supported on this version of CRT."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                if (!name)
 | 
					                            delete profileObject.name
 | 
				
			||||||
                                    throw "Profile doesn't have a name";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                var version = profileObject.version !== undefined ? profileObject.version : 1;
 | 
					                            appSettings.appendCustomProfile(name,
 | 
				
			||||||
                                if (version !== appSettings.profileVersion)
 | 
					                                                            JSON.stringify(
 | 
				
			||||||
                                    throw "This profile is not supported on this version of CRT.";
 | 
					                                                                profileObject))
 | 
				
			||||||
 | 
					                        } catch (err) {
 | 
				
			||||||
                                delete profileObject.name;
 | 
					                            messageDialog.text = qsTr(err)
 | 
				
			||||||
 | 
					                            messageDialog.open()
 | 
				
			||||||
                                appSettings.appendCustomProfile(name, JSON.stringify(profileObject));
 | 
					 | 
				
			||||||
                            } catch (err) {
 | 
					 | 
				
			||||||
                                messageDialog.text = qsTr(err)
 | 
					 | 
				
			||||||
                                messageDialog.open();
 | 
					 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    Button{
 | 
					 | 
				
			||||||
                        property alias currentIndex: profilesView.currentRow
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        Layout.fillWidth: true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        text: qsTr("Export")
 | 
					 | 
				
			||||||
                        enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin
 | 
					 | 
				
			||||||
                        onClicked: {
 | 
					 | 
				
			||||||
                            fileDialog.selectExisting = false;
 | 
					 | 
				
			||||||
                            fileDialog.callBack = function (url) {storeFile(url);};
 | 
					 | 
				
			||||||
                            fileDialog.open();
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                        function storeFile(url) {
 | 
					 | 
				
			||||||
                            try {
 | 
					 | 
				
			||||||
                                var urlString = url.toString();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                                // Fix the extension if it's missing.
 | 
					 | 
				
			||||||
                                var extension = urlString.substring(urlString.length - 5, urlString.length);
 | 
					 | 
				
			||||||
                                var urlTail = (extension === ".json" ? "" : ".json");
 | 
					 | 
				
			||||||
                                url += urlTail;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                                if (true)
 | 
					 | 
				
			||||||
                                    console.log("Storing file: " + url);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                                var profileObject = appSettings.profilesList.get(currentIndex);
 | 
					 | 
				
			||||||
                                var profileSettings = JSON.parse(profileObject.obj_string);
 | 
					 | 
				
			||||||
                                profileSettings["name"] = profileObject.text;
 | 
					 | 
				
			||||||
                                profileSettings["version"] = appSettings.profileVersion;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                                var result = fileIO.write(url, JSON.stringify(profileSettings, undefined, 2));
 | 
					 | 
				
			||||||
                                if (!result)
 | 
					 | 
				
			||||||
                                    throw "The file could not be written.";
 | 
					 | 
				
			||||||
                            } catch (err) {
 | 
					 | 
				
			||||||
                                console.log(err);
 | 
					 | 
				
			||||||
                                messageDialog.text = qsTr("There has been an error storing the file.")
 | 
					 | 
				
			||||||
                                messageDialog.open();
 | 
					 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					                Button {
 | 
				
			||||||
        }
 | 
					                    property alias currentIndex: profilesView.currentIndex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        GroupBox{
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
            title: qsTr("Screen")
 | 
					
 | 
				
			||||||
            Layout.fillWidth: true
 | 
					                    text: qsTr("Export")
 | 
				
			||||||
            GridLayout{
 | 
					                    enabled: currentIndex >= 0 && !appSettings.profilesList.get(
 | 
				
			||||||
                anchors.fill: parent
 | 
					                                 currentIndex).builtin
 | 
				
			||||||
                columns: 2
 | 
					                    onClicked: {
 | 
				
			||||||
                Label{ text: qsTr("Brightness") }
 | 
					                        fileDialog.selectExisting = false
 | 
				
			||||||
                SimpleSlider{
 | 
					                        fileDialog.callBack = function (url) {
 | 
				
			||||||
                    onValueChanged: appSettings.brightness = value
 | 
					                            storeFile(url)
 | 
				
			||||||
                    value: appSettings.brightness
 | 
					                        }
 | 
				
			||||||
 | 
					                        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()
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                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("Opacity") }
 | 
					 | 
				
			||||||
                SimpleSlider{
 | 
					 | 
				
			||||||
                    onValueChanged: appSettings.windowOpacity = value
 | 
					 | 
				
			||||||
                    value: appSettings.windowOpacity
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // DIALOGS ////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
        InsertNameDialog{
 | 
					 | 
				
			||||||
            id: insertname
 | 
					 | 
				
			||||||
            onNameSelected: {
 | 
					 | 
				
			||||||
                appSettings.appendCustomProfile(name, appSettings.composeProfileString());
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        MessageDialog {
 | 
					 | 
				
			||||||
            id: messageDialog
 | 
					 | 
				
			||||||
            title: qsTr("File Error")
 | 
					 | 
				
			||||||
            onAccepted: {
 | 
					 | 
				
			||||||
                messageDialog.close();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        Loader {
 | 
					 | 
				
			||||||
            property var callBack
 | 
					 | 
				
			||||||
            property bool selectExisting: false
 | 
					 | 
				
			||||||
            id: fileDialog
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            sourceComponent: FileDialog{
 | 
					 | 
				
			||||||
                nameFilters: ["Json files (*.json)"]
 | 
					 | 
				
			||||||
                selectMultiple: false
 | 
					 | 
				
			||||||
                selectFolder: false
 | 
					 | 
				
			||||||
                selectExisting: fileDialog.selectExisting
 | 
					 | 
				
			||||||
                onAccepted: callBack(fileUrl);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            onSelectExistingChanged: reload()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            function open() {
 | 
					 | 
				
			||||||
                item.open();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            function reload() {
 | 
					 | 
				
			||||||
                active = false;
 | 
					 | 
				
			||||||
                active = true;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    GroupBox {
 | 
				
			||||||
 | 
					        title: qsTr("Screen")
 | 
				
			||||||
 | 
					        Layout.fillWidth: true
 | 
				
			||||||
 | 
					        GridLayout {
 | 
				
			||||||
 | 
					            anchors.fill: parent
 | 
				
			||||||
 | 
					            columns: 2
 | 
				
			||||||
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Brightness")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            SimpleSlider {
 | 
				
			||||||
 | 
					                onValueChanged: appSettings.brightness = value
 | 
				
			||||||
 | 
					                value: appSettings.brightness
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Contrast")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            SimpleSlider {
 | 
				
			||||||
 | 
					                onValueChanged: appSettings.contrast = value
 | 
				
			||||||
 | 
					                value: appSettings.contrast
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Margin")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            SimpleSlider {
 | 
				
			||||||
 | 
					                onValueChanged: appSettings._margin = value
 | 
				
			||||||
 | 
					                value: appSettings._margin
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Frame size")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            SimpleSlider {
 | 
				
			||||||
 | 
					                onValueChanged: appSettings._frameMargin = value
 | 
				
			||||||
 | 
					                value: appSettings._frameMargin
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Opacity")
 | 
				
			||||||
 | 
					                visible: !appSettings.isMacOS
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            SimpleSlider {
 | 
				
			||||||
 | 
					                onValueChanged: appSettings.windowOpacity = value
 | 
				
			||||||
 | 
					                value: appSettings.windowOpacity
 | 
				
			||||||
 | 
					                visible: !appSettings.isMacOS
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // DIALOGS ////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					    InsertNameDialog {
 | 
				
			||||||
 | 
					        id: insertname
 | 
				
			||||||
 | 
					        onNameSelected: {
 | 
				
			||||||
 | 
					            appSettings.appendCustomProfile(name,
 | 
				
			||||||
 | 
					                                            appSettings.composeProfileString())
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    MessageDialog {
 | 
				
			||||||
 | 
					        id: messageDialog
 | 
				
			||||||
 | 
					        title: qsTr("File Error")
 | 
				
			||||||
 | 
					        onAccepted: {
 | 
				
			||||||
 | 
					            messageDialog.close()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Loader {
 | 
				
			||||||
 | 
					        property var callBack
 | 
				
			||||||
 | 
					        property bool selectExisting: false
 | 
				
			||||||
 | 
					        id: fileDialog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sourceComponent: FileDialog {
 | 
				
			||||||
 | 
					            nameFilters: ["Json files (*.json)"]
 | 
				
			||||||
 | 
					            selectMultiple: false
 | 
				
			||||||
 | 
					            selectFolder: false
 | 
				
			||||||
 | 
					            selectExisting: fileDialog.selectExisting
 | 
				
			||||||
 | 
					            onAccepted: callBack(fileUrl)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        onSelectExistingChanged: reload()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        function open() {
 | 
				
			||||||
 | 
					            item.open()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        function reload() {
 | 
				
			||||||
 | 
					            active = false
 | 
				
			||||||
 | 
					            active = true
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,138 +17,166 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 1.1
 | 
					import QtQuick.Controls 2.1
 | 
				
			||||||
import QtQuick.Layouts 1.1
 | 
					import QtQuick.Layouts 1.1
 | 
				
			||||||
 | 
					import QtQml 2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "Components"
 | 
					import "Components"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Tab{
 | 
					ColumnLayout {
 | 
				
			||||||
    ColumnLayout{
 | 
					 | 
				
			||||||
        anchors.fill: parent
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        GroupBox{
 | 
					    GroupBox {
 | 
				
			||||||
            title: qsTr("Font")
 | 
					        title: qsTr("Font")
 | 
				
			||||||
            Layout.fillWidth: true
 | 
					        Layout.fillWidth: true
 | 
				
			||||||
            GridLayout{
 | 
					        GridLayout {
 | 
				
			||||||
                anchors.fill: parent
 | 
					            anchors.fill: parent
 | 
				
			||||||
                columns: 2
 | 
					            columns: 2
 | 
				
			||||||
                Label { text: qsTr("Rasterization") }
 | 
					            Label {
 | 
				
			||||||
                ComboBox {
 | 
					                text: qsTr("Rasterization")
 | 
				
			||||||
                    id: rasterizationBox
 | 
					            }
 | 
				
			||||||
 | 
					            ComboBox {
 | 
				
			||||||
 | 
					                id: rasterizationBox
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    property string selectedElement: model[currentIndex]
 | 
					                property string selectedElement: model[currentIndex]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    Layout.fillWidth: true
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
                    model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")]
 | 
					                model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels"), qsTr("Sub-Pixels")]
 | 
				
			||||||
                    currentIndex: appSettings.rasterization
 | 
					                currentIndex: appSettings.rasterization
 | 
				
			||||||
                    onCurrentIndexChanged: {
 | 
					                onCurrentIndexChanged: {
 | 
				
			||||||
                        appSettings.rasterization = currentIndex
 | 
					                    appSettings.rasterization = currentIndex
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Name")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            ComboBox {
 | 
				
			||||||
 | 
					                id: fontChanger
 | 
				
			||||||
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
 | 
					                model: appSettings.fontlist
 | 
				
			||||||
 | 
					                textRole: "text"
 | 
				
			||||||
 | 
					                onActivated: {
 | 
				
			||||||
 | 
					                    var name = appSettings.fontlist.get(index).name
 | 
				
			||||||
 | 
					                    appSettings.fontNames[appSettings.rasterization] = name
 | 
				
			||||||
 | 
					                    appSettings.handleFontChanged()
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                function updateIndex() {
 | 
				
			||||||
 | 
					                    var name = appSettings.fontNames[appSettings.rasterization]
 | 
				
			||||||
 | 
					                    var index = appSettings.getIndexByName(name)
 | 
				
			||||||
 | 
					                    if (index !== undefined)
 | 
				
			||||||
 | 
					                        currentIndex = index
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                Connections {
 | 
				
			||||||
 | 
					                    target: appSettings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    onTerminalFontChanged: {
 | 
				
			||||||
 | 
					                        fontChanger.updateIndex()
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                Label{ text: qsTr("Name") }
 | 
					                Component.onCompleted: updateIndex()
 | 
				
			||||||
                ComboBox{
 | 
					            }
 | 
				
			||||||
                    id: fontChanger
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Scaling")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            RowLayout {
 | 
				
			||||||
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
 | 
					                Slider {
 | 
				
			||||||
                    Layout.fillWidth: true
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
                    model: appSettings.fontlist
 | 
					                    id: fontScalingChanger
 | 
				
			||||||
                    onActivated: {
 | 
					                    onValueChanged: appSettings.fontScaling = value
 | 
				
			||||||
                        var name = appSettings.fontlist.get(index).name;
 | 
					                    value: appSettings.fontScaling
 | 
				
			||||||
                        appSettings.fontNames[appSettings.rasterization] = name;
 | 
					                    stepSize: 0.05
 | 
				
			||||||
                        appSettings.handleFontChanged();
 | 
					                    from: appSettings.minimumFontScaling
 | 
				
			||||||
                    }
 | 
					                    to: appSettings.maximumFontScaling
 | 
				
			||||||
                    function updateIndex(){
 | 
					 | 
				
			||||||
                        var name = appSettings.fontNames[appSettings.rasterization];
 | 
					 | 
				
			||||||
                        var index = appSettings.getIndexByName(name);
 | 
					 | 
				
			||||||
                        if (index !== undefined)
 | 
					 | 
				
			||||||
                            currentIndex = index;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    Connections{
 | 
					 | 
				
			||||||
                        target: appSettings
 | 
					 | 
				
			||||||
                        onTerminalFontChanged: fontChanger.updateIndex();
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    Component.onCompleted: updateIndex();
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                Label{ text: qsTr("Scaling") }
 | 
					                SizedLabel {
 | 
				
			||||||
                RowLayout{
 | 
					                    text: Math.round(fontScalingChanger.value * 100) + "%"
 | 
				
			||||||
                    Layout.fillWidth: true
 | 
					 | 
				
			||||||
                    Slider{
 | 
					 | 
				
			||||||
                        Layout.fillWidth: true
 | 
					 | 
				
			||||||
                        id: fontScalingChanger
 | 
					 | 
				
			||||||
                        onValueChanged: if(enabled) appSettings.fontScaling = value
 | 
					 | 
				
			||||||
                        stepSize: 0.05
 | 
					 | 
				
			||||||
                        enabled: false // Another trick to fix initial bad behavior.
 | 
					 | 
				
			||||||
                        Component.onCompleted: {
 | 
					 | 
				
			||||||
                            minimumValue = appSettings.minimumFontScaling;
 | 
					 | 
				
			||||||
                            maximumValue = appSettings.maximumFontScaling;
 | 
					 | 
				
			||||||
                            value = appSettings.fontScaling;
 | 
					 | 
				
			||||||
                            enabled = true;
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                        Connections{
 | 
					 | 
				
			||||||
                            target: appSettings
 | 
					 | 
				
			||||||
                            onFontScalingChanged: fontScalingChanger.value = appSettings.fontScaling;
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    SizedLabel{
 | 
					 | 
				
			||||||
                        text: Math.round(fontScalingChanger.value * 100) + "%"
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                Label{ text: qsTr("Font Width") }
 | 
					            }
 | 
				
			||||||
                RowLayout{
 | 
					            Label {
 | 
				
			||||||
 | 
					                text: qsTr("Font Width")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            RowLayout {
 | 
				
			||||||
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
 | 
					                Slider {
 | 
				
			||||||
                    Layout.fillWidth: true
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
                    Slider{
 | 
					                    id: widthChanger
 | 
				
			||||||
                        Layout.fillWidth: true
 | 
					                    onValueChanged: appSettings.fontWidth = value
 | 
				
			||||||
                        id: widthChanger
 | 
					                    value: appSettings.fontWidth
 | 
				
			||||||
                        onValueChanged: appSettings.fontWidth = value;
 | 
					                    stepSize: 0.05
 | 
				
			||||||
                        value: appSettings.fontWidth
 | 
					                    from: 0.5
 | 
				
			||||||
                        stepSize: 0.05
 | 
					                    to: 1.5
 | 
				
			||||||
                        Component.onCompleted: {
 | 
					                }
 | 
				
			||||||
                            // This is needed to avoid unnecessary chnaged events.
 | 
					                SizedLabel {
 | 
				
			||||||
                            minimumValue = 0.5;
 | 
					                    text: Math.round(widthChanger.value * 100) + "%"
 | 
				
			||||||
                            maximumValue = 1.5;
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    SizedLabel{
 | 
					 | 
				
			||||||
                        text: Math.round(widthChanger.value * 100) + "%"
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        GroupBox{
 | 
					    }
 | 
				
			||||||
            title: qsTr("Colors")
 | 
					    GroupBox {
 | 
				
			||||||
            Layout.fillWidth: true
 | 
					        title: qsTr("Cursor")
 | 
				
			||||||
            ColumnLayout{
 | 
					        Layout.fillWidth: true
 | 
				
			||||||
                anchors.fill: parent
 | 
					        ColumnLayout {
 | 
				
			||||||
                ColumnLayout{
 | 
					            anchors.fill: parent
 | 
				
			||||||
                    Layout.fillWidth: true
 | 
					            CheckBox {
 | 
				
			||||||
                    CheckableSlider{
 | 
					                id: blinkingCursor
 | 
				
			||||||
                        name: qsTr("Chroma Color")
 | 
					                text: qsTr("Blinking Cursor")
 | 
				
			||||||
                        onNewValue: appSettings.chromaColor = newValue
 | 
					                checked: appSettings.blinkingCursor
 | 
				
			||||||
                        value: appSettings.chromaColor
 | 
					                onCheckedChanged: appSettings.blinkingCursor = checked
 | 
				
			||||||
                    }
 | 
					            }
 | 
				
			||||||
                    CheckableSlider{
 | 
					            Binding {
 | 
				
			||||||
                        name: qsTr("Saturation Color")
 | 
					                target: blinkingCursor
 | 
				
			||||||
                        onNewValue: appSettings.saturationColor = newValue
 | 
					                property: "checked"
 | 
				
			||||||
                        value: appSettings.saturationColor
 | 
					                value: appSettings.blinkingCursor
 | 
				
			||||||
                        enabled: appSettings.chromaColor !== 0
 | 
					            }
 | 
				
			||||||
                    }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    GroupBox {
 | 
				
			||||||
 | 
					        title: qsTr("Colors")
 | 
				
			||||||
 | 
					        Layout.fillWidth: true
 | 
				
			||||||
 | 
					        ColumnLayout {
 | 
				
			||||||
 | 
					            anchors.fill: parent
 | 
				
			||||||
 | 
					            ColumnLayout {
 | 
				
			||||||
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
 | 
					                CheckableSlider {
 | 
				
			||||||
 | 
					                    name: qsTr("Chroma Color")
 | 
				
			||||||
 | 
					                    onNewValue: appSettings.chromaColor = newValue
 | 
				
			||||||
 | 
					                    value: appSettings.chromaColor
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                RowLayout{
 | 
					                CheckableSlider {
 | 
				
			||||||
 | 
					                    name: qsTr("Saturation Color")
 | 
				
			||||||
 | 
					                    onNewValue: appSettings.saturationColor = newValue
 | 
				
			||||||
 | 
					                    value: appSettings.saturationColor
 | 
				
			||||||
 | 
					                    enabled: appSettings.chromaColor !== 0
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                CheckableSlider {
 | 
				
			||||||
 | 
					                    name: qsTr("Frame Gloss")
 | 
				
			||||||
 | 
					                    onNewValue: appSettings.frameGloss = newValue
 | 
				
			||||||
 | 
					                    value: appSettings.frameGloss
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            RowLayout {
 | 
				
			||||||
 | 
					                Layout.fillWidth: true
 | 
				
			||||||
 | 
					                ColorButton {
 | 
				
			||||||
 | 
					                    name: qsTr("Font")
 | 
				
			||||||
 | 
					                    height: 50
 | 
				
			||||||
                    Layout.fillWidth: true
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
                    ColorButton{
 | 
					                    onColorSelected: appSettings._fontColor = color
 | 
				
			||||||
                        name: qsTr("Font")
 | 
					                    color: appSettings._fontColor
 | 
				
			||||||
                        height: 50
 | 
					                }
 | 
				
			||||||
                        Layout.fillWidth: true
 | 
					                ColorButton {
 | 
				
			||||||
                        onColorSelected: appSettings._fontColor = color;
 | 
					                    name: qsTr("Background")
 | 
				
			||||||
                        color: appSettings._fontColor
 | 
					                    height: 50
 | 
				
			||||||
                    }
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
                    ColorButton{
 | 
					                    onColorSelected: appSettings._backgroundColor = color
 | 
				
			||||||
                        name: qsTr("Background")
 | 
					                    color: appSettings._backgroundColor
 | 
				
			||||||
                        height: 50
 | 
					                }
 | 
				
			||||||
                        Layout.fillWidth: true
 | 
					                ColorButton {
 | 
				
			||||||
                        onColorSelected: appSettings._backgroundColor = color;
 | 
					                    name: qsTr("Frame")
 | 
				
			||||||
                        color: appSettings._backgroundColor
 | 
					                    height: 50
 | 
				
			||||||
                    }
 | 
					                    Layout.fillWidth: true
 | 
				
			||||||
 | 
					                    onColorSelected: appSettings._frameColor = color
 | 
				
			||||||
 | 
					                    color: appSettings._frameColor
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -19,46 +19,57 @@
 | 
				
			|||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 1.1
 | 
					import QtQuick.Controls 2.1
 | 
				
			||||||
import QtQuick.Window 2.1
 | 
					import QtQuick.Window 2.1
 | 
				
			||||||
import QtQuick.Layouts 1.1
 | 
					import QtQuick.Layouts 1.3
 | 
				
			||||||
import QtQuick.Dialogs 1.1
 | 
					import QtQuick.Dialogs 1.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Window {
 | 
					Window {
 | 
				
			||||||
    id: settings_window
 | 
					    id: settings_window
 | 
				
			||||||
    title: qsTr("Settings")
 | 
					    title: qsTr("Settings")
 | 
				
			||||||
    width: 580
 | 
					    width: 640
 | 
				
			||||||
    height: 400
 | 
					    height: 640
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property int tabmargins: 15
 | 
					    property int tabmargins: 15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    TabView{
 | 
					    Item {
 | 
				
			||||||
        id: tabView
 | 
					        anchors { fill: parent;  margins: tabmargins }
 | 
				
			||||||
        anchors.fill: parent
 | 
					
 | 
				
			||||||
        anchors.margins: 10
 | 
					        TabBar {
 | 
				
			||||||
        SettingsGeneralTab {
 | 
					            id: bar
 | 
				
			||||||
            id: generalTab
 | 
					            anchors { left: parent.left; right: parent.right; top: parent.top; }
 | 
				
			||||||
            title: qsTr("General")
 | 
					            TabButton {
 | 
				
			||||||
            anchors.fill: parent
 | 
					                text: qsTr("General")
 | 
				
			||||||
            anchors.margins: tabmargins
 | 
					            }
 | 
				
			||||||
 | 
					            TabButton {
 | 
				
			||||||
 | 
					                text: qsTr("Terminal")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            TabButton {
 | 
				
			||||||
 | 
					                text: qsTr("Effects")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            TabButton {
 | 
				
			||||||
 | 
					                text: qsTr("Advanced")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        SettingsTerminalTab {
 | 
					
 | 
				
			||||||
            id: terminalTab
 | 
					        Frame {
 | 
				
			||||||
            title: qsTr("Terminal")
 | 
					            anchors {
 | 
				
			||||||
            anchors.fill: parent
 | 
					                top: bar.bottom
 | 
				
			||||||
            anchors.margins: tabmargins
 | 
					                left: parent.left
 | 
				
			||||||
        }
 | 
					                right: parent.right
 | 
				
			||||||
        SettingsEffectsTab {
 | 
					                bottom: parent.bottom
 | 
				
			||||||
            id: effectsTab
 | 
					            }
 | 
				
			||||||
            title: qsTr("Effects")
 | 
					
 | 
				
			||||||
            anchors.fill: parent
 | 
					            StackLayout {
 | 
				
			||||||
            anchors.margins: tabmargins
 | 
					                anchors.fill: parent
 | 
				
			||||||
        }
 | 
					
 | 
				
			||||||
        SettingsAdvancedTab {
 | 
					                currentIndex: bar.currentIndex
 | 
				
			||||||
            id: performanceTab
 | 
					
 | 
				
			||||||
            title: qsTr("Advanced")
 | 
					                SettingsGeneralTab { }
 | 
				
			||||||
            anchors.fill: parent
 | 
					                SettingsTerminalTab { }
 | 
				
			||||||
            anchors.margins: tabmargins
 | 
					                SettingsEffectsTab { }
 | 
				
			||||||
 | 
					                SettingsAdvancedTab { }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										91
									
								
								app/qml/ShaderLibrary.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								app/qml/ShaderLibrary.qml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,91 @@
 | 
				
			|||||||
 | 
					import QtQuick 2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QtObject {
 | 
				
			||||||
 | 
					    property string rasterizationShader:
 | 
				
			||||||
 | 
					        (appSettings.rasterization === appSettings.no_rasterization ? "
 | 
				
			||||||
 | 
					            lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
 | 
				
			||||||
 | 
					                return texel;
 | 
				
			||||||
 | 
					            }" : "") +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        (appSettings.rasterization === appSettings.scanline_rasterization ? "
 | 
				
			||||||
 | 
					            #define INTENSITY 0.30
 | 
				
			||||||
 | 
					            #define BRIGHTBOOST 0.30
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
 | 
				
			||||||
 | 
					                lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel;
 | 
				
			||||||
 | 
					                lowp vec3 pixelLow  = ((1.0 - INTENSITY) + (0.1 * texel)) * texel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0);
 | 
				
			||||||
 | 
					                lowp float mask = 1.0 - abs(coords.y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask);
 | 
				
			||||||
 | 
					                return mix(texel, rasterizationColor, intensity);
 | 
				
			||||||
 | 
					            }" : "") +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        (appSettings.rasterization === appSettings.pixel_rasterization ? "
 | 
				
			||||||
 | 
					            #define INTENSITY 0.30
 | 
				
			||||||
 | 
					            #define BRIGHTBOOST 0.30
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
 | 
				
			||||||
 | 
					                lowp vec3 result = texel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel;
 | 
				
			||||||
 | 
					                lowp vec3 pixelLow  = ((1.0 - INTENSITY) + (0.1 * texel)) * texel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0);
 | 
				
			||||||
 | 
					                coords = coords * coords;
 | 
				
			||||||
 | 
					                lowp float mask = 1.0 - coords.x - coords.y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask);
 | 
				
			||||||
 | 
					                return mix(texel, rasterizationColor, intensity);
 | 
				
			||||||
 | 
					            }" : "") +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        (appSettings.rasterization === appSettings.subpixel_rasterization ? "
 | 
				
			||||||
 | 
					            #define INTENSITY 0.30
 | 
				
			||||||
 | 
					            #define BRIGHTBOOST 0.30
 | 
				
			||||||
 | 
					            #define SUBPIXELS 3.0
 | 
				
			||||||
 | 
					            const vec3 offsets = vec3(3.141592654) * vec3(1.0/2.0,1.0/2.0 - 2.0/3.0,1.0/2.0-4.0/3.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
 | 
				
			||||||
 | 
					                vec2 omega = vec2(3.141592654) * vec2(2.0) * virtualResolution;
 | 
				
			||||||
 | 
					                vec2 angle = screenCoords * omega;
 | 
				
			||||||
 | 
					                vec3 xfactors = (SUBPIXELS + sin(angle.x + offsets)) / (SUBPIXELS + 1.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                lowp vec3 result = texel * xfactors;
 | 
				
			||||||
 | 
					                lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * result)) * result;
 | 
				
			||||||
 | 
					                lowp vec3 pixelLow  = ((1.0 - INTENSITY) + (0.1 * result)) * result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0);
 | 
				
			||||||
 | 
					                lowp float mask = 1.0 - abs(coords.y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask);
 | 
				
			||||||
 | 
					                return mix(texel, rasterizationColor, intensity);
 | 
				
			||||||
 | 
					            }" : "") +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "\n\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    property string min2: "
 | 
				
			||||||
 | 
					        float min2(vec2 v) {
 | 
				
			||||||
 | 
					            return min(v.x, v.y);
 | 
				
			||||||
 | 
					        }\n\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    property string rgb2grey: "
 | 
				
			||||||
 | 
					        float rgb2grey(vec3 v) {
 | 
				
			||||||
 | 
					            return dot(v, vec3(0.21, 0.72, 0.04));
 | 
				
			||||||
 | 
					        }\n\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    property string max2: "
 | 
				
			||||||
 | 
					        float max2(vec2 v) {
 | 
				
			||||||
 | 
					            return max(v.x, v.y);
 | 
				
			||||||
 | 
					        }\n\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    property string prod2: "
 | 
				
			||||||
 | 
					        float prod2(vec2 v) {
 | 
				
			||||||
 | 
					            return v.x * v.y;
 | 
				
			||||||
 | 
					        }\n\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    property string sum2: "
 | 
				
			||||||
 | 
					        float sum2(vec2 v) {
 | 
				
			||||||
 | 
					            return v.x + v.y;
 | 
				
			||||||
 | 
					        }\n\n"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -37,11 +37,21 @@ Item {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    property real ambientLight: appSettings.ambientLight * 0.2
 | 
					    property real ambientLight: appSettings.ambientLight * 0.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property size virtual_resolution
 | 
					    property real frameGloss: appSettings.frameGloss
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    property size virtualResolution
 | 
				
			||||||
 | 
					    property size screenResolution
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    property real _screenDensity: Math.min(
 | 
				
			||||||
 | 
					        screenResolution.width / virtualResolution.width,
 | 
				
			||||||
 | 
					        screenResolution.height / virtualResolution.height
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     ShaderEffect {
 | 
					     ShaderEffect {
 | 
				
			||||||
         id: dynamicShader
 | 
					         id: dynamicShader
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         property ShaderLibrary shaderLibrary: ShaderLibrary { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         property ShaderEffectSource screenBuffer: frameBuffer
 | 
					         property ShaderEffectSource screenBuffer: frameBuffer
 | 
				
			||||||
         property ShaderEffectSource burnInSource: burnInEffect.source
 | 
					         property ShaderEffectSource burnInSource: burnInEffect.source
 | 
				
			||||||
         property ShaderEffectSource frameSource: terminalFrameLoader.item
 | 
					         property ShaderEffectSource frameSource: terminalFrameLoader.item
 | 
				
			||||||
@@ -51,22 +61,32 @@ Item {
 | 
				
			|||||||
         property real screenCurvature: parent.screenCurvature
 | 
					         property real screenCurvature: parent.screenCurvature
 | 
				
			||||||
         property real chromaColor: parent.chromaColor
 | 
					         property real chromaColor: parent.chromaColor
 | 
				
			||||||
         property real ambientLight: parent.ambientLight
 | 
					         property real ambientLight: parent.ambientLight
 | 
				
			||||||
 | 
					         property real frameGloss: parent.frameGloss
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         property real flickering: appSettings.flickering
 | 
					         property real flickering: appSettings.flickering
 | 
				
			||||||
         property real horizontalSync: appSettings.horizontalSync
 | 
					         property real horizontalSync: appSettings.horizontalSync
 | 
				
			||||||
         property real horizontalSyncStrength: Utils.lint(0.05, 0.35, horizontalSync)
 | 
					         property real horizontalSyncStrength: Utils.lint(0.05, 0.35, horizontalSync)
 | 
				
			||||||
         property real glowingLine: appSettings.glowingLine * 0.2
 | 
					         property real glowingLine: appSettings.glowingLine * 0.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         // Fast burnin properties
 | 
				
			||||||
         property real burnIn: appSettings.burnIn
 | 
					         property real burnIn: appSettings.burnIn
 | 
				
			||||||
         property real burnInLastUpdate: burnInEffect.lastUpdate
 | 
					         property real burnInLastUpdate: burnInEffect.lastUpdate
 | 
				
			||||||
         property real burnInTime: burnInEffect.burnInFadeTime
 | 
					         property real burnInTime: burnInEffect.burnInFadeTime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         property real jitter: appSettings.jitter
 | 
					         property real jitter: appSettings.jitter
 | 
				
			||||||
         property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter)
 | 
					         property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter)
 | 
				
			||||||
         property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight)
 | 
					         property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight)
 | 
				
			||||||
         property real staticNoise: appSettings.staticNoise
 | 
					         property real staticNoise: appSettings.staticNoise
 | 
				
			||||||
         property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
 | 
					         property size scaleNoiseSize: Qt.size((width * 0.75) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
 | 
				
			||||||
                                               (height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
 | 
					                                               (height * 0.75) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         property size virtual_resolution: parent.virtual_resolution
 | 
					         property size virtualResolution: parent.virtualResolution
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         // Rasterization might display oversamping issues if virtual resolution is close to physical display resolution.
 | 
				
			||||||
 | 
					         // We progressively disable rasterization from 4x up to 2x resolution.
 | 
				
			||||||
 | 
					         property real rasterizationIntensity: Utils.smoothstep(2.0, 4.0, _screenDensity)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         property real displayTerminalFrame: appSettings._frameMargin > 0 || appSettings.screenCurvature > 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         property real time: timeManager.time
 | 
					         property real time: timeManager.time
 | 
				
			||||||
         property ShaderEffectSource noiseSource: noiseShaderSource
 | 
					         property ShaderEffectSource noiseSource: noiseShaderSource
 | 
				
			||||||
@@ -78,7 +98,7 @@ Item {
 | 
				
			|||||||
         blending: false
 | 
					         blending: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         //Smooth random texture used for flickering effect.
 | 
					         //Smooth random texture used for flickering effect.
 | 
				
			||||||
         Image{
 | 
					         Image {
 | 
				
			||||||
             id: noiseTexture
 | 
					             id: noiseTexture
 | 
				
			||||||
             source: "images/allNoise512.png"
 | 
					             source: "images/allNoise512.png"
 | 
				
			||||||
             width: 512
 | 
					             width: 512
 | 
				
			||||||
@@ -86,7 +106,7 @@ Item {
 | 
				
			|||||||
             fillMode: Image.Tile
 | 
					             fillMode: Image.Tile
 | 
				
			||||||
             visible: false
 | 
					             visible: false
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
         ShaderEffectSource{
 | 
					         ShaderEffectSource {
 | 
				
			||||||
             id: noiseShaderSource
 | 
					             id: noiseShaderSource
 | 
				
			||||||
             sourceItem: noiseTexture
 | 
					             sourceItem: noiseTexture
 | 
				
			||||||
             wrapMode: ShaderEffectSource.Repeat
 | 
					             wrapMode: ShaderEffectSource.Repeat
 | 
				
			||||||
@@ -155,8 +175,10 @@ Item {
 | 
				
			|||||||
             uniform highp vec4 fontColor;
 | 
					             uniform highp vec4 fontColor;
 | 
				
			||||||
             uniform highp vec4 backgroundColor;
 | 
					             uniform highp vec4 backgroundColor;
 | 
				
			||||||
             uniform lowp float shadowLength;
 | 
					             uniform lowp float shadowLength;
 | 
				
			||||||
 | 
					             uniform lowp float frameGloss;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
             uniform highp vec2 virtual_resolution;" +
 | 
					             uniform highp vec2 virtualResolution;
 | 
				
			||||||
 | 
					             uniform lowp float rasterizationIntensity;\n" +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
             (burnIn !== 0 ? "
 | 
					             (burnIn !== 0 ? "
 | 
				
			||||||
                 uniform sampler2D burnInSource;
 | 
					                 uniform sampler2D burnInSource;
 | 
				
			||||||
@@ -164,13 +186,13 @@ Item {
 | 
				
			|||||||
                 uniform highp float burnInTime;" : "") +
 | 
					                 uniform highp float burnInTime;" : "") +
 | 
				
			||||||
             (staticNoise !== 0 ? "
 | 
					             (staticNoise !== 0 ? "
 | 
				
			||||||
                 uniform highp float staticNoise;" : "") +
 | 
					                 uniform highp float staticNoise;" : "") +
 | 
				
			||||||
             (((staticNoise !== 0 || jitter !== 0)
 | 
					             (((staticNoise !== 0 || jitter !== 0) ||(fallBack && (flickering || horizontalSync))) ? "
 | 
				
			||||||
               ||(fallBack && (flickering || horizontalSync))) ? "
 | 
					 | 
				
			||||||
                 uniform lowp sampler2D noiseSource;
 | 
					                 uniform lowp sampler2D noiseSource;
 | 
				
			||||||
                 uniform highp vec2 scaleNoiseSize;" : "") +
 | 
					                 uniform highp vec2 scaleNoiseSize;" : "") +
 | 
				
			||||||
             (screenCurvature !== 0 ? "
 | 
					             (displayTerminalFrame ? "
 | 
				
			||||||
                 uniform highp float screenCurvature;
 | 
					 | 
				
			||||||
                 uniform lowp sampler2D frameSource;" : "") +
 | 
					                 uniform lowp sampler2D frameSource;" : "") +
 | 
				
			||||||
 | 
					             (screenCurvature !== 0 ? "
 | 
				
			||||||
 | 
					                 uniform highp float screenCurvature;" : "") +
 | 
				
			||||||
             (glowingLine !== 0 ? "
 | 
					             (glowingLine !== 0 ? "
 | 
				
			||||||
                 uniform highp float glowingLine;" : "") +
 | 
					                 uniform highp float glowingLine;" : "") +
 | 
				
			||||||
             (chromaColor !== 0 ? "
 | 
					             (chromaColor !== 0 ? "
 | 
				
			||||||
@@ -193,17 +215,14 @@ Item {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
             (glowingLine !== 0 ? "
 | 
					             (glowingLine !== 0 ? "
 | 
				
			||||||
                 float randomPass(vec2 coords){
 | 
					                 float randomPass(vec2 coords){
 | 
				
			||||||
                     return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015)));
 | 
					                     return fract(smoothstep(-120.0, 0.0, coords.y - (virtualResolution.y + 120.0) * fract(time * 0.00015)));
 | 
				
			||||||
                 }" : "") +
 | 
					                 }" : "") +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
             "float min2(vec2 v) {
 | 
					             shaderLibrary.min2 +
 | 
				
			||||||
                 return min(v.x, v.y);
 | 
					             shaderLibrary.rgb2grey +
 | 
				
			||||||
             }
 | 
					             shaderLibrary.rasterizationShader +
 | 
				
			||||||
 | 
					 | 
				
			||||||
             float rgb2grey(vec3 v){
 | 
					 | 
				
			||||||
                 return dot(v, vec3(0.21, 0.72, 0.04));
 | 
					 | 
				
			||||||
             }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					             "
 | 
				
			||||||
             float isInScreen(vec2 v) {
 | 
					             float isInScreen(vec2 v) {
 | 
				
			||||||
                 return min2(step(0.0, v) - step(1.0, v));
 | 
					                 return min2(step(0.0, v) - step(1.0, v));
 | 
				
			||||||
             }
 | 
					             }
 | 
				
			||||||
@@ -228,6 +247,17 @@ Item {
 | 
				
			|||||||
             "  return outColor;
 | 
					             "  return outColor;
 | 
				
			||||||
             }" +
 | 
					             }" +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					             //pseudo-random vector
 | 
				
			||||||
 | 
					             //https://stackoverflow.com/a/10625698
 | 
				
			||||||
 | 
					             "float random( vec2 p )
 | 
				
			||||||
 | 
					             {
 | 
				
			||||||
 | 
					                 vec2 K1 = vec2(
 | 
				
			||||||
 | 
					                     23.14069263277926, // e^pi (Gelfond's constant)
 | 
				
			||||||
 | 
					                     2.665144142690225 // 2^sqrt(2) (Gelfond-Schneider constant)
 | 
				
			||||||
 | 
					                 );
 | 
				
			||||||
 | 
					                 return fract( cos( dot(p,K1) ) * 12345.6789 );
 | 
				
			||||||
 | 
					             }" +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
             "void main() {" +
 | 
					             "void main() {" +
 | 
				
			||||||
                 "vec2 cc = vec2(0.5) - qt_TexCoord0;" +
 | 
					                 "vec2 cc = vec2(0.5) - qt_TexCoord0;" +
 | 
				
			||||||
                 "float distance = length(cc);" +
 | 
					                 "float distance = length(cc);" +
 | 
				
			||||||
@@ -266,7 +296,11 @@ Item {
 | 
				
			|||||||
                 : "") +
 | 
					                 : "") +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                 (jitter !== 0 || staticNoise !== 0 ?
 | 
					                 (jitter !== 0 || staticNoise !== 0 ?
 | 
				
			||||||
                     "vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));"
 | 
					                 "vec4 noiseTexel = texture2D(
 | 
				
			||||||
 | 
					                     noiseSource, scaleNoiseSize * coords
 | 
				
			||||||
 | 
					                     + vec2(0.0, random(vec2(fract(time / 237.0), 822.9582)))
 | 
				
			||||||
 | 
					                     + vec2(fract(time / 31.0), fract(time / 177.0))
 | 
				
			||||||
 | 
					                 );"
 | 
				
			||||||
                 : "") +
 | 
					                 : "") +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                 (jitter !== 0 ? "
 | 
					                 (jitter !== 0 ? "
 | 
				
			||||||
@@ -281,19 +315,21 @@ Item {
 | 
				
			|||||||
                     color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
 | 
					                     color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                 (glowingLine !== 0 ? "
 | 
					                 (glowingLine !== 0 ? "
 | 
				
			||||||
                     color += randomPass(coords * virtual_resolution) * glowingLine;" : "") +
 | 
					                     color += randomPass(coords * virtualResolution) * glowingLine;" : "") +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                 "vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" +
 | 
					                 "vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                 (burnIn !== 0 ? "
 | 
					                 (burnIn !== 0 ? "
 | 
				
			||||||
                     vec4 txt_blur = texture2D(burnInSource, staticCoords);
 | 
					                     vec4 txt_blur = texture2D(burnInSource, staticCoords);
 | 
				
			||||||
                     float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0);
 | 
					                     float blurDecay = clamp(pow(0.5, burnInTime * (time - burnInLastUpdate)), 0.0, 1.0);
 | 
				
			||||||
                     vec3 burnInColor = 0.65 * (txt_blur.rgb - vec3(blurDecay));
 | 
					                     vec3 burnInColor = txt_blur.rgb * vec3(blurDecay);
 | 
				
			||||||
                     txt_color = max(txt_color, convertWithChroma(burnInColor));"
 | 
					                     txt_color = max(txt_color, convertWithChroma(burnInColor));"
 | 
				
			||||||
                 : "") +
 | 
					                 : "") +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                  "txt_color += fontColor.rgb * vec3(color);" +
 | 
					                  "txt_color += fontColor.rgb * vec3(color);" +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                  "txt_color = applyRasterization(staticCoords, txt_color, virtualResolution, rasterizationIntensity);\n" +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                 "vec3 finalColor = txt_color;" +
 | 
					                 "vec3 finalColor = txt_color;" +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                 (flickering !== 0 ? "
 | 
					                 (flickering !== 0 ? "
 | 
				
			||||||
@@ -302,9 +338,9 @@ Item {
 | 
				
			|||||||
                 (ambientLight !== 0 ? "
 | 
					                 (ambientLight !== 0 ? "
 | 
				
			||||||
                     finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
 | 
					                     finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                 (screenCurvature !== 0 ?
 | 
					                 (displayTerminalFrame ?
 | 
				
			||||||
                    "vec4 frameColor = texture2D(frameSource, qt_TexCoord0);
 | 
					                    "vec4 frameColor = texture2D(frameSource, qt_TexCoord0);
 | 
				
			||||||
                     finalColor = mix(finalColor, frameColor.rgb, frameColor.a);"
 | 
					                     finalColor = mix(finalColor, frameColor.rgb + (finalColor*frameGloss), frameColor.a);"
 | 
				
			||||||
                 : "") +
 | 
					                 : "") +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                 "gl_FragColor = vec4(finalColor, qt_Opacity);" +
 | 
					                 "gl_FragColor = vec4(finalColor, qt_Opacity);" +
 | 
				
			||||||
@@ -325,7 +361,7 @@ Item {
 | 
				
			|||||||
     Loader {
 | 
					     Loader {
 | 
				
			||||||
         id: terminalFrameLoader
 | 
					         id: terminalFrameLoader
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         active: screenCurvature !== 0
 | 
					         active: dynamicShader.displayTerminalFrame
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         width: staticShader.width
 | 
					         width: staticShader.width
 | 
				
			||||||
         height: staticShader.height
 | 
					         height: staticShader.height
 | 
				
			||||||
@@ -337,7 +373,7 @@ Item {
 | 
				
			|||||||
             visible: false
 | 
					             visible: false
 | 
				
			||||||
             format: ShaderEffectSource.RGBA
 | 
					             format: ShaderEffectSource.RGBA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
             NewTerminalFrame {
 | 
					             TerminalFrame {
 | 
				
			||||||
                 id: terminalFrame
 | 
					                 id: terminalFrame
 | 
				
			||||||
                 blending: false
 | 
					                 blending: false
 | 
				
			||||||
                 anchors.fill: parent
 | 
					                 anchors.fill: parent
 | 
				
			||||||
@@ -345,6 +381,10 @@ Item {
 | 
				
			|||||||
         }
 | 
					         }
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     ShaderLibrary {
 | 
				
			||||||
 | 
					         id: shaderLibrary
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     ShaderEffect {
 | 
					     ShaderEffect {
 | 
				
			||||||
         id: staticShader
 | 
					         id: staticShader
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -370,7 +410,7 @@ Item {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
         property real ambientLight: parent.ambientLight
 | 
					         property real ambientLight: parent.ambientLight
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         property size virtual_resolution: parent.virtual_resolution
 | 
					         property size virtualResolution: parent.virtualResolution
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         blending: false
 | 
					         blending: false
 | 
				
			||||||
         visible: false
 | 
					         visible: false
 | 
				
			||||||
@@ -393,7 +433,7 @@ Item {
 | 
				
			|||||||
             uniform highp vec4 backgroundColor;
 | 
					             uniform highp vec4 backgroundColor;
 | 
				
			||||||
             uniform lowp float screen_brightness;
 | 
					             uniform lowp float screen_brightness;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
             uniform highp vec2 virtual_resolution;" +
 | 
					             uniform highp vec2 virtualResolution;" +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
             (bloom !== 0 ? "
 | 
					             (bloom !== 0 ? "
 | 
				
			||||||
                 uniform highp sampler2D bloomSource;
 | 
					                 uniform highp sampler2D bloomSource;
 | 
				
			||||||
@@ -411,36 +451,9 @@ Item {
 | 
				
			|||||||
             (ambientLight !== 0 ? "
 | 
					             (ambientLight !== 0 ? "
 | 
				
			||||||
                 uniform lowp float ambientLight;" : "") +
 | 
					                 uniform lowp float ambientLight;" : "") +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
             "highp float getScanlineIntensity(vec2 coords) {
 | 
					             shaderLibrary.min2 +
 | 
				
			||||||
                 float result = 1.0;" +
 | 
					             shaderLibrary.sum2 +
 | 
				
			||||||
 | 
					             shaderLibrary.rgb2grey +
 | 
				
			||||||
                (appSettings.rasterization != appSettings.no_rasterization ?
 | 
					 | 
				
			||||||
                    "float val = 0.0;
 | 
					 | 
				
			||||||
                     vec2 rasterizationCoords = fract(coords * virtual_resolution);
 | 
					 | 
				
			||||||
                     val += smoothstep(0.0, 0.5, rasterizationCoords.y);
 | 
					 | 
				
			||||||
                     val -= smoothstep(0.5, 1.0, rasterizationCoords.y);
 | 
					 | 
				
			||||||
                     result *= mix(0.5, 1.0, val);" : "") +
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                (appSettings.rasterization == appSettings.pixel_rasterization ?
 | 
					 | 
				
			||||||
                    "val = 0.0;
 | 
					 | 
				
			||||||
                     val += smoothstep(0.0, 0.5, rasterizationCoords.x);
 | 
					 | 
				
			||||||
                     val -= smoothstep(0.5, 1.0, rasterizationCoords.x);
 | 
					 | 
				
			||||||
                     result *= mix(0.5, 1.0, val);" : "") + "
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                return result;
 | 
					 | 
				
			||||||
             }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
             float min2(vec2 v) {
 | 
					 | 
				
			||||||
                 return min(v.x, v.y);
 | 
					 | 
				
			||||||
             }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
             float sum2(vec2 v) {
 | 
					 | 
				
			||||||
                 return v.x + v.y;
 | 
					 | 
				
			||||||
             }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
             float rgb2grey(vec3 v){
 | 
					 | 
				
			||||||
                 return dot(v, vec3(0.21, 0.72, 0.04));
 | 
					 | 
				
			||||||
             }" +
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
             "vec3 convertWithChroma(vec3 inColor) {
 | 
					             "vec3 convertWithChroma(vec3 inColor) {
 | 
				
			||||||
                vec3 outColor = inColor;" +
 | 
					                vec3 outColor = inColor;" +
 | 
				
			||||||
@@ -453,6 +466,7 @@ Item {
 | 
				
			|||||||
             "  return outColor;
 | 
					             "  return outColor;
 | 
				
			||||||
             }" +
 | 
					             }" +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					             shaderLibrary.rasterizationShader +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
             "void main() {" +
 | 
					             "void main() {" +
 | 
				
			||||||
                 "vec2 cc = vec2(0.5) - qt_TexCoord0;" +
 | 
					                 "vec2 cc = vec2(0.5) - qt_TexCoord0;" +
 | 
				
			||||||
@@ -475,14 +489,12 @@ Item {
 | 
				
			|||||||
                     txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60;
 | 
					                     txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60;
 | 
				
			||||||
                 " : "") +
 | 
					                 " : "") +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                  "txt_color *= getScanlineIntensity(txt_coords);" +
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                  "txt_color += vec3(0.0001);" +
 | 
					                  "txt_color += vec3(0.0001);" +
 | 
				
			||||||
                  "float greyscale_color = rgb2grey(txt_color);" +
 | 
					                  "float greyscale_color = rgb2grey(txt_color);" +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                 (screenCurvature !== 0 ? "
 | 
					                 (screenCurvature !== 0 ? "
 | 
				
			||||||
                     float reflectionMask = sum2(step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords));
 | 
					                     float reflectionMask = sum2(step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords));
 | 
				
			||||||
                     reflectionMask = clamp(0.0, 1.0, reflectionMask);"
 | 
					                     reflectionMask = clamp(reflectionMask, 0.0, 1.0);"
 | 
				
			||||||
                 :
 | 
					                 :
 | 
				
			||||||
                     "float reflectionMask = 1.0;") +
 | 
					                     "float reflectionMask = 1.0;") +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,9 +17,8 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Controls 1.1
 | 
					import QtQuick.Controls 2.0
 | 
				
			||||||
import QtQuick.Layouts 1.1
 | 
					import QtQuick.Layouts 1.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "Components"
 | 
					import "Components"
 | 
				
			||||||
@@ -27,18 +26,18 @@ import "Components"
 | 
				
			|||||||
RowLayout {
 | 
					RowLayout {
 | 
				
			||||||
    property alias value: slider.value
 | 
					    property alias value: slider.value
 | 
				
			||||||
    property alias stepSize: slider.stepSize
 | 
					    property alias stepSize: slider.stepSize
 | 
				
			||||||
    property alias minimumValue: slider.minimumValue
 | 
					    property alias minimumValue: slider.from
 | 
				
			||||||
    property alias maximumValue: slider.maximumValue
 | 
					    property alias maximumValue: slider.to
 | 
				
			||||||
    property real maxMultiplier: 100
 | 
					    property real maxMultiplier: 100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    id: setting_component
 | 
					    id: setting_component
 | 
				
			||||||
    spacing: 10
 | 
					    spacing: 10
 | 
				
			||||||
    Slider{
 | 
					    Slider {
 | 
				
			||||||
        id: slider
 | 
					        id: slider
 | 
				
			||||||
        stepSize: parent.stepSize
 | 
					        stepSize: parent.stepSize
 | 
				
			||||||
        Layout.fillWidth: true
 | 
					        Layout.fillWidth: true
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    SizedLabel{
 | 
					    SizedLabel {
 | 
				
			||||||
        text: Math.round(value * maxMultiplier) + "%"
 | 
					        text: Math.round(value * maxMultiplier) + "%"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,12 +17,12 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Rectangle{
 | 
					Rectangle {
 | 
				
			||||||
    property size terminalSize
 | 
					    property size terminalSize
 | 
				
			||||||
    property real topOpacity: 0.6
 | 
					    property real topOpacity: 0.6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    width: textSize.width * 2
 | 
					    width: textSize.width * 2
 | 
				
			||||||
    height: textSize.height * 2
 | 
					    height: textSize.height * 2
 | 
				
			||||||
    radius: 5
 | 
					    radius: 5
 | 
				
			||||||
@@ -31,17 +31,21 @@ Rectangle{
 | 
				
			|||||||
    color: "black"
 | 
					    color: "black"
 | 
				
			||||||
    opacity: sizetimer.running ? 0.6 : 0.0
 | 
					    opacity: sizetimer.running ? 0.6 : 0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Behavior on opacity{NumberAnimation{duration: 200}}
 | 
					    Behavior on opacity {
 | 
				
			||||||
 | 
					        NumberAnimation {
 | 
				
			||||||
 | 
					            duration: 200
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    onTerminalSizeChanged: sizetimer.restart()
 | 
					    onTerminalSizeChanged: sizetimer.restart()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Text{
 | 
					    Text {
 | 
				
			||||||
        id: textSize
 | 
					        id: textSize
 | 
				
			||||||
        anchors.centerIn: parent
 | 
					        anchors.centerIn: parent
 | 
				
			||||||
        color: "white"
 | 
					        color: "white"
 | 
				
			||||||
        text: terminalSize.width + "x" + terminalSize.height
 | 
					        text: terminalSize.width + "x" + terminalSize.height
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Timer{
 | 
					    Timer {
 | 
				
			||||||
        id: sizetimer
 | 
					        id: sizetimer
 | 
				
			||||||
        interval: 1000
 | 
					        interval: 1000
 | 
				
			||||||
        running: false
 | 
					        running: false
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -27,7 +27,7 @@ QtObject {
 | 
				
			|||||||
    property bool initialized: false
 | 
					    property bool initialized: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function getDatabase() {
 | 
					    function getDatabase() {
 | 
				
			||||||
         return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000);
 | 
					         return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function initialize() {
 | 
					    function initialize() {
 | 
				
			||||||
@@ -35,43 +35,47 @@ QtObject {
 | 
				
			|||||||
        db.transaction(
 | 
					        db.transaction(
 | 
				
			||||||
            function(tx) {
 | 
					            function(tx) {
 | 
				
			||||||
                tx.executeSql('CREATE TABLE IF NOT EXISTS settings(setting TEXT UNIQUE, value TEXT)');
 | 
					                tx.executeSql('CREATE TABLE IF NOT EXISTS settings(setting TEXT UNIQUE, value TEXT)');
 | 
				
			||||||
          });
 | 
					            }
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        initialized = true;
 | 
					        initialized = true
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function setSetting(setting, value) {
 | 
					    function setSetting(setting, value) {
 | 
				
			||||||
       if(!initialized) initialize();
 | 
					        if(!initialized) initialize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
       var db = getDatabase();
 | 
					        var db = getDatabase();
 | 
				
			||||||
       var res = "";
 | 
					        var res = "";
 | 
				
			||||||
       db.transaction(function(tx) {
 | 
					        db.transaction(
 | 
				
			||||||
            var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]);
 | 
					            function(tx) {
 | 
				
			||||||
                  //console.log(rs.rowsAffected)
 | 
					                var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]);
 | 
				
			||||||
                  if (rs.rowsAffected > 0) {
 | 
					                //console.log(rs.rowsAffected)
 | 
				
			||||||
 | 
					                if (rs.rowsAffected > 0) {
 | 
				
			||||||
                    res = "OK";
 | 
					                    res = "OK";
 | 
				
			||||||
                  } else {
 | 
					                } else {
 | 
				
			||||||
                    res = "Error";
 | 
					                    res = "Error";
 | 
				
			||||||
                  }
 | 
					                }
 | 
				
			||||||
            }
 | 
					           }
 | 
				
			||||||
      );
 | 
					      )
 | 
				
			||||||
      // The function returns “OK” if it was successful, or “Error” if it wasn't
 | 
					      // The function returns “OK” if it was successful, or “Error” if it wasn't
 | 
				
			||||||
      return res;
 | 
					      return res
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function getSetting(setting) {
 | 
					    function getSetting(setting) {
 | 
				
			||||||
       if(!initialized) initialize();
 | 
					        if(!initialized) initialize();
 | 
				
			||||||
       var db = getDatabase();
 | 
					        var db = getDatabase();
 | 
				
			||||||
       var res="";
 | 
					        var res = "";
 | 
				
			||||||
       db.transaction(function(tx) {
 | 
					        db.transaction(
 | 
				
			||||||
         var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]);
 | 
					            function(tx) {
 | 
				
			||||||
         if (rs.rows.length > 0) {
 | 
					                var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]);
 | 
				
			||||||
              res = rs.rows.item(0).value;
 | 
					                if (rs.rows.length > 0) {
 | 
				
			||||||
         } else {
 | 
					                res = rs.rows.item(0).value;
 | 
				
			||||||
             res = undefined;
 | 
					                } else {
 | 
				
			||||||
         }
 | 
					                res = undefined;
 | 
				
			||||||
      })
 | 
					                }
 | 
				
			||||||
      return res
 | 
					            }
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        return res
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function dropSettings(){
 | 
					    function dropSettings(){
 | 
				
			||||||
@@ -79,6 +83,7 @@ QtObject {
 | 
				
			|||||||
        db.transaction(
 | 
					        db.transaction(
 | 
				
			||||||
            function(tx) {
 | 
					            function(tx) {
 | 
				
			||||||
                tx.executeSql('DROP TABLE settings');
 | 
					                tx.executeSql('DROP TABLE settings');
 | 
				
			||||||
          });
 | 
					            }
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,22 @@
 | 
				
			|||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* cool-retro-term is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					* it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					* the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					* (at your option) any later version.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					* but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					* GNU General Public License for more details.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					*******************************************************************************/
 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtGraphicalEffects 1.0
 | 
					import QtGraphicalEffects 1.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -7,43 +26,48 @@ ShaderTerminal {
 | 
				
			|||||||
    property alias title: terminal.title
 | 
					    property alias title: terminal.title
 | 
				
			||||||
    property alias terminalSize: terminal.terminalSize
 | 
					    property alias terminalSize: terminal.terminalSize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    property real devicePixelRatio: terminalWindow.screen.devicePixelRatio
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    id: mainShader
 | 
					    id: mainShader
 | 
				
			||||||
    opacity: appSettings.windowOpacity * 0.3 + 0.7
 | 
					    opacity: appSettings.windowOpacity * 0.3 + 0.7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    source: terminal.mainSource
 | 
					    source: terminal.mainSource
 | 
				
			||||||
    burnInEffect: terminal.burnInEffect
 | 
					    burnInEffect: terminal.burnInEffect
 | 
				
			||||||
    virtual_resolution: terminal.virtualResolution
 | 
					    virtualResolution: terminal.virtualResolution
 | 
				
			||||||
 | 
					    screenResolution: Qt.size(
 | 
				
			||||||
 | 
					        terminalWindow.width * devicePixelRatio * appSettings.windowScaling,
 | 
				
			||||||
 | 
					        terminalWindow.height * devicePixelRatio * appSettings.windowScaling
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    TimeManager{
 | 
					    TimeManager {
 | 
				
			||||||
        id: timeManager
 | 
					        id: timeManager
 | 
				
			||||||
        enableTimer: terminalWindow.visible
 | 
					        enableTimer: terminalWindow.visible
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    PreprocessedTerminal{
 | 
					    PreprocessedTerminal {
 | 
				
			||||||
        id: terminal
 | 
					        id: terminal
 | 
				
			||||||
        anchors.fill: parent
 | 
					        anchors.fill: parent
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //  EFFECTS  ////////////////////////////////////////////////////////////////
 | 
					    //  EFFECTS  ////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					    Loader {
 | 
				
			||||||
    Loader{
 | 
					 | 
				
			||||||
        id: bloomEffectLoader
 | 
					        id: bloomEffectLoader
 | 
				
			||||||
        active: appSettings.bloom
 | 
					        active: appSettings.bloom
 | 
				
			||||||
        asynchronous: true
 | 
					        asynchronous: true
 | 
				
			||||||
        width: parent.width * appSettings.bloomQuality
 | 
					        width: parent.width * appSettings.bloomQuality
 | 
				
			||||||
        height: parent.height * appSettings.bloomQuality
 | 
					        height: parent.height * appSettings.bloomQuality
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        sourceComponent: FastBlur{
 | 
					        sourceComponent: FastBlur {
 | 
				
			||||||
            radius: Utils.lint(16, 64, appSettings.bloomQuality);
 | 
					            radius: Utils.lint(16, 64, appSettings.bloomQuality)
 | 
				
			||||||
            source: terminal.mainSource
 | 
					            source: terminal.mainSource
 | 
				
			||||||
            transparentBorder: true
 | 
					            transparentBorder: true
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Loader{
 | 
					    Loader {
 | 
				
			||||||
        id: bloomSourceLoader
 | 
					        id: bloomSourceLoader
 | 
				
			||||||
        active: appSettings.bloom !== 0
 | 
					        active: appSettings.bloom !== 0
 | 
				
			||||||
        asynchronous: true
 | 
					        asynchronous: true
 | 
				
			||||||
        sourceComponent: ShaderEffectSource{
 | 
					        sourceComponent: ShaderEffectSource {
 | 
				
			||||||
            id: _bloomEffectSource
 | 
					            id: _bloomEffectSource
 | 
				
			||||||
            sourceItem: bloomEffectLoader.item
 | 
					            sourceItem: bloomEffectLoader.item
 | 
				
			||||||
            hideSource: true
 | 
					            hideSource: true
 | 
				
			||||||
@@ -53,71 +77,4 @@ ShaderTerminal {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bloomSource: bloomSourceLoader.item
 | 
					    bloomSource: bloomSourceLoader.item
 | 
				
			||||||
 | 
					 | 
				
			||||||
//    NewTerminalFrame {
 | 
					 | 
				
			||||||
//        id: terminalFrame
 | 
					 | 
				
			||||||
//        anchors.fill: parent
 | 
					 | 
				
			||||||
//        blending: true
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // This shader might be useful in the future. Since we used it only for a couple
 | 
					 | 
				
			||||||
    // of calculations is probably best to move those in the main shader. If in the future
 | 
					 | 
				
			||||||
    // we need to store another fullScreen channel this might be handy.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//    ShaderEffect {
 | 
					 | 
				
			||||||
//        id: rasterizationEffect
 | 
					 | 
				
			||||||
//        width: parent.width
 | 
					 | 
				
			||||||
//        height: parent.height
 | 
					 | 
				
			||||||
//        property real outColor: 0.0
 | 
					 | 
				
			||||||
//        property real dispX: (5 / width) * appSettings.windowScaling
 | 
					 | 
				
			||||||
//        property real dispY: (5 / height) * appSettings.windowScaling
 | 
					 | 
				
			||||||
//        property size virtual_resolution: terminal.virtualResolution
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//        blending: false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//        fragmentShader:
 | 
					 | 
				
			||||||
//            "uniform lowp float qt_Opacity;" +
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//            "varying highp vec2 qt_TexCoord0;
 | 
					 | 
				
			||||||
//             uniform highp vec2 virtual_resolution;
 | 
					 | 
				
			||||||
//             uniform highp float dispX;
 | 
					 | 
				
			||||||
//             uniform highp float dispY;
 | 
					 | 
				
			||||||
//             uniform mediump float outColor;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//             highp float getScanlineIntensity(vec2 coords) {
 | 
					 | 
				
			||||||
//                 highp float result = 1.0;" +
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//                (appSettings.rasterization != appSettings.no_rasterization ?
 | 
					 | 
				
			||||||
//                    "result *= abs(sin(coords.y * virtual_resolution.y * "+Math.PI+"));" : "") +
 | 
					 | 
				
			||||||
//                (appSettings.rasterization == appSettings.pixel_rasterization ?
 | 
					 | 
				
			||||||
//                    "result *= abs(sin(coords.x * virtual_resolution.x * "+Math.PI+"));" : "") + "
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//                return result;
 | 
					 | 
				
			||||||
//             }" +
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//            "void main() {" +
 | 
					 | 
				
			||||||
//                "highp float color = getScanlineIntensity(qt_TexCoord0);" +
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//                "float distance = length(vec2(0.5) - qt_TexCoord0);" +
 | 
					 | 
				
			||||||
//                "color = mix(color, 0.0, 1.2 * distance * distance);" +
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//                "color *= outColor + smoothstep(0.00, dispX, qt_TexCoord0.x) * (1.0 - outColor);" +
 | 
					 | 
				
			||||||
//                "color *= outColor + smoothstep(0.00, dispY, qt_TexCoord0.y) * (1.0 - outColor);" +
 | 
					 | 
				
			||||||
//                "color *= outColor + (1.0 - smoothstep(1.00 - dispX, 1.00, qt_TexCoord0.x)) * (1.0 - outColor);" +
 | 
					 | 
				
			||||||
//                "color *= outColor + (1.0 - smoothstep(1.00 - dispY, 1.00, qt_TexCoord0.y)) * (1.0 - outColor);" +
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//                "gl_FragColor.a = color;" +
 | 
					 | 
				
			||||||
//            "}"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//        onStatusChanged: if (log) console.log(log) //Print warning messages
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//    rasterizationSource: ShaderEffectSource{
 | 
					 | 
				
			||||||
//        id: rasterizationEffectSource
 | 
					 | 
				
			||||||
//        sourceItem: rasterizationEffect
 | 
					 | 
				
			||||||
//        hideSource: true
 | 
					 | 
				
			||||||
//        smooth: true
 | 
					 | 
				
			||||||
//        wrapMode: ShaderEffectSource.ClampToEdge
 | 
					 | 
				
			||||||
//        visible: false
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										104
									
								
								app/qml/TerminalFrame.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								app/qml/TerminalFrame.qml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,104 @@
 | 
				
			|||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* cool-retro-term is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					* it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					* the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					* (at your option) any later version.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					* but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					* GNU General Public License for more details.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					import QtQuick 2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "utils.js" as Utils
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ShaderEffect {
 | 
				
			||||||
 | 
					    property color _frameColor: appSettings.frameColor
 | 
				
			||||||
 | 
					    property color _backgroundColor: appSettings.backgroundColor
 | 
				
			||||||
 | 
					    property color _fontColor: appSettings.fontColor
 | 
				
			||||||
 | 
					    property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2)
 | 
				
			||||||
 | 
					    property real _ambientLight: Utils.lint(0.2, 0.8, appSettings.ambientLight)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    property color frameColor: Utils.mix(_frameColor, _lightColor, _ambientLight)
 | 
				
			||||||
 | 
					    property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Coefficient of the log curve used to approximate shadowing
 | 
				
			||||||
 | 
					    property real screenShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight)
 | 
				
			||||||
 | 
					    property real frameShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    property size margin: Qt.size(
 | 
				
			||||||
 | 
					        appSettings.frameMargin / width * appSettings.windowScaling,
 | 
				
			||||||
 | 
					        appSettings.frameMargin / height * appSettings.windowScaling
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ShaderLibrary {
 | 
				
			||||||
 | 
					        id: shaderLibrary
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fragmentShader: "
 | 
				
			||||||
 | 
					        #ifdef GL_ES
 | 
				
			||||||
 | 
					            precision mediump float;
 | 
				
			||||||
 | 
					        #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        uniform lowp float screenCurvature;
 | 
				
			||||||
 | 
					        uniform lowp float screenShadowCoeff;
 | 
				
			||||||
 | 
					        uniform lowp float frameShadowCoeff;
 | 
				
			||||||
 | 
					        uniform highp float qt_Opacity;
 | 
				
			||||||
 | 
					        uniform lowp vec4 frameColor;
 | 
				
			||||||
 | 
					        uniform mediump vec2 margin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        varying highp vec2 qt_TexCoord0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        vec2 distortCoordinates(vec2 coords){
 | 
				
			||||||
 | 
					            vec2 cc = (coords - vec2(0.5));
 | 
				
			||||||
 | 
					            float dist = dot(cc, cc) * screenCurvature;
 | 
				
			||||||
 | 
					            return (coords + cc * (1.0 + dist) * dist);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        " +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        shaderLibrary.max2 +
 | 
				
			||||||
 | 
					        shaderLibrary.min2 +
 | 
				
			||||||
 | 
					        shaderLibrary.prod2 +
 | 
				
			||||||
 | 
					        shaderLibrary.sum2 +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        vec2 positiveLog(vec2 x) {
 | 
				
			||||||
 | 
					            return clamp(log(x), vec2(0.0), vec2(100.0));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        void main() {
 | 
				
			||||||
 | 
					            vec2 staticCoords = qt_TexCoord0;
 | 
				
			||||||
 | 
					            vec2 coords = distortCoordinates(staticCoords) * (vec2(1.0) + margin * 2.0) - margin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            vec2 vignetteCoords = staticCoords * (1.0 - staticCoords.yx);
 | 
				
			||||||
 | 
					            float vignette = pow(prod2(vignetteCoords) * 15.0, 0.25);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            vec3 color = frameColor.rgb * vec3(1.0 - vignette);
 | 
				
			||||||
 | 
					            float alpha = 0.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            float frameShadow = max2(positiveLog(-coords * frameShadowCoeff + vec2(1.0)) + positiveLog(coords * frameShadowCoeff - (vec2(frameShadowCoeff) - vec2(1.0))));
 | 
				
			||||||
 | 
					            frameShadow = clamp(sqrt(frameShadow), 0.0, 1.0);
 | 
				
			||||||
 | 
					            color *= frameShadow;
 | 
				
			||||||
 | 
					            alpha = sum2(1.0 - step(vec2(0.0), coords) + step(vec2(1.0), coords));
 | 
				
			||||||
 | 
					            alpha = clamp(alpha, 0.0, 1.0);
 | 
				
			||||||
 | 
					            alpha *= mix(1.0, 0.9, frameShadow);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            float screenShadow = 1.0 - prod2(positiveLog(coords * screenShadowCoeff + vec2(1.0)) * positiveLog(-coords * screenShadowCoeff + vec2(screenShadowCoeff + 1.0)));
 | 
				
			||||||
 | 
					            alpha = max(0.8 * screenShadow, alpha);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            gl_FragColor = vec4(color * alpha, alpha);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    onStatusChanged: if (log) console.log(log) //Print warning messages
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,10 +17,9 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Timer{
 | 
					Timer {
 | 
				
			||||||
    default property bool enableTimer: false
 | 
					    default property bool enableTimer: false
 | 
				
			||||||
    property real time
 | 
					    property real time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								app/qml/fonts/1971-ibm-3278/3270-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								app/qml/fonts/1971-ibm-3278/3270-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
* https://github.com/Swordfish90/cool-retro-term
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
* This file is part of cool-retro-term.
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
@@ -17,13 +17,13 @@
 | 
				
			|||||||
* You should have received a copy of the GNU General Public License
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*******************************************************************************/
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					 | 
				
			||||||
import QtQuick 2.2
 | 
					import QtQuick 2.2
 | 
				
			||||||
import QtQuick.Window 2.1
 | 
					import QtQuick.Window 2.1
 | 
				
			||||||
import QtQuick.Controls 1.1
 | 
					import QtQuick.Controls 2.3
 | 
				
			||||||
import QtGraphicalEffects 1.0
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
ApplicationWindow{
 | 
					import "menus"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ApplicationWindow {
 | 
				
			||||||
    id: terminalWindow
 | 
					    id: terminalWindow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    width: 1024
 | 
					    width: 1024
 | 
				
			||||||
@@ -37,8 +37,6 @@ ApplicationWindow{
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Load saved window geometry and show the window
 | 
					    // Load saved window geometry and show the window
 | 
				
			||||||
    Component.onCompleted: {
 | 
					    Component.onCompleted: {
 | 
				
			||||||
        appSettings.handleFontChanged();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        x = appSettings.x
 | 
					        x = appSettings.x
 | 
				
			||||||
        y = appSettings.y
 | 
					        y = appSettings.y
 | 
				
			||||||
        width = appSettings.width
 | 
					        width = appSettings.width
 | 
				
			||||||
@@ -55,22 +53,30 @@ ApplicationWindow{
 | 
				
			|||||||
    property bool fullscreen: appSettings.fullscreen
 | 
					    property bool fullscreen: appSettings.fullscreen
 | 
				
			||||||
    onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed)
 | 
					    onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //Workaround: Without __contentItem a ugly thin border is visible.
 | 
					    menuBar: qtquickMenuLoader.item
 | 
				
			||||||
    menuBar: CRTMainMenuBar{
 | 
					
 | 
				
			||||||
        id: mainMenu
 | 
					    Loader {
 | 
				
			||||||
        visible: (Qt.platform.os === "osx" || appSettings.showMenubar)
 | 
					        id: qtquickMenuLoader
 | 
				
			||||||
        __contentItem.visible: mainMenu.visible
 | 
					        active: !appSettings.isMacOS && appSettings.showMenubar
 | 
				
			||||||
 | 
					        sourceComponent: WindowMenu { }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Loader {
 | 
				
			||||||
 | 
					        id: globalMenuLoader
 | 
				
			||||||
 | 
					        active: appSettings.isMacOS
 | 
				
			||||||
 | 
					        sourceComponent: OSXMenu { }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    property string wintitle: appSettings.wintitle
 | 
					    property string wintitle: appSettings.wintitle
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    color: "#00000000"
 | 
					    color: "#00000000"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    title: terminalContainer.title || qsTr(appSettings.wintitle)
 | 
					    title: terminalContainer.title || qsTr(appSettings.wintitle)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Action {
 | 
					    Action {
 | 
				
			||||||
        id: showMenubarAction
 | 
					        id: showMenubarAction
 | 
				
			||||||
        text: qsTr("Show Menubar")
 | 
					        text: qsTr("Show Menubar")
 | 
				
			||||||
        enabled: Qt.platform.os !== "osx"
 | 
					        enabled: !appSettings.isMacOS
 | 
				
			||||||
        shortcut: "Ctrl+Shift+M"
 | 
					        shortcut: "Ctrl+Shift+M"
 | 
				
			||||||
        checkable: true
 | 
					        checkable: true
 | 
				
			||||||
        checked: appSettings.showMenubar
 | 
					        checked: appSettings.showMenubar
 | 
				
			||||||
@@ -79,9 +85,9 @@ ApplicationWindow{
 | 
				
			|||||||
    Action {
 | 
					    Action {
 | 
				
			||||||
        id: fullscreenAction
 | 
					        id: fullscreenAction
 | 
				
			||||||
        text: qsTr("Fullscreen")
 | 
					        text: qsTr("Fullscreen")
 | 
				
			||||||
        enabled: Qt.platform.os !== "osx"
 | 
					        enabled: !appSettings.isMacOS
 | 
				
			||||||
        shortcut: "Alt+F11"
 | 
					        shortcut: "Alt+F11"
 | 
				
			||||||
        onTriggered: appSettings.fullscreen = !appSettings.fullscreen;
 | 
					        onTriggered: appSettings.fullscreen = !appSettings.fullscreen
 | 
				
			||||||
        checkable: true
 | 
					        checkable: true
 | 
				
			||||||
        checked: appSettings.fullscreen
 | 
					        checked: appSettings.fullscreen
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -89,69 +95,68 @@ ApplicationWindow{
 | 
				
			|||||||
        id: quitAction
 | 
					        id: quitAction
 | 
				
			||||||
        text: qsTr("Quit")
 | 
					        text: qsTr("Quit")
 | 
				
			||||||
        shortcut: "Ctrl+Shift+Q"
 | 
					        shortcut: "Ctrl+Shift+Q"
 | 
				
			||||||
        onTriggered: Qt.quit();
 | 
					        onTriggered: Qt.quit()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Action{
 | 
					    Action {
 | 
				
			||||||
        id: showsettingsAction
 | 
					        id: showsettingsAction
 | 
				
			||||||
        text: qsTr("Settings")
 | 
					        text: qsTr("Settings")
 | 
				
			||||||
        onTriggered: {
 | 
					        onTriggered: {
 | 
				
			||||||
            settingswindow.show();
 | 
					            settingswindow.show()
 | 
				
			||||||
            settingswindow.requestActivate();
 | 
					            settingswindow.requestActivate()
 | 
				
			||||||
            settingswindow.raise();
 | 
					            settingswindow.raise()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Action{
 | 
					    Action {
 | 
				
			||||||
        id: copyAction
 | 
					        id: copyAction
 | 
				
			||||||
        text: qsTr("Copy")
 | 
					        text: qsTr("Copy")
 | 
				
			||||||
        shortcut: "Ctrl+Shift+C"
 | 
					        shortcut: "Ctrl+Shift+C"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Action{
 | 
					    Action {
 | 
				
			||||||
        id: pasteAction
 | 
					        id: pasteAction
 | 
				
			||||||
        text: qsTr("Paste")
 | 
					        text: qsTr("Paste")
 | 
				
			||||||
        shortcut: "Ctrl+Shift+V"
 | 
					        shortcut: "Ctrl+Shift+V"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Action{
 | 
					    Action {
 | 
				
			||||||
        id: zoomIn
 | 
					        id: zoomIn
 | 
				
			||||||
        text: qsTr("Zoom In")
 | 
					        text: qsTr("Zoom In")
 | 
				
			||||||
        shortcut: "Ctrl++"
 | 
					        shortcut: "Ctrl++"
 | 
				
			||||||
        onTriggered: appSettings.incrementScaling();
 | 
					        onTriggered: appSettings.incrementScaling()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Action{
 | 
					    Action {
 | 
				
			||||||
        id: zoomOut
 | 
					        id: zoomOut
 | 
				
			||||||
        text: qsTr("Zoom Out")
 | 
					        text: qsTr("Zoom Out")
 | 
				
			||||||
        shortcut: "Ctrl+-"
 | 
					        shortcut: "Ctrl+-"
 | 
				
			||||||
        onTriggered: appSettings.decrementScaling();
 | 
					        onTriggered: appSettings.decrementScaling()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Action{
 | 
					    Action {
 | 
				
			||||||
        id: showAboutAction
 | 
					        id: showAboutAction
 | 
				
			||||||
        text: qsTr("About")
 | 
					        text: qsTr("About")
 | 
				
			||||||
        onTriggered: {
 | 
					        onTriggered: {
 | 
				
			||||||
            aboutDialog.show();
 | 
					            aboutDialog.show()
 | 
				
			||||||
            aboutDialog.requestActivate();
 | 
					            aboutDialog.requestActivate()
 | 
				
			||||||
            aboutDialog.raise();
 | 
					            aboutDialog.raise()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ApplicationSettings{
 | 
					    ApplicationSettings {
 | 
				
			||||||
        id: appSettings
 | 
					        id: appSettings
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    TerminalContainer{
 | 
					    TerminalContainer {
 | 
				
			||||||
        id: terminalContainer
 | 
					        id: terminalContainer
 | 
				
			||||||
        y: appSettings.showMenubar ? 0 : -2 // Workaroud to hide the margin in the menubar.
 | 
					 | 
				
			||||||
        width: parent.width
 | 
					        width: parent.width
 | 
				
			||||||
        height: (parent.height + Math.abs(y))
 | 
					        height: (parent.height + Math.abs(y))
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    SettingsWindow{
 | 
					    SettingsWindow {
 | 
				
			||||||
        id: settingswindow
 | 
					        id: settingswindow
 | 
				
			||||||
        visible: false
 | 
					        visible: false
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    AboutDialog{
 | 
					    AboutDialog {
 | 
				
			||||||
        id: aboutDialog
 | 
					        id: aboutDialog
 | 
				
			||||||
        visible: false
 | 
					        visible: false
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Loader{
 | 
					    Loader {
 | 
				
			||||||
        anchors.centerIn: parent
 | 
					        anchors.centerIn: parent
 | 
				
			||||||
        active: appSettings.showTerminalSize
 | 
					        active: appSettings.showTerminalSize
 | 
				
			||||||
        sourceComponent: SizeOverlay{
 | 
					        sourceComponent: SizeOverlay {
 | 
				
			||||||
            z: 3
 | 
					            z: 3
 | 
				
			||||||
            terminalSize: terminalContainer.terminalSize
 | 
					            terminalSize: terminalContainer.terminalSize
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -159,7 +164,7 @@ ApplicationWindow{
 | 
				
			|||||||
    onClosing: {
 | 
					    onClosing: {
 | 
				
			||||||
        // OSX Since we are currently supporting only one window
 | 
					        // OSX Since we are currently supporting only one window
 | 
				
			||||||
        // quit the application when it is closed.
 | 
					        // quit the application when it is closed.
 | 
				
			||||||
        if (Qt.platform.os === "osx")
 | 
					        if (appSettings.isMacOS)
 | 
				
			||||||
            Qt.quit()
 | 
					            Qt.quit()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										95
									
								
								app/qml/menus/FullContextMenu.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								app/qml/menus/FullContextMenu.qml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,95 @@
 | 
				
			|||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* cool-retro-term is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					* it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					* the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					* (at your option) any later version.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					* but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					* GNU General Public License for more details.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					import QtQuick 2.2
 | 
				
			||||||
 | 
					import QtQuick.Controls 2.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Menu {
 | 
				
			||||||
 | 
					    id: contextmenu
 | 
				
			||||||
 | 
					    MenuItem {
 | 
				
			||||||
 | 
					        action: copyAction
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    MenuItem {
 | 
				
			||||||
 | 
					        action: pasteAction
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    MenuItem {
 | 
				
			||||||
 | 
					        action: showsettingsAction
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    MenuSeparator {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Menu {
 | 
				
			||||||
 | 
					        title: qsTr("File")
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: quitAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Menu {
 | 
				
			||||||
 | 
					        title: qsTr("Edit")
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: copyAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: pasteAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuSeparator {}
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: showsettingsAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Menu {
 | 
				
			||||||
 | 
					        title: qsTr("View")
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: fullscreenAction
 | 
				
			||||||
 | 
					            visible: fullscreenAction.enabled
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: showMenubarAction
 | 
				
			||||||
 | 
					            visible: showMenubarAction.enabled
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: zoomIn
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: zoomOut
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Menu {
 | 
				
			||||||
 | 
					        id: profilesMenu
 | 
				
			||||||
 | 
					        title: qsTr("Profiles")
 | 
				
			||||||
 | 
					        Instantiator {
 | 
				
			||||||
 | 
					            model: appSettings.profilesList
 | 
				
			||||||
 | 
					            delegate: MenuItem {
 | 
				
			||||||
 | 
					                text: model.text
 | 
				
			||||||
 | 
					                onTriggered: {
 | 
				
			||||||
 | 
					                    appSettings.loadProfileString(obj_string)
 | 
				
			||||||
 | 
					                    appSettings.handleFontChanged()
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            onObjectAdded: profilesMenu.insertItem(index, object)
 | 
				
			||||||
 | 
					            onObjectRemoved: profilesMenu.removeItem(object)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Menu {
 | 
				
			||||||
 | 
					        title: qsTr("Help")
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: showAboutAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										89
									
								
								app/qml/menus/OSXMenu.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								app/qml/menus/OSXMenu.qml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,89 @@
 | 
				
			|||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* cool-retro-term is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					* it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					* the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					* (at your option) any later version.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					* but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					* GNU General Public License for more details.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import QtQuick 2.3
 | 
				
			||||||
 | 
					import Qt.labs.platform 1.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MenuBar {
 | 
				
			||||||
 | 
					    id: defaultMenuBar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Menu {
 | 
				
			||||||
 | 
					        title: qsTr("File")
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            text: quitAction.text
 | 
				
			||||||
 | 
					            onTriggered: quitAction.trigger()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Menu {
 | 
				
			||||||
 | 
					        title: qsTr("Edit")
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            text: copyAction.text
 | 
				
			||||||
 | 
					            shortcut: "Meta+C"
 | 
				
			||||||
 | 
					            onTriggered: copyAction.trigger()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            text: pasteAction.text
 | 
				
			||||||
 | 
					            shortcut: "Meta+V"
 | 
				
			||||||
 | 
					            onTriggered: pasteAction.trigger()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuSeparator {}
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            text: showsettingsAction.text
 | 
				
			||||||
 | 
					            shortcut: showsettingsAction.shortcut
 | 
				
			||||||
 | 
					            onTriggered: showsettingsAction.trigger()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Menu {
 | 
				
			||||||
 | 
					        title: qsTr("View")
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            text: zoomIn.text
 | 
				
			||||||
 | 
					            shortcut: "Meta++"
 | 
				
			||||||
 | 
					            onTriggered: zoomIn.trigger()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            text: zoomOut.text
 | 
				
			||||||
 | 
					            shortcut: "Meta+-"
 | 
				
			||||||
 | 
					            onTriggered: zoomOut.trigger()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Menu {
 | 
				
			||||||
 | 
					        id: profilesMenu
 | 
				
			||||||
 | 
					        title: qsTr("Profiles")
 | 
				
			||||||
 | 
					        Instantiator {
 | 
				
			||||||
 | 
					            model: appSettings.profilesList
 | 
				
			||||||
 | 
					            delegate: MenuItem {
 | 
				
			||||||
 | 
					                text: model.text
 | 
				
			||||||
 | 
					                onTriggered: {
 | 
				
			||||||
 | 
					                    appSettings.loadProfileString(obj_string)
 | 
				
			||||||
 | 
					                    appSettings.handleFontChanged()
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            onObjectAdded: profilesMenu.insertItem(index, object)
 | 
				
			||||||
 | 
					            onObjectRemoved: profilesMenu.removeItem(object)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Menu {
 | 
				
			||||||
 | 
					        title: qsTr("Help")
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            text: showAboutAction.text
 | 
				
			||||||
 | 
					            onTriggered: showAboutAction.trigger()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										31
									
								
								app/qml/menus/ShortContextMenu.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								app/qml/menus/ShortContextMenu.qml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* cool-retro-term is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					* it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					* the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					* (at your option) any later version.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					* but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					* GNU General Public License for more details.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					import QtQuick 2.2
 | 
				
			||||||
 | 
					import QtQuick.Controls 2.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Menu {
 | 
				
			||||||
 | 
					    id: contextmenu
 | 
				
			||||||
 | 
					    MenuItem {
 | 
				
			||||||
 | 
					        action: copyAction
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    MenuItem {
 | 
				
			||||||
 | 
					        action: pasteAction
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										85
									
								
								app/qml/menus/WindowMenu.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								app/qml/menus/WindowMenu.qml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,85 @@
 | 
				
			|||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* cool-retro-term is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					* it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					* the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					* (at your option) any later version.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					* but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					* GNU General Public License for more details.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					import QtQuick 2.2
 | 
				
			||||||
 | 
					import QtQuick.Controls 2.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MenuBar {
 | 
				
			||||||
 | 
					    id: defaultMenuBar
 | 
				
			||||||
 | 
					    visible: appSettings.showMenubar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Menu {
 | 
				
			||||||
 | 
					        title: qsTr("File")
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: quitAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Menu {
 | 
				
			||||||
 | 
					        title: qsTr("Edit")
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: copyAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: pasteAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuSeparator {}
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: showsettingsAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Menu {
 | 
				
			||||||
 | 
					        title: qsTr("View")
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: fullscreenAction
 | 
				
			||||||
 | 
					            visible: fullscreenAction.enabled
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: showMenubarAction
 | 
				
			||||||
 | 
					            visible: showMenubarAction.enabled
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: zoomIn
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: zoomOut
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Menu {
 | 
				
			||||||
 | 
					        id: profilesMenu
 | 
				
			||||||
 | 
					        title: qsTr("Profiles")
 | 
				
			||||||
 | 
					        Instantiator {
 | 
				
			||||||
 | 
					            model: appSettings.profilesList
 | 
				
			||||||
 | 
					            delegate: MenuItem {
 | 
				
			||||||
 | 
					                text: model.text
 | 
				
			||||||
 | 
					                onTriggered: {
 | 
				
			||||||
 | 
					                    appSettings.loadProfileString(obj_string)
 | 
				
			||||||
 | 
					                    appSettings.handleFontChanged()
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            onObjectAdded: profilesMenu.insertItem(index, object)
 | 
				
			||||||
 | 
					            onObjectRemoved: profilesMenu.removeItem(object)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Menu {
 | 
				
			||||||
 | 
					        title: qsTr("Help")
 | 
				
			||||||
 | 
					        MenuItem {
 | 
				
			||||||
 | 
					            action: showAboutAction
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -12,7 +12,6 @@
 | 
				
			|||||||
        <file>TimeManager.qml</file>
 | 
					        <file>TimeManager.qml</file>
 | 
				
			||||||
        <file>SimpleSlider.qml</file>
 | 
					        <file>SimpleSlider.qml</file>
 | 
				
			||||||
        <file>ColorButton.qml</file>
 | 
					        <file>ColorButton.qml</file>
 | 
				
			||||||
        <file>Glossy.qml</file>
 | 
					 | 
				
			||||||
        <file>AboutDialog.qml</file>
 | 
					        <file>AboutDialog.qml</file>
 | 
				
			||||||
        <file>InsertNameDialog.qml</file>
 | 
					        <file>InsertNameDialog.qml</file>
 | 
				
			||||||
        <file>SettingsEffectsTab.qml</file>
 | 
					        <file>SettingsEffectsTab.qml</file>
 | 
				
			||||||
@@ -20,9 +19,8 @@
 | 
				
			|||||||
        <file>SettingsTerminalTab.qml</file>
 | 
					        <file>SettingsTerminalTab.qml</file>
 | 
				
			||||||
        <file>FontScanlines.qml</file>
 | 
					        <file>FontScanlines.qml</file>
 | 
				
			||||||
        <file>fonts/1977-apple2/PrintChar21.ttf</file>
 | 
					        <file>fonts/1977-apple2/PrintChar21.ttf</file>
 | 
				
			||||||
        <file>fonts/1971-ibm-3278/3270Medium.ttf</file>
 | 
					        <file>fonts/1971-ibm-3278/3270-Regular.ttf</file>
 | 
				
			||||||
        <file>Storage.qml</file>
 | 
					        <file>Storage.qml</file>
 | 
				
			||||||
        <file>CRTMainMenuBar.qml</file>
 | 
					 | 
				
			||||||
        <file>SettingsAdvancedTab.qml</file>
 | 
					        <file>SettingsAdvancedTab.qml</file>
 | 
				
			||||||
        <file>TerminalContainer.qml</file>
 | 
					        <file>TerminalContainer.qml</file>
 | 
				
			||||||
        <file>images/crt256.png</file>
 | 
					        <file>images/crt256.png</file>
 | 
				
			||||||
@@ -42,6 +40,11 @@
 | 
				
			|||||||
        <file>fonts/1977-commodore-pet/PetMe.ttf</file>
 | 
					        <file>fonts/1977-commodore-pet/PetMe.ttf</file>
 | 
				
			||||||
        <file>BurnInEffect.qml</file>
 | 
					        <file>BurnInEffect.qml</file>
 | 
				
			||||||
        <file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file>
 | 
					        <file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file>
 | 
				
			||||||
        <file>NewTerminalFrame.qml</file>
 | 
					        <file>TerminalFrame.qml</file>
 | 
				
			||||||
 | 
					        <file>menus/WindowMenu.qml</file>
 | 
				
			||||||
 | 
					        <file>menus/FullContextMenu.qml</file>
 | 
				
			||||||
 | 
					        <file>menus/ShortContextMenu.qml</file>
 | 
				
			||||||
 | 
					        <file>ShaderLibrary.qml</file>
 | 
				
			||||||
 | 
					        <file>menus/OSXMenu.qml</file>
 | 
				
			||||||
    </qresource>
 | 
					    </qresource>
 | 
				
			||||||
</RCC>
 | 
					</RCC>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,23 @@
 | 
				
			|||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					* Copyright (c) 2013-2021 "Filippo Scognamiglio"
 | 
				
			||||||
 | 
					* https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This file is part of cool-retro-term.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* cool-retro-term is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					* it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					* the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					* (at your option) any later version.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					* but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					* GNU General Public License for more details.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.pragma library
 | 
					.pragma library
 | 
				
			||||||
function clamp(x, min, max) {
 | 
					function clamp(x, min, max) {
 | 
				
			||||||
    if (x <= min)
 | 
					    if (x <= min)
 | 
				
			||||||
@@ -6,15 +26,23 @@ function clamp(x, min, max) {
 | 
				
			|||||||
        return max;
 | 
					        return max;
 | 
				
			||||||
    return x;
 | 
					    return x;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function lint(a, b, t) {
 | 
					function lint(a, b, t) {
 | 
				
			||||||
    return (1 - t) * a + (t) * b;
 | 
					    return (1 - t) * a + (t) * b;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
function mix(c1, c2, alpha){
 | 
					
 | 
				
			||||||
 | 
					function mix(c1, c2, alpha) {
 | 
				
			||||||
    return Qt.rgba(c1.r * alpha + c2.r * (1-alpha),
 | 
					    return Qt.rgba(c1.r * alpha + c2.r * (1-alpha),
 | 
				
			||||||
                   c1.g * alpha + c2.g * (1-alpha),
 | 
					                   c1.g * alpha + c2.g * (1-alpha),
 | 
				
			||||||
                   c1.b * alpha + c2.b * (1-alpha),
 | 
					                   c1.b * alpha + c2.b * (1-alpha),
 | 
				
			||||||
                   c1.a * alpha + c2.a * (1-alpha))
 | 
					                   c1.a * alpha + c2.a * (1-alpha))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function smoothstep(min, max, value) {
 | 
				
			||||||
 | 
					    let x = Math.max(0, Math.min(1, (value - min) / (max - min)));
 | 
				
			||||||
 | 
					    return x * x * (3 - 2 * x);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function strToColor(s){
 | 
					function strToColor(s){
 | 
				
			||||||
    var r = parseInt(s.substring(1,3), 16) / 256;
 | 
					    var r = parseInt(s.substring(1,3), 16) / 256;
 | 
				
			||||||
    var g = parseInt(s.substring(3,5), 16) / 256;
 | 
					    var g = parseInt(s.substring(3,5), 16) / 256;
 | 
				
			||||||
 
 | 
				
			|||||||
 Submodule qmltermwidget updated: 48274c7566...63228027e1
									
								
							@@ -1,32 +1,46 @@
 | 
				
			|||||||
name: cool-retro-term # check to see if it's available
 | 
					name: cool-retro-term # check to see if it's available
 | 
				
			||||||
version: '1.1.0' # this is freakin' awesome
 | 
					version: '1.1.1' # this is freakin' awesome
 | 
				
			||||||
summary: cool-retro-term is a terminal emulator. # 79 char long summary
 | 
					summary: cool-retro-term is a cool and retro terminal emulator. # 79 char long summary
 | 
				
			||||||
description: |
 | 
					description: |
 | 
				
			||||||
  cool-retro-term is a terminal emulator which mimics the look and feel of the old cathode tube screens. It has been designed to be eye-candy, customizable, and reasonably lightweight.
 | 
					  cool-retro-term is a terminal emulator which mimics the look and feel of the old cathode tube screens. It has been designed to be eye-candy, customizable, and reasonably lightweight.
 | 
				
			||||||
grade: stable # must be 'stable' to release into candidate/stable channels
 | 
					grade: stable # must be 'stable' to release into candidate/stable channels
 | 
				
			||||||
confinement: strict # use 'strict' once you have the right plugs
 | 
					confinement: classic # use 'strict' once you have the right plugs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					base: core18
 | 
				
			||||||
 | 
					
 | 
				
			||||||
apps:
 | 
					apps:
 | 
				
			||||||
  cool-retro-term:
 | 
					  cool-retro-term:
 | 
				
			||||||
    command: desktop-launch $SNAP/usr/bin/cool-retro-term
 | 
					    command: bin/desktop-launch $SNAP/usr/bin/cool-retro-term
 | 
				
			||||||
    desktop: usr/share/applications/cool-retro-term.desktop
 | 
					    desktop: usr/share/applications/cool-retro-term.desktop
 | 
				
			||||||
    plugs:
 | 
					    environment:
 | 
				
			||||||
      - unity7
 | 
					      QML2_IMPORT_PATH: $SNAP/usr/lib/x86_64-linux-gnu/qt5/qml
 | 
				
			||||||
      - x11
 | 
					 | 
				
			||||||
      - desktop
 | 
					 | 
				
			||||||
      - home
 | 
					 | 
				
			||||||
      - network
 | 
					 | 
				
			||||||
      - network-bind
 | 
					 | 
				
			||||||
      - network-manager
 | 
					 | 
				
			||||||
      - password-manager-service
 | 
					 | 
				
			||||||
      - locale-control
 | 
					 | 
				
			||||||
      - gsettings
 | 
					 | 
				
			||||||
      - shutdown
 | 
					 | 
				
			||||||
      - firewall-control
 | 
					 | 
				
			||||||
      - process-control
 | 
					 | 
				
			||||||
      - system-observe
 | 
					 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
parts:
 | 
					parts:
 | 
				
			||||||
 | 
					  desktop-qt5:
 | 
				
			||||||
 | 
					    source: https://github.com/ubuntu/snapcraft-desktop-helpers.git
 | 
				
			||||||
 | 
					    source-subdir: qt
 | 
				
			||||||
 | 
					    plugin: make
 | 
				
			||||||
 | 
					    make-parameters: ["FLAVOR=qt5"]
 | 
				
			||||||
 | 
					    build-packages:
 | 
				
			||||||
 | 
					      - build-essential
 | 
				
			||||||
 | 
					      - qtbase5-dev
 | 
				
			||||||
 | 
					      - dpkg-dev
 | 
				
			||||||
 | 
					    stage-packages:
 | 
				
			||||||
 | 
					      - libxkbcommon0
 | 
				
			||||||
 | 
					      - ttf-ubuntu-font-family
 | 
				
			||||||
 | 
					      - dmz-cursor-theme
 | 
				
			||||||
 | 
					      - light-themes
 | 
				
			||||||
 | 
					      - adwaita-icon-theme
 | 
				
			||||||
 | 
					      - gnome-themes-standard
 | 
				
			||||||
 | 
					      - shared-mime-info
 | 
				
			||||||
 | 
					      - libqt5gui5
 | 
				
			||||||
 | 
					      - libgdk-pixbuf2.0-0
 | 
				
			||||||
 | 
					      - libqt5svg5 # for loading icon themes which are svg
 | 
				
			||||||
 | 
					      - try: [appmenu-qt5] # not available on core18
 | 
				
			||||||
 | 
					      - locales-all
 | 
				
			||||||
 | 
					      - xdg-user-dirs
 | 
				
			||||||
 | 
					      - fcitx-frontend-qt5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  my-part:
 | 
					  my-part:
 | 
				
			||||||
    source: https://github.com/Swordfish90/cool-retro-term
 | 
					    source: https://github.com/Swordfish90/cool-retro-term
 | 
				
			||||||
    source-type: git
 | 
					    source-type: git
 | 
				
			||||||
@@ -44,11 +58,14 @@ parts:
 | 
				
			|||||||
    stage-packages: 
 | 
					    stage-packages: 
 | 
				
			||||||
      - qmlscene
 | 
					      - qmlscene
 | 
				
			||||||
      - qml-module-qtquick-controls 
 | 
					      - qml-module-qtquick-controls 
 | 
				
			||||||
      - qtdeclarative5-qtquick2-plugin 
 | 
					      - qml-module-qtquick2
 | 
				
			||||||
      - libqt5qml-graphicaleffects 
 | 
					      - qml-module-qtgraphicaleffects
 | 
				
			||||||
      - qml-module-qtquick-dialogs 
 | 
					      - qml-module-qtquick-dialogs 
 | 
				
			||||||
      - qtdeclarative5-localstorage-plugin 
 | 
					      - qml-module-qtquick-localstorage
 | 
				
			||||||
      - qtdeclarative5-window-plugin
 | 
					      - qml-module-qtquick-window2
 | 
				
			||||||
      - libgl1-mesa-dev
 | 
					      - libgl1-mesa-dev
 | 
				
			||||||
      - qtdeclarative5-dev-tools
 | 
					      - qtdeclarative5-dev-tools
 | 
				
			||||||
      - qml-module-qtquick-extras
 | 
					      - qml-module-qtquick-extras
 | 
				
			||||||
 | 
					      - qml-module-qt-labs-settings
 | 
				
			||||||
 | 
					      - qml-module-qt-labs-folderlistmodel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user