132 lines
3.9 KiB
C++
132 lines
3.9 KiB
C++
#include "MainFrame.h"
|
||
|
||
#include "AboutDlg.h"
|
||
#include "HelpDlg.h"
|
||
#include "RulesDlg.h"
|
||
|
||
#include "resources/icon.xpm"
|
||
|
||
MainFrame::MainFrame()
|
||
: wxFrame(nullptr, wxID_ANY, _("Маджонг (пасьянс)"), wxDefaultPosition,
|
||
wxSize(800, 600)),
|
||
dataDirPath(wxStandardPaths::Get().GetUserDataDir()) {
|
||
SetIcon(logo_icon);
|
||
|
||
initMenu();
|
||
bindMenu();
|
||
|
||
Bind(wxEVT_SHOW, [this](wxShowEvent& _) -> void {
|
||
if (openLayout())
|
||
panel->Start(layoutPath, solveable,
|
||
[this](const wxSize& size) -> void {
|
||
this->SetMinClientSize(size);
|
||
});
|
||
});
|
||
|
||
CreateStatusBar(2);
|
||
|
||
panel = new GamePanel(this);
|
||
panel->SetFocus();
|
||
}
|
||
|
||
void MainFrame::initMenu() {
|
||
wxMenu* menuGame = new wxMenu;
|
||
menuGame->Append(IDM_New_Game, _("Начать сначала"));
|
||
menuGame->Append(IDM_Open, _("Открыть карту"));
|
||
menuGame->AppendCheckItem(IDM_Solveable, _("Генерировать решаемую карту"));
|
||
menuGame->Enable(IDM_Solveable,
|
||
false); // TODO: finish solveable table generation
|
||
menuGame->AppendSeparator();
|
||
menuGame->Append(IDM_Undo, _("Отменить ход"));
|
||
menuGame->Append(IDM_Reshuffle, _("Перемешать поле"));
|
||
menuGame->AppendSeparator();
|
||
menuGame->Append(IDM_Exit, _("Выход"));
|
||
|
||
wxMenu* menuHelp = new wxMenu;
|
||
menuHelp->Append(IDM_Help, _("Инструкция"));
|
||
menuHelp->Append(IDM_Rules, _("Правила игры"));
|
||
menuHelp->Append(IDM_About, _("О программе"));
|
||
|
||
wxMenuBar* menuBar = new wxMenuBar;
|
||
menuBar->Append(menuGame, _("Игра"));
|
||
menuBar->Append(menuHelp, _("Помощь"));
|
||
|
||
SetMenuBar(menuBar);
|
||
}
|
||
|
||
void MainFrame::bindMenu() {
|
||
Bind(
|
||
wxEVT_MENU, [this](wxCommandEvent& _) -> void { Close(); }, IDM_Exit);
|
||
|
||
Bind(
|
||
wxEVT_MENU,
|
||
[this](wxCommandEvent& _) -> void {
|
||
if (openLayout())
|
||
panel->Start(layoutPath, solveable,
|
||
[this](const wxSize& size) -> void {
|
||
this->SetMinClientSize(size);
|
||
});
|
||
},
|
||
IDM_Open);
|
||
|
||
Bind(
|
||
wxEVT_MENU,
|
||
[this](wxCommandEvent& _) -> void { (new HelpDlg(this, -1))->Show(); },
|
||
IDM_Help);
|
||
|
||
Bind(
|
||
wxEVT_MENU,
|
||
[this](wxCommandEvent& _) -> void { (new AboutDlg(this, -1))->Show(); },
|
||
IDM_About);
|
||
|
||
Bind(
|
||
wxEVT_MENU,
|
||
[this](wxCommandEvent& _) -> void { (new RulesDlg(this, -1))->Show(); },
|
||
IDM_Rules);
|
||
|
||
Bind(
|
||
wxEVT_MENU,
|
||
[this](wxCommandEvent& _) -> void {
|
||
if (!layoutPath.IsEmpty() || openLayout()) {
|
||
panel->Start(layoutPath, solveable,
|
||
[this](const wxSize& size) -> void {
|
||
this->SetMinClientSize(size);
|
||
});
|
||
}
|
||
},
|
||
IDM_New_Game);
|
||
|
||
Bind(
|
||
wxEVT_MENU,
|
||
[this](wxCommandEvent& evt) -> void { solveable = evt.IsChecked(); },
|
||
IDM_Solveable);
|
||
|
||
Bind(
|
||
wxEVT_MENU, [this](wxCommandEvent& _) -> void { panel->undo(); },
|
||
IDM_Undo);
|
||
|
||
Bind(
|
||
wxEVT_MENU,
|
||
[this](wxCommandEvent& _) -> void { panel->reshuffle(solveable); },
|
||
IDM_Reshuffle);
|
||
}
|
||
|
||
/**
|
||
* Shows a file opening dialog asking for .smlf file if succed, sets its path to
|
||
* layoutPath
|
||
* @return true if user have chosen a file, false if cancelled
|
||
*/
|
||
bool MainFrame::openLayout() {
|
||
wxFileDialog openFileDlg(
|
||
this, _("Открыть карту"),
|
||
dataDirPath + wxFileName::GetPathSeparator() + _("layouts"),
|
||
_("Turtle.smlf"), _("Файлы Mahjong карт (*.smlf)|*.smlf"),
|
||
wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
||
|
||
if (openFileDlg.ShowModal() == wxID_CANCEL)
|
||
return false;
|
||
|
||
layoutPath = openFileDlg.GetPath();
|
||
return true;
|
||
}
|