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
31 m_currentScrollMod( {} )
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
62{
63}
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;
93 case 1: cfg->m_Input.drag_left = MOUSE_DRAG_ACTION::DRAG_SELECTED; 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
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 = [this]( int mod )
228 {
229 switch( mod )
230 {
231 case 0: return m_rbZoomNone->GetValue() || m_rbPanHNone->GetValue() || m_rbPanVNone->GetValue();
232 case WXK_CONTROL: return m_rbZoomCtrl->GetValue() || m_rbPanHCtrl->GetValue() || m_rbPanVCtrl->GetValue();
233 case WXK_SHIFT: return m_rbZoomShift->GetValue() || m_rbPanHShift->GetValue() || m_rbPanVShift->GetValue();
234 case WXK_ALT: return m_rbZoomAlt->GetValue() || m_rbPanHAlt->GetValue() || m_rbPanVAlt->GetValue();
235 default: return false;
236 }
237 };
238
239 auto assign_first_available =
240 [&]( wxRadioButton* noneBtn, wxRadioButton* ctrlBtn, wxRadioButton* shiftBtn, wxRadioButton* altBtn )
241 {
242 int candidates[] = { 0, WXK_CONTROL, WXK_SHIFT, WXK_ALT };
243
244 for( int candidate : candidates )
245 {
246 if( candidate == modifier )
247 continue;
248
249 if( !column_taken( candidate ) )
250 {
251 switch( candidate )
252 {
253 case 0: noneBtn->SetValue( true ); break;
254 case WXK_CONTROL: ctrlBtn->SetValue( true ); break;
255 case WXK_SHIFT: shiftBtn->SetValue( true ); break;
256 case WXK_ALT: altBtn->SetValue( true ); break;
257 }
258
259 break;
260 }
261 }
262 };
263
264 if( modifier == WXK_CONTROL )
265 {
266 if( !isZoom && m_rbZoomCtrl->GetValue() )
267 assign_first_available( m_rbZoomNone, m_rbZoomCtrl, m_rbZoomShift, m_rbZoomAlt );
268 if( !isPanH && m_rbPanHCtrl->GetValue() )
269 assign_first_available( m_rbPanHNone, m_rbPanHCtrl, m_rbPanHShift, m_rbPanHAlt );
270 if( !isPanV && m_rbPanVCtrl->GetValue() )
271 assign_first_available( m_rbPanVNone, m_rbPanVCtrl, m_rbPanVShift, m_rbPanVAlt );
272 }
273 else if( modifier == WXK_SHIFT )
274 {
275 if( !isZoom && m_rbZoomShift->GetValue() )
276 assign_first_available( m_rbZoomNone, m_rbZoomCtrl, m_rbZoomShift, m_rbZoomAlt );
277 if( !isPanH && m_rbPanHShift->GetValue() )
278 assign_first_available( m_rbPanHNone, m_rbPanHCtrl, m_rbPanHShift, m_rbPanHAlt );
279 if( !isPanV && m_rbPanVShift->GetValue() )
280 assign_first_available( m_rbPanVNone, m_rbPanVCtrl, m_rbPanVShift, m_rbPanVAlt );
281 }
282 else if( modifier == WXK_ALT )
283 {
284 if( !isZoom && m_rbZoomAlt->GetValue() )
285 assign_first_available( m_rbZoomNone, m_rbZoomCtrl, m_rbZoomShift, m_rbZoomAlt );
286 if( !isPanH && m_rbPanHAlt->GetValue() )
287 assign_first_available( m_rbPanHNone, m_rbPanHCtrl, m_rbPanHShift, m_rbPanHAlt );
288 if( !isPanV && m_rbPanVAlt->GetValue() )
289 assign_first_available( m_rbPanVNone, m_rbPanVCtrl, m_rbPanVShift, m_rbPanVAlt );
290 }
291
293
294 m_scrollWarning->Show( !isScrollModSetValid( newSet ) );
295
296 m_currentScrollMod = newSet;
297}
298
299
301{
302 SCROLL_MOD_SET ret = {};
303
304 if( m_rbZoomShift->GetValue() )
305 ret.zoom = WXK_SHIFT;
306 else if( m_rbZoomCtrl->GetValue() )
307 ret.zoom = WXK_CONTROL;
308 else if( m_rbZoomAlt->GetValue() )
309 ret.zoom = WXK_ALT;
310
311 if( m_rbPanHShift->GetValue() )
312 ret.panh = WXK_SHIFT;
313 else if( m_rbPanHCtrl->GetValue() )
314 ret.panh = WXK_CONTROL;
315 else if( m_rbPanHAlt->GetValue() )
316 ret.panh = WXK_ALT;
317
318 if( m_rbPanVShift->GetValue() )
319 ret.panv = WXK_SHIFT;
320 else if( m_rbPanVCtrl->GetValue() )
321 ret.panv = WXK_CONTROL;
322 else if( m_rbPanVAlt->GetValue() )
323 ret.panv = WXK_ALT;
324
325 return ret;
326}
327
328
330{
331 return ( aSet.zoom != aSet.panh && aSet.panh != aSet.panv && aSet.panv != aSet.zoom );
332}
333
334
336{
337 auto set_wheel_buttons =
338 []( int aModifier, wxRadioButton* aNoneBtn, wxRadioButton* aCtrlBtn,
339 wxRadioButton* aShiftBtn, wxRadioButton* aAltBtn )
340 {
341 switch( aModifier )
342 {
343 case 0: aNoneBtn->SetValue( true ); break;
344 case WXK_CONTROL: aCtrlBtn->SetValue( true ); break;
345 case WXK_SHIFT: aShiftBtn->SetValue( true ); break;
346 case WXK_ALT: aAltBtn->SetValue( true ); break;
347 }
348 };
349
351 m_rbZoomAlt );
352
354 m_rbPanHAlt );
355
357 m_rbPanVAlt );
358
361}
362
363
364void PANEL_MOUSE_SETTINGS::onMouseDefaults( wxCommandEvent& event )
365{
367 m_currentScrollMod.panh = WXK_CONTROL;
368 m_currentScrollMod.panv = WXK_SHIFT;
371
373
374 m_checkEnablePanH->SetValue( false );
375}
376
377
378void PANEL_MOUSE_SETTINGS::onTrackpadDefaults( wxCommandEvent& event )
379{
380 m_currentScrollMod.zoom = WXK_CONTROL;
381 m_currentScrollMod.panh = WXK_SHIFT;
385
387
388 m_checkEnablePanH->SetValue( true );
389}
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Definition: bitmap.cpp:110
@ small_warning
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)
Class PANEL_MOUSE_SETTINGS_BASE.
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 getScrollModSet()
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:565
#define _(s)
PGM_BASE & Pgm()
The global program "get" accessor.
Definition: pgm_base.cpp:902
see class PGM_BASE
MOUSE_DRAG_ACTION drag_right
MOUSE_DRAG_ACTION drag_middle
MOUSE_DRAG_ACTION drag_left