forked from Sepanta/console-emulator
8 changed files with 497 additions and 30 deletions
@ -0,0 +1,361 @@ |
|||||
|
import QtQuick 2.0 |
||||
|
import QtQuick.Controls 2.13 |
||||
|
import QtGraphicalEffects 1.13 |
||||
|
|
||||
|
import "qrc:/theme" |
||||
|
import "qrc:/const" |
||||
|
import "qrc:/emulator/components" |
||||
|
|
||||
|
|
||||
|
import de.skycoder42.QtMvvm.Core 1.0 |
||||
|
import de.skycoder42.QtMvvm.Quick 1.0 |
||||
|
import com.example.consoleemulator 1.0 |
||||
|
|
||||
|
Button { |
||||
|
id: button |
||||
|
|
||||
|
//========================================= |
||||
|
property var name |
||||
|
property var nameLed: name + "Led" |
||||
|
|
||||
|
MvvmBinding { |
||||
|
viewModel: mainView.viewModel |
||||
|
viewProperty: "down" |
||||
|
viewModelProperty: name |
||||
|
type: MvvmBinding.OneWayToViewModel |
||||
|
} |
||||
|
|
||||
|
MvvmBinding { |
||||
|
viewModel: mainView.viewModel |
||||
|
viewProperty: "colorMode" |
||||
|
viewModelProperty: nameLed |
||||
|
} |
||||
|
//========================================= |
||||
|
|
||||
|
|
||||
|
property var image: "" |
||||
|
property var radius: Math.min(width / 2, height / 2) |
||||
|
property var timeToPress: 100 |
||||
|
property var border: 6 |
||||
|
|
||||
|
property var colorMode: 0 // 0->None; 1->White; 2->Green; 3->Yellow |
||||
|
property color lightColor: getColor() |
||||
|
property color lightGlow: getColorGlow() |
||||
|
|
||||
|
signal pressed |
||||
|
signal released |
||||
|
|
||||
|
implicitWidth: width |
||||
|
implicitHeight: height |
||||
|
|
||||
|
onPressed: { button.down = true } |
||||
|
onReleased: { button.down = false } |
||||
|
|
||||
|
function getColor() { |
||||
|
switch(colorMode) { |
||||
|
case(0): return Theme.current.none |
||||
|
case(1): return Theme.current.white |
||||
|
case(2): return Theme.current.green |
||||
|
case(3): return Theme.current.yellow |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function getColorGlow() { |
||||
|
switch(colorMode) { |
||||
|
case(0): return Theme.current.noneGlow |
||||
|
case(1): return Theme.current.whiteGlow |
||||
|
case(2): return Theme.current.greenGlow |
||||
|
case(3): return Theme.current.yellowGlow |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
width: Const.macroButton |
||||
|
height: Const.macroButton*2 |
||||
|
|
||||
|
contentItem: Item { |
||||
|
id: content |
||||
|
anchors.fill: parent |
||||
|
z: 1 |
||||
|
|
||||
|
Item { |
||||
|
property var factor: button.state == "Pressed" ? |
||||
|
Const.imageScalePressed : Const.imageScale |
||||
|
property var elevator: button.state == "Pressed" ? 3 : 0 |
||||
|
|
||||
|
anchors.horizontalCenter: parent.horizontalCenter |
||||
|
y: (parent.height * (1-factor)) / 2 + elevator |
||||
|
width: parent.width * factor |
||||
|
height: parent.height * factor |
||||
|
|
||||
|
Behavior on y { |
||||
|
NumberAnimation { |
||||
|
duration: timeToPress |
||||
|
easing.type: Easing.InOutQuad |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Behavior on width { |
||||
|
NumberAnimation { |
||||
|
duration: timeToPress |
||||
|
easing.type: Easing.InOutQuad |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Behavior on height { |
||||
|
NumberAnimation { |
||||
|
duration: timeToPress |
||||
|
easing.type: Easing.InOutQuad |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Image { |
||||
|
id: img |
||||
|
anchors.fill: parent |
||||
|
source: image |
||||
|
fillMode: Image.PreserveAspectFit |
||||
|
antialiasing: true |
||||
|
smooth: true |
||||
|
} |
||||
|
|
||||
|
ColorOverlay { |
||||
|
anchors.fill: img |
||||
|
source: img |
||||
|
color: button.state == "Pressed" ? Theme.current.textSelected : Theme.current.text |
||||
|
antialiasing: true |
||||
|
smooth: true |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
background: Item{ |
||||
|
width: parent.width |
||||
|
height: parent.height |
||||
|
|
||||
|
Rectangle { |
||||
|
id: backLightGlow |
||||
|
property var diffusion: Theme.current.glowRaduis |
||||
|
width: backLight.width + diffusion |
||||
|
height: backLight.height + diffusion |
||||
|
radius: width / 2 |
||||
|
anchors.horizontalCenter: backLight.horizontalCenter |
||||
|
y: - diffusion / 4 |
||||
|
color: Theme.current.background |
||||
|
border { |
||||
|
width: diffusion / 2 |
||||
|
color: Theme.current.background |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Rectangle { |
||||
|
anchors.fill: backLightGlow |
||||
|
|
||||
|
color: "transparent" |
||||
|
layer.enabled: true |
||||
|
layer.effect: OpacityMask { |
||||
|
maskSource: backLightGlow |
||||
|
} |
||||
|
|
||||
|
Rectangle { |
||||
|
width: parent.width |
||||
|
height: parent.height |
||||
|
radius: parent.radius |
||||
|
color: "transparent" |
||||
|
|
||||
|
RadialGradient { |
||||
|
anchors.fill: parent |
||||
|
gradient: Gradient { |
||||
|
GradientStop { position: 0.0; color: lightGlow } |
||||
|
GradientStop { |
||||
|
position: 0.5 * (backLight.width - backLightGlow.diffusion / backLightGlow.width) |
||||
|
color: lightGlow |
||||
|
} |
||||
|
GradientStop { position: 0.5; color: "transparent" } |
||||
|
GradientStop { position: 1.0; color: "transparent" } |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Rectangle { |
||||
|
id: backLight |
||||
|
width: parent.width + 4 |
||||
|
height: parent.height + 4 |
||||
|
radius: width / 2 |
||||
|
color: lightColor |
||||
|
anchors.top: parent.top |
||||
|
anchors.horizontalCenter: parent.horizontalCenter |
||||
|
} |
||||
|
|
||||
|
Rectangle { |
||||
|
id: background |
||||
|
anchors.fill: parent |
||||
|
radius: button.radius |
||||
|
color: Theme.current.button |
||||
|
|
||||
|
Behavior on color { |
||||
|
ColorAnimation { |
||||
|
duration: timeToPress |
||||
|
easing.type: Easing.InOutQuad |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Item { |
||||
|
id: coloredRing |
||||
|
width: parent.width |
||||
|
height: parent.height |
||||
|
|
||||
|
Rectangle { |
||||
|
id: lightRing |
||||
|
width: parent.width |
||||
|
height: parent.height |
||||
|
radius: width / 2 |
||||
|
color: "transparent" |
||||
|
border{ |
||||
|
color: background.color |
||||
|
width: button.border |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Item { |
||||
|
id: borderGrad |
||||
|
implicitWidth: parent.width |
||||
|
implicitHeight: parent.height |
||||
|
anchors.fill: parent |
||||
|
|
||||
|
layer.enabled: true |
||||
|
layer.effect: |
||||
|
OpacityMask { |
||||
|
maskSource: lightRing |
||||
|
} |
||||
|
|
||||
|
Rectangle { |
||||
|
width: parent.width |
||||
|
height: parent.height |
||||
|
color: background.color |
||||
|
|
||||
|
LinearGradient { |
||||
|
id: linGrad |
||||
|
anchors.fill: parent |
||||
|
start: Qt.point(0, parent.height) |
||||
|
end: Qt.point(0, 0) |
||||
|
gradient: Gradient { |
||||
|
GradientStop { |
||||
|
id: buttonDown |
||||
|
position: 0 |
||||
|
color: Theme.current.shadow |
||||
|
|
||||
|
Behavior on color { |
||||
|
ColorAnimation { |
||||
|
duration: timeToPress |
||||
|
easing.type: Easing.InOutQuad |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
GradientStop { |
||||
|
id: buttonUp |
||||
|
position: 1 |
||||
|
color: Theme.current.light |
||||
|
|
||||
|
Behavior on color { |
||||
|
ColorAnimation { |
||||
|
duration: timeToPress |
||||
|
easing.type: Easing.InOutQuad |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
MouseArea { |
||||
|
hoverEnabled: true |
||||
|
anchors.fill: background |
||||
|
onEntered: { |
||||
|
button.state = "Hovering" |
||||
|
} |
||||
|
|
||||
|
onExited: { |
||||
|
button.state = "" |
||||
|
} |
||||
|
|
||||
|
onPressed: { |
||||
|
button.state = "Pressed" |
||||
|
button.pressed() |
||||
|
} |
||||
|
|
||||
|
onReleased: { |
||||
|
button.released() |
||||
|
if (containsMouse) |
||||
|
button.state = "Hovering" |
||||
|
else |
||||
|
button.state = "" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Item { |
||||
|
id: hoverLight |
||||
|
implicitWidth: parent.width |
||||
|
implicitHeight: parent.height |
||||
|
anchors.fill: parent |
||||
|
|
||||
|
layer.enabled: true |
||||
|
layer.effect: OpacityMask { |
||||
|
maskSource: background |
||||
|
} |
||||
|
|
||||
|
Rectangle { |
||||
|
id: hoverGlow |
||||
|
width: 2 * parent.width |
||||
|
height: parent.height |
||||
|
x: - 2 * parent.width |
||||
|
color: "transparent" |
||||
|
|
||||
|
HoverGlow {} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
states: [ |
||||
|
State { |
||||
|
name: "Hovering" |
||||
|
PropertyChanges { |
||||
|
target: hoverGlow |
||||
|
x: 0 |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
State { |
||||
|
name: "Pressed" |
||||
|
PropertyChanges { |
||||
|
target: background |
||||
|
color: Theme.current.buttonSelected |
||||
|
} |
||||
|
|
||||
|
PropertyChanges { |
||||
|
target: buttonUp |
||||
|
color: Theme.current.shadow |
||||
|
} |
||||
|
|
||||
|
PropertyChanges { |
||||
|
target: buttonDown |
||||
|
color: Theme.current.light |
||||
|
} |
||||
|
} |
||||
|
] |
||||
|
|
||||
|
transitions: [ |
||||
|
Transition { |
||||
|
from: ""; to: "Hovering" |
||||
|
NumberAnimation { |
||||
|
properties: "x" |
||||
|
duration: 500 |
||||
|
easing.type: Easing.OutQuad |
||||
|
} |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
|
@ -0,0 +1,87 @@ |
|||||
|
import QtQuick 2.0 |
||||
|
import QtQuick.Layouts 1.13 |
||||
|
import QtQuick.Controls 2.12 |
||||
|
import de.skycoder42.QtMvvm.Core 1.0 |
||||
|
import de.skycoder42.QtMvvm.Quick 1.0 |
||||
|
import com.example.consoleemulator 1.0 |
||||
|
|
||||
|
import "qrc:/emulator/elements" |
||||
|
import "qrc:/emulator/components" |
||||
|
import "qrc:/const" |
||||
|
import "qrc:/qtmvvm/views" |
||||
|
|
||||
|
GridLayout { |
||||
|
x: 70 |
||||
|
y: 50 |
||||
|
rowSpacing: 36 |
||||
|
columns: 4 |
||||
|
|
||||
|
ProbeButton { |
||||
|
name: "probe1" |
||||
|
image: "qrc:/icons/topLeft/probe.png" |
||||
|
} |
||||
|
ProbeButton { |
||||
|
name: "probe2" |
||||
|
image: "qrc:/icons/topLeft/probe.png" |
||||
|
} |
||||
|
ProbeButton { |
||||
|
name: "probe3" |
||||
|
image: "qrc:/icons/topLeft/probe.png" |
||||
|
} |
||||
|
ProbeButton { |
||||
|
name: "probe4" |
||||
|
image: "qrc:/icons/topLeft/probe.png" |
||||
|
} |
||||
|
property var widthOfBtns: 130 |
||||
|
property var probeList: [] |
||||
|
|
||||
|
MvvmBinding { |
||||
|
viewModel: mainView.viewModel |
||||
|
viewProperty: "probeList" |
||||
|
viewModelProperty: "probeList" |
||||
|
} |
||||
|
ComboBox { |
||||
|
model: probeList |
||||
|
width: widthOfBtns |
||||
|
implicitWidth: width |
||||
|
implicitHeight: 25 |
||||
|
MvvmBinding { |
||||
|
viewModel: mainView.viewModel |
||||
|
viewProperty: "currentIndex" |
||||
|
viewModelProperty: "currentSelectedProbe1" |
||||
|
} |
||||
|
} |
||||
|
ComboBox { |
||||
|
model: probeList |
||||
|
width: widthOfBtns |
||||
|
implicitWidth: width |
||||
|
implicitHeight: 25 |
||||
|
MvvmBinding { |
||||
|
viewModel: mainView.viewModel |
||||
|
viewProperty: "currentIndex" |
||||
|
viewModelProperty: "currentSelectedProbe2" |
||||
|
} |
||||
|
} |
||||
|
ComboBox { |
||||
|
model: probeList |
||||
|
width: widthOfBtns |
||||
|
implicitWidth: width |
||||
|
implicitHeight: 25 |
||||
|
MvvmBinding { |
||||
|
viewModel: mainView.viewModel |
||||
|
viewProperty: "currentIndex" |
||||
|
viewModelProperty: "currentSelectedProbe3" |
||||
|
} |
||||
|
} |
||||
|
ComboBox { |
||||
|
model: probeList |
||||
|
width: widthOfBtns |
||||
|
implicitWidth: width |
||||
|
implicitHeight: 25 |
||||
|
MvvmBinding { |
||||
|
viewModel: mainView.viewModel |
||||
|
viewProperty: "currentIndex" |
||||
|
viewModelProperty: "currentSelectedProbe4" |
||||
|
} |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue