From 69b7bab962913cd10ca676f91cca5274eee1ce7f Mon Sep 17 00:00:00 2001 From: openshwprojects Date: Mon, 28 Nov 2022 17:46:09 +0100 Subject: [PATCH] sim: menubar stab --- src/sim/Simulation.cpp | 9 ++--- src/sim/Simulator.cpp | 9 ++++- src/sim/Simulator.h | 1 + src/sim/WinMenuBar.cpp | 77 ++++++++++++++++++++++++++++++++++++++++++ src/sim/WinMenuBar.h | 24 +++++++++++++ 5 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 src/sim/WinMenuBar.cpp create mode 100644 src/sim/WinMenuBar.h diff --git a/src/sim/Simulation.cpp b/src/sim/Simulation.cpp index 942c25c63..364d05acf 100644 --- a/src/sim/Simulation.cpp +++ b/src/sim/Simulation.cpp @@ -135,10 +135,11 @@ void CSimulation::createDemo() { bulb2_copy->setPosition(640, 140); addObject(bulb2_copy); - - CObject *wb3s_copy = wb3s->cloneObject(); - wb3s_copy->setPosition(640, 440); - addObject(wb3s_copy); + if (0) { + CObject *wb3s_copy = wb3s->cloneObject(); + wb3s_copy->setPosition(640, 440); + addObject(wb3s_copy); + } matchAllJunctions(); recalcBounds(); diff --git a/src/sim/Simulator.cpp b/src/sim/Simulator.cpp index 065dd14ac..3cff1acd8 100644 --- a/src/sim/Simulator.cpp +++ b/src/sim/Simulator.cpp @@ -15,6 +15,7 @@ #include "Simulation.h" #include "CursorManager.h" #include "Solver.h" +#include "WinMenuBar.h" CSimulator::CSimulator() { @@ -47,6 +48,9 @@ void CSimulator::drawWindow() { SDL_Event Event; while (SDL_PollEvent(&Event)) { + if (winMenu) { + winMenu->processEvent(Event); + } if (Event.type == SDL_KEYDOWN) { onKeyDown(Event.key.keysym.sym); @@ -151,13 +155,16 @@ class CShape *CSimulator::getShapeUnderCursor() { Coord p = GetMousePos(); return sim->findShapeByBoundsPoint(p); } + + void CSimulator::createWindow() { Window = SDL_CreateWindow("OpenGL Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WinWidth, WinHeight, WindowFlags); assert(Window); + winMenu = new CWinMenuBar(); + winMenu->createMenuBar(Window); Context = SDL_GL_CreateContext(Window); cur = new CursorManager(); } - void CSimulator::onKeyDown(int keyCode) { if (keyCode == '1') { setTool(new Tool_Use()); diff --git a/src/sim/Simulator.h b/src/sim/Simulator.h index 1f96adfec..4ebbde00e 100644 --- a/src/sim/Simulator.h +++ b/src/sim/Simulator.h @@ -15,6 +15,7 @@ class CSimulator { class CSimulation *sim; class CursorManager *cur; class CSolver *solver; + class CWinMenuBar *winMenu; void onKeyDown(int keyCode); void setTool(Tool_Base *tb); diff --git a/src/sim/WinMenuBar.cpp b/src/sim/WinMenuBar.cpp new file mode 100644 index 000000000..68cd63114 --- /dev/null +++ b/src/sim/WinMenuBar.cpp @@ -0,0 +1,77 @@ +#if WINDOWS + +#include "WinMenuBar.h" + +CWinMenuBar::CWinMenuBar() { + + +} +enum { + ID_NEW, + ID_LOAD, + ID_SAVEAS, + ID_EXIT, +}; +void CWinMenuBar::createWindowsMenu(HWND windowRef) { + + hMenuBar = CreateMenu(); + hFile = CreateMenu(); + hEdit = CreateMenu(); + hHelp = CreateMenu(); + + AppendMenu(hMenuBar, MF_POPUP, (UINT_PTR)hFile, "File"); + AppendMenu(hMenuBar, MF_POPUP, (UINT_PTR)hEdit, "Edit"); + AppendMenu(hMenuBar, MF_POPUP, (UINT_PTR)hHelp, "Help"); + + AppendMenu(hFile, MF_STRING, 1, "New..."); + AppendMenu(hFile, MF_STRING, 1, "Load..."); + AppendMenu(hFile, MF_STRING, 1, "Save as..."); + AppendMenu(hFile, MF_STRING, ID_EXIT, "Exit"); + + AppendMenu(hEdit, MF_STRING, 1, "Options"); + + AppendMenu(hHelp, MF_STRING, 1, "About"); + + SetMenu(windowRef, hMenuBar); + +} +HWND CWinMenuBar::getHWNDForSDLWindow(SDL_Window* win) { + SDL_SysWMinfo infoWindow; + SDL_VERSION(&infoWindow.version); + if (!SDL_GetWindowWMInfo(win, &infoWindow)) + { + return NULL; + } + return (infoWindow.info.win.window); +} +void CWinMenuBar::createMenuBar(SDL_Window *win) { + HWND hwnd = getHWNDForSDLWindow(win); + createWindowsMenu(hwnd); + //Enable WinAPI Events Processing + SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE); +} +void CWinMenuBar::processEvent(const SDL_Event &Event) { + if (Event.type == SDL_SYSWMEVENT) { + if (Event.syswm.msg->msg.win.msg == WM_COMMAND) + { + if (LOWORD(Event.syswm.msg->msg.win.wParam) == ID_EXIT) + { + exit(0); + } + else if (LOWORD(Event.syswm.msg->msg.win.wParam) == ID_NEW) + { + + } + else if (LOWORD(Event.syswm.msg->msg.win.wParam) == ID_LOAD) + { + + } + else if (LOWORD(Event.syswm.msg->msg.win.wParam) == ID_SAVEAS) + { + + } + } + } +} + +#endif \ No newline at end of file diff --git a/src/sim/WinMenuBar.h b/src/sim/WinMenuBar.h new file mode 100644 index 000000000..d201da3b1 --- /dev/null +++ b/src/sim/WinMenuBar.h @@ -0,0 +1,24 @@ +#ifndef __WINMENUBAR_H__ +#define __WINMENUBAR_H__ + +#include "sim_local.h" +#include +#include + +class CWinMenuBar { + HMENU hMenuBar; + HMENU hFile; + HMENU hEdit; + HMENU hHelp; + + void createWindowsMenu(HWND windowRef); + HWND getHWNDForSDLWindow(SDL_Window* win); +public: + CWinMenuBar(); + + void createMenuBar(SDL_Window *win); + void processEvent(const SDL_Event &Event); + +}; + +#endif \ No newline at end of file