/* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "MainWindow.h" #include // rand #include #include FXDEFMAP(MainWindow) MainWindow_Map[]= { //________Message_Type____________ID____________Message_Handler_______ FXMAPFUNC(SEL_COMMAND, MainWindow::UI_Tile, MainWindow::on_Tile_Click), FXMAPFUNC(SEL_COMMAND, MainWindow::UI_New, MainWindow::on_New_Click), }; FXIMPLEMENT(MainWindow, FXMainWindow, MainWindow_Map, ARRAYNUMBER(MainWindow_Map)) MainWindow::MainWindow(FXApp *a) : FXMainWindow(a, "MyProgram 0.1", nullptr, nullptr, DECOR_ALL, 0,0,200,150) { board = nullptr; matrix = nullptr; app = a; create_ui(); int width = 9; int height = 9; new_game(width, height, 10); } MainWindow::~MainWindow() { delete board; } void MainWindow::create() { FXMainWindow::create(); show(PLACEMENT_SCREEN); } void MainWindow::create_ui() { contents=new FXHorizontalFrame(this, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y); // LEFT pane to contain the canvas canvasFrame=new FXVerticalFrame(contents, FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT, 0, 0, 0, 0, 10, 10, 10, 10); // Label above the canvas new FXLabel(canvasFrame,"foxminesweeper", NULL, JUSTIFY_CENTER_X|LAYOUT_FILL_X); // Horizontal divider line new FXHorizontalSeparator(canvasFrame, SEPARATOR_GROOVE|LAYOUT_FILL_X); scroll_area = new FXScrollWindow(canvasFrame, FX::SCROLLERS_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN); // RIGHT pane for the buttons buttonFrame=new FXVerticalFrame(contents, FRAME_SUNKEN|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT, 0, 0, 0, 0, 10, 10, 10, 10); // Label above the buttons new FXLabel(buttonFrame, "New Game", NULL, JUSTIFY_CENTER_X|LAYOUT_FILL_X); // Horizontal divider line new FXHorizontalSeparator(buttonFrame, SEPARATOR_RIDGE|LAYOUT_FILL_X); FXText *gametxt = new FXText(buttonFrame); gametxt->setText("test"); // Exit button new FXButton(buttonFrame, "&Exit", nullptr, app, FXApp::ID_QUIT, BUTTON_NORMAL|LAYOUT_FILL_X); new FXButton(buttonFrame, "&New Game", nullptr, this, MainWindow::UI_New, BUTTON_NORMAL|LAYOUT_FILL_X); /* create icons */ bomb_icon = new FXGIFIcon(app, tile_1, IMAGE_KEEP); empty_icon = new FXGIFIcon(app, empty, IMAGE_KEEP); tile_1_icon = new FXGIFIcon(app, tile_1, IMAGE_KEEP); tile_2_icon = new FXGIFIcon(app, tile_2, IMAGE_KEEP); tile_3_icon = new FXGIFIcon(app, tile_3, IMAGE_KEEP); tile_4_icon = new FXGIFIcon(app, tile_4, IMAGE_KEEP); tile_5_icon = new FXGIFIcon(app, tile_5, IMAGE_KEEP); tile_6_icon = new FXGIFIcon(app, tile_6, IMAGE_KEEP); tile_7_icon = new FXGIFIcon(app, tile_7, IMAGE_KEEP); tile_8_icon = new FXGIFIcon(app, tile_8, IMAGE_KEEP); bomb_icon->create(); empty_icon->create(); tile_1_icon->create(); tile_2_icon->create(); tile_3_icon->create(); tile_4_icon->create(); tile_5_icon->create(); tile_6_icon->create(); tile_7_icon->create(); tile_8_icon->create(); } void MainWindow::new_game(int width, int height, int minecount) { if (board) delete board; puts("starting new game.."); int tilecount = width*height; tile_buttons.clear(); board = new Board(width, height); matrix = new FXMatrix(scroll_area, width, MATRIX_BY_COLUMNS|LAYOUT_CENTER_Y|LAYOUT_CENTER_X); for (int i = 0; i < tilecount; i++) { std::shared_ptr b(new FXButton(matrix, "ok", nullptr, this, UI_Tile)); tile_buttons.push_back(b); b->setIcon(tile_1_icon); } printf("rows: %d columns: %d\n", matrix->getNumRows(), matrix->getNumColumns()); draw_buttons(); } void MainWindow::draw_buttons() { } long MainWindow::on_Tile_Click(FXObject *sender, FXSelector sel, void *data) { int x = 0, y = 0; FXButton *button = dynamic_cast(sender); if (!button) return 0; x = matrix->colOfChild(button); y = matrix->rowOfChild(button); printf("button pressed: x=%d, y=%d\n", x, y); board->reveal_tile_at(x, y); draw_buttons(); return 1; } long MainWindow::on_New_Click(FXObject *sender, FXSelector sel, void *data) { if (board) { new_game(5, 5, 20); } return 1; }