fix compile against newer giflib
[rofl0r-obeditor.git] / src / levels__wndEditBackground.cpp
blobca87ee5b49c09482afa66a670400bc09c2786255
1 /*
2 * levels__myWnd_EditBackground.cpp
4 * Created on: 8 mai 2009
5 * Author: pat
6 */
8 #include "wx/wxprec.h"
9 #ifndef WX_PRECOMP
10 #include "wx/wx.h"
11 #endif
13 #include "common__mod.h"
14 #include "common__ob_controls.h"
16 #include "levels__globals.h"
17 #include "levels__sidesWindows.h"
18 #include "levels__wndEditBackground.h"
19 #include "levels__Ctrl_SceneView.h"
22 const wxFont font_Alphabet( 18, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, true );
23 const wxFont font_Label( 16, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxNORMAL, true );
25 //----------------------------------------------------------------------------
26 const int MAX_LAYERS = 20;
27 const int REPEAT_FOREVER = 100;
28 const int BTN_W = 50;
29 wxString alphaChoices[] = {wxT("0"),wxT("1"),wxT("2"),wxT("3"),wxT("4"),wxT("5"),wxT("6")};
31 //****************************************************
32 myWnd_EditBackground::myWnd_EditBackground(
33 wxWindow* _parent
34 , ob_stage* _stage
35 , ob_StageDeclaration* _stage_declaration
36 , ob_StagesSet* _stage_set
38 :wxDialog( _parent, wxID_ANY, wxT("Edit Backgound"), wxDefaultPosition, wxDefaultSize
39 ,wxMAXIMIZE_BOX | wxRESIZE_BORDER | wxDEFAULT_DIALOG_STYLE )
41 stage = _stage;
42 stage_declaration = _stage_declaration;
43 stage_set = _stage_set;
45 b_not_update_vals = false;
46 b_updating_vals = false;
47 b_initialised = false;
48 b_changed = false;
50 nb_layers = 0;
51 oLayers = NULL;
52 oMap_OldNew_Layers__size = 0;
53 oMap_OldNew_Layers = NULL;
55 wxButton* t_btn;
56 wxSizer *t_sizer, *t_sizer2;
58 //-------------------------------------
59 wxSizer* sizer_main = new wxBoxSizer( wxVERTICAL );
60 wxSizer* sizer_middle = new wxBoxSizer( wxHORIZONTAL );
62 //-------------------------------------
63 // Top
64 wxSizer* t_sizer_top = new wxBoxSizer( wxHORIZONTAL );
65 sizer_main->Add( t_sizer_top, 0, wxEXPAND );
66 int BORDERS_SIZES = 1;
67 // Control with current layer values
68 // PATH
69 t_sizer2 = new wxBoxSizer( wxVERTICAL );
70 t_sizer2->Add( new wxStaticText( this, wxID_ANY, wxT("Path") )
71 ,0,wxALL, BORDERS_SIZES );
73 ctrl_path = new prObFileChooserCtrl( this );
74 ctrl_path->Connect( wxEVT_OBFILECHOOSER_CHANGE
75 , wxCommandEventHandler(myWnd_EditBackground::Evt_bgParamChange)
76 , NULL, this);
77 ctrl_path->Connect( wxEVT_KILL_FOCUS
78 , wxFocusEventHandler(myWnd_EditBackground::Evt_bgParamFocusOut)
79 , NULL, this);
80 // ctrl_path->SetMaxSize( wxSize( BTN_W + 20, wxDefaultCoord));
81 t_sizer2->Add( ctrl_path
82 ,0,wxALL, BORDERS_SIZES );
83 t_sizer_top->Add( t_sizer2, 0, wxALL, 2 );
85 // Xratio
86 t_sizer2 = new wxBoxSizer( wxVERTICAL );
87 t_sizer2->Add( new wxStaticText( this, wxID_ANY, wxT("xRat") )
88 ,0,wxALL, BORDERS_SIZES );
89 txtCtrl_Xratio = new wxTextCtrl(this, wxID_ANY
90 , wxString(), wxDefaultPosition,wxDefaultSize,wxTE_PROCESS_ENTER
91 , wxValidatorFloatPositive() );
92 txtCtrl_Xratio->Connect( wxEVT_COMMAND_TEXT_ENTER
93 , wxCommandEventHandler(myWnd_EditBackground::Evt_bgParamChange )
94 , NULL, this);
95 txtCtrl_Xratio->Connect( wxEVT_KILL_FOCUS
96 , wxFocusEventHandler(myWnd_EditBackground::Evt_bgParamFocusOut)
97 , NULL, this);
98 txtCtrl_Xratio->SetMinSize( wxSize( BTN_W, wxDefaultCoord));
99 txtCtrl_Xratio->SetMaxSize( wxSize( BTN_W, wxDefaultCoord));
100 t_sizer2->Add( txtCtrl_Xratio
101 ,0,wxALL, BORDERS_SIZES );
102 t_sizer_top->Add( t_sizer2, 0, wxALL, 2 );
104 // Zratio
105 t_sizer2 = new wxBoxSizer( wxVERTICAL );
106 t_sizer2->Add( new wxStaticText( this, wxID_ANY, wxT("zRat") )
107 ,0,wxALL, BORDERS_SIZES );
108 txtCtrl_Zratio = new wxTextCtrl(this, wxID_ANY
109 , wxString(), wxDefaultPosition,wxDefaultSize,wxTE_PROCESS_ENTER
110 , wxValidatorFloatPositive() );
111 txtCtrl_Zratio->Connect( wxEVT_KILL_FOCUS
112 , wxFocusEventHandler(myWnd_EditBackground::Evt_bgParamFocusOut)
113 , NULL, this);
114 txtCtrl_Zratio->Connect( wxEVT_KILL_FOCUS
115 , wxCommandEventHandler(myWnd_EditBackground::Evt_bgParamChange)
116 , NULL, this);
117 txtCtrl_Zratio->SetMinSize( wxSize( BTN_W, wxDefaultCoord));
118 txtCtrl_Zratio->SetMaxSize( wxSize( BTN_W, wxDefaultCoord));
119 t_sizer2->Add( txtCtrl_Zratio
120 ,0,wxALL, BORDERS_SIZES );
121 t_sizer_top->Add( t_sizer2, 0, wxALL, 2 );
123 // Xpos
124 t_sizer2 = new wxBoxSizer( wxVERTICAL );
125 t_sizer2->Add( new wxStaticText( this, wxID_ANY, wxT("xPos") )
126 ,0,wxALL, BORDERS_SIZES );
127 txtCtrl_Xpos = new wxTextCtrl(this, wxID_ANY
128 , wxString(), wxDefaultPosition,wxDefaultSize,wxTE_PROCESS_ENTER
129 , wxValidatorIntegerRelative() );
130 txtCtrl_Xpos->Connect( wxEVT_KILL_FOCUS
131 , wxFocusEventHandler(myWnd_EditBackground::Evt_bgParamFocusOut)
132 , NULL, this);
133 txtCtrl_Xpos->Connect( wxEVT_COMMAND_TEXT_ENTER
134 , wxCommandEventHandler(myWnd_EditBackground::Evt_bgParamChange )
135 , NULL, this);
136 txtCtrl_Xpos->SetMinSize( wxSize( BTN_W, wxDefaultCoord));
137 txtCtrl_Xpos->SetMaxSize( wxSize( BTN_W, wxDefaultCoord));
138 t_sizer2->Add( txtCtrl_Xpos
139 ,0,wxALL, BORDERS_SIZES );
140 t_sizer_top->Add( t_sizer2, 0, wxALL, 2 );
142 // Zpos
143 t_sizer2 = new wxBoxSizer( wxVERTICAL );
144 t_sizer2->Add( new wxStaticText( this, wxID_ANY, wxT("zPos") )
145 ,0,wxALL, BORDERS_SIZES );
146 txtCtrl_Zpos = new wxTextCtrl(this, wxID_ANY
147 , wxString(), wxDefaultPosition,wxDefaultSize,wxTE_PROCESS_ENTER
148 , wxValidatorIntegerRelative() );
149 txtCtrl_Zpos->Connect( wxEVT_KILL_FOCUS
150 , wxFocusEventHandler(myWnd_EditBackground::Evt_bgParamFocusOut)
151 , NULL, this);
152 txtCtrl_Zpos->Connect( wxEVT_COMMAND_TEXT_ENTER
153 , wxCommandEventHandler(myWnd_EditBackground::Evt_bgParamChange )
154 , NULL, this);
155 txtCtrl_Zpos->SetMinSize( wxSize( BTN_W, wxDefaultCoord));
156 txtCtrl_Zpos->SetMaxSize( wxSize( BTN_W, wxDefaultCoord));
157 t_sizer2->Add( txtCtrl_Zpos
158 ,0,wxALL, BORDERS_SIZES );
159 t_sizer_top->Add( t_sizer2, 0, wxALL, 2 );
161 // Xspace
162 t_sizer2 = new wxBoxSizer( wxVERTICAL );
163 t_sizer2->Add( new wxStaticText( this, wxID_ANY, wxT("xSpace") )
164 ,0,wxALL, BORDERS_SIZES );
165 txtCtrl_Xspace = new wxTextCtrl(this, wxID_ANY
166 , wxString(), wxDefaultPosition,wxDefaultSize,wxTE_PROCESS_ENTER
167 , wxValidatorIntegerRelative() );
168 txtCtrl_Xspace->Connect( wxEVT_KILL_FOCUS
169 , wxFocusEventHandler(myWnd_EditBackground::Evt_bgParamFocusOut)
170 , NULL, this);
171 txtCtrl_Xspace->Connect( wxEVT_COMMAND_TEXT_ENTER
172 , wxCommandEventHandler(myWnd_EditBackground::Evt_bgParamChange )
173 , NULL, this);
174 txtCtrl_Xspace->SetMinSize( wxSize( BTN_W, wxDefaultCoord));
175 txtCtrl_Xspace->SetMaxSize( wxSize( BTN_W, wxDefaultCoord));
176 t_sizer2->Add( txtCtrl_Xspace
177 ,0,wxALL, BORDERS_SIZES );
178 t_sizer_top->Add( t_sizer2, 0, wxALL, 2 );
180 // Zspace
181 t_sizer2 = new wxBoxSizer( wxVERTICAL );
182 t_sizer2->Add( new wxStaticText( this, wxID_ANY, wxT("zSpace") )
183 ,0,wxALL, BORDERS_SIZES );
184 txtCtrl_Zspace = new wxTextCtrl(this, wxID_ANY
185 , wxString(), wxDefaultPosition,wxDefaultSize,wxTE_PROCESS_ENTER
186 , wxValidatorIntegerRelative() );
187 txtCtrl_Zspace->Connect( wxEVT_KILL_FOCUS
188 , wxFocusEventHandler(myWnd_EditBackground::Evt_bgParamFocusOut)
189 , NULL, this);
190 txtCtrl_Zspace->Connect( wxEVT_COMMAND_TEXT_ENTER
191 , wxCommandEventHandler(myWnd_EditBackground::Evt_bgParamChange )
192 , NULL, this);
193 txtCtrl_Zspace->SetMinSize( wxSize( BTN_W, wxDefaultCoord));
194 txtCtrl_Zspace->SetMaxSize( wxSize( BTN_W, wxDefaultCoord));
195 t_sizer2->Add( txtCtrl_Zspace
196 ,0,wxALL, BORDERS_SIZES );
197 t_sizer_top->Add( t_sizer2, 0, wxALL, 2 );
199 // Xrepeat
200 t_sizer2 = new wxBoxSizer( wxVERTICAL );
201 t_sizer2->Add( new wxStaticText( this, wxID_ANY, wxT("xRep" ))
202 ,0,wxALL, BORDERS_SIZES );
203 txtCtrl_Xrepeat = new wxTextCtrl(this, wxID_ANY
204 , wxString(), wxDefaultPosition,wxDefaultSize,wxTE_PROCESS_ENTER
205 , wxValidatorIntegerRelative() );
206 txtCtrl_Xrepeat->Connect( wxEVT_KILL_FOCUS
207 , wxFocusEventHandler(myWnd_EditBackground::Evt_bgParamFocusOut)
208 , NULL, this);
209 txtCtrl_Xrepeat->Connect( wxEVT_COMMAND_TEXT_ENTER
210 , wxCommandEventHandler(myWnd_EditBackground::Evt_bgParamChange )
211 , NULL, this);
212 txtCtrl_Xrepeat->SetMinSize( wxSize( BTN_W, wxDefaultCoord));
213 txtCtrl_Xrepeat->SetMaxSize( wxSize( BTN_W, wxDefaultCoord));
214 t_sizer2->Add( txtCtrl_Xrepeat
215 ,0,wxALL, BORDERS_SIZES );
216 t_sizer_top->Add( t_sizer2, 0, wxALL, 2 );
218 // Zrepeat
219 t_sizer2 = new wxBoxSizer( wxVERTICAL );
220 t_sizer2->Add( new wxStaticText( this, wxID_ANY, wxT("zRep" ))
221 ,0,wxALL, BORDERS_SIZES );
222 txtCtrl_Zrepeat = new wxTextCtrl(this, wxID_ANY
223 , wxString(), wxDefaultPosition,wxDefaultSize,wxTE_PROCESS_ENTER
224 , wxValidatorIntegerRelative() );
225 txtCtrl_Zrepeat->Connect( wxEVT_KILL_FOCUS
226 , wxFocusEventHandler(myWnd_EditBackground::Evt_bgParamFocusOut)
227 , NULL, this);
228 txtCtrl_Zrepeat->Connect( wxEVT_COMMAND_TEXT_ENTER
229 , wxCommandEventHandler(myWnd_EditBackground::Evt_bgParamChange )
230 , NULL, this);
231 txtCtrl_Zrepeat->SetMinSize( wxSize( BTN_W, wxDefaultCoord));
232 txtCtrl_Zrepeat->SetMaxSize( wxSize( BTN_W, wxDefaultCoord));
233 t_sizer2->Add( txtCtrl_Zrepeat
234 ,0,wxALL, BORDERS_SIZES );
235 t_sizer_top->Add( t_sizer2, 0, wxALL, 2 );
237 // Transparency
238 t_sizer2 = new wxBoxSizer( wxVERTICAL );
239 t_sizer2->Add( new wxStaticText( this, wxID_ANY, wxT("Trans" ))
240 ,0,wxALL, BORDERS_SIZES );
241 chkCtrl_transparency = new wxCheckBox(this, wxID_ANY, wxString() );
242 chkCtrl_transparency->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED
243 , wxCommandEventHandler(myWnd_EditBackground::Evt_bgParamChange )
244 , NULL, this);
245 chkCtrl_transparency->SetMinSize( wxSize( BTN_W, wxDefaultCoord));
246 chkCtrl_transparency->SetMaxSize( wxSize( BTN_W, wxDefaultCoord));
247 t_sizer2->Add( chkCtrl_transparency
248 ,0,wxALL, BORDERS_SIZES );
249 t_sizer_top->Add( t_sizer2, 0, wxALL, 2 );
251 // Alpha
252 t_sizer2 = new wxBoxSizer( wxVERTICAL );
253 t_sizer2->Add( new wxStaticText( this, wxID_ANY, wxT("Alpha" ))
254 ,0,wxALL, BORDERS_SIZES );
255 comboCtrl_alpha = new wxComboBox(this, wxID_ANY, wxT("0")
256 , wxDefaultPosition,wxDefaultSize
257 , 7, alphaChoices
258 , wxCB_READONLY|wxCB_DROPDOWN );
259 comboCtrl_alpha->Connect( wxEVT_COMMAND_TEXT_UPDATED
260 , wxCommandEventHandler(myWnd_EditBackground::Evt_bgParamChange )
261 , NULL, this );
262 comboCtrl_alpha->SetMinSize( wxSize( BTN_W, wxDefaultCoord));
263 comboCtrl_alpha->SetMaxSize( wxSize( BTN_W, wxDefaultCoord));
264 t_sizer2->Add( comboCtrl_alpha
265 ,0,wxALL, BORDERS_SIZES );
266 t_sizer_top->Add( t_sizer2, 0, wxALL, 2 );
268 t_sizer_top->AddStretchSpacer();
270 //-------------------------------------
271 sizer_main->Add( sizer_middle, 1, wxEXPAND );
273 //-------------------------------------
274 //Left
275 t_sizer = new wxBoxSizer( wxVERTICAL );
276 sizer_middle->Add( t_sizer, 0, wxEXPAND );
278 // List of layers avalaile + Button Add
279 t_sizer2 = new wxBoxSizer( wxHORIZONTAL );
280 t_sizer->Add( t_sizer2, 0, 0 );
282 t_btn = new wxButton( this, wxID_ANY, wxT("Move Up") );
283 t_btn->Connect( wxEVT_COMMAND_BUTTON_CLICKED
284 , wxCommandEventHandler(myWnd_EditBackground::Evt_MoveLayerUp)
285 , NULL, this);
286 t_sizer2->Add( t_btn, 0, wxALL, 3 );
288 t_btn = new wxButton( this, wxID_ANY, wxT("Move Down") );
289 t_btn->Connect( wxEVT_COMMAND_BUTTON_CLICKED
290 , wxCommandEventHandler(myWnd_EditBackground::Evt_MoveLayerDown)
291 , NULL, this);
292 t_sizer2->Add( t_btn, 0, wxALL, 3 );
294 t_sizer2 = new wxBoxSizer( wxHORIZONTAL );
295 t_sizer->Add( t_sizer2, 0, 0 );
297 t_btn = new wxButton( this, wxID_ANY, wxT("New Layer" ));
298 t_btn->Connect( wxEVT_COMMAND_BUTTON_CLICKED
299 , wxCommandEventHandler(myWnd_EditBackground::Evt_NewLayer)
300 , NULL, this);
301 t_sizer2->Add( t_btn, 0, wxALL, 3 );
303 t_btn = new wxButton( this, wxID_ANY, wxT("Delete Layer") );
304 t_btn->Connect( wxEVT_COMMAND_BUTTON_CLICKED
305 , wxCommandEventHandler(myWnd_EditBackground::Evt_DeleteLayer)
306 , NULL, this);
307 t_sizer2->Add( t_btn, 0, wxALL, 3 );
311 //-------------------------------------
312 // the list of Layers Here
313 listCtrl_bg = new wxListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
314 0, NULL,
315 wxLB_SINGLE | wxLB_NEEDED_SB );
316 listCtrl_bg->Connect( wxEVT_COMMAND_LISTBOX_SELECTED
317 , wxCommandEventHandler(myWnd_EditBackground::Evt_SelectedChange)
318 , NULL, this);
319 listCtrl_bg->Connect( wxEVT_LEFT_DCLICK
320 , wxMouseEventHandler(myWnd_EditBackground::Evt_SelectedDblCick)
321 , NULL, this);
322 t_sizer->Add( listCtrl_bg, 1, wxEXPAND | wxALL, 3 );
325 //-------------------------------------
326 //-------------------------------------
327 // Right
328 // View of the layers
329 sceneView = new Panel_SceneView( this
330 , stage, stage_declaration, stage_set
332 sizer_middle->Add( sceneView, 1, wxEXPAND );
334 //-------------------------------------
335 // Down
336 t_sizer = new wxBoxSizer( wxHORIZONTAL );
337 sizer_main->Add( t_sizer, 0, wxEXPAND );
339 t_sizer->AddStretchSpacer(3);
341 // Btns OK CANCEL
342 t_btn = new wxButton( this, wxID_ANY, wxT("OK") );
343 t_btn->Connect( wxEVT_COMMAND_BUTTON_CLICKED
344 , wxCommandEventHandler(myWnd_EditBackground::Evt_OK)
345 , NULL, this);
346 t_sizer->Add( t_btn, 0, wxALL, 3 );
348 t_sizer->AddStretchSpacer();
350 t_btn = new wxButton( this, wxID_ANY, wxT("Cancel" ));
351 t_btn->Connect( wxEVT_COMMAND_BUTTON_CLICKED
352 , wxCommandEventHandler(myWnd_EditBackground::Evt_Cancel)
353 , NULL, this);
354 t_sizer->Add( t_btn, 0, wxALL, 3 );
356 t_sizer->AddStretchSpacer(3);
359 //***********************************
360 // Finalisation of the window
361 SetMinSize( wxSize( 780,530) );
362 SetSizer( sizer_main );
363 Show();
364 Frame_RestorePrevCoord( this, wxT("editBackground_frame"));
366 // Initialisations
367 Init();
368 b_initialised = true;
372 //****************************************************
373 void
374 myWnd_EditBackground::Init()
376 if( stage == NULL )
377 return;
379 nb_layers = 0;
380 oLayers = new ob_BG_Layer*[MAX_LAYERS];
382 ob_BG_Layer** t_objs = (ob_BG_Layer**)
383 stage->GetSubObjectS_ofType( OB_TYPE_BG_LAYER, nb_layers );
385 // On place l'objet background en premier
386 bool b_found = false;
387 for( size_t i = 0; i < nb_layers; i++)
389 if( t_objs[i]->name.Upper() == wxT("BACKGROUND" ))
391 if( i > 0 )
393 ob_BG_Layer* t = t_objs[0];
394 for( size_t j = i; j > 0; j-- )
395 t_objs[j] = t_objs[j-1];
396 t_objs[0] = t;
397 t_objs[1]->InsertObject_Before( t );
398 b_changed = true;
400 b_found = true;
401 break;
405 if( b_found == false )
407 wxMessageBox( wxT("No background Found !"), wxT("WARNING")
408 , wxICON_EXCLAMATION | wxOK );
412 // On fait des copies des objets
413 for( size_t i = 0; i < nb_layers; i++)
414 oLayers[i] = (ob_BG_Layer*) t_objs[i]->Clone();
416 if( nb_layers > 0 )
417 delete[] t_objs;
419 for( size_t i = 0; i < nb_layers; i++)
421 // On normalise les objets bgLayers
422 oLayers[i]->FillMissings();
424 // On remplit la liste avec les nom des objets
425 wxString item_str = oLayers[i]->name;
426 if( i > 0 )
427 item_str = oLayers[i]->GetName();
429 listCtrl_bg->Append( item_str );
432 // Fill the Association Old New array
433 oMap_OldNew_Layers__size = nb_layers;
434 if( nb_layers > 0 )
436 oMap_OldNew_Layers = new ob_BG_Layer*[nb_layers];
437 for( size_t i = 0; i < nb_layers; i++ )
438 oMap_OldNew_Layers[i] = oLayers[i];
441 // On selectionne le premier
442 listCtrl_bg->Select( 0 );
444 // On Update les val des champs
445 Update_Layer_Vals();
447 // On assigne puis dessine les layers
448 sceneView->Set_Background( oLayers, nb_layers );
449 Update_Layers_View();
453 //****************************************************
454 void
455 myWnd_EditBackground::EvtActivate( wxActivateEvent& evt )
457 evt.Skip();
460 //****************************************************
461 void
462 myWnd_EditBackground::EvtClose( wxCloseEvent& evt )
464 Frame_SaveCoord( this, wxT("editBackground_frame"));
465 evt.Skip();
469 //****************************************************
471 myWnd_EditBackground::~myWnd_EditBackground()
473 b_initialised = false;
475 size_t t_nb_layers = nb_layers;
476 nb_layers = 0;
478 if( oLayers != NULL )
480 for( size_t i = 0; i < t_nb_layers; i++ )
481 if( oLayers[i] != NULL )
482 delete oLayers[i];
483 delete[] oLayers;
486 if( oMap_OldNew_Layers != NULL )
487 delete[] oMap_OldNew_Layers;
491 //****************************************************
492 void
493 myWnd_EditBackground::Zero_Layer_Vals()
495 ctrl_path->SetObPath(wxT("data"));
496 txtCtrl_Xratio->SetValue( wxT("1" ));
497 txtCtrl_Zratio->SetValue( wxT("1" ));
498 txtCtrl_Xpos->SetValue( wxT("0" ));
499 txtCtrl_Zpos->SetValue( wxT("0" ));
500 txtCtrl_Xspace->SetValue( wxT("0" ));
501 txtCtrl_Zspace->SetValue( wxT("0" ));
502 txtCtrl_Xrepeat->SetValue( wxT("5000") );
503 txtCtrl_Zrepeat->SetValue( wxT("5000") );;
504 chkCtrl_transparency->SetValue( true );;
505 comboCtrl_alpha->SetValue( wxT("0") );
509 //****************************************************
510 void
511 myWnd_EditBackground::Update_Layer_Vals()
513 b_updating_vals = true;
515 int num = listCtrl_bg->GetSelection();
516 if( num == wxNOT_FOUND || num >= (int) nb_layers )
518 Zero_Layer_Vals();
519 b_updating_vals = false;
520 return;
523 int i = 0;
524 wxString t ;
526 t = oLayers[num]->GetToken( i );
527 ctrl_path->SetObPath(t);
528 i++;
530 t = oLayers[num]->GetToken( i );
531 i++;
532 txtCtrl_Xratio->SetValue( t );
534 t = oLayers[num]->GetToken( i );
535 i++;
536 txtCtrl_Zratio->SetValue( t );
538 t = oLayers[num]->GetToken( i );
539 i++;
540 txtCtrl_Xpos->SetValue( t );
542 t = oLayers[num]->GetToken( i );
543 i++;
544 txtCtrl_Zpos->SetValue( t );
546 t = oLayers[num]->GetToken( i );
547 i++;
548 txtCtrl_Xspace->SetValue( t );
550 t = oLayers[num]->GetToken( i );
551 i++;
552 txtCtrl_Zspace->SetValue( t );
554 t = oLayers[num]->GetToken( i );
555 i++;
556 txtCtrl_Xrepeat->SetValue( t );
558 t = oLayers[num]->GetToken( i );
559 i++;
560 txtCtrl_Zrepeat->SetValue( t );
562 t = oLayers[num]->GetToken( i );
563 i++;
564 chkCtrl_transparency->SetValue( t == wxT("1") );
566 t = oLayers[num]->GetToken( i );
567 i++;
568 comboCtrl_alpha->SetValue( t );
570 b_updating_vals = false;
573 //****************************************************
574 void
575 myWnd_EditBackground::Evt_bgParamFocusOut( wxFocusEvent& dummy )
577 Check_Param_Change();
580 //****************************************************
581 void
582 myWnd_EditBackground::Evt_bgParamChange( wxCommandEvent& evt_ctrl )
584 Check_Param_Change();
587 //****************************************************
588 void
589 myWnd_EditBackground::Check_Param_Change()
591 if( b_initialised == false || b_updating_vals == true )
592 return;
594 int num = listCtrl_bg->GetSelection();
595 if( num == wxNOT_FOUND || num >= (int) nb_layers )
597 Zero_Layer_Vals();
598 return;
601 bool b_update_view = false;
602 wxString t, t2, t3;
603 int i = 0;
605 // Check the values given
606 t = ctrl_path->GetObPath();
607 if( t != oLayers[num]->GetToken( i ) )
609 b_update_view = true;
610 oLayers[num]->SetToken( i, t );
612 i++;
614 t = txtCtrl_Xratio->GetValue();
615 if( t != oLayers[num]->GetToken( i ) )
617 b_update_view = true;
618 oLayers[num]->SetToken( i, t );
620 i++;
622 t = txtCtrl_Zratio->GetValue();
623 if( t != oLayers[num]->GetToken( i ) )
625 b_update_view = true;
626 oLayers[num]->SetToken( i, t );
628 i++;
630 t = txtCtrl_Xpos->GetValue();
631 if( t != oLayers[num]->GetToken( i ) )
633 b_update_view = true;
634 oLayers[num]->SetToken( i, t );
636 i++;
638 t = txtCtrl_Zpos->GetValue();
639 if( t != oLayers[num]->GetToken( i ) )
641 b_update_view = true;
642 oLayers[num]->SetToken( i, t );
644 i++;
646 t = txtCtrl_Xspace->GetValue();
647 if( t != oLayers[num]->GetToken( i ) )
649 b_update_view = true;
650 oLayers[num]->SetToken( i, t );
652 i++;
654 t = txtCtrl_Zspace->GetValue();
655 if( t != oLayers[num]->GetToken( i ) )
657 b_update_view = true;
658 oLayers[num]->SetToken( i, t );
660 i++;
662 t = txtCtrl_Xrepeat->GetValue();
663 if( t != oLayers[num]->GetToken( i ) )
665 b_update_view = true;
666 oLayers[num]->SetToken( i, t );
668 i++;
670 t = txtCtrl_Zrepeat->GetValue();
671 if( t != oLayers[num]->GetToken( i ) )
673 b_update_view = true;
674 oLayers[num]->SetToken( i, t );
676 i++;
678 t = chkCtrl_transparency->GetValue() ? wxT("1") : wxT("0");
679 if( t != oLayers[num]->GetToken( i ) )
681 b_update_view = true;
682 oLayers[num]->SetToken( i, t );
684 i++;
686 t = comboCtrl_alpha->GetValue();
687 if( t != oLayers[num]->GetToken( i ) )
688 oLayers[num]->SetToken( i, t );
689 i++;
691 if( oLayers[num]->name.Upper() != wxT("BACKGROUND") )
692 listCtrl_bg->SetString( num, oLayers[num]->GetName() );
694 if( b_update_view == true )
695 Update_Layers_View();
699 //****************************************************
700 void
701 myWnd_EditBackground::Update_Layers_View()
703 if( nb_layers == 0 )
704 return;
706 sceneView->Update_View();
707 return;
711 //****************************************************
712 void
713 myWnd_EditBackground::EvtResize( wxSizeEvent& evt )
715 evt.Skip();
718 //****************************************************
719 void
720 myWnd_EditBackground::Evt_OK( wxCommandEvent& evt_menu )
722 // Have to see if something is changed
723 if( stage != NULL && nb_layers > 0 )
725 size_t orig_nb_layers = 0;
726 ob_BG_Layer** orig_Layers = (ob_BG_Layer**)
727 stage->GetSubObjectS_ofType( OB_TYPE_BG_LAYER, orig_nb_layers );
729 // Update layers previously in the levels file
730 bool* b_updated = NULL;
731 if( nb_layers > 0 )
732 b_updated = new bool[nb_layers];
734 for( size_t i = 0; i < nb_layers; i++)
736 b_updated[i] = false;
737 for( size_t j = 0; j < oMap_OldNew_Layers__size; j++ )
739 if( oMap_OldNew_Layers[j] != NULL
740 && oMap_OldNew_Layers[j] == oLayers[i] )
742 b_updated[i] = true;
743 b_changed = b_changed ||
744 orig_Layers[j]->Update_With( oLayers[i] );
745 break;
750 // Delete layers previously in the levels file wich have been deleted
751 for( size_t j = 0; j < oMap_OldNew_Layers__size; j++ )
753 if( oMap_OldNew_Layers[j] == NULL )
755 b_changed = true;
756 delete orig_Layers[j];
757 orig_Layers[j] = NULL;
761 // Reordering previously existing layers
762 if( orig_nb_layers > 0 )
764 // Get the remappings of the indices
765 size_t* lay_remaps = new size_t[orig_nb_layers];
766 for( size_t j = 0; j < nb_layers; j++ )
768 lay_remaps[j] = 666;
769 for( size_t i = 0; i < orig_nb_layers; i++ )
771 if( oMap_OldNew_Layers[i] == oLayers[j] )
773 lay_remaps[j] = i;
774 if( lay_remaps[j] != i )
775 b_changed = true;
776 break;
781 // 0 ==> background, already there
782 ob_BG_Layer* prev = orig_Layers[0];
783 for( size_t i = 0; i < orig_nb_layers; i++)
785 if( lay_remaps[i] == 666 )
786 continue;
788 prev->InsertObject_After( orig_Layers[lay_remaps[i]] );
789 prev = orig_Layers[lay_remaps[i]];
792 delete[] lay_remaps;
796 ob_BG_Layer* prev_layer = orig_Layers[0]; // The background already exists
797 for( size_t i = 1; i < nb_layers; i++)
799 // New layer
800 if( b_updated[i] == false )
802 ob_BG_Layer* new_layer = (ob_BG_Layer*) oLayers[i]->Clone();
803 if( prev_layer->InsertObject_After( new_layer ) == false )
805 wxMessageBox( wxT("Unable to insert bgLayer !"), wxT("ERROR !!")
806 , wxICON_EXCLAMATION | wxOK );
807 delete new_layer;
809 else
811 b_changed = true;
812 prev_layer = new_layer;
815 else
816 prev_layer = (ob_BG_Layer*) prev_layer->next;
819 if( b_updated != NULL )
820 delete[] b_updated;
821 if( orig_Layers != NULL )
822 delete[] orig_Layers;
825 Close();
829 //****************************************************
830 void
831 myWnd_EditBackground::Evt_Cancel( wxCommandEvent& evt_menu )
833 Close();
836 //****************************************************
837 void
838 myWnd_EditBackground::Evt_SelectedChange( wxCommandEvent& evt_menu )
840 if( b_not_update_vals == true )
841 return;
843 int num = listCtrl_bg->GetSelection();
844 if( num == wxNOT_FOUND || num >= (int) nb_layers )
845 return;
847 Update_Layer_Vals();
850 //****************************************************
851 void
852 myWnd_EditBackground::Evt_SelectedDblCick( wxMouseEvent& evt )
854 if( b_not_update_vals == true )
855 return;
857 int num = listCtrl_bg->GetSelection();
858 if( num == wxNOT_FOUND || num >= (int) nb_layers )
859 return;
861 myWnd_BGProperties t( this, oLayers[num], false );
862 t.ShowModal();
864 if( t.b_chg == true )
866 Update_Layer_Vals();
867 Update_Layers_View();
872 //****************************************************
873 void
874 myWnd_EditBackground::Evt_MoveLayerUp( wxCommandEvent& evt_menu )
876 int num = listCtrl_bg->GetSelection();
877 if( num == wxNOT_FOUND || num >= (int) nb_layers || num <= 1 )
878 return;
880 if( num == 0 )
881 return;
883 ob_BG_Layer* t = oLayers[num-1];
884 oLayers[num-1] = oLayers[num];
885 oLayers[num ] = t;
887 b_not_update_vals = true;
888 listCtrl_bg->SetString( num-1, oLayers[num-1]->GetName() );
889 listCtrl_bg->SetString( num, oLayers[num ]->GetName() );
890 listCtrl_bg->Select( num-1 );
891 b_not_update_vals = false;
893 // Update stuffs
894 Update_Layers_View();
897 //****************************************************
898 void
899 myWnd_EditBackground::Evt_MoveLayerDown( wxCommandEvent& evt_menu )
901 int num = listCtrl_bg->GetSelection();
902 if( num == wxNOT_FOUND || num >= (int) nb_layers - 1 || num == 0 )
903 return;
905 if( num == (int) nb_layers )
906 return;
908 ob_BG_Layer* t = oLayers[num+1];
909 oLayers[num+1] = oLayers[num];
910 oLayers[num ] = t;
912 b_not_update_vals = true;
913 listCtrl_bg->SetString( num+1, oLayers[num+1]->GetName() );
914 listCtrl_bg->SetString( num, oLayers[num ]->GetName() );
915 listCtrl_bg->Select( num+1 );
916 b_not_update_vals = false;
918 // Update stuffs
919 Update_Layers_View();
922 //****************************************************
923 void
924 myWnd_EditBackground::Evt_NewLayer( wxCommandEvent& evt_menu )
926 myWnd_BGProperties t( this, NULL, false );
927 t.ShowModal();
929 if( t.theObj == NULL )
930 return;
932 if( (int) nb_layers >= MAX_LAYERS )
934 delete t.theObj;
935 t.theObj = NULL;
936 wxMessageBox( wxT("TOO MUCH LAYERS !") );
937 return;
940 // Add it to the layer list
941 oLayers[nb_layers] = (ob_BG_Layer*) t.theObj;
942 nb_layers++;
944 // Add it to the Control list
945 listCtrl_bg->Append( ((ob_BG_Layer*) t.theObj)->GetName() );
946 listCtrl_bg->Select( nb_layers - 1 );
948 // Update stuffs
949 Update_Layer_Vals();
950 Update_Layers_View();
953 //****************************************************
954 void
955 myWnd_EditBackground::Evt_DeleteLayer( wxCommandEvent& evt_menu )
957 if( nb_layers == 0 )
958 return;
960 int num = listCtrl_bg->GetSelection();
961 if( num == wxNOT_FOUND || num >= (int) nb_layers )
962 return;
964 int res = wxMessageBox( wxT("Sure to delete this layer ?"), wxT("Warning !")
965 , wxICON_EXCLAMATION | wxYES_NO, this );
966 if( res != wxYES )
967 return;
969 // Update the associtaion memory array
970 for( size_t i = 0; i < oMap_OldNew_Layers__size; i++)
971 if( oMap_OldNew_Layers[i] == oLayers[num] )
973 oMap_OldNew_Layers[i] = NULL;
974 break;
977 delete oLayers[num];
979 for( int i = num; i < (int)nb_layers-1; i++ )
980 oLayers[i] = oLayers[i+1];
981 nb_layers--;
983 listCtrl_bg->Delete( num );
985 if( nb_layers == 0 )
987 Update_Layers_View();
988 return;
991 if( num >= (int) nb_layers )
992 num = nb_layers-1;
993 listCtrl_bg->Select( num );
994 Update_Layer_Vals();
995 Update_Layers_View();
998 //****************************************************
999 //****************************************************
1000 //****************************************************
1002 BEGIN_EVENT_TABLE(myWnd_EditBackground, wxDialog)
1003 EVT_ACTIVATE(myWnd_EditBackground::EvtActivate)
1004 EVT_CLOSE( myWnd_EditBackground::EvtClose )
1005 EVT_SIZE(myWnd_EditBackground::EvtResize)
1006 END_EVENT_TABLE()