2 * Copyright (C) Volition, Inc. 1999. All rights reserved.
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
11 #include "res/pofview_ico.h"
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 )
17 this->SetSizeHints( wxDefaultSize, wxDefaultSize );
20 bSizer3 = new wxBoxSizer( wxHORIZONTAL );
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 );
26 bSizer4 = new wxBoxSizer( wxVERTICAL );
28 bSizer4->SetMinSize( wxSize( 200,-1 ) );
30 bSizer4->Add( 0, 10, 0, wxEXPAND, 5 );
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 );
37 bSizer4->Add( 0, 5, 0, 0, 5 );
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 );
44 bSizer4->Add( 0, 30, 0, 0, 5 );
47 bSizer3->Add( bSizer4, 1, 0, 5 );
49 m_button2 = new wxButton( this, wxID_OK, wxT("Ok"), wxDefaultPosition, wxDefaultSize, 0 );
50 bSizer3->Add( m_button2, 0, wxALL, 5 );
53 this->SetSizer( bSizer3 );
57 this->Centre( wxBOTH );
64 ///////////////////////////////////////////////////////////////////////////
66 BEGIN_EVENT_TABLE( SubobjectsDialog, wxDialog )
67 EVT_TREE_SEL_CHANGED( ID_OBJ_TREE, SubobjectsDialog::OnSelChanged )
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 )
73 this->SetSizeHints( wxDefaultSize, wxDefaultSize );
76 bSizer4 = new wxBoxSizer( wxHORIZONTAL );
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 ) );
81 bSizer4->Add( m_treeCtrlSubobjects, 0, wxALL|wxEXPAND, 5 );
83 wxFlexGridSizer* fgSizer1;
84 fgSizer1 = new wxFlexGridSizer( 0, 1, 15, 0 );
85 fgSizer1->SetFlexibleDirection( wxVERTICAL );
86 fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
88 wxFlexGridSizer* fgSizer2;
89 fgSizer2 = new wxFlexGridSizer( 0, 2, 0, 0 );
90 fgSizer2->SetFlexibleDirection( wxVERTICAL );
91 fgSizer2->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
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 );
97 m_textCtrlName = new wxTextCtrl( this, wxID_ANY, wxT("name"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
98 fgSizer2->Add( m_textCtrlName, 0, wxALL|wxEXPAND, 5 );
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 );
104 m_textCtrlBspGenVersion = new wxTextCtrl( this, wxID_ANY, wxT("1.1"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
105 fgSizer2->Add( m_textCtrlBspGenVersion, 0, wxALL|wxEXPAND, 5 );
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 );
111 m_textCtrlNumPolys = new wxTextCtrl( this, wxID_ANY, wxT("1000"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
112 fgSizer2->Add( m_textCtrlNumPolys, 0, wxALL|wxEXPAND, 5 );
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 );
118 m_textCtrlNumVerts = new wxTextCtrl( this, wxID_ANY, wxT("2000"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
119 fgSizer2->Add( m_textCtrlNumVerts, 0, wxALL|wxEXPAND, 5 );
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 );
125 m_textCtrlMovementType = new wxTextCtrl( this, wxID_ANY, wxT("mt"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
126 fgSizer2->Add( m_textCtrlMovementType, 0, wxALL|wxEXPAND, 5 );
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 );
132 m_textCtrlMovementAxis = new wxTextCtrl( this, wxID_ANY, wxT("ma"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
133 fgSizer2->Add( m_textCtrlMovementAxis, 0, wxALL|wxEXPAND, 5 );
136 fgSizer1->Add( fgSizer2, 1, wxEXPAND, 5 );
138 wxStaticBoxSizer* sbSizer1;
139 sbSizer1 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Lower Detail Versions") ), wxVERTICAL );
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 );
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 );
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 );
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 );
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 );
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 );
166 fgSizer1->Add( sbSizer1, 1, wxEXPAND, 5 );
168 wxStaticBoxSizer* sbSizer2;
169 sbSizer2 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("POF Info") ), wxVERTICAL );
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 );
176 fgSizer1->Add( sbSizer2, 1, wxEXPAND, 5 );
179 bSizer4->Add( fgSizer1, 1, wxEXPAND, 5 );
182 this->SetSizer( bSizer4 );
184 bSizer4->Fit( this );
186 this->Centre( wxBOTH );
191 SubobjectsDialog::~SubobjectsDialog()
195 class subobjectItemData : public wxTreeItemData
201 subobjectItemData(int sm)
207 int GetSubmodelId() { return sm_id; }
210 void SubobjectsDialog::OnSelChanged(wxTreeEvent &event)
212 wxTreeItemId item = event.GetItem();
214 if ( !item.IsOk() ) {
218 int model_num = ((PofViewFrame*)GetParent())->GetModelnum();
220 int sm_id = ((subobjectItemData*)(m_treeCtrlSubobjects->GetItemData(item)))->GetSubmodelId();
222 bsp_info *sm = &m_pm->submodel[sm_id];
224 m_staticTextDetail1->SetLabelText("");
225 m_staticTextDetail2->SetLabelText("");
226 m_staticTextDetail3->SetLabelText("");
227 m_staticTextDetail4->SetLabelText("");
228 m_staticTextDetail5->SetLabelText("");
229 m_staticTextDetail6->SetLabelText("");
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)) );
236 switch (sm->movement_type) {
238 m_textCtrlMovementType->SetValue("None");
242 m_textCtrlMovementType->SetValue("Positional");
246 m_textCtrlMovementType->SetValue("Rotational");
250 m_textCtrlMovementType->SetValue("?Unknown?");
254 if (sm->movement_type == 1) {
255 switch (sm->movement_axis) {
257 m_textCtrlMovementAxis->SetValue("X (Pitch)");
261 m_textCtrlMovementAxis->SetValue("Y (Bank)");
265 m_textCtrlMovementAxis->SetValue("Z (Heading)");
269 m_textCtrlMovementAxis->SetValue("?Unknown?");
273 m_textCtrlMovementAxis->SetValue("");
276 switch (sm->num_details) {
278 m_staticTextDetail6->SetLabelText(m_pm->submodel[sm->details[5]].name);
280 m_staticTextDetail5->SetLabelText(m_pm->submodel[sm->details[4]].name);
282 m_staticTextDetail4->SetLabelText(m_pm->submodel[sm->details[3]].name);
284 m_staticTextDetail3->SetLabelText(m_pm->submodel[sm->details[2]].name);
286 m_staticTextDetail2->SetLabelText(m_pm->submodel[sm->details[1]].name);
288 m_staticTextDetail1->SetLabelText(m_pm->submodel[sm->details[0]].name);
292 if (sm->i_replace > -1) {
293 m_staticTextPOFInfo->SetLabelText( wxString::Format("%s\n[I replace %s]",
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]",
299 m_pm->submodel[sm->my_replacement].name) );
301 m_staticTextPOFInfo->SetLabelText(m_pm->debug_info);
304 m_staticTextPOFInfo->SetLabelText("");
308 void SubobjectsDialog::AddModel(int sm, wxTreeItemId parent)
313 subobjectItemData *data = new subobjectItemData(sm);
315 // check for live debris
316 if ( !SDL_strncasecmp("debris-", m_pm->submodel[sm].name, strlen("debris-")) ) {
317 wxString debris_name;
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));
323 int res = wxString(m_pm->submodel[sm].name).Find(debris_name);
325 if (res != wxNOT_FOUND) {
326 item = m_treeCtrlSubobjects->AppendItem(item, m_pm->submodel[sm].name);
327 m_treeCtrlSubobjects->SetItemData(item, data);
334 item = m_treeCtrlSubobjects->AppendItem(parent, m_pm->submodel[sm].name);
336 m_treeCtrlSubobjects->SetItemData(item, data);
338 for (i = m_pm->submodel[sm].first_child; i > -1; i = m_pm->submodel[i].next_sibling) {
343 void SubobjectsDialog::ParseModel()
345 int model_num = ((PofViewFrame*)GetParent())->GetModelnum();
351 m_pm = model_get(model_num);
354 SetTitle( wxString::Format("%s's subobjects", ((PofViewFrame*)GetParent())->GetFileName()) );
358 wxTreeItemId root = m_treeCtrlSubobjects->AddRoot( wxT("root") );
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-")) ) {
370 // Expand to make all tree visible for searching when adding live debris
371 m_treeCtrlSubobjects->ExpandAll();
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-")) ) {
383 m_treeCtrlSubobjects->CollapseAll();
385 wxTreeItemId item = m_treeCtrlSubobjects->GetFirstVisibleItem();
387 // deal with wxWidgets bug that shows hidden root as first visible
388 if ( item == m_treeCtrlSubobjects->GetRootItem() ) {
389 wxTreeItemIdValue cookie;
391 item = m_treeCtrlSubobjects->GetFirstChild(item, cookie);
394 // force select first item in tree and resize dialog to fit
395 m_treeCtrlSubobjects->SelectItem(item);