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 (C) 2020 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 cfg->m_Input.center_on_zoom = m_checkZoomCenter->GetValue();
115 cfg->m_Input.auto_pan = m_checkAutoPan->GetValue();
118 cfg->m_Input.zoom_speed = m_zoomSpeed->GetValue();
120 cfg->m_Input.horizontal_pan = m_checkEnablePanH->GetValue();
121
125
127
128 return true;
129}
130
131
133{
134 COMMON_SETTINGS defaultSettings;
135
136 defaultSettings.ResetToDefaults();
137
138 applySettingsToPanel( defaultSettings );
139}
140
141
143{
144 m_checkZoomCenter->SetValue( aSettings.m_Input.center_on_zoom );
145 m_checkAutoPan->SetValue( aSettings.m_Input.auto_pan );
147 m_zoomSpeed->SetValue( aSettings.m_Input.zoom_speed );
148 m_checkAutoZoomSpeed->SetValue( aSettings.m_Input.zoom_speed_auto );
149 m_checkEnablePanH->SetValue( aSettings.m_Input.horizontal_pan );
150 m_autoPanSpeed->SetValue( aSettings.m_Input.auto_pan_acceleration );
151
152 m_zoomSpeed->Enable( !aSettings.m_Input.zoom_speed_auto );
153
154 switch( aSettings.m_Input.drag_left )
155 {
156 case MOUSE_DRAG_ACTION::SELECT: m_choiceLeftButtonDrag->SetSelection( 0 ); break;
157 case MOUSE_DRAG_ACTION::DRAG_SELECTED: m_choiceLeftButtonDrag->SetSelection( 1 ); break;
158 case MOUSE_DRAG_ACTION::DRAG_ANY: m_choiceLeftButtonDrag->SetSelection( 2 ); break;
159 default: break;
160 }
161
162 switch( aSettings.m_Input.drag_middle )
163 {
164 case MOUSE_DRAG_ACTION::PAN: m_choiceMiddleButtonDrag->SetSelection( 0 ); break;
165 case MOUSE_DRAG_ACTION::ZOOM: m_choiceMiddleButtonDrag->SetSelection( 1 ); break;
166 case MOUSE_DRAG_ACTION::NONE: m_choiceMiddleButtonDrag->SetSelection( 2 ); break;
167 case MOUSE_DRAG_ACTION::SELECT: break;
168 default: break;
169 }
170
171 switch( aSettings.m_Input.drag_right )
172 {
173 case MOUSE_DRAG_ACTION::PAN: m_choiceRightButtonDrag->SetSelection( 0 ); break;
174 case MOUSE_DRAG_ACTION::ZOOM: m_choiceRightButtonDrag->SetSelection( 1 ); break;
175 case MOUSE_DRAG_ACTION::NONE: m_choiceRightButtonDrag->SetSelection( 2 ); break;
176 case MOUSE_DRAG_ACTION::SELECT: break;
177 default: break;
178 }
179
184
186}
187
188
189void PANEL_MOUSE_SETTINGS::OnScrollRadioButton( wxCommandEvent& event )
190{
191 wxRadioButton* btn = dynamic_cast<wxRadioButton*>( event.GetEventObject() );
192
193 if( !btn )
194 return;
195
197
198 m_scrollWarning->Show( !isScrollModSetValid( newSet ) );
199
200 m_currentScrollMod = newSet;
201}
202
203
205{
206 SCROLL_MOD_SET ret = {};
207
208 if( m_rbZoomShift->GetValue() )
209 ret.zoom = WXK_SHIFT;
210 else if( m_rbZoomCtrl->GetValue() )
211 ret.zoom = WXK_CONTROL;
212 else if( m_rbZoomAlt->GetValue() )
213 ret.zoom = WXK_ALT;
214
215 if( m_rbPanHShift->GetValue() )
216 ret.panh = WXK_SHIFT;
217 else if( m_rbPanHCtrl->GetValue() )
218 ret.panh = WXK_CONTROL;
219 else if( m_rbPanHAlt->GetValue() )
220 ret.panh = WXK_ALT;
221
222 if( m_rbPanVShift->GetValue() )
223 ret.panv = WXK_SHIFT;
224 else if( m_rbPanVCtrl->GetValue() )
225 ret.panv = WXK_CONTROL;
226 else if( m_rbPanVAlt->GetValue() )
227 ret.panv = WXK_ALT;
228
229 return ret;
230}
231
232
234{
235 return ( aSet.zoom != aSet.panh && aSet.panh != aSet.panv && aSet.panv != aSet.zoom );
236}
237
238
240{
241 auto set_wheel_buttons =
242 []( int aModifier, wxRadioButton* aNoneBtn, wxRadioButton* aCtrlBtn,
243 wxRadioButton* aShiftBtn, wxRadioButton* aAltBtn )
244 {
245 switch( aModifier )
246 {
247 case 0: aNoneBtn->SetValue( true ); break;
248 case WXK_CONTROL: aCtrlBtn->SetValue( true ); break;
249 case WXK_SHIFT: aShiftBtn->SetValue( true ); break;
250 case WXK_ALT: aAltBtn->SetValue( true ); break;
251 }
252 };
253
255 m_rbZoomAlt );
256
258 m_rbPanHAlt );
259
261 m_rbPanVAlt );
262
264}
265
266
267void PANEL_MOUSE_SETTINGS::onMouseDefaults( wxCommandEvent& event )
268{
270 m_currentScrollMod.panh = WXK_CONTROL;
271 m_currentScrollMod.panv = WXK_SHIFT;
273
275
276 m_checkEnablePanH->SetValue( false );
277}
278
279
280void PANEL_MOUSE_SETTINGS::onTrackpadDefaults( wxCommandEvent& event )
281{
282 m_currentScrollMod.zoom = WXK_CONTROL;
283 m_currentScrollMod.panh = WXK_SHIFT;
286
288
289 m_checkEnablePanH->SetValue( true );
290}
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
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:678
#define _(s)
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1059
see class PGM_BASE
MOUSE_DRAG_ACTION drag_right
MOUSE_DRAG_ACTION drag_middle
MOUSE_DRAG_ACTION drag_left