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