KiCad PCB EDA Suite
Loading...
Searching...
No Matches
panel_mouse_settings.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2020 Jon Evans <[email protected]>
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
21#include <bitmaps.h>
23#include <kiplatform/touchpad.h>
24#include <pgm_base.h>
27#include <wx/defs.h>
28
29
33 m_nativeTouchpadGestureAvailable(
35{
36#ifdef __WXOSX_MAC__
37 for( wxSizerItem* child : m_zoomSizer->GetChildren() )
38 {
39 if( child->GetWindow() == m_zoomSpeed )
40 child->SetBorder( 14 );
41 }
42
43 for( wxSizerItem* child : m_panSizer->GetChildren() )
44 {
45 if( child->GetWindow() == m_autoPanSpeed )
46 child->SetBorder( 14 );
47 }
48
49 m_lblCtrl->SetLabel( _( "Cmd" ) );
50 m_lblAlt->SetLabel( _( "Option" ) );
51#endif
52
53 m_scrollWarning->SetBitmap( KiBitmapBundle( BITMAPS::small_warning ) );
54 m_scrollWarning->Hide();
55
56 if( !m_nativeTouchpadGestureAvailable )
57 {
58 m_touchpadModeLabel->Hide();
59 m_choiceTouchpadMode->Hide();
60 }
61
62 m_checkAutoZoomSpeed->Bind( wxEVT_COMMAND_CHECKBOX_CLICKED,
63 [&]( wxCommandEvent& aEvt )
64 {
65 m_zoomSpeed->Enable( !m_checkAutoZoomSpeed->GetValue() );
66 } );
67}
68
69
73
74
76{
77 const COMMON_SETTINGS* cfg = Pgm().GetCommonSettings();
78
80
81 return true;
82}
83
84
86{
88
90
91 TOUCHPAD_MODE touchpadMode = getTouchpadMode();
92
94 {
95 PAGED_DIALOG::GetDialog( this )->SetError( _( "Only one action can be assigned to each "
96 "vertical scroll setting" ),
97 this, nullptr );
98 return false;
99 }
100
101 switch( m_choiceLeftButtonDrag->GetSelection() )
102 {
103 case 0: cfg->m_Input.drag_left = MOUSE_DRAG_ACTION::SELECT; break;
105 case 2: cfg->m_Input.drag_left = MOUSE_DRAG_ACTION::DRAG_ANY; break;
106 default: break;
107 }
108
109 switch( m_choiceMiddleButtonDrag->GetSelection() )
110 {
111 case 0: cfg->m_Input.drag_middle = MOUSE_DRAG_ACTION::PAN; break;
112 case 1: cfg->m_Input.drag_middle = MOUSE_DRAG_ACTION::ZOOM; break;
113 case 2: cfg->m_Input.drag_middle = MOUSE_DRAG_ACTION::NONE; break;
114 default: break;
115 }
116
117 switch( m_choiceRightButtonDrag->GetSelection() )
118 {
119 case 0: cfg->m_Input.drag_right = MOUSE_DRAG_ACTION::PAN; break;
120 case 1: cfg->m_Input.drag_right = MOUSE_DRAG_ACTION::ZOOM; break;
121 case 2: cfg->m_Input.drag_right = MOUSE_DRAG_ACTION::NONE; break;
122 default: break;
123 }
124
125 switch( m_choicePanMoveKey->GetSelection() )
126 {
127 case 1: cfg->m_Input.motion_pan_modifier = WXK_ALT; break;
128 case 2: cfg->m_Input.motion_pan_modifier = WXK_CONTROL; break;
129 case 3: cfg->m_Input.motion_pan_modifier = WXK_SHIFT; break;
130 default: cfg->m_Input.motion_pan_modifier = 0; break;
131 }
132
133 cfg->m_Input.center_on_zoom = m_checkZoomCenter->GetValue();
134 cfg->m_Input.auto_pan = m_checkAutoPan->GetValue();
137 cfg->m_Input.zoom_speed = m_zoomSpeed->GetValue();
139 cfg->m_Input.horizontal_pan = m_checkEnablePanH->GetValue();
140 cfg->m_Input.touchpad_mode = touchpadMode;
141
145
148
149 return true;
150}
151
152
154{
155 COMMON_SETTINGS defaultSettings;
156
157 defaultSettings.ResetToDefaults();
158
159 applySettingsToPanel( defaultSettings );
160}
161
162
164{
165 m_checkZoomCenter->SetValue( aSettings.m_Input.center_on_zoom );
166 m_checkAutoPan->SetValue( aSettings.m_Input.auto_pan );
168 m_zoomSpeed->SetValue( aSettings.m_Input.zoom_speed );
169 m_checkAutoZoomSpeed->SetValue( aSettings.m_Input.zoom_speed_auto );
170 m_checkEnablePanH->SetValue( aSettings.m_Input.horizontal_pan );
171 m_autoPanSpeed->SetValue( aSettings.m_Input.auto_pan_acceleration );
172
173 m_zoomSpeed->Enable( !aSettings.m_Input.zoom_speed_auto );
174
175 switch( aSettings.m_Input.drag_left )
176 {
177 case MOUSE_DRAG_ACTION::SELECT: m_choiceLeftButtonDrag->SetSelection( 0 ); break;
178 case MOUSE_DRAG_ACTION::DRAG_SELECTED: m_choiceLeftButtonDrag->SetSelection( 1 ); break;
179 case MOUSE_DRAG_ACTION::DRAG_ANY: m_choiceLeftButtonDrag->SetSelection( 2 ); break;
180 default: break;
181 }
182
183 switch( aSettings.m_Input.drag_middle )
184 {
185 case MOUSE_DRAG_ACTION::PAN: m_choiceMiddleButtonDrag->SetSelection( 0 ); break;
186 case MOUSE_DRAG_ACTION::ZOOM: m_choiceMiddleButtonDrag->SetSelection( 1 ); break;
187 case MOUSE_DRAG_ACTION::NONE: m_choiceMiddleButtonDrag->SetSelection( 2 ); break;
188 case MOUSE_DRAG_ACTION::SELECT: break;
189 default: break;
190 }
191
192 switch( aSettings.m_Input.drag_right )
193 {
194 case MOUSE_DRAG_ACTION::PAN: m_choiceRightButtonDrag->SetSelection( 0 ); break;
195 case MOUSE_DRAG_ACTION::ZOOM: m_choiceRightButtonDrag->SetSelection( 1 ); break;
196 case MOUSE_DRAG_ACTION::NONE: m_choiceRightButtonDrag->SetSelection( 2 ); break;
197 case MOUSE_DRAG_ACTION::SELECT: break;
198 default: break;
199 }
200
201 switch( aSettings.m_Input.motion_pan_modifier )
202 {
203 case WXK_ALT: m_choicePanMoveKey->SetSelection( 1 ); break;
204 case WXK_CONTROL: m_choicePanMoveKey->SetSelection( 2 ); break;
205 case WXK_SHIFT: m_choicePanMoveKey->SetSelection( 3 ); break;
206 default: m_choicePanMoveKey->SetSelection( 0 ); break;
207 }
208
212 m_currentScrollMod.zoomReverse = aSettings.m_Input.reverse_scroll_zoom;
213 m_currentScrollMod.panHReverse = aSettings.m_Input.reverse_scroll_pan_h;
214
216 ? aSettings.m_Input.touchpad_mode
218
219 m_choiceTouchpadMode->SetSelection( static_cast<int>( touchpadMode ) );
220
222}
223
224
225void PANEL_MOUSE_SETTINGS::OnScrollRadioButton( wxCommandEvent& event )
226{
227 wxRadioButton* btn = dynamic_cast<wxRadioButton*>( event.GetEventObject() );
228
229 if( !btn )
230 return;
231
232 bool isZoom = ( btn == m_rbZoomCtrl || btn == m_rbZoomShift || btn == m_rbZoomAlt );
233 bool isPanH = ( btn == m_rbPanHCtrl || btn == m_rbPanHShift || btn == m_rbPanHAlt );
234 bool isPanV = ( btn == m_rbPanVCtrl || btn == m_rbPanVShift || btn == m_rbPanVAlt );
235
236 int modifier = 0;
237
238 if( btn == m_rbZoomCtrl || btn == m_rbPanHCtrl || btn == m_rbPanVCtrl )
239 modifier = WXK_CONTROL;
240 else if( btn == m_rbZoomShift || btn == m_rbPanHShift || btn == m_rbPanVShift )
241 modifier = WXK_SHIFT;
242 else if( btn == m_rbZoomAlt || btn == m_rbPanHAlt || btn == m_rbPanVAlt )
243 modifier = WXK_ALT;
244
245 auto column_taken =
246 [this]( int mod )
247 {
248 switch( mod )
249 {
250 case 0: return m_rbZoomNone->GetValue() || m_rbPanHNone->GetValue() || m_rbPanVNone->GetValue();
251 case WXK_CONTROL: return m_rbZoomCtrl->GetValue() || m_rbPanHCtrl->GetValue() || m_rbPanVCtrl->GetValue();
252 case WXK_SHIFT: return m_rbZoomShift->GetValue() || m_rbPanHShift->GetValue() || m_rbPanVShift->GetValue();
253 case WXK_ALT: return m_rbZoomAlt->GetValue() || m_rbPanHAlt->GetValue() || m_rbPanVAlt->GetValue();
254 default: return false;
255 }
256 };
257
258 auto assign_first_available =
259 [&]( wxRadioButton* noneBtn, wxRadioButton* ctrlBtn, wxRadioButton* shiftBtn, wxRadioButton* altBtn )
260 {
261 int candidates[] = { 0, WXK_CONTROL, WXK_SHIFT, WXK_ALT };
262
263 for( int candidate : candidates )
264 {
265 if( candidate == modifier )
266 continue;
267
268 if( !column_taken( candidate ) )
269 {
270 switch( candidate )
271 {
272 case 0: noneBtn->SetValue( true ); break;
273 case WXK_CONTROL: ctrlBtn->SetValue( true ); break;
274 case WXK_SHIFT: shiftBtn->SetValue( true ); break;
275 case WXK_ALT: altBtn->SetValue( true ); break;
276 }
277
278 break;
279 }
280 }
281 };
282
283 if( modifier == WXK_CONTROL )
284 {
285 if( !isZoom && m_rbZoomCtrl->GetValue() )
286 assign_first_available( m_rbZoomNone, m_rbZoomCtrl, m_rbZoomShift, m_rbZoomAlt );
287 if( !isPanH && m_rbPanHCtrl->GetValue() )
288 assign_first_available( m_rbPanHNone, m_rbPanHCtrl, m_rbPanHShift, m_rbPanHAlt );
289 if( !isPanV && m_rbPanVCtrl->GetValue() )
290 assign_first_available( m_rbPanVNone, m_rbPanVCtrl, m_rbPanVShift, m_rbPanVAlt );
291 }
292 else if( modifier == WXK_SHIFT )
293 {
294 if( !isZoom && m_rbZoomShift->GetValue() )
295 assign_first_available( m_rbZoomNone, m_rbZoomCtrl, m_rbZoomShift, m_rbZoomAlt );
296 if( !isPanH && m_rbPanHShift->GetValue() )
297 assign_first_available( m_rbPanHNone, m_rbPanHCtrl, m_rbPanHShift, m_rbPanHAlt );
298 if( !isPanV && m_rbPanVShift->GetValue() )
299 assign_first_available( m_rbPanVNone, m_rbPanVCtrl, m_rbPanVShift, m_rbPanVAlt );
300 }
301 else if( modifier == WXK_ALT )
302 {
303 if( !isZoom && m_rbZoomAlt->GetValue() )
304 assign_first_available( m_rbZoomNone, m_rbZoomCtrl, m_rbZoomShift, m_rbZoomAlt );
305 if( !isPanH && m_rbPanHAlt->GetValue() )
306 assign_first_available( m_rbPanHNone, m_rbPanHCtrl, m_rbPanHShift, m_rbPanHAlt );
307 if( !isPanV && m_rbPanVAlt->GetValue() )
308 assign_first_available( m_rbPanVNone, m_rbPanVCtrl, m_rbPanVShift, m_rbPanVAlt );
309 }
310
312
313 m_scrollWarning->Show( !isScrollModSetValid( newSet ) );
314
315 m_currentScrollMod = newSet;
316}
317
318
320{
321 SCROLL_MOD_SET ret = {};
322
323 if( m_rbZoomShift->GetValue() )
324 ret.zoom = WXK_SHIFT;
325 else if( m_rbZoomCtrl->GetValue() )
326 ret.zoom = WXK_CONTROL;
327 else if( m_rbZoomAlt->GetValue() )
328 ret.zoom = WXK_ALT;
329
330 if( m_rbPanHShift->GetValue() )
331 ret.panh = WXK_SHIFT;
332 else if( m_rbPanHCtrl->GetValue() )
333 ret.panh = WXK_CONTROL;
334 else if( m_rbPanHAlt->GetValue() )
335 ret.panh = WXK_ALT;
336
337 if( m_rbPanVShift->GetValue() )
338 ret.panv = WXK_SHIFT;
339 else if( m_rbPanVCtrl->GetValue() )
340 ret.panv = WXK_CONTROL;
341 else if( m_rbPanVAlt->GetValue() )
342 ret.panv = WXK_ALT;
343
344 return ret;
345}
346
347
349{
350 return ( aSet.zoom != aSet.panh && aSet.panh != aSet.panv && aSet.panv != aSet.zoom );
351}
352
353
355{
356 auto set_wheel_buttons =
357 []( int aModifier, wxRadioButton* aNoneBtn, wxRadioButton* aCtrlBtn,
358 wxRadioButton* aShiftBtn, wxRadioButton* aAltBtn )
359 {
360 switch( aModifier )
361 {
362 case 0: aNoneBtn->SetValue( true ); break;
363 case WXK_CONTROL: aCtrlBtn->SetValue( true ); break;
364 case WXK_SHIFT: aShiftBtn->SetValue( true ); break;
365 case WXK_ALT: aAltBtn->SetValue( true ); break;
366 }
367 };
368
370 m_rbZoomAlt );
371
373 m_rbPanHAlt );
374
376 m_rbPanVAlt );
377
378 m_checkZoomReverse->SetValue( m_currentScrollMod.zoomReverse );
379 m_checkPanHReverse->SetValue( m_currentScrollMod.panHReverse );
380}
381
382
393
394
395void PANEL_MOUSE_SETTINGS::onMouseDefaults( wxCommandEvent& event )
396{
397 m_currentScrollMod.zoom = 0;
398 m_currentScrollMod.panh = WXK_CONTROL;
399 m_currentScrollMod.panv = WXK_SHIFT;
400 m_currentScrollMod.zoomReverse = false;
401 m_currentScrollMod.panHReverse = false;
402
404
405 m_checkEnablePanH->SetValue( false );
406}
407
408
409void PANEL_MOUSE_SETTINGS::onTrackpadDefaults( wxCommandEvent& event )
410{
411 m_choiceTouchpadMode->SetSelection( static_cast<int>( TOUCHPAD_MODE::SCROLL_GESTURES ) );
412
413 m_currentScrollMod.zoom = WXK_CONTROL;
414 m_currentScrollMod.panh = WXK_SHIFT;
415 m_currentScrollMod.panv = 0;
416 m_currentScrollMod.zoomReverse = false;
417 m_currentScrollMod.panHReverse = false;
418
420
421 m_checkEnablePanH->SetValue( true );
422}
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Definition bitmap.cpp:106
void ResetToDefaults()
Resets all parameters to default values.
static PAGED_DIALOG * GetDialog(wxWindow *aWindow)
void SetError(const wxString &aMessage, const wxString &aPageName, int aCtrlId, int aRow=-1, int aCol=-1)
PANEL_MOUSE_SETTINGS_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxTAB_TRAVERSAL, const wxString &name=wxEmptyString)
void onMouseDefaults(wxCommandEvent &event) override
bool TransferDataFromWindow() override
void ResetPanel() override
Reset the contents of this panel.
void applySettingsToPanel(const COMMON_SETTINGS &aSettings)
TOUCHPAD_MODE getTouchpadMode() const
SCROLL_MOD_SET m_currentScrollMod
bool isScrollModSetValid(const SCROLL_MOD_SET &aSet)
bool TransferDataToWindow() override
void onTrackpadDefaults(wxCommandEvent &event) override
void OnScrollRadioButton(wxCommandEvent &event) override
PANEL_MOUSE_SETTINGS(wxWindow *aParent)
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition pgm_base.cpp:546
TOUCHPAD_MODE
#define _(s)
bool IsNativeTouchpadGestureAvailable()
Check whether this port provides the native touchpad gesture APIs.
PGM_BASE & Pgm()
The global program "get" accessor.
see class PGM_BASE
MOUSE_DRAG_ACTION drag_right
MOUSE_DRAG_ACTION drag_middle
MOUSE_DRAG_ACTION drag_left