36 wxBoxSizer *mainSizer =
new wxBoxSizer(wxVERTICAL);
39 wxStaticText *header =
new wxStaticText(
this, wxID_ANY,
"Recent Projects");
40 wxFont headerFont = header->GetFont();
41 headerFont.SetPointSize(headerFont.GetPointSize() + 2);
42 headerFont.MakeBold();
43 header->SetFont(headerFont);
44 mainSizer->Add(header, 0, wxALL, 10);
47 wxSplitterWindow *splitter =
48 new wxSplitterWindow(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_3D | wxSP_LIVE_UPDATE);
51 wxPanel *leftPanel =
new wxPanel(splitter);
52 wxBoxSizer *leftSizer =
new wxBoxSizer(wxVERTICAL);
55 wxLC_REPORT | wxLC_SINGLE_SEL | wxBORDER_SUNKEN);
56 m_projectList->InsertColumn(0,
"Project Name", wxLIST_FORMAT_LEFT, 200);
57 m_projectList->InsertColumn(1,
"Path", wxLIST_FORMAT_LEFT, 200);
60 leftPanel->SetSizer(leftSizer);
63 wxPanel *rightPanel =
new wxPanel(splitter);
64 wxBoxSizer *rightSizer =
new wxBoxSizer(wxVERTICAL);
66 wxStaticBox *detailsBox =
new wxStaticBox(rightPanel, wxID_ANY,
"Project Details");
67 wxStaticBoxSizer *detailsSizer =
new wxStaticBoxSizer(detailsBox, wxVERTICAL);
70 wxBoxSizer *nameSizer =
new wxBoxSizer(wxHORIZONTAL);
71 nameSizer->Add(
new wxStaticText(rightPanel, wxID_ANY,
"Name:"), 0, wxRIGHT, 10);
77 detailsSizer->Add(nameSizer, 0, wxEXPAND | wxALL, 5);
80 wxBoxSizer *descSizer =
new wxBoxSizer(wxHORIZONTAL);
81 descSizer->Add(
new wxStaticText(rightPanel, wxID_ANY,
"Description:"), 0, wxRIGHT, 10);
84 detailsSizer->Add(descSizer, 0, wxEXPAND | wxALL, 5);
87 wxBoxSizer *pathSizer =
new wxBoxSizer(wxHORIZONTAL);
88 pathSizer->Add(
new wxStaticText(rightPanel, wxID_ANY,
"Location:"), 0, wxRIGHT, 10);
91 detailsSizer->Add(pathSizer, 0, wxEXPAND | wxALL, 5);
94 wxBoxSizer *filesSizer =
new wxBoxSizer(wxHORIZONTAL);
95 filesSizer->Add(
new wxStaticText(rightPanel, wxID_ANY,
"Files:"), 0, wxRIGHT, 10);
98 detailsSizer->Add(filesSizer, 0, wxEXPAND | wxALL, 5);
101 wxBoxSizer *modSizer =
new wxBoxSizer(wxHORIZONTAL);
102 modSizer->Add(
new wxStaticText(rightPanel, wxID_ANY,
"Last Modified:"), 0, wxRIGHT, 10);
105 detailsSizer->Add(modSizer, 0, wxEXPAND | wxALL, 5);
107 rightSizer->Add(detailsSizer, 0, wxEXPAND | wxALL, 5);
108 rightSizer->AddStretchSpacer(1);
109 rightPanel->SetSizer(rightSizer);
112 splitter->SplitVertically(leftPanel, rightPanel, 350);
113 splitter->SetMinimumPaneSize(200);
115 mainSizer->Add(splitter, 1, wxEXPAND | wxLEFT | wxRIGHT, 10);
117 mainSizer->Add(
new wxStaticLine(
this), 0, wxEXPAND | wxALL, 10);
120 wxBoxSizer *buttonSizer =
new wxBoxSizer(wxHORIZONTAL);
124 buttonSizer->Add(
m_openBtn, 0, wxRIGHT, 5);
132 buttonSizer->AddSpacer(20);
140 buttonSizer->AddStretchSpacer(1);
142 m_cancelBtn =
new wxButton(
this, wxID_CANCEL,
"Cancel");
145 mainSizer->Add(buttonSizer, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 10);
336 int result = dialog.ShowModal();
338 if (result == wxID_OK) {
345 if (!wxFileName::DirExists(defaultProjectsDir)) {
346 wxFileName::Mkdir(defaultProjectsDir, wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL);
350 wxFileDialog saveDialog(
this,
"Save BehaviorTree Project", defaultProjectsDir,
351 wxString::FromUTF8(project->GetName()) +
".btproj",
352 "BehaviorTree Project (*.btproj)|*.btproj", wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
354 if (saveDialog.ShowModal() == wxID_OK) {
355 wxString projectPath = saveDialog.GetPath();
356 project->SetProjectFilePath(projectPath.ToStdString());
358 if (project->SaveToFile(projectPath.ToStdString())) {
361 projectManager.AddToRecentProjects(projectPath.ToStdString());
367 wxMessageBox(
"Failed to save project file.",
"Error", wxOK | wxICON_ERROR,
this);
MainFrame::OnExit MainFrame::OnNewProject MainFrame::OnCloseProject MainFrame::OnToggleMaximize MainFrame::OnPreviousScene MainFrame::OnPreferences MainFrame::OnEditorTool EVT_BUTTON(ID_MonitorTool, MainFrame::OnMonitorTool) EVT_PAINT(MainFrame