]> icculus.org git repositories - taylor/freespace2.git/blob - src/pofview/pofviewdialogs.cpp
avoid sending LAN broadcast with PXO game query
[taylor/freespace2.git] / src / pofview / pofviewdialogs.cpp
1 /*
2  * Copyright (C) Volition, Inc. 1999.  All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell
5  * or otherwise commercially exploit the source or things you created based on
6  * the source.
7  */
8
9 #include "pofview.h"
10
11 #include "res/pofview_ico.h"
12
13
14 AboutBox::AboutBox( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style )
15         : wxDialog( parent, id, title, pos, size, style )
16 {
17         this->SetSizeHints( wxDefaultSize, wxDefaultSize );
18
19         wxBoxSizer* bSizer3;
20         bSizer3 = new wxBoxSizer( wxHORIZONTAL );
21
22         m_bitmap2 = new wxStaticBitmap( this, wxID_ANY, wxBITMAP_PNG_FROM_DATA(pofview_ico), wxDefaultPosition, wxDefaultSize, 0 );
23         bSizer3->Add( m_bitmap2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 15 );
24
25         wxBoxSizer* bSizer4;
26         bSizer4 = new wxBoxSizer( wxVERTICAL );
27
28         bSizer4->SetMinSize( wxSize( 200,-1 ) );
29
30         bSizer4->Add( 0, 10, 0, wxEXPAND, 5 );
31
32         m_staticText3 = new wxStaticText( this, wxID_ANY, wxT("PofView Version 1.0"), wxDefaultPosition, wxDefaultSize, 0 );
33         m_staticText3->Wrap( -1 );
34         bSizer4->Add( m_staticText3, 0, wxALL, 5 );
35
36
37         bSizer4->Add( 0, 5, 0, 0, 5 );
38
39         m_staticText4 = new wxStaticText( this, wxID_ANY, wxT("Copyright © 1996"), wxDefaultPosition, wxDefaultSize, 0 );
40         m_staticText4->Wrap( -1 );
41         bSizer4->Add( m_staticText4, 0, wxALL, 5 );
42
43
44         bSizer4->Add( 0, 30, 0, 0, 5 );
45
46
47         bSizer3->Add( bSizer4, 1, 0, 5 );
48
49         m_button2 = new wxButton( this, wxID_OK, wxT("Ok"), wxDefaultPosition, wxDefaultSize, 0 );
50         bSizer3->Add( m_button2, 0, wxALL, 5 );
51
52
53         this->SetSizer( bSizer3 );
54         this->Layout();
55         bSizer3->Fit( this );
56
57         this->Centre( wxBOTH );
58 }
59
60 AboutBox::~AboutBox()
61 {
62 }
63
64 ///////////////////////////////////////////////////////////////////////////
65
66 BEGIN_EVENT_TABLE( SubobjectsDialog, wxDialog )
67         EVT_TREE_SEL_CHANGED( ID_OBJ_TREE, SubobjectsDialog::OnSelChanged )
68 END_EVENT_TABLE()
69
70 SubobjectsDialog::SubobjectsDialog( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style )
71         : wxDialog( parent, id, title, pos, size, style )
72 {
73         this->SetSizeHints( wxDefaultSize, wxDefaultSize );
74
75         wxBoxSizer* bSizer4;
76         bSizer4 = new wxBoxSizer( wxHORIZONTAL );
77
78         m_treeCtrlSubobjects = new wxTreeCtrl( this, ID_OBJ_TREE, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE|wxTR_HAS_BUTTONS|wxTR_LINES_AT_ROOT|wxTR_HIDE_ROOT );
79         m_treeCtrlSubobjects->SetMinSize( wxSize( 200,-1 ) );
80
81         bSizer4->Add( m_treeCtrlSubobjects, 0, wxALL|wxEXPAND, 5 );
82
83         wxFlexGridSizer* fgSizer1;
84         fgSizer1 = new wxFlexGridSizer( 0, 1, 15, 0 );
85         fgSizer1->SetFlexibleDirection( wxVERTICAL );
86         fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
87
88         wxFlexGridSizer* fgSizer2;
89         fgSizer2 = new wxFlexGridSizer( 0, 2, 0, 0 );
90         fgSizer2->SetFlexibleDirection( wxVERTICAL );
91         fgSizer2->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
92
93         m_staticTextName = new wxStaticText( this, wxID_ANY, wxT("Name:"), wxDefaultPosition, wxDefaultSize, 0 );
94         m_staticTextName->Wrap( -1 );
95         fgSizer2->Add( m_staticTextName, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
96
97         m_textCtrlName = new wxTextCtrl( this, wxID_ANY, wxT("name"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
98         fgSizer2->Add( m_textCtrlName, 0, wxALL|wxEXPAND, 5 );
99
100         m_staticTextBspGenVersion = new wxStaticText( this, wxID_ANY, wxT("BspGen Version:"), wxDefaultPosition, wxDefaultSize, 0 );
101         m_staticTextBspGenVersion->Wrap( -1 );
102         fgSizer2->Add( m_staticTextBspGenVersion, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
103
104         m_textCtrlBspGenVersion = new wxTextCtrl( this, wxID_ANY, wxT("1.1"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
105         fgSizer2->Add( m_textCtrlBspGenVersion, 0, wxALL|wxEXPAND, 5 );
106
107         m_staticTextPolys = new wxStaticText( this, wxID_ANY, wxT("Polys:"), wxDefaultPosition, wxDefaultSize, 0 );
108         m_staticTextPolys->Wrap( -1 );
109         fgSizer2->Add( m_staticTextPolys, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
110
111         m_textCtrlNumPolys = new wxTextCtrl( this, wxID_ANY, wxT("1000"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
112         fgSizer2->Add( m_textCtrlNumPolys, 0, wxALL|wxEXPAND, 5 );
113
114         m_staticTextVerts = new wxStaticText( this, wxID_ANY, wxT("Verts:"), wxDefaultPosition, wxDefaultSize, 0 );
115         m_staticTextVerts->Wrap( -1 );
116         fgSizer2->Add( m_staticTextVerts, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
117
118         m_textCtrlNumVerts = new wxTextCtrl( this, wxID_ANY, wxT("2000"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
119         fgSizer2->Add( m_textCtrlNumVerts, 0, wxALL|wxEXPAND, 5 );
120
121         m_staticTextMovementType = new wxStaticText( this, wxID_ANY, wxT("Movement Type:"), wxDefaultPosition, wxDefaultSize, 0 );
122         m_staticTextMovementType->Wrap( -1 );
123         fgSizer2->Add( m_staticTextMovementType, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
124
125         m_textCtrlMovementType = new wxTextCtrl( this, wxID_ANY, wxT("mt"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
126         fgSizer2->Add( m_textCtrlMovementType, 0, wxALL|wxEXPAND, 5 );
127
128         m_staticTextMovementAxis = new wxStaticText( this, wxID_ANY, wxT("Movement Axis:"), wxDefaultPosition, wxDefaultSize, 0 );
129         m_staticTextMovementAxis->Wrap( -1 );
130         fgSizer2->Add( m_staticTextMovementAxis, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
131
132         m_textCtrlMovementAxis = new wxTextCtrl( this, wxID_ANY, wxT("ma"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
133         fgSizer2->Add( m_textCtrlMovementAxis, 0, wxALL|wxEXPAND, 5 );
134
135
136         fgSizer1->Add( fgSizer2, 1, wxEXPAND, 5 );
137
138         wxStaticBoxSizer* sbSizer1;
139         sbSizer1 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Lower Detail Versions") ), wxVERTICAL );
140
141         m_staticTextDetail1 = new wxStaticText( this, wxID_ANY, wxT("detail1"), wxDefaultPosition, wxDefaultSize, 0 );
142         m_staticTextDetail1->Wrap( -1 );
143         sbSizer1->Add( m_staticTextDetail1, 0, wxLEFT, 10 );
144
145         m_staticTextDetail2 = new wxStaticText( this, wxID_ANY, wxT("detail2"), wxDefaultPosition, wxDefaultSize, 0 );
146         m_staticTextDetail2->Wrap( -1 );
147         sbSizer1->Add( m_staticTextDetail2, 0, wxLEFT, 10 );
148
149         m_staticTextDetail3 = new wxStaticText( this, wxID_ANY, wxT("detail3"), wxDefaultPosition, wxDefaultSize, 0 );
150         m_staticTextDetail3->Wrap( -1 );
151         sbSizer1->Add( m_staticTextDetail3, 0, wxLEFT, 10 );
152
153         m_staticTextDetail4 = new wxStaticText( this, wxID_ANY, wxT("detail4"), wxDefaultPosition, wxDefaultSize, 0 );
154         m_staticTextDetail4->Wrap( -1 );
155         sbSizer1->Add( m_staticTextDetail4, 0, wxLEFT, 10 );
156
157         m_staticTextDetail5 = new wxStaticText( this, wxID_ANY, wxT("detail5"), wxDefaultPosition, wxDefaultSize, 0 );
158         m_staticTextDetail5->Wrap( -1 );
159         sbSizer1->Add( m_staticTextDetail5, 0, wxLEFT, 10 );
160
161         m_staticTextDetail6 = new wxStaticText( this, wxID_ANY, wxT("detail6"), wxDefaultPosition, wxDefaultSize, 0 );
162         m_staticTextDetail6->Wrap( -1 );
163         sbSizer1->Add( m_staticTextDetail6, 0, wxLEFT, 10 );
164
165
166         fgSizer1->Add( sbSizer1, 1, wxEXPAND, 5 );
167
168         wxStaticBoxSizer* sbSizer2;
169         sbSizer2 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("POF Info") ), wxVERTICAL );
170
171         m_staticTextPOFInfo = new wxStaticText( this, wxID_ANY, wxT("pofinfo"), wxDefaultPosition, wxDefaultSize, 0 );
172         m_staticTextPOFInfo->Wrap( -1 );
173         sbSizer2->Add( m_staticTextPOFInfo, 0, wxALL, 5 );
174
175
176         fgSizer1->Add( sbSizer2, 1, wxEXPAND, 5 );
177
178
179         bSizer4->Add( fgSizer1, 1, wxEXPAND, 5 );
180
181
182         this->SetSizer( bSizer4 );
183         this->Layout();
184         bSizer4->Fit( this );
185
186         this->Centre( wxBOTH );
187
188         m_pm = NULL;
189 }
190
191 SubobjectsDialog::~SubobjectsDialog()
192 {
193 }
194
195 class subobjectItemData : public wxTreeItemData
196 {
197         private:
198                 int sm_id;
199
200         public:
201                 subobjectItemData(int sm)
202                         : wxTreeItemData()
203                 {
204                         sm_id = sm;
205                 }
206
207                 int GetSubmodelId() { return sm_id; }
208 };
209
210 void SubobjectsDialog::OnSelChanged(wxTreeEvent &event)
211 {
212         wxTreeItemId item = event.GetItem();
213
214         if ( !item.IsOk() ) {
215                 return;
216         }
217
218         int model_num = ((PofViewFrame*)GetParent())->GetModelnum();
219
220         int sm_id = ((subobjectItemData*)(m_treeCtrlSubobjects->GetItemData(item)))->GetSubmodelId();
221
222         bsp_info *sm = &m_pm->submodel[sm_id];
223
224         m_staticTextDetail1->SetLabelText("");
225         m_staticTextDetail2->SetLabelText("");
226         m_staticTextDetail3->SetLabelText("");
227         m_staticTextDetail4->SetLabelText("");
228         m_staticTextDetail5->SetLabelText("");
229         m_staticTextDetail6->SetLabelText("");
230
231         m_textCtrlName->SetValue(sm->name);
232         m_textCtrlBspGenVersion->SetValue( wxString::Format("%d.%02d", m_pm->version / 100, m_pm->version % 100));
233         m_textCtrlNumPolys->SetValue( wxString::Format("%d", submodel_get_num_polys(model_num, sm_id)) );
234         m_textCtrlNumVerts->SetValue( wxString::Format("%d", submodel_get_num_verts(model_num, sm_id)) );
235
236         switch (sm->movement_type) {
237                 case -1:
238                         m_textCtrlMovementType->SetValue("None");
239                         break;
240
241                 case 0:
242                         m_textCtrlMovementType->SetValue("Positional");
243                         break;
244
245                 case 1:
246                         m_textCtrlMovementType->SetValue("Rotational");
247                         break;
248
249                 default:
250                         m_textCtrlMovementType->SetValue("?Unknown?");
251                         break;
252         }
253
254         if (sm->movement_type == 1) {
255                 switch (sm->movement_axis) {
256                         case 0:
257                                 m_textCtrlMovementAxis->SetValue("X (Pitch)");
258                                 break;
259
260                         case 1:
261                                 m_textCtrlMovementAxis->SetValue("Y (Bank)");
262                                 break;
263
264                         case 2:
265                                 m_textCtrlMovementAxis->SetValue("Z (Heading)");
266                                 break;
267
268                         default:
269                                 m_textCtrlMovementAxis->SetValue("?Unknown?");
270                                 break;
271                 }
272         } else {
273                 m_textCtrlMovementAxis->SetValue("");
274         }
275
276         switch (sm->num_details) {
277                 case 6:
278                         m_staticTextDetail6->SetLabelText(m_pm->submodel[sm->details[5]].name);
279                 case 5:
280                         m_staticTextDetail5->SetLabelText(m_pm->submodel[sm->details[4]].name);
281                 case 4:
282                         m_staticTextDetail4->SetLabelText(m_pm->submodel[sm->details[3]].name);
283                 case 3:
284                         m_staticTextDetail3->SetLabelText(m_pm->submodel[sm->details[2]].name);
285                 case 2:
286                         m_staticTextDetail2->SetLabelText(m_pm->submodel[sm->details[1]].name);
287                 case 1:
288                         m_staticTextDetail1->SetLabelText(m_pm->submodel[sm->details[0]].name);
289         }
290
291 #ifndef NDEBUG
292         if (sm->i_replace > -1) {
293                 m_staticTextPOFInfo->SetLabelText( wxString::Format("%s\n[I replace %s]",
294                                                                                                                         m_pm->debug_info,
295                                                                                                                         m_pm->submodel[sm->i_replace].name) );
296         } else if (sm->my_replacement > -1) {
297                 m_staticTextPOFInfo->SetLabelText(wxString::Format("%s\n[My replacement %s]",
298                                                                                                                    m_pm->debug_info,
299                                                                                                                    m_pm->submodel[sm->my_replacement].name) );
300         } else {
301                 m_staticTextPOFInfo->SetLabelText(m_pm->debug_info);
302         }
303 #else
304         m_staticTextPOFInfo->SetLabelText("");
305 #endif
306 }
307
308 void SubobjectsDialog::AddModel(int sm, wxTreeItemId parent)
309 {
310         wxTreeItemId item;
311         int i;
312
313         subobjectItemData *data = new subobjectItemData(sm);
314
315         // check for live debris
316         if ( !SDL_strncasecmp("debris-", m_pm->submodel[sm].name, strlen("debris-")) ) {
317                 wxString debris_name;
318
319                 // traverse the tree and put live debris with correct submodel
320                 for (item = m_treeCtrlSubobjects->GetFirstVisibleItem(); item.IsOk(); item = m_treeCtrlSubobjects->GetNextVisible(item)) {
321                         debris_name = wxString::Format("debris-%s", m_treeCtrlSubobjects->GetItemText(item));
322
323                         int res = wxString(m_pm->submodel[sm].name).Find(debris_name);
324
325                         if (res != wxNOT_FOUND) {
326                                 item = m_treeCtrlSubobjects->AppendItem(item, m_pm->submodel[sm].name);
327                                 m_treeCtrlSubobjects->SetItemData(item, data);
328
329                                 return;
330                         }
331                 }
332         }
333
334         item = m_treeCtrlSubobjects->AppendItem(parent, m_pm->submodel[sm].name);
335
336         m_treeCtrlSubobjects->SetItemData(item, data);
337
338         for (i = m_pm->submodel[sm].first_child; i > -1; i = m_pm->submodel[i].next_sibling) {
339                 AddModel(i, item);
340         }
341 }
342
343 void SubobjectsDialog::ParseModel()
344 {
345         int model_num = ((PofViewFrame*)GetParent())->GetModelnum();
346
347         if (model_num < 0) {
348                 return;
349         }
350
351         m_pm = model_get(model_num);
352         wxASSERT( m_pm );
353
354         SetTitle( wxString::Format("%s's subobjects", ((PofViewFrame*)GetParent())->GetFileName()) );
355
356         int i;
357
358         wxTreeItemId root = m_treeCtrlSubobjects->AddRoot( wxT("root") );
359
360         // add all base submodels (ie, without parents) except live debris
361         for (i = 0; i < m_pm->n_models; i++) {
362                 if (m_pm->submodel[i].parent < 0) {
363                         // add if *not* live debris
364                         if ( SDL_strncasecmp("debris-", m_pm->submodel[i].name, strlen("debris-")) ) {
365                                 AddModel(i, root);
366                         }
367                 }
368         }
369
370         // Expand to make all tree visible for searching when adding live debris
371         m_treeCtrlSubobjects->ExpandAll();
372
373         // Now add any live debris
374         for (i = 0; i < m_pm->n_models; i++) {
375                 if (m_pm->submodel[i].parent < 0) {
376                         // add if live debris
377                         if ( !SDL_strncasecmp("debris-", m_pm->submodel[i].name, strlen("debris-")) ) {
378                                 AddModel(i, root);
379                         }
380                 }
381         }
382
383         m_treeCtrlSubobjects->CollapseAll();
384
385         wxTreeItemId item = m_treeCtrlSubobjects->GetFirstVisibleItem();
386
387         // deal with wxWidgets bug that shows hidden root as first visible
388         if ( item == m_treeCtrlSubobjects->GetRootItem() ) {
389                 wxTreeItemIdValue cookie;
390
391                 item = m_treeCtrlSubobjects->GetFirstChild(item, cookie);
392         }
393
394         // force select first item in tree and resize dialog to fit
395         m_treeCtrlSubobjects->SelectItem(item);
396
397         Fit();
398 }