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 along
18 * with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21#include <bitmaps.h>
23#include <pgm_base.h>
26#include <wx/defs.h>
27
28
32{
33#ifdef __WXOSX_MAC__
34 for( wxSizerItem* child : m_zoomSizer->GetChildren() )
35 {
36 if( child->GetWindow() == m_zoomSpeed )
37 child->SetBorder( 14 );
38 }
39
40 for( wxSizerItem* child : m_panSizer->GetChildren() )
41 {
42 if( child->GetWindow() == m_autoPanSpeed )
43 child->SetBorder( 14 );
44 }
45
46 m_lblCtrl->SetLabel( _( "Cmd" ) );
47 m_lblAlt->SetLabel( _( "Option" ) );
48#endif
49
50 m_scrollWarning->SetBitmap( KiBitmapBundle( BITMAPS::small_warning ) );
51 m_scrollWarning->Hide();
52
53 m_checkAutoZoomSpeed->Bind( wxEVT_COMMAND_CHECKBOX_CLICKED,
54 [&]( wxCommandEvent& aEvt )
55 {
56 m_zoomSpeed->Enable( !m_checkAutoZoomSpeed->GetValue() );
57 } );
58}
59
60
64
65
67{
68 const COMMON_SETTINGS* cfg = Pgm().GetCommonSettings();
69
71
72 return true;
73}
74
75
77{
79
81
83 {
84 PAGED_DIALOG::GetDialog( this )->SetError( _( "Only one action can be assigned to each "
85 "vertical scroll setting" ),
86 this, nullptr );
87 return false;
88 }
89
90 switch( m_choiceLeftButtonDrag->GetSelection() )
91 {
92 case 0: cfg->m_Input.drag_left = MOUSE_DRAG_ACTION::SELECT; break;
94 case 2: cfg->m_Input.drag_left = MOUSE_DRAG_ACTION::DRAG_ANY; break;
95 default: break;
96 }
97
98 switch( m_choiceMiddleButtonDrag->GetSelection() )
99 {
100 case 0: cfg->m_Input.drag_middle = MOUSE_DRAG_ACTION::PAN; break;
101 case 1: cfg->m_Input.drag_middle = MOUSE_DRAG_ACTION::ZOOM; break;
102 case 2: cfg->m_Input.drag_middle = MOUSE_DRAG_ACTION::NONE; break;
103 default: break;
104 }
105
106 switch( m_choiceRightButtonDrag->GetSelection() )
107 {
108 case 0: cfg->m_Input.drag_right = MOUSE_DRAG_ACTION::PAN; break;
109 case 1: cfg->m_Input.drag_right = MOUSE_DRAG_ACTION::ZOOM; break;
110 case 2: cfg->m_Input.drag_right = MOUSE_DRAG_ACTION::NONE; break;
111 default: break;
112 }
113
114 switch( m_choicePanMoveKey->GetSelection() )
115 {
116 case 1: cfg->m_Input.motion_pan_modifier = WXK_ALT; break;
117 case 2: cfg->m_Input.motion_pan_modifier = WXK_CONTROL; break;
118 case 3: cfg->m_Input.motion_pan_modifier = WXK_SHIFT; break;
119 default: cfg->m_Input.motion_pan_modifier = 0; break;
120 }
121
122 cfg->m_Input.center_on_zoom = m_checkZoomCenter->GetValue();
123 cfg->m_Input.auto_pan = m_checkAutoPan->GetValue();
126 cfg->m_Input.zoom_speed = m_zoomSpeed->GetValue();
128 cfg->m_Input.horizontal_pan = m_checkEnablePanH->GetValue();
129
133
136
137 return true;
138}
139
140
142{
143 COMMON_SETTINGS defaultSettings;
144
145 defaultSettings.ResetToDefaults();
146
147 applySettingsToPanel( defaultSettings );
148}
149
150
152{
153 m_checkZoomCenter->SetValue( aSettings.m_Input.center_on_zoom );
154 m_checkAutoPan->SetValue( aSettings.m_Input.auto_pan );
156 m_zoomSpeed->SetValue( aSettings.m_Input.zoom_speed );
157 m_checkAutoZoomSpeed->SetValue( aSettings.m_Input.zoom_speed_auto );
158 m_checkEnablePanH->SetValue( aSettings.m_Input.horizontal_pan );
159 m_autoPanSpeed->SetValue( aSettings.m_Input.auto_pan_acceleration );
160
161 m_zoomSpeed->Enable( !aSettings.m_Input.zoom_speed_auto );
162
163 switch( aSettings.m_Input.drag_left )
164 {
165 case MOUSE_DRAG_ACTION::SELECT: m_choiceLeftButtonDrag->SetSelection( 0 ); break;
166 case MOUSE_DRAG_ACTION::DRAG_SELECTED: m_choiceLeftButtonDrag->SetSelection( 1 ); break;
167 case MOUSE_DRAG_ACTION::DRAG_ANY: m_choiceLeftButtonDrag->SetSelection( 2 ); break;
168 default: break;
169 }
170
171 switch( aSettings.m_Input.drag_middle )
172 {
173 case MOUSE_DRAG_ACTION::PAN: m_choiceMiddleButtonDrag->SetSelection( 0 ); break;
174 case MOUSE_DRAG_ACTION::ZOOM: m_choiceMiddleButtonDrag->SetSelection( 1 ); break;
175 case MOUSE_DRAG_ACTION::NONE: m_choiceMiddleButtonDrag->SetSelection( 2 ); break;
176 case MOUSE_DRAG_ACTION::SELECT: break;
177 default: break;
178 }
179
180 switch( aSettings.m_Input.drag_right )
181 {
182 case MOUSE_DRAG_ACTION::PAN: m_choiceRightButtonDrag->SetSelection( 0 ); break;
183 case MOUSE_DRAG_ACTION::ZOOM: m_choiceRightButtonDrag->SetSelection( 1 ); break;
184 case MOUSE_DRAG_ACTION::NONE: m_choiceRightButtonDrag->SetSelection( 2 ); break;
185 case MOUSE_DRAG_ACTION::SELECT: break;
186 default: break;
187 }
188
189 switch( aSettings.m_Input.motion_pan_modifier )
190 {
191 case WXK_ALT: m_choicePanMoveKey->SetSelection( 1 ); break;
192 case WXK_CONTROL: m_choicePanMoveKey->SetSelection( 2 ); break;
193 case WXK_SHIFT: m_choicePanMoveKey->SetSelection( 3 ); break;
194 default: m_choicePanMoveKey->SetSelection( 0 ); break;
195 }
196
200 m_currentScrollMod.zoomReverse = aSettings.m_Input.reverse_scroll_zoom;
201 m_currentScrollMod.panHReverse = aSettings.m_Input.reverse_scroll_pan_h;
202
204}
205
206
207void PANEL_MOUSE_SETTINGS::OnScrollRadioButton( wxCommandEvent& event )
208{
209 wxRadioButton* btn = dynamic_cast<wxRadioButton*>( event.GetEventObject() );
210
211 if( !btn )
212 return;
213
214 bool isZoom = ( btn == m_rbZoomCtrl || btn == m_rbZoomShift || btn == m_rbZoomAlt );
215 bool isPanH = ( btn == m_rbPanHCtrl || btn == m_rbPanHShift || btn == m_rbPanHAlt );
216 bool isPanV = ( btn == m_rbPanVCtrl || btn == m_rbPanVShift || btn == m_rbPanVAlt );
217
218 int modifier = 0;
219
220 if( btn == m_rbZoomCtrl || btn == m_rbPanHCtrl || btn == m_rbPanVCtrl )
221 modifier = WXK_CONTROL;
222 else if( btn == m_rbZoomShift || btn == m_rbPanHShift || btn == m_rbPanVShift )
223 modifier = WXK_SHIFT;
224 else if( btn == m_rbZoomAlt || btn == m_rbPanHAlt || btn == m_rbPanVAlt )
225 modifier = WXK_ALT;
226
227 auto column_taken =
228 [this]( int mod )
229 {
230 switch( mod )
231 {
232 case 0: return m_rbZoomNone->GetValue() || m_rbPanHNone->GetValue() || m_rbPanVNone->GetValue();
233 case WXK_CONTROL: return m_rbZoomCtrl->GetValue() || m_rbPanHCtrl->GetValue() || m_rbPanVCtrl->GetValue();
234 case WXK_SHIFT: return m_rbZoomShift->GetValue() || m_rbPanHShift->GetValue() || m_rbPanVShift->GetValue();
235 case WXK_ALT: return m_rbZoomAlt->GetValue() || m_rbPanHAlt->GetValue() || m_rbPanVAlt->GetValue();
236 default: return false;
237 }
238 };
239
240 auto assign_first_available =
241 [&]( wxRadioButton* noneBtn, wxRadioButton* ctrlBtn, wxRadioButton* shiftBtn, wxRadioButton* altBtn )
242 {
243 int candidates[] = { 0, WXK_CONTROL, WXK_SHIFT, WXK_ALT };
244
245 for( int candidate : candidates )
246 {
247 if( candidate == modifier )
248 continue;
249
250 if( !column_taken( candidate ) )
251 {
252 switch( candidate )
253 {
254 case 0: noneBtn->SetValue( true ); break;
255 case WXK_CONTROL: ctrlBtn->SetValue( true ); break;
256 case WXK_SHIFT: shiftBtn->SetValue( true ); break;
257 case WXK_ALT: altBtn->SetValue( true ); break;
258 }
259
260 break;
261 }
262 }
263 };
264
265 if( modifier == WXK_CONTROL )
266 {
267 if( !isZoom && m_rbZoomCtrl->GetValue() )
268 assign_first_available( m_rbZoomNone, m_rbZoomCtrl, m_rbZoomShift, m_rbZoomAlt );
269 if( !isPanH && m_rbPanHCtrl->GetValue() )
270 assign_first_available( m_rbPanHNone, m_rbPanHCtrl, m_rbPanHShift, m_rbPanHAlt );
271 if( !isPanV && m_rbPanVCtrl->GetValue() )
272 assign_first_available( m_rbPanVNone, m_rbPanVCtrl, m_rbPanVShift, m_rbPanVAlt );
273 }
274 else if( modifier == WXK_SHIFT )
275 {
276 if( !isZoom && m_rbZoomShift->GetValue() )
277 assign_first_available( m_rbZoomNone, m_rbZoomCtrl, m_rbZoomShift, m_rbZoomAlt );
278 if( !isPanH && m_rbPanHShift->GetValue() )
279 assign_first_available( m_rbPanHNone, m_rbPanHCtrl, m_rbPanHShift, m_rbPanHAlt );
280 if( !isPanV && m_rbPanVShift->GetValue() )
281 assign_first_available( m_rbPanVNone, m_rbPanVCtrl, m_rbPanVShift, m_rbPanVAlt );
282 }
283 else if( modifier == WXK_ALT )
284 {
285 if( !isZoom && m_rbZoomAlt->GetValue() )
286 assign_first_available( m_rbZoomNone, m_rbZoomCtrl, m_rbZoomShift, m_rbZoomAlt );
287 if( !isPanH && m_rbPanHAlt->GetValue() )
288 assign_first_available( m_rbPanHNone, m_rbPanHCtrl, m_rbPanHShift, m_rbPanHAlt );
289 if( !isPanV && m_rbPanVAlt->GetValue() )
290 assign_first_available( m_rbPanVNone, m_rbPanVCtrl, m_rbPanVShift, m_rbPanVAlt );
291 }
292
294
295 m_scrollWarning->Show( !isScrollModSetValid( newSet ) );
296
297 m_currentScrollMod = newSet;
298}
299
300
302{
303 SCROLL_MOD_SET ret = {};
304
305 if( m_rbZoomShift->GetValue() )
306 ret.zoom = WXK_SHIFT;
307 else if( m_rbZoomCtrl->GetValue() )
308 ret.zoom = WXK_CONTROL;
309 else if( m_rbZoomAlt->GetValue() )
310 ret.zoom = WXK_ALT;
311
312 if( m_rbPanHShift->GetValue() )
313 ret.panh = WXK_SHIFT;
314 else if( m_rbPanHCtrl->GetValue() )
315 ret.panh = WXK_CONTROL;
316 else if( m_rbPanHAlt->GetValue() )
317 ret.panh = WXK_ALT;
318
319 if( m_rbPanVShift->GetValue() )
320 ret.panv = WXK_SHIFT;
321 else if( m_rbPanVCtrl->GetValue() )
322 ret.panv = WXK_CONTROL;
323 else if( m_rbPanVAlt->GetValue() )
324 ret.panv = WXK_ALT;
325
326 return ret;
327}
328
329
331{
332 return ( aSet.zoom != aSet.panh && aSet.panh != aSet.panv && aSet.panv != aSet.zoom );
333}
334
335
337{
338 auto set_wheel_buttons =
339 []( int aModifier, wxRadioButton* aNoneBtn, wxRadioButton* aCtrlBtn,
340 wxRadioButton* aShiftBtn, wxRadioButton* aAltBtn )
341 {
342 switch( aModifier )
343 {
344 case 0: aNoneBtn->SetValue( true ); break;
345 case WXK_CONTROL: aCtrlBtn->SetValue( true ); break;
346 case WXK_SHIFT: aShiftBtn->SetValue( true ); break;
347 case WXK_ALT: aAltBtn->SetValue( true ); break;
348 }
349 };
350
352 m_rbZoomAlt );
353
355 m_rbPanHAlt );
356
358 m_rbPanVAlt );
359
360 m_checkZoomReverse->SetValue( m_currentScrollMod.zoomReverse );
361 m_checkPanHReverse->SetValue( m_currentScrollMod.panHReverse );
362}
363
364
365void PANEL_MOUSE_SETTINGS::onMouseDefaults( wxCommandEvent& event )
366{
367 m_currentScrollMod.zoom = 0;
368 m_currentScrollMod.panh = WXK_CONTROL;
369 m_currentScrollMod.panv = WXK_SHIFT;
370 m_currentScrollMod.zoomReverse = false;
371 m_currentScrollMod.panHReverse = false;
372
374
375 m_checkEnablePanH->SetValue( false );
376}
377
378
379void PANEL_MOUSE_SETTINGS::onTrackpadDefaults( wxCommandEvent& event )
380{
381 m_currentScrollMod.zoom = WXK_CONTROL;
382 m_currentScrollMod.panh = WXK_SHIFT;
383 m_currentScrollMod.panv = 0;
384 m_currentScrollMod.zoomReverse = false;
385 m_currentScrollMod.panHReverse = false;
386
388
389 m_checkEnablePanH->SetValue( true );
390}
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Definition bitmap.cpp:110
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)
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:537
#define _(s)
PGM_BASE & Pgm()
The global program "get" accessor.
Definition pgm_base.cpp:946
see class PGM_BASE
MOUSE_DRAG_ACTION drag_right
MOUSE_DRAG_ACTION drag_middle
MOUSE_DRAG_ACTION drag_left