From c49b48df010c97553aec80491c8fb505e21bcbf1 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Fri, 23 Dec 2022 16:49:33 +0100 Subject: [PATCH] Improve db tab --- src/base_tab/BaseGameTab.cpp | 127 +++++++++ src/base_tab/BaseGameTab.hpp | 28 ++ src/base_tab/BaseImportTab.cpp | 8 + src/base_tab/BaseImportTab.hpp | 10 + src/base_tab/BaseTab.cpp | 126 +-------- src/base_tab/BaseTab.hpp | 21 +- src/gui.cpp | 48 +++- src/gui.h | 28 +- tools/wxFrameBuilder.fbp | 465 +++++++++++++++++++++++++++++++-- 9 files changed, 711 insertions(+), 150 deletions(-) create mode 100644 src/base_tab/BaseGameTab.cpp create mode 100644 src/base_tab/BaseGameTab.hpp create mode 100644 src/base_tab/BaseImportTab.cpp create mode 100644 src/base_tab/BaseImportTab.hpp diff --git a/src/base_tab/BaseGameTab.cpp b/src/base_tab/BaseGameTab.cpp new file mode 100644 index 0000000..79f28c1 --- /dev/null +++ b/src/base_tab/BaseGameTab.cpp @@ -0,0 +1,127 @@ +#include "BaseGameTab.hpp" +#include "AppendGameDialog.hpp" +#include + +BaseGameTab::BaseGameTab(wxFrame *parent, std::string base_file) + : TabBase_TabGames(parent), base_file(base_file), + base(NULL) { + + game_list->InsertColumn(0, L"id", wxLIST_FORMAT_LEFT, 50); + game_list->InsertColumn(1, L"White", wxLIST_FORMAT_LEFT, 200); + game_list->InsertColumn(2, L"Black", wxLIST_FORMAT_LEFT, 200); + game_list->InsertColumn(3, L"Event", wxLIST_FORMAT_LEFT, 150); + game_list->InsertColumn(4, L"Round", wxLIST_FORMAT_LEFT, 100); + game_list->InsertColumn(5, L"Result", wxLIST_FORMAT_LEFT, 200); + game_list->InsertColumn(6, L"ECO", wxLIST_FORMAT_LEFT, 200); + + this->Bind(wxEVT_BUTTON, &BaseGameTab::OnDelete, this, ID_DELETE_BUTTON); + this->Bind(wxEVT_BUTTON, &BaseGameTab::OnSave, this, ID_SAVE_BUTTON); + this->Bind(wxEVT_BUTTON, &BaseGameTab::OnExport, this, ID_EXPORT_BUTTON); + this->Bind(wxEVT_LIST_ITEM_ACTIVATED, &BaseGameTab::OnOpenGame, this, wxID_ANY); + this->Bind(wxEVT_BUTTON, &BaseGameTab::OnImport, this, ID_IMPORT_BUTTON); + + current_base->SetLabel(base_file); + LoadFile(); +} + +void BaseGameTab::OnImport(wxCommandEvent &event) { + AppendGameDialog *dia = new AppendGameDialog(this, base); + dia->ShowModal(); + game_list->DeleteAllItems(); + deleted.clear(); + edited.clear(); + LoadFile(); +} + +void BaseGameTab::OnDelete(wxCommandEvent &event) { + long selected = -1; + + while ((selected = game_list->GetNextItem(selected, wxLIST_NEXT_ALL, + wxLIST_STATE_SELECTED)) != + wxNOT_FOUND) { + wxListItem listItem; + listItem.m_itemId = selected; // sets row + listItem.m_col = 0; // sets column + game_list->GetItem(listItem); // gets item + deleted.push_back(std::stoi(listItem.GetText().ToStdString())); + for (std::uint32_t &i : deleted) { + wxLogDebug("%d", i); + } + game_list->SetItemBackgroundColour(selected, *wxRED); + } +} + +void BaseGameTab::OnSave(wxCommandEvent &event) { + std::vector> new_games_bases; + std::vector> new_games; + new_games.insert( + new_games.end(), edited.begin(), + edited.end()); // Add edited game (since they are also deleted) + base->Save(deleted, new_games_bases, new_games); + game_list->DeleteAllItems(); + edited.clear(); + deleted.clear(); + LoadFile(); +} + +void BaseGameTab::OnOpenGame(wxListEvent &event) { + wxLogDebug("Open!"); + long id = std::stoi(event.GetItem().GetText().ToStdString()); + std::shared_ptr *g = new std::shared_ptr(base->GetGame(id)); + if (g != NULL) { + edited.push_back(*g); + deleted.push_back(id); + game_list->SetItemBackgroundColour(event.GetIndex(), *wxGREEN); + wxCommandEvent newGameEvent(NEW_GAME_EVENT, GetId()); + newGameEvent.SetEventObject(this); + newGameEvent.SetClientData(g); + ProcessEvent(newGameEvent); + } +} + +void BaseGameTab::ApplyPreferences() {} + +void BaseGameTab::OnExport(wxCommandEvent &event) { + wxFileDialog openFileDialog(this, _("Export database"), "", "", + "Database files (*.pgn)|*.pgn", + wxFD_SAVE | wxFD_OVERWRITE_PROMPT); + if (openFileDialog.ShowModal() != wxID_CANCEL) { + std::string path = openFileDialog.GetPath().ToStdString(); + wxFileName file(base_file); + wxString ext = file.GetExt().Lower(); + GameBase *base; + if (ext == "pgn") { + base = new PGNGameBase(path); + base->Export(this->base); + delete base; + } + } +} + +void BaseGameTab::LoadFile() { + wxFileName file(base_file); + wxString ext = file.GetExt().Lower(); + if (ext == "pgn") { + base = std::shared_ptr(new PGNGameBase(base_file)); + SetLabel(file.GetName() + "(PGN)"); + } + + if (base != NULL) { + long id = 0; + while (base->NextGame()) { + long index = + game_list->InsertItem(0, std::to_string(id)); // want this for col. 1 + game_list->SetItem(index, 1, base->GetTag("White")); + game_list->SetItem(index, 2, base->GetTag("Black")); + game_list->SetItem(index, 3, base->GetTag("Event")); + game_list->SetItem(index, 4, base->GetTag("Round")); + game_list->SetItem(index, 5, base->GetTag("Result")); + game_list->SetItem(index, 6, base->GetTag("ECO")); + id++; + } + } + + wxCommandEvent event(REFRESH_TAB_TITLE, GetId()); + event.SetEventObject(this); + ProcessEvent(event); +} diff --git a/src/base_tab/BaseGameTab.hpp b/src/base_tab/BaseGameTab.hpp new file mode 100644 index 0000000..d90163f --- /dev/null +++ b/src/base_tab/BaseGameTab.hpp @@ -0,0 +1,28 @@ + +#include "gamebase/GameBase.hpp" +#include "gamebase/PGNGameBase.hpp" +#include "ochess.hpp" + +// Foreign events +wxDECLARE_EVENT(NEW_GAME_EVENT, wxCommandEvent); +wxDECLARE_EVENT(REFRESH_TAB_TITLE, wxCommandEvent); + +class BaseGameTab : public TabBase_TabGames { + std::shared_ptr base; + std::vector deleted; + std::vector> edited; + std::string base_file; + +public: + BaseGameTab(wxFrame *parent, std::string base_file); + + void ApplyPreferences(); + void LoadFile(); + void OnDelete(wxCommandEvent &event); + void OnSave(wxCommandEvent &event); + void OnExport(wxCommandEvent &event); + void OnOpenGame(wxListEvent &event); + void OnImport(wxCommandEvent &event); + std::shared_ptr GetGame() { return (std::shared_ptr(NULL)); } + std::shared_ptr GetBase() { return (std::shared_ptr(base)); }; +}; \ No newline at end of file diff --git a/src/base_tab/BaseImportTab.cpp b/src/base_tab/BaseImportTab.cpp new file mode 100644 index 0000000..8b7cb1f --- /dev/null +++ b/src/base_tab/BaseImportTab.cpp @@ -0,0 +1,8 @@ +#include "BaseImportTab.hpp" + + +BaseImportTab::BaseImportTab(wxFrame *parent): +TabBase_TabImport(parent) +{ + +} diff --git a/src/base_tab/BaseImportTab.hpp b/src/base_tab/BaseImportTab.hpp new file mode 100644 index 0000000..e39f921 --- /dev/null +++ b/src/base_tab/BaseImportTab.hpp @@ -0,0 +1,10 @@ +#include "ochess.hpp" + + + +class BaseImportTab : public TabBase_TabImport { + + +public: + BaseImportTab(wxFrame *parent); +}; \ No newline at end of file diff --git a/src/base_tab/BaseTab.cpp b/src/base_tab/BaseTab.cpp index 19e9f0e..67577e0 100644 --- a/src/base_tab/BaseTab.cpp +++ b/src/base_tab/BaseTab.cpp @@ -3,125 +3,21 @@ #include BaseTab::BaseTab(wxFrame *parent, std::string base_file) - : TabBase_TabGames(parent), base_file(base_file), TabInfos(TabInfos::BASE), - base(NULL) { + : TabBase(parent), TabInfos(TabInfos::BASE){ - game_list->InsertColumn(0, L"id", wxLIST_FORMAT_LEFT, 50); - game_list->InsertColumn(1, L"White", wxLIST_FORMAT_LEFT, 200); - game_list->InsertColumn(2, L"Black", wxLIST_FORMAT_LEFT, 200); - game_list->InsertColumn(3, L"Event", wxLIST_FORMAT_LEFT, 150); - game_list->InsertColumn(4, L"Round", wxLIST_FORMAT_LEFT, 100); - game_list->InsertColumn(5, L"Result", wxLIST_FORMAT_LEFT, 200); - game_list->InsertColumn(6, L"ECO", wxLIST_FORMAT_LEFT, 200); + // Games tab + games_tab=new BaseGameTab((wxFrame *)notebook,base_file); + notebook->AddPage(games_tab, "Games",true); // true for selecting the tab - this->Bind(wxEVT_BUTTON, &BaseTab::OnDelete, this, ID_DELETE_BUTTON); - this->Bind(wxEVT_BUTTON, &BaseTab::OnSave, this, ID_SAVE_BUTTON); - this->Bind(wxEVT_BUTTON, &BaseTab::OnExport, this, ID_EXPORT_BUTTON); - this->Bind(wxEVT_LIST_ITEM_ACTIVATED, &BaseTab::OnOpenGame, this, wxID_ANY); - this->Bind(wxEVT_BUTTON, &BaseTab::OnImport, this, ID_IMPORT_BUTTON); + // Import tab + import_tab=new BaseImportTab((wxFrame *)notebook); + notebook->AddPage(import_tab, "Import"); - current_base->SetLabel(base_file); - LoadFile(); -} - -void BaseTab::OnImport(wxCommandEvent &event) { - AppendGameDialog *dia = new AppendGameDialog(this, base); - dia->ShowModal(); - game_list->DeleteAllItems(); - deleted.clear(); - edited.clear(); - LoadFile(); -} - -void BaseTab::OnDelete(wxCommandEvent &event) { - long selected = -1; - - while ((selected = game_list->GetNextItem(selected, wxLIST_NEXT_ALL, - wxLIST_STATE_SELECTED)) != - wxNOT_FOUND) { - wxListItem listItem; - listItem.m_itemId = selected; // sets row - listItem.m_col = 0; // sets column - game_list->GetItem(listItem); // gets item - deleted.push_back(std::stoi(listItem.GetText().ToStdString())); - for (std::uint32_t &i : deleted) { - wxLogDebug("%d", i); - } - game_list->SetItemBackgroundColour(selected, *wxRED); - } -} - -void BaseTab::OnSave(wxCommandEvent &event) { - std::vector> new_games_bases; - std::vector> new_games; - new_games.insert( - new_games.end(), edited.begin(), - edited.end()); // Add edited game (since they are also deleted) - base->Save(deleted, new_games_bases, new_games); - game_list->DeleteAllItems(); - edited.clear(); - deleted.clear(); - LoadFile(); -} - -void BaseTab::OnOpenGame(wxListEvent &event) { - wxLogDebug("Open!"); - long id = std::stoi(event.GetItem().GetText().ToStdString()); - std::shared_ptr *g = new std::shared_ptr(base->GetGame(id)); - if (g != NULL) { - edited.push_back(*g); - deleted.push_back(id); - game_list->SetItemBackgroundColour(event.GetIndex(), *wxGREEN); - wxCommandEvent newGameEvent(NEW_GAME_EVENT, GetId()); - newGameEvent.SetEventObject(this); - newGameEvent.SetClientData(g); - ProcessEvent(newGameEvent); - } + RefreshLabel(); } void BaseTab::ApplyPreferences() {} -void BaseTab::OnExport(wxCommandEvent &event) { - wxFileDialog openFileDialog(this, _("Export database"), "", "", - "Database files (*.pgn)|*.pgn", - wxFD_SAVE | wxFD_OVERWRITE_PROMPT); - if (openFileDialog.ShowModal() != wxID_CANCEL) { - std::string path = openFileDialog.GetPath().ToStdString(); - wxFileName file(base_file); - wxString ext = file.GetExt().Lower(); - GameBase *base; - if (ext == "pgn") { - base = new PGNGameBase(path); - base->Export(this->base); - delete base; - } - } -} - -void BaseTab::LoadFile() { - wxFileName file(base_file); - wxString ext = file.GetExt().Lower(); - if (ext == "pgn") { - base = std::shared_ptr(new PGNGameBase(base_file)); - SetLabel(file.GetName() + "(PGN)"); - } - - if (base != NULL) { - long id = 0; - while (base->NextGame()) { - long index = - game_list->InsertItem(0, std::to_string(id)); // want this for col. 1 - game_list->SetItem(index, 1, base->GetTag("White")); - game_list->SetItem(index, 2, base->GetTag("Black")); - game_list->SetItem(index, 3, base->GetTag("Event")); - game_list->SetItem(index, 4, base->GetTag("Round")); - game_list->SetItem(index, 5, base->GetTag("Result")); - game_list->SetItem(index, 6, base->GetTag("ECO")); - id++; - } - } - - wxCommandEvent event(REFRESH_TAB_TITLE, GetId()); - event.SetEventObject(this); - ProcessEvent(event); -} +void BaseTab::RefreshLabel(){ + SetLabel("Database XX"); +} \ No newline at end of file diff --git a/src/base_tab/BaseTab.hpp b/src/base_tab/BaseTab.hpp index b265414..e025c63 100644 --- a/src/base_tab/BaseTab.hpp +++ b/src/base_tab/BaseTab.hpp @@ -1,28 +1,19 @@ #include "gamebase/GameBase.hpp" -#include "gamebase/PGNGameBase.hpp" #include "ochess.hpp" +#include "BaseGameTab.hpp" +#include "BaseImportTab.hpp" -// Foreign events -wxDECLARE_EVENT(NEW_GAME_EVENT, wxCommandEvent); -wxDECLARE_EVENT(REFRESH_TAB_TITLE, wxCommandEvent); - -class BaseTab : public TabBase_TabGames, public TabInfos { +class BaseTab : public TabBase, public TabInfos { std::shared_ptr base; - std::vector deleted; - std::vector> edited; - std::string base_file; + BaseGameTab *games_tab; + BaseImportTab *import_tab; public: BaseTab(wxFrame *parent, std::string base_file); void ApplyPreferences(); - void LoadFile(); - void OnDelete(wxCommandEvent &event); - void OnSave(wxCommandEvent &event); - void OnExport(wxCommandEvent &event); - void OnOpenGame(wxListEvent &event); - void OnImport(wxCommandEvent &event); + void RefreshLabel(); std::shared_ptr GetGame() { return (std::shared_ptr(NULL)); } std::shared_ptr GetBase() { return (std::shared_ptr(base)); }; }; \ No newline at end of file diff --git a/src/gui.cpp b/src/gui.cpp index f706a5e..c14d000 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -375,7 +375,7 @@ TabBase::TabBase( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxS wxBoxSizer* main_sizer; main_sizer = new wxBoxSizer( wxVERTICAL ); - notebook = new wxAuiNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxAUI_NB_DEFAULT_STYLE ); + notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); main_sizer->Add( notebook, 1, wxEXPAND | wxALL, 5 ); @@ -568,3 +568,49 @@ TabBase_TabGames::TabBase_TabGames( wxWindow* parent, wxWindowID id, const wxPoi TabBase_TabGames::~TabBase_TabGames() { } + +TabBase_TabImport::TabBase_TabImport( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name ) +{ + wxBoxSizer* main_sizer; + main_sizer = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* top_sizer; + top_sizer = new wxBoxSizer( wxHORIZONTAL ); + + from_game_label = new wxStaticText( this, wxID_ANY, wxT("From opened games:"), wxDefaultPosition, wxDefaultSize, 0 ); + from_game_label->Wrap( -1 ); + top_sizer->Add( from_game_label, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_comboBox1 = new wxComboBox( this, wxID_ANY, wxT("Combo!"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + top_sizer->Add( m_comboBox1, 100, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + import_from_game_button = new wxButton( this, wxID_ANY, wxT("Import"), wxDefaultPosition, wxDefaultSize, 0 ); + top_sizer->Add( import_from_game_button, 0, wxALL, 5 ); + + + main_sizer->Add( top_sizer, 1, wxEXPAND, 5 ); + + m_staticline4 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + main_sizer->Add( m_staticline4, 0, wxEXPAND | wxALL, 5 ); + + wxBoxSizer* bottom_sizer; + bottom_sizer = new wxBoxSizer( wxHORIZONTAL ); + + from_db_label = new wxStaticText( this, wxID_ANY, wxT("From opened databases:"), wxDefaultPosition, wxDefaultSize, 0 ); + from_db_label->Wrap( -1 ); + bottom_sizer->Add( from_db_label, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + main_sizer->Add( bottom_sizer, 1, wxEXPAND, 5 ); + + game_list = new wxListCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_ICON ); + main_sizer->Add( game_list, 20, wxALL|wxEXPAND, 5 ); + + + this->SetSizer( main_sizer ); + this->Layout(); +} + +TabBase_TabImport::~TabBase_TabImport() +{ +} diff --git a/src/gui.h b/src/gui.h index dc4a14b..fb2e3e2 100644 --- a/src/gui.h +++ b/src/gui.h @@ -36,8 +36,9 @@ #include #include #include -#include #include +#include +#include /////////////////////////////////////////////////////////////////////////// @@ -232,7 +233,7 @@ class TabBase : public wxPanel private: protected: - wxAuiNotebook* notebook; + wxNotebook* notebook; public: @@ -323,3 +324,26 @@ class TabBase_TabGames : public wxPanel }; +/////////////////////////////////////////////////////////////////////////////// +/// Class TabBase_TabImport +/////////////////////////////////////////////////////////////////////////////// +class TabBase_TabImport : public wxPanel +{ + private: + + protected: + wxStaticText* from_game_label; + wxComboBox* m_comboBox1; + wxButton* import_from_game_button; + wxStaticLine* m_staticline4; + wxStaticText* from_db_label; + wxListCtrl* game_list; + + public: + + TabBase_TabImport( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 500,200 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString ); + + ~TabBase_TabImport(); + +}; + diff --git a/tools/wxFrameBuilder.fbp b/tools/wxFrameBuilder.fbp index cf465f1..3f9ff83 100644 --- a/tools/wxFrameBuilder.fbp +++ b/tools/wxFrameBuilder.fbp @@ -29,7 +29,7 @@ 0 0 0 - + 0 wxAUI_MGR_DEFAULT @@ -122,7 +122,7 @@ - + main_sizer wxVERTICAL @@ -189,7 +189,7 @@ - + 0 wxAUI_MGR_DEFAULT @@ -216,16 +216,16 @@ - + main_sizer wxVERTICAL none - + 5 wxEXPAND 0 - + current_engine_sizer wxHORIZONTAL @@ -3654,7 +3654,7 @@ 5 wxEXPAND | wxALL 1 - + 1 1 1 @@ -3665,6 +3665,7 @@ + 1 0 @@ -3699,12 +3700,10 @@ Resizable 1 - wxAUI_NB_DEFAULT_STYLE + ; ; forward_declare - -1 0 - @@ -3735,16 +3734,16 @@ wxTAB_TRAVERSAL - + main_sizer wxVERTICAL protected - + 5 wxEXPAND 0 - + bar_sizer wxHORIZONTAL @@ -5136,7 +5135,7 @@ - + 0 wxAUI_MGR_DEFAULT @@ -5159,16 +5158,16 @@ wxTAB_TRAVERSAL - + main_sizer wxVERTICAL none - + 5 wxEXPAND 0 - + top_sizer wxHORIZONTAL @@ -5671,5 +5670,437 @@ + + 0 + wxAUI_MGR_DEFAULT + + + 1 + 1 + impl_virtual + + + 0 + wxID_ANY + + + TabBase_TabImport + + 500,200 + ; ; forward_declare + + 0 + + + wxTAB_TRAVERSAL + + + main_sizer + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + + top_sizer + wxHORIZONTAL + none + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + From opened games: + 0 + + 0 + + + 0 + + 1 + from_game_label + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 100 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_comboBox1 + 1 + + + protected + 1 + + Resizable + -1 + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + Combo! + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Import + + 0 + + 0 + + + 0 + + 1 + import_from_game_button + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline4 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + ; ; forward_declare + 0 + + + + + + + + 5 + wxEXPAND + 1 + + + bottom_sizer + wxHORIZONTAL + none + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + From opened databases: + 0 + + 0 + + + 0 + + 1 + from_db_label + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + + + 5 + wxALL|wxEXPAND + 20 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + game_list + 1 + + + protected + 1 + + Resizable + 1 + + wxLC_ICON + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + +