You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

283 lines
9.4 KiB

3 years ago
6 years ago
3 years ago
  1. /*
  2. * This program source code file is part of KiCad, a free EDA CAD application.
  3. *
  4. * Copyright (C) 2020 Jon Evans <jon@craftyjon.com>
  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. #include <bitmaps.h>
  21. #include <dialogs/panel_mouse_settings.h>
  22. #include <pgm_base.h>
  23. #include <settings/common_settings.h>
  24. #include <widgets/paged_dialog.h>
  25. #include <wx/defs.h>
  26. PANEL_MOUSE_SETTINGS::PANEL_MOUSE_SETTINGS( wxWindow* aParent ) :
  27. PANEL_MOUSE_SETTINGS_BASE( aParent ),
  28. m_currentScrollMod( {} )
  29. {
  30. #ifdef __WXOSX_MAC__
  31. for( wxSizerItem* child : m_zoomSizer->GetChildren() )
  32. {
  33. if( child->GetWindow() == m_zoomSpeed )
  34. child->SetBorder( 14 );
  35. }
  36. for( wxSizerItem* child : m_panSizer->GetChildren() )
  37. {
  38. if( child->GetWindow() == m_autoPanSpeed )
  39. child->SetBorder( 14 );
  40. }
  41. m_lblCtrl->SetLabel( _( "Cmd" ) );
  42. m_lblAlt->SetLabel( _( "Option" ) );
  43. #endif
  44. m_scrollWarning->SetBitmap( KiBitmap( BITMAPS::small_warning ) );
  45. m_scrollWarning->Hide();
  46. m_checkAutoZoomSpeed->Bind( wxEVT_COMMAND_CHECKBOX_CLICKED,
  47. [&]( wxCommandEvent& aEvt )
  48. {
  49. m_zoomSpeed->Enable( !m_checkAutoZoomSpeed->GetValue() );
  50. } );
  51. }
  52. PANEL_MOUSE_SETTINGS::~PANEL_MOUSE_SETTINGS()
  53. {
  54. }
  55. bool PANEL_MOUSE_SETTINGS::TransferDataToWindow()
  56. {
  57. const COMMON_SETTINGS* cfg = Pgm().GetCommonSettings();
  58. applySettingsToPanel( *cfg );
  59. return true;
  60. }
  61. bool PANEL_MOUSE_SETTINGS::TransferDataFromWindow()
  62. {
  63. COMMON_SETTINGS* cfg = Pgm().GetCommonSettings();
  64. m_currentScrollMod = getScrollModSet();
  65. if( !isScrollModSetValid( m_currentScrollMod ) )
  66. {
  67. PAGED_DIALOG::GetDialog( this )->SetError( _( "Only one action can be assigned to each "
  68. "vertical scroll setting" ),
  69. this, nullptr );
  70. return false;
  71. }
  72. switch( m_choiceLeftButtonDrag->GetSelection() )
  73. {
  74. case 0: cfg->m_Input.drag_left = MOUSE_DRAG_ACTION::SELECT; break;
  75. case 1: cfg->m_Input.drag_left = MOUSE_DRAG_ACTION::DRAG_SELECTED; break;
  76. case 2: cfg->m_Input.drag_left = MOUSE_DRAG_ACTION::DRAG_ANY; break;
  77. default: break;
  78. }
  79. switch( m_choiceMiddleButtonDrag->GetSelection() )
  80. {
  81. case 0: cfg->m_Input.drag_middle = MOUSE_DRAG_ACTION::PAN; break;
  82. case 1: cfg->m_Input.drag_middle = MOUSE_DRAG_ACTION::ZOOM; break;
  83. case 2: cfg->m_Input.drag_middle = MOUSE_DRAG_ACTION::NONE; break;
  84. default: break;
  85. }
  86. switch( m_choiceRightButtonDrag->GetSelection() )
  87. {
  88. case 0: cfg->m_Input.drag_right = MOUSE_DRAG_ACTION::PAN; break;
  89. case 1: cfg->m_Input.drag_right = MOUSE_DRAG_ACTION::ZOOM; break;
  90. case 2: cfg->m_Input.drag_right = MOUSE_DRAG_ACTION::NONE; break;
  91. default: break;
  92. }
  93. cfg->m_Input.center_on_zoom = m_checkZoomCenter->GetValue();
  94. cfg->m_Input.auto_pan = m_checkAutoPan->GetValue();
  95. cfg->m_Input.auto_pan_acceleration = m_autoPanSpeed->GetValue();
  96. cfg->m_Input.zoom_acceleration = m_checkZoomAcceleration->GetValue();
  97. cfg->m_Input.zoom_speed = m_zoomSpeed->GetValue();
  98. cfg->m_Input.zoom_speed_auto = m_checkAutoZoomSpeed->GetValue();
  99. cfg->m_Input.horizontal_pan = m_checkEnablePanH->GetValue();
  100. cfg->m_Input.scroll_modifier_zoom = m_currentScrollMod.zoom;
  101. cfg->m_Input.scroll_modifier_pan_h = m_currentScrollMod.panh;
  102. cfg->m_Input.scroll_modifier_pan_v = m_currentScrollMod.panv;
  103. return true;
  104. }
  105. void PANEL_MOUSE_SETTINGS::ResetPanel()
  106. {
  107. COMMON_SETTINGS defaultSettings;
  108. defaultSettings.ResetToDefaults();
  109. applySettingsToPanel( defaultSettings );
  110. }
  111. void PANEL_MOUSE_SETTINGS::applySettingsToPanel( const COMMON_SETTINGS& aSettings )
  112. {
  113. m_checkZoomCenter->SetValue( aSettings.m_Input.center_on_zoom );
  114. m_checkAutoPan->SetValue( aSettings.m_Input.auto_pan );
  115. m_checkZoomAcceleration->SetValue( aSettings.m_Input.zoom_acceleration );
  116. m_zoomSpeed->SetValue( aSettings.m_Input.zoom_speed );
  117. m_checkAutoZoomSpeed->SetValue( aSettings.m_Input.zoom_speed_auto );
  118. m_checkEnablePanH->SetValue( aSettings.m_Input.horizontal_pan );
  119. m_autoPanSpeed->SetValue( aSettings.m_Input.auto_pan_acceleration );
  120. m_zoomSpeed->Enable( !aSettings.m_Input.zoom_speed_auto );
  121. switch( aSettings.m_Input.drag_left )
  122. {
  123. case MOUSE_DRAG_ACTION::SELECT: m_choiceLeftButtonDrag->SetSelection( 0 ); break;
  124. case MOUSE_DRAG_ACTION::DRAG_SELECTED: m_choiceLeftButtonDrag->SetSelection( 1 ); break;
  125. case MOUSE_DRAG_ACTION::DRAG_ANY: m_choiceLeftButtonDrag->SetSelection( 2 ); break;
  126. default: break;
  127. }
  128. switch( aSettings.m_Input.drag_middle )
  129. {
  130. case MOUSE_DRAG_ACTION::PAN: m_choiceMiddleButtonDrag->SetSelection( 0 ); break;
  131. case MOUSE_DRAG_ACTION::ZOOM: m_choiceMiddleButtonDrag->SetSelection( 1 ); break;
  132. case MOUSE_DRAG_ACTION::NONE: m_choiceMiddleButtonDrag->SetSelection( 2 ); break;
  133. case MOUSE_DRAG_ACTION::SELECT: break;
  134. default: break;
  135. }
  136. switch( aSettings.m_Input.drag_right )
  137. {
  138. case MOUSE_DRAG_ACTION::PAN: m_choiceRightButtonDrag->SetSelection( 0 ); break;
  139. case MOUSE_DRAG_ACTION::ZOOM: m_choiceRightButtonDrag->SetSelection( 1 ); break;
  140. case MOUSE_DRAG_ACTION::NONE: m_choiceRightButtonDrag->SetSelection( 2 ); break;
  141. case MOUSE_DRAG_ACTION::SELECT: break;
  142. default: break;
  143. }
  144. m_currentScrollMod.zoom = aSettings.m_Input.scroll_modifier_zoom;
  145. m_currentScrollMod.panh = aSettings.m_Input.scroll_modifier_pan_h;
  146. m_currentScrollMod.panv = aSettings.m_Input.scroll_modifier_pan_v;
  147. updateScrollModButtons();
  148. }
  149. void PANEL_MOUSE_SETTINGS::OnScrollRadioButton( wxCommandEvent& event )
  150. {
  151. wxRadioButton* btn = dynamic_cast<wxRadioButton*>( event.GetEventObject() );
  152. if( !btn )
  153. return;
  154. SCROLL_MOD_SET newSet = getScrollModSet();
  155. m_scrollWarning->Show( !isScrollModSetValid( newSet ) );
  156. m_currentScrollMod = newSet;
  157. }
  158. SCROLL_MOD_SET PANEL_MOUSE_SETTINGS::getScrollModSet()
  159. {
  160. SCROLL_MOD_SET ret = {};
  161. if( m_rbZoomShift->GetValue() )
  162. ret.zoom = WXK_SHIFT;
  163. else if( m_rbZoomCtrl->GetValue() )
  164. ret.zoom = WXK_CONTROL;
  165. else if( m_rbZoomAlt->GetValue() )
  166. ret.zoom = WXK_ALT;
  167. if( m_rbPanHShift->GetValue() )
  168. ret.panh = WXK_SHIFT;
  169. else if( m_rbPanHCtrl->GetValue() )
  170. ret.panh = WXK_CONTROL;
  171. else if( m_rbPanHAlt->GetValue() )
  172. ret.panh = WXK_ALT;
  173. if( m_rbPanVShift->GetValue() )
  174. ret.panv = WXK_SHIFT;
  175. else if( m_rbPanVCtrl->GetValue() )
  176. ret.panv = WXK_CONTROL;
  177. else if( m_rbPanVAlt->GetValue() )
  178. ret.panv = WXK_ALT;
  179. return ret;
  180. }
  181. bool PANEL_MOUSE_SETTINGS::isScrollModSetValid( const SCROLL_MOD_SET& aSet )
  182. {
  183. return ( aSet.zoom != aSet.panh && aSet.panh != aSet.panv && aSet.panv != aSet.zoom );
  184. }
  185. void PANEL_MOUSE_SETTINGS::updateScrollModButtons()
  186. {
  187. auto set_wheel_buttons =
  188. []( int aModifier, wxRadioButton* aNoneBtn, wxRadioButton* aCtrlBtn,
  189. wxRadioButton* aShiftBtn, wxRadioButton* aAltBtn )
  190. {
  191. switch( aModifier )
  192. {
  193. case 0: aNoneBtn->SetValue( true ); break;
  194. case WXK_CONTROL: aCtrlBtn->SetValue( true ); break;
  195. case WXK_SHIFT: aShiftBtn->SetValue( true ); break;
  196. case WXK_ALT: aAltBtn->SetValue( true ); break;
  197. }
  198. };
  199. set_wheel_buttons( m_currentScrollMod.zoom, m_rbZoomNone, m_rbZoomCtrl, m_rbZoomShift,
  200. m_rbZoomAlt );
  201. set_wheel_buttons( m_currentScrollMod.panh, m_rbPanHNone, m_rbPanHCtrl, m_rbPanHShift,
  202. m_rbPanHAlt );
  203. set_wheel_buttons( m_currentScrollMod.panv, m_rbPanVNone, m_rbPanVCtrl, m_rbPanVShift,
  204. m_rbPanVAlt );
  205. }
  206. void PANEL_MOUSE_SETTINGS::onMouseDefaults( wxCommandEvent& event )
  207. {
  208. m_currentScrollMod.zoom = 0;
  209. m_currentScrollMod.panh = WXK_CONTROL;
  210. m_currentScrollMod.panv = WXK_SHIFT;
  211. updateScrollModButtons();
  212. m_checkEnablePanH->SetValue( false );
  213. }
  214. void PANEL_MOUSE_SETTINGS::onTrackpadDefaults( wxCommandEvent& event )
  215. {
  216. m_currentScrollMod.zoom = WXK_CONTROL;
  217. m_currentScrollMod.panh = WXK_SHIFT;
  218. m_currentScrollMod.panv = 0;
  219. updateScrollModButtons();
  220. m_checkEnablePanH->SetValue( true );
  221. }