From 10db25fcc592c1c41ec696cc4066ed03bd825183 Mon Sep 17 00:00:00 2001 From: hwinter <hwinter@student.ethz.ch> Date: Sat, 9 Nov 2024 18:40:33 +0100 Subject: [PATCH] buttons and popup window --- CMakeLists.txt | 6 +++- assets/error.png | Bin 0 -> 25808 bytes sockpp/.idea/misc.xml | 6 ++++ src/client/GameController.cpp | 13 ++++++- src/client/messageBoxes/ErrorDialog.cpp | 36 +++++++++++++++++++ src/client/messageBoxes/ErrorDialog.h | 21 +++++++++++ src/client/windows/GameWindow.cpp | 45 +++++++++++++++++++++--- src/client/windows/GameWindow.h | 4 +++ 8 files changed, 124 insertions(+), 7 deletions(-) create mode 100644 assets/error.png create mode 100644 src/client/messageBoxes/ErrorDialog.cpp create mode 100644 src/client/messageBoxes/ErrorDialog.h diff --git a/CMakeLists.txt b/CMakeLists.txt index d19dc91..a98a8e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,7 +48,9 @@ set(CLIENT_SOURCE_FILES src/common/serialization/serializable_value.h src/common/serialization/json_utils.h src/common/serialization/uuid_generator.h - src/common/serialization/unique_serializable.cpp src/common/serialization/unique_serializable.h) + src/common/serialization/unique_serializable.cpp src/common/serialization/unique_serializable.h + src/client/messageBoxes/ErrorDialog.cpp + src/client/messageBoxes/ErrorDialog.h) # define a variable SERVER_SOURCE_FILES that contains the paths to all source files required to compile the server executable set(SERVER_SOURCE_FILES @@ -101,6 +103,8 @@ target_compile_definitions(Wizard-server PRIVATE WIZARD_SERVER=1 RAPIDJSON_HAS_S # Comment out if you don't want to print network-related messages into the console target_compile_definitions(Wizard-server PRIVATE PRINT_NETWORK_MESSAGES=1) +# Copy all files from the assets folder to the binary directory +file(COPY ${CMAKE_SOURCE_DIR}/assets/ DESTINATION ${CMAKE_BINARY_DIR}/assets/) # linking to sockpp if(WIN32) diff --git a/assets/error.png b/assets/error.png new file mode 100644 index 0000000000000000000000000000000000000000..e8fcf98588f32c6c91d4def84739038c8686db2c GIT binary patch literal 25808 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 Mt0u^jD|X@k1HT^gxc~qF literal 0 HcmV?d00001 diff --git a/sockpp/.idea/misc.xml b/sockpp/.idea/misc.xml index 7c97963..6a6aa90 100644 --- a/sockpp/.idea/misc.xml +++ b/sockpp/.idea/misc.xml @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> + <component name="BackendCodeEditorMiscSettings"> + <option name="/Default/RiderDebugger/RiderRestoreDecompile/RestoreDecompileSetting/@EntryValue" value="false" type="bool" /> + <option name="/Default/Housekeeping/GlobalSettingsUpgraded/IsUpgraded/@EntryValue" value="true" type="bool" /> + <option name="/Default/Housekeeping/FeatureSuggestion/FeatureSuggestionManager/DisabledSuggesters/=SwitchToGoToActionSuggester/@EntryIndexedValue" value="true" type="bool" /> + <option name="/Default/Environment/Hierarchy/GeneratedFilesCacheKey/Timestamp/@EntryValue" value="4" type="long" /> + </component> <component name="CMakePythonSetting"> <option name="pythonIntegrationState" value="YES" /> </component> diff --git a/src/client/GameController.cpp b/src/client/GameController.cpp index 651bcec..cc348ff 100644 --- a/src/client/GameController.cpp +++ b/src/client/GameController.cpp @@ -4,6 +4,7 @@ #include "../common/network/requests/draw_card_request.h" #include "../common/network/requests/fold_request.h" #include "../common/network/requests/play_card_request.h" +#include "../client/messageBoxes/ErrorDialog.h" #include "network/ClientNetworkManager.h" @@ -143,8 +144,18 @@ wxEvtHandler* GameController::getMainThreadEventHandler() { } +//void GameController::showError(const std::string& title, const std::string& message) { +// wxMessageBox(message, title, wxICON_ERROR); +//} + void GameController::showError(const std::string& title, const std::string& message) { - wxMessageBox(message, title, wxICON_ERROR); + // Load a custom image for the error dialog + wxString fullpath = "assets/error.png"; + + wxBitmap errorImage(fullpath, wxBITMAP_TYPE_ANY); + // Create and show the custom error dialog + ErrorDialog errorDialog(nullptr, title, message, errorImage); + errorDialog.ShowModal(); } diff --git a/src/client/messageBoxes/ErrorDialog.cpp b/src/client/messageBoxes/ErrorDialog.cpp new file mode 100644 index 0000000..f272223 --- /dev/null +++ b/src/client/messageBoxes/ErrorDialog.cpp @@ -0,0 +1,36 @@ +// +// Created by hannah on 11/9/24. +// + +#include "ErrorDialog.h" + +ErrorDialog::ErrorDialog(wxWindow* parent, const std::string& title, const std::string& message, const wxBitmap& image) + : wxDialog(parent, wxID_ANY, title, wxDefaultPosition, wxSize(400, 250), wxDEFAULT_DIALOG_STYLE | wxSTAY_ON_TOP) { + + // Set custom background color (for example, red for error dialogs) + SetBackgroundColour(*wxBLACK); + + // Create a vertical sizer for layout + wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); + + // Display the custom image (if it’s valid) + if (image.IsOk()) { + wxImage resizedImage = image.ConvertToImage(); + resizedImage.Rescale(100, 100); + + imageCtrl = new wxStaticBitmap(this, wxID_ANY, wxBitmap(resizedImage)); + sizer->Add(imageCtrl, 0, wxALIGN_CENTER | wxALL, 20); + } + + // Display the error message + messageCtrl = new wxStaticText(this, wxID_ANY, message); + messageCtrl->SetForegroundColour(*wxWHITE); // Set text color to white for better contrast + sizer->Add(messageCtrl, 0, wxALIGN_CENTER | wxALL, 10); + + // Add an OK button to close the dialog + okButton = new wxButton(this, wxID_OK, "OK"); + sizer->Add(okButton, 0, wxALIGN_CENTER | wxALL, 10); + + SetSizerAndFit(sizer); + Centre(); // Center the dialog on the screen +} \ No newline at end of file diff --git a/src/client/messageBoxes/ErrorDialog.h b/src/client/messageBoxes/ErrorDialog.h new file mode 100644 index 0000000..b55a0ff --- /dev/null +++ b/src/client/messageBoxes/ErrorDialog.h @@ -0,0 +1,21 @@ +// +// Created by hannah on 11/9/24. +// + +#ifndef ERRORDIALOG_H +#define ERRORDIALOG_H + +#include <wx/wx.h> +#include <wx/statbmp.h> + +class ErrorDialog : public wxDialog{ + public: ErrorDialog(wxWindow* parent, const std::string& title, const std::string& message, const wxBitmap& image); + + private: + wxStaticBitmap* imageCtrl; + wxStaticText* messageCtrl; + wxButton* okButton; + +}; + +#endif //ERRORDIALOG_H diff --git a/src/client/windows/GameWindow.cpp b/src/client/windows/GameWindow.cpp index 2ae3559..53fff8e 100644 --- a/src/client/windows/GameWindow.cpp +++ b/src/client/windows/GameWindow.cpp @@ -4,7 +4,6 @@ GameWindow::GameWindow(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(nullptr, wxID_ANY, title, pos, size) { // Set up layout that will contain and center all content - this->_mainLayout = new wxBoxSizer(wxVERTICAL); wxBoxSizer* outerLayout = new wxBoxSizer(wxHORIZONTAL); outerLayout->Add(this->_mainLayout, 1, wxCENTER); @@ -14,12 +13,34 @@ GameWindow::GameWindow(const wxString& title, const wxPoint& pos, const wxSize& // Set up status bar this->_statusBar = this->CreateStatusBar(1); + // Add "Rules" button directly to the status bar + _rulesButton = new wxButton(_statusBar, wxID_ANY, "Rules"); + _settingsButton = new wxButton(_statusBar, wxID_ANY, "Settings"); + + // Set minimum height of status bar based on the button's height with padding + _statusBar->SetMinHeight(_rulesButton->GetSize().GetHeight() + 10); + + // Create a horizontal sizer for the status bar and add the button to it + wxBoxSizer* statusSizer = new wxBoxSizer(wxHORIZONTAL); + + // Add stretchable space to fill space in statusbar + statusSizer->AddStretchSpacer(1); + + statusSizer->Add(_settingsButton, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL | wxALL, 5); + statusSizer->Add(_rulesButton, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL | wxALL, 5); + _statusBar->SetSizer(statusSizer); + _statusBar->Layout(); + + // Bind the button click event to showRules method + _rulesButton->Bind(wxEVT_BUTTON, &GameWindow::showRules, this); + _settingsButton->Bind(wxEVT_BUTTON, &GameWindow::show_settings, this); + // Set background - wxColor lightBlue = wxColor(213, 231, 239); - this->SetBackgroundColour(lightBlue); + wxColor darkred = wxColor(102, 0, 51); + this->SetBackgroundColour(darkred); // Set the minimum size of the window. The user won't be able to resize the window to a size smaller than this - this->SetMinSize(wxSize(1000, 720)); + this->SetMinSize(wxSize(50, 50)); } @@ -39,7 +60,7 @@ void GameWindow::showPanel(wxPanel* panel) { } // add new panel - this->_mainLayout->Add(panel, 0, wxALIGN_CENTER | wxALL, 20); // 20 pixel spacing + this->_mainLayout->Add(panel, 1, wxEXPAND | wxALL, 20); // 20 pixel spacing panel->Show(true); this->_currentPanel = panel; @@ -55,3 +76,17 @@ void GameWindow::setStatus(const std::string& message) { this->_statusBar->SetStatusText(message, 0); } +void GameWindow::showRules(wxCommandEvent& event){ + wxString rules = "Game Rules:\n" + "Do not cheat!"; + + wxMessageDialog rulesDialog(this, rules, "Game Rules", wxOK | wxICON_INFORMATION); + rulesDialog.ShowModal(); +} + +void GameWindow::show_settings(wxCommandEvent& event){ + wxString settings = "Not implemented yet"; + + wxMessageDialog rulesDialog(this, settings, "Game Rules", wxOK | wxICON_INFORMATION); + rulesDialog.ShowModal(); +} diff --git a/src/client/windows/GameWindow.h b/src/client/windows/GameWindow.h index 2efbcfc..b02b19d 100644 --- a/src/client/windows/GameWindow.h +++ b/src/client/windows/GameWindow.h @@ -15,9 +15,13 @@ public: private: wxBoxSizer* _mainLayout; wxStatusBar* _statusBar; + wxButton* _rulesButton; + wxButton* _settingsButton; wxPanel* _currentPanel; + void showRules(wxCommandEvent& event); + void show_settings(wxCommandEvent& event); }; -- GitLab