1 #include "mmoptionwindows.h"
2
3 #include <wx/sizer.h>
4 #include <wx/stattext.h>
5 #include <wx/statline.h>
6 #include <wx/choice.h>
7 #include <wx/button.h>
8 #include <wx/intl.h>
9 #include <wx/checkbox.h>
10 #include <wx/slider.h>
11 #include <wx/combobox.h>
12 #include <wx/tipwin.h>
13 #include <wx/tooltip.h>
14 #include <wx/textctrl.h>
15
16 #include "ui.h"
17 #include <lslunitsync/optionswrapper.h>
18 #include "utils/controls.h"
19 #include <lslutils/misc.h>
20 #include "utils/conversion.h"
21 #include "gui/spinctl/spinctrl.h"
22
SingleOptionDialog(IBattle & battle,const wxString & optiontag)23 SingleOptionDialog::SingleOptionDialog( IBattle& battle, const wxString& optiontag ):
24 m_battle( battle ),
25 m_tag( optiontag ),
26 m_checkbox( 0 ),
27 m_combobox( 0 ),
28 m_spinctrl( 0 ),
29 m_textctrl( 0 ),
30 m_ok_button(0)
31 {
32 LSL::OptionsWrapper& optWrap = m_battle.CustomBattleOptions();
33 LSL::OptionsWrapper::GameOption optFlag = ( LSL::OptionsWrapper::GameOption )s2l( optiontag.BeforeFirst( '_' ) );
34 const auto key = STD_STRING(optiontag.AfterFirst( '_' ));
35 LSL::Enum::OptionType type = optWrap.GetSingleOptionType( key );
36 Create( (wxWindow*)&ui().mw(), wxID_ANY, _( "Change option" ), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, _T( "OptionDialog" ) );
37 if ( !optWrap.keyExists( key, optFlag, false, type ) )
38 {
39 EndModal( wxID_CANCEL );
40 return;
41 }
42
43 wxBoxSizer* m_main_sizer = new wxBoxSizer( wxVERTICAL );
44
45 // wxStaticText* m_labelctrl = wxStaticText();
46
47 switch ( type )
48 {
49 case LSL::Enum::opt_bool:
50 {
51 const auto opt = optWrap.m_opts[optFlag].bool_map[key];
52 m_checkbox = new wxCheckBox( this, wxID_ANY, TowxString(opt.name));
53 m_checkbox->SetToolTip( TES( opt.description ) );
54 m_checkbox->SetValue( opt.value );
55 m_main_sizer->Add( m_checkbox, 0, wxEXPAND );
56 break;
57 }
58 case LSL::Enum::opt_float:
59 {
60 const auto opt = optWrap.m_opts[optFlag].float_map[key];
61 m_spinctrl = new SlSpinCtrlDouble<SingleOptionDialog>();
62 m_spinctrl->Create( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize,
63 wxSP_ARROW_KEYS, double( opt.min ), double( opt.max ),
64 double( opt.value ), double( opt.stepping ), TowxString(opt.key));
65 m_spinctrl->SetToolTip( TES( opt.description ) );
66 m_main_sizer->Add( m_spinctrl, 0, wxEXPAND );
67 break;
68 }
69 case LSL::Enum::opt_string:
70 {
71 const auto opt = optWrap.m_opts[optFlag].string_map[key];
72 m_textctrl = new wxTextCtrl( this, wxID_ANY, TowxString(opt.value), wxDefaultPosition,
73 wxDefaultSize,0, wxDefaultValidator, TowxString(opt.key));
74 m_textctrl->SetToolTip( TES( opt.description ) );
75 m_main_sizer->Add( m_textctrl, 0, wxEXPAND );
76 break;
77 }
78 case LSL::Enum::opt_list:
79 {
80 const auto opt = optWrap.m_opts[optFlag].list_map[key];
81 const int temp = int( opt.cbx_choices.size() - 1 );
82 const int index = LSL::Util::Clamp( opt.cur_choice_index, 0, temp );
83 m_combobox = new wxComboBox( this, wxID_ANY, TowxString(opt.cbx_choices[index]), wxDefaultPosition, wxDefaultSize,
84 LSL::Util::vectorToArrayString(opt.cbx_choices), wxCB_READONLY, wxDefaultValidator );
85 std::string tooltip = opt.description + "\n";
86 for (const auto itor : opt.listitems)
87 {
88 tooltip += "\n" + itor.name + ": " + itor.desc;
89 }
90 m_combobox->SetToolTip( TES( tooltip ) );
91 m_main_sizer->Add( m_combobox, 0, wxEXPAND );
92 break;
93 }
94 default:
95 {
96 EndModal( wxID_CANCEL );
97 return;
98 break;
99 }
100 }
101
102 wxSize __SpacerSize_1 = wxDLG_UNIT( this, wxSize( 0, 0 ) );
103 m_main_sizer->Add( __SpacerSize_1.GetWidth(), __SpacerSize_1.GetHeight(), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5 );
104 wxStaticLine* m_separator1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxSize( 10, -1 ), wxLI_HORIZONTAL, _T( "ID_STATICLINE1" ) );
105 m_main_sizer->Add( m_separator1, 0, wxALL | wxEXPAND | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5 );
106 wxBoxSizer* m_buttons_sizer = new wxBoxSizer( wxHORIZONTAL );
107 m_cancel_button = new wxButton( this, ID_CANCEL, _( "Cancel" ), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T( "ID_CANCEL" ) );
108 m_buttons_sizer->Add( m_cancel_button, 0, wxALL | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 5 );
109 m_buttons_sizer->Add( 0, 0, 1, wxALL | wxEXPAND | wxSHAPED | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 0 );
110 m_ok_button = new wxButton( this, ID_OK, _( "Ok" ), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T( "ID_OK" ) );
111 m_buttons_sizer->Add( m_ok_button, 0, wxALL | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL, 5 );
112 m_main_sizer->Add( m_buttons_sizer, 0, wxALL | wxEXPAND | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 0 );
113
114
115 m_main_sizer->Fit( this );
116 m_main_sizer->SetSizeHints( this );
117
118 SetSizer( m_main_sizer );
119 Layout();
120
121 Connect( ID_CANCEL, wxEVT_COMMAND_BUTTON_CLICKED, ( wxObjectEventFunction )&SingleOptionDialog::OnCancel );
122 Connect( ID_OK, wxEVT_COMMAND_BUTTON_CLICKED, ( wxObjectEventFunction )&SingleOptionDialog::OnOk );
123 }
124
OnCancel(wxCommandEvent &)125 void SingleOptionDialog::OnCancel( wxCommandEvent& /*unused*/ )
126 {
127 EndModal( wxID_CANCEL );
128 }
129
OnOk(wxCommandEvent &)130 void SingleOptionDialog::OnOk( wxCommandEvent& /*unused*/ )
131 {
132 const auto optFlag = ( LSL::OptionsWrapper::GameOption )s2l( m_tag.BeforeFirst( '_' ) );
133 const auto key = STD_STRING(m_tag.AfterFirst( '_' ));
134 wxString value;
135 if ( m_textctrl )
136 value = m_textctrl->GetValue();
137 else if ( m_combobox )
138 value = TowxString(m_battle.CustomBattleOptions()
139 .GetNameListOptItemKey(key, STD_STRING(m_combobox->GetValue()), optFlag));
140 else if ( m_spinctrl )
141 {
142 double d = m_spinctrl->GetValue() ;
143 value = wxFormat( _T("%f") ) % d;
144 wxLogMessage( _T("Got VALUE: %s -- %f"), value.c_str(), d );
145 }
146 else if ( m_checkbox ) value = TowxString( m_checkbox->GetValue() );
147 m_battle.CustomBattleOptions().setSingleOption( key, STD_STRING(value), optFlag );
148 m_battle.SendHostInfo( m_tag );
149 EndModal( wxID_OK );
150 }
151