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.

251 lines
8.6 KiB

6 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 <dialog_shim.h>
  21. #include <dialogs/panel_mouse_settings.h>
  22. #include <pgm_base.h>
  23. #include <settings/common_settings.h>
  24. #include <wx/defs.h>
  25. PANEL_MOUSE_SETTINGS::PANEL_MOUSE_SETTINGS( DIALOG_SHIM* aDialog, wxWindow* aParent ) :
  26. PANEL_MOUSE_SETTINGS_BASE( aParent ),
  27. m_dialog( aDialog ),
  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. #endif
  43. m_checkAutoZoomSpeed->Bind( wxEVT_COMMAND_CHECKBOX_CLICKED,
  44. [&]( wxCommandEvent& aEvt )
  45. {
  46. m_zoomSpeed->Enable( !m_checkAutoZoomSpeed->GetValue() );
  47. } );
  48. }
  49. PANEL_MOUSE_SETTINGS::~PANEL_MOUSE_SETTINGS()
  50. {
  51. }
  52. bool PANEL_MOUSE_SETTINGS::TransferDataToWindow()
  53. {
  54. const COMMON_SETTINGS* cfg = Pgm().GetCommonSettings();
  55. applySettingsToPanel( *cfg );
  56. return true;
  57. }
  58. bool PANEL_MOUSE_SETTINGS::TransferDataFromWindow()
  59. {
  60. COMMON_SETTINGS* cfg = Pgm().GetCommonSettings();
  61. m_currentScrollMod = getScrollModSet();
  62. if( !isScrollModSetValid( m_currentScrollMod ) )
  63. return false;
  64. switch( m_choiceLeftButtonDrag->GetSelection() )
  65. {
  66. case 0: cfg->m_Input.drag_left = MOUSE_DRAG_ACTION::SELECT; break;
  67. case 1: cfg->m_Input.drag_left = MOUSE_DRAG_ACTION::DRAG_SELECTED; break;
  68. case 2: cfg->m_Input.drag_left = MOUSE_DRAG_ACTION::DRAG_ANY; break;
  69. default: break;
  70. }
  71. switch( m_choiceMiddleButtonDrag->GetSelection() )
  72. {
  73. case 0: cfg->m_Input.drag_middle = MOUSE_DRAG_ACTION::PAN; break;
  74. case 1: cfg->m_Input.drag_middle = MOUSE_DRAG_ACTION::ZOOM; break;
  75. case 2: cfg->m_Input.drag_middle = MOUSE_DRAG_ACTION::NONE; break;
  76. default: break;
  77. }
  78. switch( m_choiceRightButtonDrag->GetSelection() )
  79. {
  80. case 0: cfg->m_Input.drag_right = MOUSE_DRAG_ACTION::PAN; break;
  81. case 1: cfg->m_Input.drag_right = MOUSE_DRAG_ACTION::ZOOM; break;
  82. case 2: cfg->m_Input.drag_right = MOUSE_DRAG_ACTION::NONE; break;
  83. default: break;
  84. }
  85. cfg->m_Input.center_on_zoom = m_checkZoomCenter->GetValue();
  86. cfg->m_Input.auto_pan = m_checkAutoPan->GetValue();
  87. cfg->m_Input.auto_pan_acceleration = m_autoPanSpeed->GetValue();
  88. cfg->m_Input.zoom_acceleration = m_checkZoomAcceleration->GetValue();
  89. cfg->m_Input.zoom_speed = m_zoomSpeed->GetValue();
  90. cfg->m_Input.zoom_speed_auto = m_checkAutoZoomSpeed->GetValue();
  91. cfg->m_Input.horizontal_pan = m_checkEnablePanH->GetValue();
  92. cfg->m_Input.scroll_modifier_zoom = m_currentScrollMod.zoom;
  93. cfg->m_Input.scroll_modifier_pan_h = m_currentScrollMod.panh;
  94. cfg->m_Input.scroll_modifier_pan_v = m_currentScrollMod.panv;
  95. return true;
  96. }
  97. void PANEL_MOUSE_SETTINGS::ResetPanel()
  98. {
  99. COMMON_SETTINGS defaultSettings;
  100. defaultSettings.ResetToDefaults();
  101. applySettingsToPanel( defaultSettings );
  102. }
  103. void PANEL_MOUSE_SETTINGS::applySettingsToPanel( const COMMON_SETTINGS& aSettings )
  104. {
  105. m_checkZoomCenter->SetValue( aSettings.m_Input.center_on_zoom );
  106. m_checkAutoPan->SetValue( aSettings.m_Input.auto_pan );
  107. m_checkZoomAcceleration->SetValue( aSettings.m_Input.zoom_acceleration );
  108. m_zoomSpeed->SetValue( aSettings.m_Input.zoom_speed );
  109. m_checkAutoZoomSpeed->SetValue( aSettings.m_Input.zoom_speed_auto );
  110. m_checkEnablePanH->SetValue( aSettings.m_Input.horizontal_pan );
  111. m_autoPanSpeed->SetValue( aSettings.m_Input.auto_pan_acceleration );
  112. m_zoomSpeed->Enable( !aSettings.m_Input.zoom_speed_auto );
  113. switch( aSettings.m_Input.drag_left )
  114. {
  115. case MOUSE_DRAG_ACTION::SELECT: m_choiceLeftButtonDrag->SetSelection( 0 ); break;
  116. case MOUSE_DRAG_ACTION::DRAG_SELECTED: m_choiceLeftButtonDrag->SetSelection( 1 ); break;
  117. case MOUSE_DRAG_ACTION::DRAG_ANY: m_choiceLeftButtonDrag->SetSelection( 2 ); break;
  118. default: break;
  119. }
  120. switch( aSettings.m_Input.drag_middle )
  121. {
  122. case MOUSE_DRAG_ACTION::PAN: m_choiceMiddleButtonDrag->SetSelection( 0 ); break;
  123. case MOUSE_DRAG_ACTION::ZOOM: m_choiceMiddleButtonDrag->SetSelection( 1 ); break;
  124. case MOUSE_DRAG_ACTION::NONE: m_choiceMiddleButtonDrag->SetSelection( 2 ); break;
  125. case MOUSE_DRAG_ACTION::SELECT: break;
  126. default: break;
  127. }
  128. switch( aSettings.m_Input.drag_right )
  129. {
  130. case MOUSE_DRAG_ACTION::PAN: m_choiceRightButtonDrag->SetSelection( 0 ); break;
  131. case MOUSE_DRAG_ACTION::ZOOM: m_choiceRightButtonDrag->SetSelection( 1 ); break;
  132. case MOUSE_DRAG_ACTION::NONE: m_choiceRightButtonDrag->SetSelection( 2 ); break;
  133. case MOUSE_DRAG_ACTION::SELECT: break;
  134. default: break;
  135. }
  136. m_currentScrollMod.zoom = aSettings.m_Input.scroll_modifier_zoom;
  137. m_currentScrollMod.panh = aSettings.m_Input.scroll_modifier_pan_h;
  138. m_currentScrollMod.panv = aSettings.m_Input.scroll_modifier_pan_v;
  139. updateScrollModButtons();
  140. }
  141. void PANEL_MOUSE_SETTINGS::OnScrollRadioButton( wxCommandEvent& event )
  142. {
  143. wxRadioButton* btn = dynamic_cast<wxRadioButton*>( event.GetEventObject() );
  144. if( !btn )
  145. return;
  146. SCROLL_MOD_SET newSet = getScrollModSet();
  147. if( isScrollModSetValid( newSet ) )
  148. m_currentScrollMod = newSet;
  149. else
  150. updateScrollModButtons();
  151. }
  152. SCROLL_MOD_SET PANEL_MOUSE_SETTINGS::getScrollModSet()
  153. {
  154. SCROLL_MOD_SET ret = {};
  155. if( m_rbZoomShift->GetValue() )
  156. ret.zoom = WXK_SHIFT;
  157. else if( m_rbZoomCtrl->GetValue() )
  158. ret.zoom = WXK_CONTROL;
  159. else if( m_rbZoomAlt->GetValue() )
  160. ret.zoom = WXK_ALT;
  161. if( m_rbPanHShift->GetValue() )
  162. ret.panh = WXK_SHIFT;
  163. else if( m_rbPanHCtrl->GetValue() )
  164. ret.panh = WXK_CONTROL;
  165. else if( m_rbPanHAlt->GetValue() )
  166. ret.panh = WXK_ALT;
  167. if( m_rbPanVShift->GetValue() )
  168. ret.panv = WXK_SHIFT;
  169. else if( m_rbPanVCtrl->GetValue() )
  170. ret.panv = WXK_CONTROL;
  171. else if( m_rbPanVAlt->GetValue() )
  172. ret.panv = WXK_ALT;
  173. return ret;
  174. }
  175. bool PANEL_MOUSE_SETTINGS::isScrollModSetValid( const SCROLL_MOD_SET& aSet )
  176. {
  177. return ( aSet.zoom != aSet.panh && aSet.panh != aSet.panv && aSet.panv != aSet.zoom );
  178. }
  179. void PANEL_MOUSE_SETTINGS::updateScrollModButtons()
  180. {
  181. auto set_wheel_buttons =
  182. []( int aModifier, wxRadioButton* aNoneBtn, wxRadioButton* aCtrlBtn,
  183. wxRadioButton* aShiftBtn, wxRadioButton* aAltBtn )
  184. {
  185. switch( aModifier )
  186. {
  187. case 0: aNoneBtn->SetValue( true ); break;
  188. case WXK_CONTROL: aCtrlBtn->SetValue( true ); break;
  189. case WXK_SHIFT: aShiftBtn->SetValue( true ); break;
  190. case WXK_ALT: aAltBtn->SetValue( true ); break;
  191. }
  192. };
  193. set_wheel_buttons( m_currentScrollMod.zoom, m_rbZoomNone, m_rbZoomCtrl, m_rbZoomShift,
  194. m_rbZoomAlt );
  195. set_wheel_buttons( m_currentScrollMod.panh, m_rbPanHNone, m_rbPanHCtrl, m_rbPanHShift,
  196. m_rbPanHAlt );
  197. set_wheel_buttons( m_currentScrollMod.panv, m_rbPanVNone, m_rbPanVCtrl, m_rbPanVShift,
  198. m_rbPanVAlt );
  199. }