Compare commits
33 Commits
improve-bu
...
v1.0.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6446f1d1bc | ||
|
|
01f391dea3 | ||
|
|
5b635abb38 | ||
|
|
54c52b230a | ||
|
|
40eb51e5eb | ||
|
|
546c4f36f0 | ||
|
|
2911960482 | ||
|
|
265e19def8 | ||
|
|
2bc88768b6 | ||
|
|
32f7923652 | ||
|
|
e379f05aca | ||
|
|
a7bab660e9 | ||
|
|
1bcb85968b | ||
|
|
4adf13539a | ||
|
|
8b47c5633a | ||
|
|
cb1e3f1b76 | ||
|
|
92ef89d5d2 | ||
|
|
b8fd9d6c45 | ||
|
|
0c17ca115e | ||
|
|
505a840574 | ||
|
|
56d742c1d2 | ||
|
|
28c66fa689 | ||
|
|
ceea1339d0 | ||
|
|
8aea50fd2b | ||
|
|
166e1f40fe | ||
|
|
415dcafee3 | ||
|
|
0399a6eb3c | ||
|
|
ac70da5b38 | ||
|
|
5ad20f6b4e | ||
|
|
283aa92579 | ||
|
|
9364aa3536 | ||
|
|
e0708e519c | ||
|
|
ebbb1f82fe |
14
README.md
@@ -4,14 +4,14 @@
|
|||||||
cool-retro-term is a terminal emulator which mimics the look and feel of the old cathode tube screens.
|
cool-retro-term is a terminal emulator which mimics the look and feel of the old cathode tube screens.
|
||||||
It has been designed to be eye-candy, customizable, and reasonably lightweight.
|
It has been designed to be eye-candy, customizable, and reasonably lightweight.
|
||||||
|
|
||||||
It uses the QML port of qtermwidget (Konsole) developed by me: https://github.com/Swordfish90/qmltermwidget
|
It uses the QML port of qtermwidget (Konsole) developed by me: https://github.com/Swordfish90/qmltermwidget .
|
||||||
|
|
||||||
This terminal emulator requires Qt 5.2 or higher to run.
|
This terminal emulator works under Linux and OSX and requires Qt 5.2 or higher.
|
||||||
|
|
||||||
##Screenshots
|
##Screenshots
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
##Get cool-retro-term
|
##Get cool-retro-term
|
||||||
You can either build cool-retro-term yourself (see below) or walk the easy way and install one of these packages:
|
You can either build cool-retro-term yourself (see below) or walk the easy way and install one of these packages:
|
||||||
@@ -31,6 +31,10 @@ Gentoo users can install from a 3rd-party repository preferably via layman:
|
|||||||
|
|
||||||
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!
|
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) can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb)
|
||||||
|
|
||||||
|
OSX users can grab the latest dmg from the release page: https://github.com/Swordfish90/cool-retro-term/releases
|
||||||
|
|
||||||
##Build instructions (Linux)
|
##Build instructions (Linux)
|
||||||
|
|
||||||
##Dependencies
|
##Dependencies
|
||||||
|
|||||||
14
app/app.pro
@@ -20,3 +20,17 @@ RESOURCES += qml/resources.qrc
|
|||||||
target.path += /usr/bin/
|
target.path += /usr/bin/
|
||||||
|
|
||||||
INSTALLS += target
|
INSTALLS += target
|
||||||
|
|
||||||
|
# Install icons
|
||||||
|
unix {
|
||||||
|
icon32.files = icons/32x32/cool-retro-term.png
|
||||||
|
icon32.path = /usr/share/icons/hicolor/32x32/apps
|
||||||
|
icon64.files = icons/64x64/cool-retro-term.png
|
||||||
|
icon64.path = /usr/share/icons/hicolor/64x64/apps
|
||||||
|
icon128.files = icons/128x128/cool-retro-term.png
|
||||||
|
icon128.path = /usr/share/icons/hicolor/128x128/apps
|
||||||
|
icon256.files = icons/256x256/cool-retro-term.png
|
||||||
|
icon256.path = /usr/share/icons/hicolor/256x256/apps
|
||||||
|
|
||||||
|
INSTALLS += icon32 icon64 icon128 icon256
|
||||||
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
@@ -5,6 +5,7 @@
|
|||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
|
|
||||||
#include <QtWidgets/QApplication>
|
#include <QtWidgets/QApplication>
|
||||||
|
#include <QIcon>
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -38,6 +39,12 @@ int main(int argc, char *argv[])
|
|||||||
QQmlApplicationEngine engine;
|
QQmlApplicationEngine engine;
|
||||||
FileIO fileIO;
|
FileIO fileIO;
|
||||||
|
|
||||||
|
#if !defined(Q_OS_MAC)
|
||||||
|
app.setWindowIcon(QIcon::fromTheme("cool-retro-term", QIcon(":../icons/32x32/cool-retro-term.png")));
|
||||||
|
#else
|
||||||
|
app.setWindowIcon(QIcon(":../icons/32x32/cool-retro-term.png"));
|
||||||
|
#endif
|
||||||
|
|
||||||
// Manage command line arguments from the cpp side
|
// Manage command line arguments from the cpp side
|
||||||
QStringList args = app.arguments();
|
QStringList args = app.arguments();
|
||||||
if (args.contains("-h") || args.contains("--help")) {
|
if (args.contains("-h") || args.contains("--help")) {
|
||||||
@@ -65,6 +72,8 @@ int main(int argc, char *argv[])
|
|||||||
engine.rootContext()->setContextProperty("workdir", getNamedArgument(args, "--workdir", "$HOME"));
|
engine.rootContext()->setContextProperty("workdir", getNamedArgument(args, "--workdir", "$HOME"));
|
||||||
engine.rootContext()->setContextProperty("fileIO", &fileIO);
|
engine.rootContext()->setContextProperty("fileIO", &fileIO);
|
||||||
|
|
||||||
|
engine.rootContext()->setContextProperty("devicePixelRatio", app.devicePixelRatio());
|
||||||
|
|
||||||
// Manage import paths for Linux and OSX.
|
// Manage import paths for Linux and OSX.
|
||||||
QStringList importPathList = engine.importPathList();
|
QStringList importPathList = engine.importPathList();
|
||||||
importPathList.prepend(QCoreApplication::applicationDirPath() + "/qmltermwidget");
|
importPathList.prepend(QCoreApplication::applicationDirPath() + "/qmltermwidget");
|
||||||
|
|||||||
@@ -19,13 +19,19 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
|
import QtQuick.Controls 1.0
|
||||||
|
|
||||||
import "utils.js" as Utils
|
import "utils.js" as Utils
|
||||||
|
|
||||||
QtObject{
|
QtObject{
|
||||||
property string version: "1.0.0 RC1"
|
property string version: "1.0.0"
|
||||||
|
|
||||||
// GENERAL SETTINGS ///////////////////////////////////////////////////
|
// STATIC CONSTANTS ////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
readonly property real minimumFontScaling: 0.25
|
||||||
|
readonly property real maximumFontScaling: 2.50
|
||||||
|
|
||||||
|
// GENERAL SETTINGS ///////////////////////////////////////////////////////
|
||||||
|
|
||||||
property bool fullscreen: false
|
property bool fullscreen: false
|
||||||
property bool showMenubar: true
|
property bool showMenubar: true
|
||||||
@@ -83,7 +89,7 @@ QtObject{
|
|||||||
|
|
||||||
property bool lowResolutionFont: false
|
property bool lowResolutionFont: false
|
||||||
|
|
||||||
property var fontNames: ["HERMIT", "COMMODORE_PET", "COMMODORE_PET"]
|
property var fontNames: ["TERMINUS_SCALED", "COMMODORE_PET", "COMMODORE_PET"]
|
||||||
property var fontlist: fontManager.item.fontlist
|
property var fontlist: fontManager.item.fontlist
|
||||||
|
|
||||||
signal terminalFontChanged(string fontSource, int pixelSize, int lineSpacing, real screenScaling, real fontWidth)
|
signal terminalFontChanged(string fontSource, int pixelSize, int lineSpacing, real screenScaling, real fontWidth)
|
||||||
@@ -113,12 +119,12 @@ QtObject{
|
|||||||
}
|
}
|
||||||
|
|
||||||
function incrementScaling(){
|
function incrementScaling(){
|
||||||
fontScaling = Math.min(fontScaling + 0.05, 2.50);
|
fontScaling = Math.min(fontScaling + 0.05, maximumFontScaling);
|
||||||
handleFontChanged();
|
handleFontChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
function decrementScaling(){
|
function decrementScaling(){
|
||||||
fontScaling = Math.max(fontScaling - 0.05, 0.50);
|
fontScaling = Math.max(fontScaling - 0.05, minimumFontScaling);
|
||||||
handleFontChanged();
|
handleFontChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -455,4 +461,11 @@ QtObject{
|
|||||||
storeCustomProfiles();
|
storeCustomProfiles();
|
||||||
//storage.dropSettings(); //DROPS THE SETTINGS!.. REMEMBER TO DISABLE ONCE ENABLED!!
|
//storage.dropSettings(); //DROPS THE SETTINGS!.. REMEMBER TO DISABLE ONCE ENABLED!!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// VARS ///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
property Label _sampleLabel: Label {
|
||||||
|
text: "100%"
|
||||||
|
}
|
||||||
|
property real labelWidth: _sampleLabel.width
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import QtQuick 2.2
|
|||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 1.1
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
|
|
||||||
|
import "Components"
|
||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
property alias name: check.text
|
property alias name: check.text
|
||||||
|
|
||||||
@@ -35,7 +37,6 @@ RowLayout {
|
|||||||
id: setting_component
|
id: setting_component
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
spacing: 25
|
|
||||||
|
|
||||||
onValueChanged: {
|
onValueChanged: {
|
||||||
check.checked = !(value == 0);
|
check.checked = !(value == 0);
|
||||||
@@ -45,7 +46,7 @@ RowLayout {
|
|||||||
|
|
||||||
CheckBox{
|
CheckBox{
|
||||||
id: check
|
id: check
|
||||||
implicitWidth: 150
|
implicitWidth: 160
|
||||||
onClicked: {
|
onClicked: {
|
||||||
if(!checked){
|
if(!checked){
|
||||||
checked = false;
|
checked = false;
|
||||||
@@ -66,16 +67,8 @@ RowLayout {
|
|||||||
newValue(value);
|
newValue(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Text{
|
SizedLabel {
|
||||||
id: textfield
|
anchors { top: parent.top; bottom: parent.bottom }
|
||||||
property string unformattedText: Math.round(((value - min_value) / (max_value - min_value)) * 100)
|
text: Math.round(((value - min_value) / (max_value - min_value)) * 100) + "%"
|
||||||
text: formatNumber(unformattedText)
|
|
||||||
}
|
|
||||||
function formatNumber(num) {
|
|
||||||
var n = "" + num;
|
|
||||||
while (n.length < 3) {
|
|
||||||
n = " " + n;
|
|
||||||
}
|
|
||||||
return n + "%";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
35
app/qml/Components/SizedLabel.qml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2013 "Filippo Scognamiglio"
|
||||||
|
* https://github.com/Swordfish90/cool-retro-term
|
||||||
|
*
|
||||||
|
* This file is part of cool-retro-term.
|
||||||
|
*
|
||||||
|
* cool-retro-term is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
import QtQuick 2.0
|
||||||
|
import QtQuick.Controls 1.0
|
||||||
|
|
||||||
|
// This component is simply a label with a predifined size.
|
||||||
|
// Used to improve alignment.
|
||||||
|
|
||||||
|
Item {
|
||||||
|
property alias text: textfield.text
|
||||||
|
width: appSettings.labelWidth
|
||||||
|
Label{
|
||||||
|
id: textfield
|
||||||
|
anchors { right: parent.right; verticalCenter: parent.verticalCenter }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -70,6 +70,16 @@ QtObject{
|
|||||||
fontWidth: 1.0
|
fontWidth: 1.0
|
||||||
lowResolutionFont: true
|
lowResolutionFont: true
|
||||||
}
|
}
|
||||||
|
ListElement{
|
||||||
|
name: "EXCELSIOR_SCALED"
|
||||||
|
text: "Fixedsys Excelsior (Modern)"
|
||||||
|
source: "fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf"
|
||||||
|
lineSpacing: 0
|
||||||
|
pixelSize: 16
|
||||||
|
baseScaling: 2.4
|
||||||
|
fontWidth: 1.0
|
||||||
|
lowResolutionFont: true
|
||||||
|
}
|
||||||
ListElement{
|
ListElement{
|
||||||
name: "COMMODORE_PET_SCALED"
|
name: "COMMODORE_PET_SCALED"
|
||||||
text: "Commodore PET (1977)"
|
text: "Commodore PET (1977)"
|
||||||
|
|||||||
@@ -44,11 +44,13 @@ Item{
|
|||||||
anchors.topMargin: frame.displacementTop * appSettings.windowScaling
|
anchors.topMargin: frame.displacementTop * appSettings.windowScaling
|
||||||
anchors.bottomMargin: frame.displacementBottom * appSettings.windowScaling
|
anchors.bottomMargin: frame.displacementBottom * appSettings.windowScaling
|
||||||
|
|
||||||
//The blur effect has to take into account the framerate
|
//Parameters for the burnIn effect.
|
||||||
property real mBlur: Math.sqrt(appSettings.burnIn)
|
property real burnIn: appSettings.burnIn
|
||||||
property real motionBlurCoefficient: Utils.lint(_minBlurCoefficient, _maxBlurCoefficient, mBlur)
|
property real fps: appSettings.fps !== 0 ? appSettings.fps : 60
|
||||||
property real _minBlurCoefficient: 0.2
|
property real burnInFadeTime: Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn)
|
||||||
property real _maxBlurCoefficient: 0.02
|
property real motionBlurCoefficient: 1.0 / (fps * burnInFadeTime)
|
||||||
|
property real _minBurnInFadeTime: 0.16
|
||||||
|
property real _maxBurnInFadeTime: 1.6
|
||||||
|
|
||||||
property size terminalSize: kterminal.terminalSize
|
property size terminalSize: kterminal.terminalSize
|
||||||
property size fontMetrics: kterminal.fontMetrics
|
property size fontMetrics: kterminal.fontMetrics
|
||||||
@@ -176,7 +178,7 @@ Item{
|
|||||||
MouseArea{
|
MouseArea{
|
||||||
acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
|
acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
cursorShape: Qt.IBeamCursor
|
cursorShape: kterminal.terminalUsesMouse ? Qt.ArrowCursor : Qt.IBeamCursor
|
||||||
onWheel:{
|
onWheel:{
|
||||||
if(wheel.modifiers & Qt.ControlModifier){
|
if(wheel.modifiers & Qt.ControlModifier){
|
||||||
wheel.angleDelta.y > 0 ? zoomIn.trigger() : zoomOut.trigger();
|
wheel.angleDelta.y > 0 ? zoomIn.trigger() : zoomOut.trigger();
|
||||||
@@ -228,13 +230,15 @@ Item{
|
|||||||
Loader{
|
Loader{
|
||||||
id: blurredSourceLoader
|
id: blurredSourceLoader
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
active: mBlur !== 0
|
active: burnIn !== 0
|
||||||
|
|
||||||
sourceComponent: ShaderEffectSource{
|
sourceComponent: ShaderEffectSource{
|
||||||
|
property bool updateBurnIn: false
|
||||||
|
|
||||||
id: _blurredSourceEffect
|
id: _blurredSourceEffect
|
||||||
sourceItem: blurredTerminalLoader.item
|
sourceItem: blurredTerminalLoader.item
|
||||||
recursive: true
|
recursive: true
|
||||||
live: true
|
live: false
|
||||||
hideSource: true
|
hideSource: true
|
||||||
wrapMode: kterminalSource.wrapMode
|
wrapMode: kterminalSource.wrapMode
|
||||||
|
|
||||||
@@ -244,6 +248,13 @@ Item{
|
|||||||
livetimer.restart();
|
livetimer.restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This updates the burnin synched with the timer.
|
||||||
|
Connections {
|
||||||
|
target: updateBurnIn ? mainShader : null
|
||||||
|
ignoreUnknownSignals: false
|
||||||
|
onTimeChanged: _blurredSourceEffect.scheduleUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
Timer{
|
Timer{
|
||||||
id: livetimer
|
id: livetimer
|
||||||
|
|
||||||
@@ -251,14 +262,15 @@ Item{
|
|||||||
// We multiply 1.1 to have a little bit of margin over the theoretical value.
|
// We multiply 1.1 to have a little bit of margin over the theoretical value.
|
||||||
// This solution is not extremely clean, but it's probably the best to avoid measuring fps.
|
// This solution is not extremely clean, but it's probably the best to avoid measuring fps.
|
||||||
|
|
||||||
interval: (1 / motionBlurCoefficient) * 60 * 1.1
|
interval: burnInFadeTime * 1000 * 1.1
|
||||||
running: true
|
running: true
|
||||||
onTriggered: _blurredSourceEffect.live = false;
|
onTriggered: _blurredSourceEffect.updateBurnIn = false;
|
||||||
}
|
}
|
||||||
Connections{
|
Connections{
|
||||||
target: kterminal
|
target: kterminal
|
||||||
onImagePainted:{
|
onImagePainted:{
|
||||||
_blurredSourceEffect.live = true;
|
_blurredSourceEffect.scheduleUpdate();
|
||||||
|
_blurredSourceEffect.updateBurnIn = true;
|
||||||
livetimer.restart();
|
livetimer.restart();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -289,7 +301,7 @@ Item{
|
|||||||
? kterminal.height * Math.max(1, burnInScaling)
|
? kterminal.height * Math.max(1, burnInScaling)
|
||||||
: kterminal.height * scaleTexture * appSettings.burnInQuality
|
: kterminal.height * scaleTexture * appSettings.burnInQuality
|
||||||
|
|
||||||
active: mBlur !== 0
|
active: burnIn !== 0
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
|
|
||||||
sourceComponent: ShaderEffect {
|
sourceComponent: ShaderEffect {
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import QtQuick 2.2
|
|||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 1.1
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
|
|
||||||
|
import "Components"
|
||||||
|
|
||||||
Tab{
|
Tab{
|
||||||
ColumnLayout{
|
ColumnLayout{
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
@@ -34,23 +36,26 @@ Tab{
|
|||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
rows: 2
|
rows: 2
|
||||||
columns: 3
|
columns: 3
|
||||||
CheckBox{
|
Label{text: qsTr("Effects FPS")}
|
||||||
property int fps: checked ? slider.value : 0
|
|
||||||
onFpsChanged: appSettings.fps = fps
|
|
||||||
checked: appSettings.fps !== 0
|
|
||||||
text: qsTr("Effects FPS")
|
|
||||||
}
|
|
||||||
Slider{
|
Slider{
|
||||||
id: slider
|
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
stepSize: 1
|
id: fpsSlider
|
||||||
maximumValue: 60
|
onValueChanged: {
|
||||||
minimumValue: 1
|
if (enabled) {
|
||||||
enabled: appSettings.fps !== 0
|
appSettings.fps = value !== 60 ? value + 1 : 0;
|
||||||
value: appSettings.fps !== 0 ? appSettings.fps : 60
|
|
||||||
}
|
}
|
||||||
Text{text: slider.value}
|
}
|
||||||
Text{text: qsTr("Texture Quality")}
|
stepSize: 1
|
||||||
|
enabled: false
|
||||||
|
Component.onCompleted: {
|
||||||
|
minimumValue = 0;
|
||||||
|
maximumValue = 60;
|
||||||
|
value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60;
|
||||||
|
enabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SizedLabel{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")}
|
||||||
|
Label{text: qsTr("Texture Quality")}
|
||||||
Slider{
|
Slider{
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
id: txtslider
|
id: txtslider
|
||||||
@@ -63,7 +68,7 @@ Tab{
|
|||||||
enabled = true;
|
enabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Text{text: Math.round(txtslider.value * 100) + "%"}
|
SizedLabel{text: Math.round(txtslider.value * 100) + "%"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GroupBox{
|
GroupBox{
|
||||||
@@ -74,8 +79,7 @@ Tab{
|
|||||||
GridLayout{
|
GridLayout{
|
||||||
id: bloomQualityContainer
|
id: bloomQualityContainer
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
Label{text: qsTr("Bloom Quality")}
|
||||||
Text{text: qsTr("Bloom Quality")}
|
|
||||||
Slider{
|
Slider{
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
id: bloomSlider
|
id: bloomSlider
|
||||||
@@ -88,7 +92,7 @@ Tab{
|
|||||||
enabled = true;
|
enabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Text{text: Math.round(bloomSlider.value * 100) + "%"}
|
SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GroupBox{
|
GroupBox{
|
||||||
@@ -100,7 +104,7 @@ Tab{
|
|||||||
id: blurQualityContainer
|
id: blurQualityContainer
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
Text{text: qsTr("BurnIn Quality")}
|
Label{text: qsTr("BurnIn Quality")}
|
||||||
Slider{
|
Slider{
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
id: burnInSlider
|
id: burnInSlider
|
||||||
@@ -113,7 +117,7 @@ Tab{
|
|||||||
enabled = true;
|
enabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Text{text: Math.round(burnInSlider.value * 100) + "%"}
|
SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GroupBox{
|
GroupBox{
|
||||||
|
|||||||
@@ -46,17 +46,17 @@ Tab{
|
|||||||
GridLayout{
|
GridLayout{
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
columns: 2
|
columns: 2
|
||||||
Text{ text: qsTr("Brightness") }
|
Label{ text: qsTr("Brightness") }
|
||||||
SimpleSlider{
|
SimpleSlider{
|
||||||
onValueChanged: appSettings.brightness = value
|
onValueChanged: appSettings.brightness = value
|
||||||
value: appSettings.brightness
|
value: appSettings.brightness
|
||||||
}
|
}
|
||||||
Text{ text: qsTr("Contrast") }
|
Label{ text: qsTr("Contrast") }
|
||||||
SimpleSlider{
|
SimpleSlider{
|
||||||
onValueChanged: appSettings.contrast = value
|
onValueChanged: appSettings.contrast = value
|
||||||
value: appSettings.contrast
|
value: appSettings.contrast
|
||||||
}
|
}
|
||||||
Text{ text: qsTr("Opacity") }
|
Label{ text: qsTr("Opacity") }
|
||||||
SimpleSlider{
|
SimpleSlider{
|
||||||
onValueChanged: appSettings.windowOpacity = value
|
onValueChanged: appSettings.windowOpacity = value
|
||||||
value: appSettings.windowOpacity
|
value: appSettings.windowOpacity
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import QtQuick 2.2
|
|||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 1.1
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
|
|
||||||
|
import "Components"
|
||||||
|
|
||||||
Tab{
|
Tab{
|
||||||
ColumnLayout{
|
ColumnLayout{
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
@@ -32,7 +34,7 @@ Tab{
|
|||||||
GridLayout{
|
GridLayout{
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
columns: 2
|
columns: 2
|
||||||
Text{ text: qsTr("Name") }
|
Label{ text: qsTr("Name") }
|
||||||
ComboBox{
|
ComboBox{
|
||||||
id: fontChanger
|
id: fontChanger
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
@@ -54,7 +56,7 @@ Tab{
|
|||||||
}
|
}
|
||||||
Component.onCompleted: updateIndex();
|
Component.onCompleted: updateIndex();
|
||||||
}
|
}
|
||||||
Text{ text: qsTr("Scaling") }
|
Label{ text: qsTr("Scaling") }
|
||||||
RowLayout{
|
RowLayout{
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Slider{
|
Slider{
|
||||||
@@ -64,8 +66,8 @@ Tab{
|
|||||||
stepSize: 0.05
|
stepSize: 0.05
|
||||||
enabled: false // Another trick to fix initial bad behavior.
|
enabled: false // Another trick to fix initial bad behavior.
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
minimumValue = 0.5;
|
minimumValue = appSettings.minimumFontScaling;
|
||||||
maximumValue = 2.5;
|
maximumValue = appSettings.maximumFontScaling;
|
||||||
value = appSettings.fontScaling;
|
value = appSettings.fontScaling;
|
||||||
enabled = true;
|
enabled = true;
|
||||||
}
|
}
|
||||||
@@ -74,11 +76,11 @@ Tab{
|
|||||||
onFontScalingChanged: fontScalingChanger.value = appSettings.fontScaling;
|
onFontScalingChanged: fontScalingChanger.value = appSettings.fontScaling;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Text{
|
SizedLabel{
|
||||||
text: Math.round(fontScalingChanger.value * 100) + "%"
|
text: Math.round(fontScalingChanger.value * 100) + "%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Text{ text: qsTr("Font Width") }
|
Label{ text: qsTr("Font Width") }
|
||||||
RowLayout{
|
RowLayout{
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Slider{
|
Slider{
|
||||||
@@ -93,7 +95,7 @@ Tab{
|
|||||||
maximumValue = 1.5;
|
maximumValue = 1.5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Text{
|
SizedLabel{
|
||||||
text: Math.round(widthChanger.value * 100) + "%"
|
text: Math.round(widthChanger.value * 100) + "%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,13 +21,13 @@
|
|||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtGraphicalEffects 1.0
|
import QtGraphicalEffects 1.0
|
||||||
|
|
||||||
|
import "utils.js" as Utils
|
||||||
|
|
||||||
ShaderEffect {
|
ShaderEffect {
|
||||||
property ShaderEffectSource source
|
property ShaderEffectSource source
|
||||||
property ShaderEffectSource blurredSource
|
property ShaderEffectSource blurredSource
|
||||||
property ShaderEffectSource bloomSource
|
property ShaderEffectSource bloomSource
|
||||||
|
|
||||||
property real liveBlur: blurredSource && blurredSource.live ? 1.0 : 0.0
|
|
||||||
|
|
||||||
property color fontColor: appSettings.fontColor
|
property color fontColor: appSettings.fontColor
|
||||||
property color backgroundColor: appSettings.backgroundColor
|
property color backgroundColor: appSettings.backgroundColor
|
||||||
property real bloom: appSettings.bloom * 2.5
|
property real bloom: appSettings.bloom * 2.5
|
||||||
@@ -40,7 +40,7 @@ ShaderEffect {
|
|||||||
(height) / (noiseTexture.height * appSettings.windowScaling * appSettings.fontScaling))
|
(height) / (noiseTexture.height * appSettings.windowScaling * appSettings.fontScaling))
|
||||||
|
|
||||||
property real screenCurvature: appSettings.screenCurvature
|
property real screenCurvature: appSettings.screenCurvature
|
||||||
property real glowingLine: appSettings.glowingLine
|
property real glowingLine: appSettings.glowingLine * 0.2
|
||||||
|
|
||||||
property real chromaColor: appSettings.chromaColor;
|
property real chromaColor: appSettings.chromaColor;
|
||||||
|
|
||||||
@@ -58,6 +58,12 @@ ShaderEffect {
|
|||||||
|
|
||||||
property real screen_brightness: appSettings.brightness * 1.5 + 0.5
|
property real screen_brightness: appSettings.brightness * 1.5 + 0.5
|
||||||
|
|
||||||
|
// This is the average value of the abs(sin) function. Needed to avoid aliasing.
|
||||||
|
readonly property real absSinAvg: 0.63661828335466886
|
||||||
|
property size rasterizationSmooth: Qt.size(
|
||||||
|
Utils.clamp(2.0 * virtual_resolution.width / (width * devicePixelRatio), 0.0, 1.0),
|
||||||
|
Utils.clamp(2.0 * virtual_resolution.height / (height * devicePixelRatio), 0.0, 1.0))
|
||||||
|
|
||||||
property real dispX
|
property real dispX
|
||||||
property real dispY
|
property real dispY
|
||||||
property size virtual_resolution
|
property size virtual_resolution
|
||||||
@@ -155,6 +161,7 @@ ShaderEffect {
|
|||||||
uniform lowp float screen_brightness;
|
uniform lowp float screen_brightness;
|
||||||
|
|
||||||
uniform highp vec2 virtual_resolution;
|
uniform highp vec2 virtual_resolution;
|
||||||
|
uniform highp vec2 rasterizationSmooth;
|
||||||
uniform highp float dispX;
|
uniform highp float dispX;
|
||||||
uniform highp float dispY;" +
|
uniform highp float dispY;" +
|
||||||
|
|
||||||
@@ -162,8 +169,7 @@ ShaderEffect {
|
|||||||
uniform highp sampler2D bloomSource;
|
uniform highp sampler2D bloomSource;
|
||||||
uniform lowp float bloom;" : "") +
|
uniform lowp float bloom;" : "") +
|
||||||
(burnIn !== 0 ? "
|
(burnIn !== 0 ? "
|
||||||
uniform sampler2D blurredSource;
|
uniform sampler2D blurredSource;" : "") +
|
||||||
uniform lowp float liveBlur;" : "") +
|
|
||||||
(staticNoise !== 0 ? "
|
(staticNoise !== 0 ? "
|
||||||
uniform highp float staticNoise;" : "") +
|
uniform highp float staticNoise;" : "") +
|
||||||
(((staticNoise !== 0 || jitter !== 0 || rbgShift)
|
(((staticNoise !== 0 || jitter !== 0 || rbgShift)
|
||||||
@@ -194,16 +200,18 @@ ShaderEffect {
|
|||||||
|
|
||||||
(glowingLine !== 0 ? "
|
(glowingLine !== 0 ? "
|
||||||
float randomPass(vec2 coords){
|
float randomPass(vec2 coords){
|
||||||
return fract(smoothstep(-0.2, 0.0, coords.y - 3.0 * fract(time * 0.0001))) * glowingLine;
|
return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015)));
|
||||||
}" : "") +
|
}" : "") +
|
||||||
|
|
||||||
"highp float getScanlineIntensity(vec2 coords) {
|
"highp float getScanlineIntensity(vec2 coords) {
|
||||||
highp float result = 1.0;" +
|
highp float result = 1.0;" +
|
||||||
|
|
||||||
(appSettings.rasterization != appSettings.no_rasterization ?
|
(appSettings.rasterization != appSettings.no_rasterization ?
|
||||||
"result *= abs(sin(coords.y * virtual_resolution.y * "+Math.PI+"));" : "") +
|
"float val = abs(sin(coords.y * virtual_resolution.y * "+Math.PI+"));
|
||||||
|
result *= mix(val, " + absSinAvg + ", rasterizationSmooth.y);" : "") +
|
||||||
(appSettings.rasterization == appSettings.pixel_rasterization ?
|
(appSettings.rasterization == appSettings.pixel_rasterization ?
|
||||||
"result *= abs(sin(coords.x * virtual_resolution.x * "+Math.PI+"));" : "") + "
|
"val = abs(sin(coords.x * virtual_resolution.x * "+Math.PI+"));
|
||||||
|
result *= mix(val, " + absSinAvg + ", rasterizationSmooth.x);" : "") + "
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -264,12 +272,12 @@ ShaderEffect {
|
|||||||
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
|
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
|
||||||
|
|
||||||
(glowingLine !== 0 ? "
|
(glowingLine !== 0 ? "
|
||||||
color += randomPass(coords) * glowingLine;" : "") +
|
color += randomPass(coords * virtual_resolution) * glowingLine;" : "") +
|
||||||
|
|
||||||
"vec3 txt_color = texture2D(source, txt_coords).rgb;" +
|
"vec3 txt_color = texture2D(source, txt_coords).rgb;" +
|
||||||
|
|
||||||
(burnIn !== 0 ? "
|
(burnIn !== 0 ? "
|
||||||
vec4 txt_blur = liveBlur * texture2D(blurredSource, txt_coords);
|
vec4 txt_blur = texture2D(blurredSource, txt_coords);
|
||||||
txt_color = txt_color + txt_blur.rgb * txt_blur.a;"
|
txt_color = txt_color + txt_blur.rgb * txt_blur.a;"
|
||||||
: "") +
|
: "") +
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import QtQuick 2.2
|
|||||||
import QtQuick.Controls 1.1
|
import QtQuick.Controls 1.1
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
|
|
||||||
|
import "Components"
|
||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
property alias value: slider.value
|
property alias value: slider.value
|
||||||
property alias stepSize: slider.stepSize
|
property alias stepSize: slider.stepSize
|
||||||
@@ -36,15 +38,7 @@ RowLayout {
|
|||||||
stepSize: parent.stepSize
|
stepSize: parent.stepSize
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
}
|
}
|
||||||
Text{
|
SizedLabel{
|
||||||
id: textfield
|
text: Math.round(value * maxMultiplier) + "%"
|
||||||
text: formatNumber(Math.round(value * maxMultiplier))
|
|
||||||
}
|
|
||||||
function formatNumber(num) {
|
|
||||||
var n = "" + num;
|
|
||||||
while (n.length < 3) {
|
|
||||||
n = " " + n;
|
|
||||||
}
|
|
||||||
return n + "%";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
app/qml/fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf
Normal file
@@ -50,5 +50,8 @@
|
|||||||
<file>fonts/modern-envy-code-r/Envy Code R.ttf</file>
|
<file>fonts/modern-envy-code-r/Envy Code R.ttf</file>
|
||||||
<file>fonts/modern-inconsolata/Inconsolata.otf</file>
|
<file>fonts/modern-inconsolata/Inconsolata.otf</file>
|
||||||
<file>SettingsScreenTab.qml</file>
|
<file>SettingsScreenTab.qml</file>
|
||||||
|
<file>fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf</file>
|
||||||
|
<file>../icons/32x32/cool-retro-term.png</file>
|
||||||
|
<file>Components/SizedLabel.qml</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
.pragma library
|
.pragma library
|
||||||
|
function clamp(x, min, max) {
|
||||||
|
if (x <= min)
|
||||||
|
return min;
|
||||||
|
if (x >= max)
|
||||||
|
return max;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
function lint(a, b, t) {
|
function lint(a, b, t) {
|
||||||
return (1 - t) * a + (t) * b;
|
return (1 - t) * a + (t) * b;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
Comment=Use the command line the old way
|
Comment=Use the command line the old way
|
||||||
Exec=cool-retro-term
|
Exec=cool-retro-term
|
||||||
GenericName=Terminal emulator
|
GenericName=Terminal emulator
|
||||||
Icon=utilities-terminal
|
Icon=cool-retro-term
|
||||||
MimeType=
|
MimeType=
|
||||||
Name=Cool Retro Term
|
Name=Cool Retro Term
|
||||||
Categories=Qt;System;Utility;TerminalEmulator;
|
Categories=Qt;System;Utility;TerminalEmulator;
|
||||||
|
|||||||
@@ -18,10 +18,10 @@
|
|||||||
|
|
||||||
Name: cool-retro-term
|
Name: cool-retro-term
|
||||||
Summary: Cool Retro Terminal
|
Summary: Cool Retro Terminal
|
||||||
Version: 0.9
|
Version: 1.0
|
||||||
Release: 0%{?dist}
|
Release: 0%{?dist}
|
||||||
Group: System/X11/Terminals
|
Group: System/X11/Terminals
|
||||||
License: GPLv3
|
License: GPL-3.0+
|
||||||
URL: https://github.com/Swordfish90/cool-retro-term
|
URL: https://github.com/Swordfish90/cool-retro-term
|
||||||
|
|
||||||
# For this spec file to work, the cool-retro-term sources must be located
|
# For this spec file to work, the cool-retro-term sources must be located
|
||||||
@@ -82,9 +82,7 @@ desktop-file-install \
|
|||||||
%{_bindir}/%{name}
|
%{_bindir}/%{name}
|
||||||
%{_libdir}/qt5/qml/
|
%{_libdir}/qt5/qml/
|
||||||
%{_datadir}/applications/%{name}.desktop
|
%{_datadir}/applications/%{name}.desktop
|
||||||
# FIXME: Icon
|
%{_datadir}/icons/hicolor/*/*/*
|
||||||
# %{_datadir}/pixmaps/%{name}.png
|
|
||||||
# %{_datadir}/icons/hicolor/*/*/*
|
|
||||||
|
|
||||||
%clean
|
%clean
|
||||||
rm -rf %{buildroot}
|
rm -rf %{buildroot}
|
||||||
|
|||||||