#include "seasonwindow.hpp" #include "gui_functions.hpp" #define ID_CHECKBOX 0x0001 #define ID_SEASONS_STATIC 0x0001 #define ID_ALL_BUTTON 0x1000 #define ID_NONE_BUTTON 0x1001 #define ID_CONFIRM_BUTTON 0x1002 SeasonWindow *SeasonWindow::sw = nullptr; SeasonWindow::SeasonWindow( HINSTANCE hInstance, const std::vector< int > &seasons, std::vector< int > &return_vector, HWND parent_window ) : parent( parent_window ), returned( return_vector ), season_nums( seasons ) { window = CreateWindowW( L"SeasonWindow", L"Select seasons", WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, window_width, window_height, parent, NULL, hInstance, NULL ); ShowWindow( window, SW_SHOW ); auto hFont = ( HFONT )GetStockObject( DEFAULT_GUI_FONT ); EnableWindow( parent, false ); size_t x{ 5 }, y{ 25 }; // create a check box for each season HWND checkbox_hwnd; for ( auto &s : season_nums ) { checkbox_hwnd = createCheckbox( std::to_wstring( s ).c_str(), x, y, 55, 15, ID_CHECKBOX, window, hFont ); checkboxes.push_back( checkbox_hwnd ); if ( x == 185 ) { x = 5; y += 20; } else { x += 60; } } createLabel( L"Select seasons:", 5, 5, 100, 15, ID_SEASONS_STATIC, window, hFont ); createButton( L"Select all", 130, 175, 100, 25, ID_ALL_BUTTON, window, hFont ); createButton( L"Unselect all", 5, 175, 110, 25, ID_NONE_BUTTON, window, hFont ); createButton( L"Select", 165, 215, 80, 25, ID_CONFIRM_BUTTON, window, hFont ); UpdateWindow( window ); } void SeasonWindow::mainLoop() { MSG msg; while ( GetMessage( &msg, NULL, 0, 0 ) ) { if ( !IsDialogMessage( window, &msg ) ) { TranslateMessage( &msg ); sw = this; DispatchMessage( &msg ); } } } LRESULT CALLBACK SeasonWindow::messageHandler( HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam ) { switch ( umsg ) { case WM_CREATE: centerWindow( hwnd ); break; case WM_COMMAND: switch ( LOWORD( wParam ) ) { case ID_ALL_BUTTON: sw->selectAll(); break; case ID_NONE_BUTTON: sw->selectNone(); break; case ID_CONFIRM_BUTTON: sw->storeResult(); SendMessage( hwnd, WM_CLOSE, 0, 0 ); break; } break; case WM_DESTROY: PostQuitMessage( 0 ); break; } return DefWindowProcW( hwnd, umsg, wParam, lParam ); } void SeasonWindow::selectAll() { for ( auto &x : checkboxes ) { SendMessage( x, BM_SETCHECK, BST_CHECKED, NULL ); } } void SeasonWindow::selectNone() { for ( auto &x : checkboxes ) { SendMessage( x, BM_SETCHECK, BST_UNCHECKED, NULL ); } } void SeasonWindow::storeResult() { for ( unsigned long long i = 0; i < checkboxes.size(); i++ ) { if ( SendMessage( checkboxes[i], BM_GETCHECK, 0, 0 ) == BST_CHECKED ) { returned.push_back( season_nums[i] ); } } }