DayZ Scripts
v1.21.156300 ยท Jun 20, 2023
 
Loading...
Searching...
No Matches
KeybindingElement.c
Go to the documentation of this file.
1
2class KeybindingElement extends ScriptedWidgetEventHandler
3{
4 protected KeybindingsGroup m_Group;
5
6 protected Widget m_Root;
9 protected ButtonWidget m_PrimaryBindButton;
10 protected ButtonWidget m_AlternativeBindButton;
13
14 protected int m_ElementIndex;
15 protected bool m_IsEdited;
16 protected bool m_IsAlternateEdited;
17
18 protected ref array<int> m_CustomBind;
20
21 protected ref Timer m_EntryTimer = new Timer( CALL_CATEGORY_GUI );
22
23 void KeybindingElement( int key_index, Widget parent, KeybindingsGroup group )
24 {
26 m_ElementName = TextWidget.Cast( m_Root.FindAnyWidget( "setting_label" ) );
27 m_ElementModifier = TextWidget.Cast( m_Root.FindAnyWidget( "modifier_label" ) );
28 m_PrimaryBindButton = ButtonWidget.Cast( m_Root.FindAnyWidget( "primary_bind" ) );
29 m_AlternativeBindButton = ButtonWidget.Cast( m_Root.FindAnyWidget( "alternative_bind" ) );
30 m_PrimaryClear = m_Root.FindAnyWidget( "primary_clear" );
31 m_AlternativeClear = m_Root.FindAnyWidget( "alternative_clear" );
32
33 m_Group = group;
34 m_ElementIndex = key_index;
35
36 Reload();
37 m_Root.SetHandler( this );
38 }
39
41 {
42 return "gui/layouts/new_ui/options/keybindings_selectors/keybinding_option.layout";
43 }
44
45 bool IsChanged()
46 {
47 return m_IsEdited;
48 }
49
51 {
53 }
54
56 {
57 return m_CustomBind;
58 }
59
61 {
63 }
64
65 // assembly all related binding at widget element
66 void SetElementTitle( ButtonWidget btnWidget, UAInput pInput, int iDeviceFlags )
67 {
68 string output;
69 int a, i, countbind = 0;
70
71 for( a = 0; a < pInput.AlternativeCount(); a++ )
72 {
73 pInput.SelectAlternative(a);
74 if( pInput.IsCombo() )
75 {
76 if( pInput.BindingCount() > 0 )
77 {
78 if( pInput.Binding(0) != 0 && pInput.CheckBindDevice(0,iDeviceFlags) )
79 {
80 if( countbind > 0 )
81 output += ", ";
82
83 output += GetUApi().GetButtonName( pInput.Binding(0) );
84 countbind++;
85
86 for( i = 1; i < pInput.BindingCount(); i++ )
87 {
88 if( pInput.Binding(i) != 0 )
89 {
90 output += " + " + GetUApi().GetButtonName( pInput.Binding(i) );
91 countbind++;
92 }
93 }
94
95 }
96 }
97 }
98 else
99 {
100 if( pInput.BindingCount() > 0 )
101 {
102 if( pInput.Binding(0) != 0 && pInput.CheckBindDevice(0,iDeviceFlags) )
103 {
104 if( countbind > 0 )
105 output += ", ";
106
107 output += GetUApi().GetButtonName( pInput.Binding(0) );
108 countbind++;
109 }
110 }
111 }
112
113 }
114
115 // nothing may be available - we do not want "null" or "0" in string
116 if( countbind > 0 )
117 btnWidget.SetText(output);
118 else
119 btnWidget.SetText("");
120 }
121
122 void Reload()
123 {
124 UAInput input = GetUApi().GetInputByID( m_ElementIndex );
125 m_IsEdited = false;
126 m_IsAlternateEdited = false;
127 m_CustomBind = null;
128 m_CustomAlternateBind = null;
129
130 if( input.IsLimited() )
131 {
132 if( input.IsPressLimit() )
133 {
134 m_ElementModifier.SetText( "#keybind_press" );
135 }
136 if( input.IsReleaseLimit() )
137 {
138 m_ElementModifier.SetText( "#keybind_release" );
139 }
140 if( input.IsHoldLimit() )
141 {
142 m_ElementModifier.SetText( "#keybind_hold" );
143 }
144 if( input.IsHoldBeginLimit() )
145 {
146 m_ElementModifier.SetText( "#keybind_holdbegin" );
147 }
148 if( input.IsClickLimit() )
149 {
150 m_ElementModifier.SetText( "#keybind_click" );
151 }
152 if( input.IsDoubleClickLimit() )
153 {
154 m_ElementModifier.SetText( "#keybind_doubletap" );
155 }
156 }
157 else
158 {
159 m_ElementModifier.SetText( "" );
160 }
161
162 string option_text;
163 string name;
164
165 GetGame().GetInput().GetActionDesc( m_ElementIndex, option_text );
166 m_ElementName.SetText( option_text );
167
168 // column #1 :: keyboard + mouse
169 SetElementTitle(m_PrimaryBindButton, input, EUAINPUT_DEVICE_KEYBOARDMOUSE);
170
171 // column #2 :: controller
172 SetElementTitle(m_AlternativeBindButton, input, EUAINPUT_DEVICE_CONTROLLER);
173 }
174
175 void Reload( array<int> custom_binds, bool is_alternate )
176 {
177 string output;
178 if( custom_binds.Count() > 1 )
179 {
180 if( custom_binds.Get( 0 ) != 0 )
181 output = GetUApi().GetButtonName( custom_binds.Get( 0 ) );
182 for( int i = 1; i < custom_binds.Count(); i++ )
183 {
184 if( custom_binds.Get( i ) != 0 )
185 output += " + " + GetUApi().GetButtonName( custom_binds.Get( i ) );
186 }
187 }
188 else if( custom_binds.Count() > 0 )
189 {
190 if( custom_binds.Get( 0 ) != 0 )
191 output = GetUApi().GetButtonName( custom_binds.Get( 0 ) );
192 }
193
194 if( is_alternate )
195 {
196 m_CustomAlternateBind = custom_binds;
197 m_IsAlternateEdited = true;
198 m_AlternativeBindButton.SetText( output );
199 }
200 else
201 {
202 m_CustomBind = custom_binds;
203 m_IsEdited = true;
204 m_PrimaryBindButton.SetText( output );
205 }
206 }
207
209 {
210 m_Group.StartEnteringKeybind( m_ElementIndex );
211 m_PrimaryBindButton.SetText( "#layout_keybinding_new_keybind" );
212 }
213
215 {
216 Reload();
217 }
218
220 {
221 m_Group.StartEnteringAlternateKeybind( m_ElementIndex );
222 m_AlternativeBindButton.SetText( "#layout_keybinding_new_keybind" );
223 }
224
226 {
227 Reload();
228 }
229
230 override bool OnClick( Widget w, int x, int y, int button )
231 {
232 if( !m_Group.IsEnteringKeyBind() )
233 {
234 if( w == m_PrimaryBindButton )
235 {
236 m_EntryTimer.Run( 0.01, this, "StartEnteringKeybind" );
237 }
238 if( w == m_AlternativeBindButton )
239 {
240 m_EntryTimer.Run( 0.01, this, "StartEnteringAlternateKeybind" );
241 }
242 }
243 return false;
244 }
245
246 override bool OnMouseButtonUp( Widget w, int x, int y, int button )
247 {
248 if( w == m_PrimaryClear )
249 {
250 m_IsEdited = true;
251 m_CustomBind = new array<int>;
252 m_PrimaryBindButton.SetText( "" );
253 m_Group.ClearKeybind( m_ElementIndex );
254 }
255 if( w == m_AlternativeClear )
256 {
257 m_IsAlternateEdited = true;
258 m_CustomAlternateBind = new array<int>;
259 m_AlternativeBindButton.SetText( "" );
260 m_Group.ClearAlternativeKeybind( m_ElementIndex );
261 }
262 return false;
263 }
264
265 override bool OnMouseEnter( Widget w, int x, int y )
266 {
267 if( w == m_PrimaryBindButton || w == m_PrimaryClear )
268 {
269 m_PrimaryBindButton.SetColor( ARGBF( 1, 1, 0, 0 ) );
270 m_PrimaryClear.Show( true );
271 m_PrimaryClear.Update();
272 m_AlternativeClear.Show( false );
273 return true;
274 }
275 else if( w == m_AlternativeBindButton || w == m_AlternativeClear )
276 {
277 m_AlternativeBindButton.SetColor( ARGBF( 1, 1, 0, 0 ) );
278 m_PrimaryClear.Show( false );
279 m_AlternativeClear.Show( true );
280 m_AlternativeClear.Update();
281 return true;
282 }
283 else
284 {
285 m_PrimaryBindButton.SetColor( ARGBF( 0, 0, 0, 0 ) );
286 m_AlternativeBindButton.SetColor( ARGBF( 1, 0, 0, 0 ) );
287 m_PrimaryClear.Show( false );
288 m_AlternativeClear.Show( false );
289 }
290 return false;
291 }
292
293 override bool OnMouseLeave( Widget w, Widget enterW, int x, int y )
294 {
295 if( w == m_PrimaryClear || w == m_PrimaryBindButton )
296 {
297 if( enterW != m_PrimaryClear && enterW != m_PrimaryBindButton )
298 {
299 m_PrimaryClear.Show( false );
300 m_PrimaryBindButton.SetColor( ARGBF( 1, 0, 0, 0 ) );
301 }
302 }
303 if( w == m_AlternativeClear || w == m_AlternativeBindButton )
304 {
305 if( enterW != m_AlternativeClear && enterW != m_AlternativeBindButton )
306 {
307 m_AlternativeClear.Show( false );
308 m_AlternativeBindButton.SetColor( ARGBF( 1, 0, 0, 0 ) );
309 }
310 }
311 return false;
312 }
313}
Icon x
Icon y
string name
protected Widget m_Root
Definition SizeToChild.c:91
proto native UAInputAPI GetUApi()
proto native Input GetInput()
proto native WorkspaceWidget GetWorkspace()
proto int GetActionDesc(int action_index, out string desc)
map: item x vector(index, width, height)
Definition EnWidgets.c:538
bool SetElementTitle(UAInput pInput, int iDeviceFlags, out string output)
assemble all active bindings at widget element
protected ref array< int > m_CustomBind
protected TextWidget m_ElementModifier
override bool OnMouseLeave(Widget w, Widget enterW, int x, int y)
protected ButtonWidget m_AlternativeBindButton
protected ref array< int > m_CustomAlternateBind
protected KeybindingsGroup m_Group
void SetElementTitle(ButtonWidget btnWidget, UAInput pInput, int iDeviceFlags)
protected TextWidget m_ElementName
void Reload(array< int > custom_binds, bool is_alternate)
protected Widget m_AlternativeClear
protected Widget m_Root
Definition SizeToChild.c:9
protected ButtonWidget m_PrimaryBindButton
override bool OnMouseEnter(Widget w, int x, int y)
array< int > GetChangedAlternateBinds()
void KeybindingElement(int key_index, Widget parent, KeybindingsGroup group)
override bool OnClick(Widget w, int x, int y, int button)
override bool OnMouseButtonUp(Widget w, int x, int y, int button)
proto native UAInput GetInputByID(int iID)
returns list of all bindable (i.e. visible) inputs from the active group ('core' by default)
proto native owned string GetButtonName(int iHash)
proto native bool IsCombo()
proto native bool CheckBindDevice(int iIndex, int iDeviceFlags)
proto native void SelectAlternative(int iIndex)
proto native bool IsDoubleClickLimit()
proto native int AlternativeCount()
proto native bool IsHoldBeginLimit()
proto native bool IsHoldLimit()
proto native int BindingCount()
proto native int Binding(int iIndex)
proto native bool IsPressLimit()
proto native bool IsClickLimit()
proto native bool IsLimited()
proto native bool IsReleaseLimit()
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
void ClearAlternativeKeybind(int key_index)
void ClearKeybind(int key_index)
proto native CGame GetGame()
const int CALL_CATEGORY_GUI
Definition tools.c:9
proto native external Widget CreateWidgets(string layout, Widget parentWidget=NULL, bool immedUpdate=true)
Create widgets from *.layout file.
int ARGBF(float fa, float fr, float fg, float fb)
Converts <0.0, 1.0> ARGB into color.
Definition proto.c:332