@@ -21,40 +21,70 @@ import QtQuick.Controls 2.12
2121import QtQuick.Layouts 1.12
2222import Shotcut.Controls 1.0 as Shotcut
2323
24- Item {
24+ Shotcut .KeyframableFilter {
25+ property string cutoffProperty: ' 0'
26+ property string stagesProperty: ' 1'
27+ property string wetnessProperty: ' wetness'
2528 width: 350
2629 height: 125
30+ keyframableParameters: preset .parameters
31+ startValues: [39 , 1 , 0 ]
32+ middleValues: [39 , 1 , 1 ]
33+ endValues: [39 , 1 , 0 ]
2734 Component .onCompleted : {
2835 if (filter .isNew ) {
2936 // Set default parameter values
30- filter .set (' 0 ' , 39 )
31- filter .set (' 1 ' , 1 )
32- filter .set (' wetness ' , 1.0 )
37+ filter .set (cutoffProperty , 39 )
38+ filter .set (stagesProperty , 1 )
39+ filter .set (wetnessProperty , 1.0 )
3340 filter .savePreset (preset .parameters )
3441 }
3542 setControls ()
3643 }
3744
3845 function setControls () {
39- sliderCutoff .value = filter .getDouble (' 0' )
40- sliderStages .value = filter .get (' 1' )
41- sliderWetness .value = filter .getDouble (' wetness' ) * sliderWetness .maximumValue
46+ var position = getPosition ()
47+ blockUpdate = true
48+ sliderCutoff .value = filter .getDouble (cutoffProperty, position)
49+ cutoffKeyframesButton .checked = filter .animateIn <= 0 && filter .animateOut <= 0 && filter .keyframeCount (cutoffProperty) > 0
50+ sliderStages .value = filter .getDouble (stagesProperty, position)
51+ stagesKeyframesButton .checked = filter .animateIn <= 0 && filter .animateOut <= 0 && filter .keyframeCount (stagesProperty) > 0
52+ sliderWetness .value = filter .getDouble (wetnessProperty, position) * sliderWetness .maximumValue
53+ wetnessKeyframesButton .checked = filter .animateIn <= 0 && filter .animateOut <= 0 && filter .keyframeCount (wetnessProperty) > 0
54+ blockUpdate = false
55+ enableControls (isSimpleKeyframesActive ())
56+ }
57+
58+ function enableControls (enabled ) {
59+ sliderCutoff .enabled = sliderStages .enabled = sliderWetness .enabled = enabled
60+ }
61+
62+ function updateSimpleKeyframes () {
63+ updateFilter (cutoffProperty, sliderCutoff .value , cutoffKeyframesButton, null )
64+ updateFilter (stagesProperty, sliderStages .value , stagesKeyframesButton, null )
65+ updateFilter (wetnessProperty, sliderWetness .value / sliderWetness .maximumValue , wetnessKeyframesButton, null )
4266 }
4367
4468 GridLayout {
4569 anchors .fill : parent
4670 anchors .margins : 8
47- columns: 3
71+ columns: 4
4872
4973 Label {
5074 text: qsTr (' Preset' )
5175 Layout .alignment : Qt .AlignRight
5276 }
5377 Shotcut .Preset {
5478 id: preset
55- parameters: [' 0' , ' 1' , ' 2' , ' wetness' ]
56- Layout .columnSpan : 2
57- onPresetSelected: setControls ()
79+ parameters: [cutoffProperty, stagesProperty, wetnessProperty]
80+ Layout .columnSpan : parent .columns - 1
81+ onBeforePresetLoaded: {
82+ resetSimpleKeyframes ()
83+ }
84+ onPresetSelected: {
85+ setControls ()
86+ initializeSimpleKeyframes ()
87+ }
5888 }
5989
6090 Label { text: qsTr (' Cutoff frequency' )
@@ -65,14 +95,18 @@ Item {
6595 minimumValue: 5
6696 maximumValue: 21600
6797 suffix: ' Hz'
68- value: filter .getDouble (' 0' )
69- onValueChanged: {
70- filter .set (' 0' , value)
71- }
98+ onValueChanged: updateFilter (cutoffProperty, value, cutoffKeyframesButton, getPosition ())
7299 }
73100 Shotcut .UndoButton {
74101 onClicked: sliderCutoff .value = 39
75102 }
103+ Shotcut .KeyframesButton {
104+ id: cutoffKeyframesButton
105+ onToggled: {
106+ enableControls (true )
107+ toggleKeyframes (checked, cutoffProperty, sliderCutoff .value )
108+ }
109+ }
76110
77111 Label { text: qsTr (' Rolloff rate' )
78112 Layout .alignment : Qt .AlignRight
@@ -81,14 +115,18 @@ Item {
81115 id: sliderStages
82116 minimumValue: 1
83117 maximumValue: 10
84- value: filter .get (' 1' )
85- onValueChanged: {
86- filter .set (' 1' , value)
87- }
118+ onValueChanged: updateFilter (stagesProperty, value, stagesKeyframesButton, getPosition ())
88119 }
89120 Shotcut .UndoButton {
90121 onClicked: sliderStages .value = 1
91122 }
123+ Shotcut .KeyframesButton {
124+ id: stagesKeyframesButton
125+ onToggled: {
126+ enableControls (true )
127+ toggleKeyframes (checked, stagesProperty, sliderStages .value )
128+ }
129+ }
92130
93131 Label { text: qsTr (' Dry' )
94132 Layout .alignment : Qt .AlignRight
@@ -100,17 +138,35 @@ Item {
100138 decimals: 1
101139 label: qsTr (' Wet' )
102140 suffix: ' %'
103- value: filter .getDouble (' wetness' ) * maximumValue
104- onValueChanged: {
105- filter .set (' wetness' , value / maximumValue)
106- }
141+ onValueChanged: updateFilter (wetnessProperty, value / maximumValue, wetnessKeyframesButton, getPosition ())
107142 }
108143 Shotcut .UndoButton {
109144 onClicked: sliderWetness .value = sliderWetness .maximumValue
110145 }
146+ Shotcut .KeyframesButton {
147+ id: wetnessKeyframesButton
148+ onToggled: {
149+ enableControls (true )
150+ toggleKeyframes (checked, wetnessProperty, sliderWetness .value / sliderWetness .maximumValue )
151+ }
152+ }
111153
112154 Item {
113155 Layout .fillHeight : true
114156 }
115157 }
158+ Connections {
159+ target: filter
160+ onChanged: setControls ()
161+ onInChanged: updateSimpleKeyframes ()
162+ onOutChanged: updateSimpleKeyframes ()
163+ onAnimateInChanged: updateSimpleKeyframes ()
164+ onAnimateOutChanged: updateSimpleKeyframes ()
165+ onPropertyChanged: setControls ()
166+ }
167+
168+ Connections {
169+ target: producer
170+ onPositionChanged: setControls ()
171+ }
116172}
0 commit comments