1/*
2 * LegacyClonk
3 *
4 * Copyright (c) 1998-2000, Matthes Bender (RedWolf Design)
5 * Copyright (c) 2017-2020, The LegacyClonk Team and contributors
6 *
7 * Distributed under the terms of the ISC license; see accompanying file
8 * "COPYING" for details.
9 *
10 * "Clonk" is a registered trademark of Matthes Bender, used with permission.
11 * See accompanying file "TRADEMARK" for details.
12 *
13 * To redistribute this file separately, substitute the full license texts
14 * for the above references.
15 */
16
17/* Handles engine execution in developer mode */
18
19#pragma once
20
21#include "C4PropertyDlg.h"
22#include "C4ToolsDlg.h"
23#include "C4ObjectListDlg.h"
24#include "C4EditCursor.h"
25#include "C4Game.h"
26
27#include <StdWindow.h>
28
29#ifdef WITH_DEVELOPER_MODE
30#include <gtk/gtk.h>
31#endif
32
33const int C4CNS_ModePlay = 0,
34 C4CNS_ModeEdit = 1,
35 C4CNS_ModeDraw = 2;
36
37#define IDM_NET_CLIENT1 10000
38#define IDM_NET_CLIENT2 10100
39#define IDM_PLAYER_QUIT1 10200
40#define IDM_PLAYER_QUIT2 10300
41#define IDM_VIEWPORT_NEW1 10400
42#define IDM_VIEWPORT_NEW2 10500
43
44#ifdef WITH_DEVELOPER_MODE
45#include <StdGtkWindow.h>
46typedef CStdGtkWindow C4ConsoleBase;
47#else
48typedef CStdWindow C4ConsoleBase;
49#endif
50
51class C4Console : public C4ConsoleBase
52{
53#ifdef WITH_DEVELOPER_MODE
54public:
55 struct GCharStringWrapper
56 {
57 std::u8string String;
58
59 const gchar *c_str() const noexcept { return reinterpret_cast<const char *>(String.c_str()); }
60 };
61#endif
62
63public:
64 C4Console();
65 virtual ~C4Console();
66 bool Editing;
67 C4PropertyDlg PropertyDlg;
68 C4ToolsDlg ToolsDlg;
69 C4ObjectListDlg ObjectListDlg;
70 C4EditCursor EditCursor;
71 void Default();
72 virtual void Clear() override;
73 virtual void Close() override;
74 bool Init(CStdApp *app);
75 bool Init(CStdApp *app, const char *title, const class C4Rect &bounds = CStdWindow::DefaultBounds, CStdWindow *parent = nullptr) override;
76 void Execute();
77 void ClearPointers(C4Object *pObj);
78 bool Message(const char *szMessage, bool fQuery = false);
79 void SetCaption(const char *szCaption);
80 bool In(const char *szText);
81 bool Out(std::string_view text);
82 bool ClearLog(); // empty log text
83 void DoPlay();
84 void DoHalt();
85 bool UpdateCursorBar(const char *szCursor);
86 bool UpdateHaltCtrls(bool fHalt);
87 bool UpdateModeCtrls(int iMode);
88 void UpdateInputCtrl();
89 void UpdateMenus();
90 bool OpenGame(const char *szCmdLine = nullptr);
91 bool TogglePause(); // key callpack: pause
92
93#ifdef _WIN32
94 static std::wstring GetDialogItemText(HWND dlg, int item);
95#elif defined(WITH_DEVELOPER_MODE)
96 static GCharStringWrapper ClonkToGtk(std::string_view text);
97#endif
98
99protected:
100 bool CloseGame();
101 bool fGameOpen;
102 void EnableControls(bool fEnable);
103 bool UpdatePlayerMenu();
104 bool UpdateViewportMenu();
105 bool UpdateStatusBars();
106 void Sec1Timer() override { Game.Sec1Timer(); Application.DoSec1Timers(); }
107 // Menu
108 void ClearPlayerMenu();
109 void ClearViewportMenu();
110 void UpdateNetMenu();
111 void ClearNetMenu();
112 void PlayerJoin();
113 void EditObjects();
114 void EditInfo();
115 void EditScript();
116 void EditTitle();
117 void ViewportNew();
118 void HelpAbout();
119#ifdef _WIN32
120 bool FileSelect(char *sFilename, int iSize, const char *szFilter, DWORD dwFlags, bool fSave = false);
121#else
122 bool FileSelect(char *sFilename, int iSize, const char *szFilter, uint32_t dwFlags, bool fSave = false);
123#endif
124 bool SaveGame(bool fSaveGame);
125 bool FileSaveAs(bool fSaveGame);
126 bool FileSave(bool fSaveGame);
127 bool FileOpen();
128 bool FileOpenWPlrs();
129 bool FileClose();
130 bool FileQuit();
131 bool FileRecord();
132
133 int ScriptCounter;
134 int FrameCounter;
135 int Time, FPS;
136 int MenuIndexFile;
137 int MenuIndexComponents;
138 int MenuIndexPlayer;
139 int MenuIndexViewport;
140 int MenuIndexNet;
141 int MenuIndexHelp;
142
143#ifdef _WIN32
144
145 void UpdateMenuText(HMENU hMenu);
146 bool AddMenuItem(HMENU hMenu, DWORD dwID, const char *szString, bool fEnabled = true);
147
148 virtual bool Win32DialogMessageHandling(MSG *msg) override
149 {
150 return (hWindow && IsDialogMessage(hWindow, msg)) || (PropertyDlg.hDialog && IsDialogMessage(PropertyDlg.hDialog, msg));
151 };
152
153 WNDCLASSEX GetWindowClass(const HINSTANCE instance) const override { return {}; }
154
155 bool GetPositionData(std::string &id, std::string &subKey, bool &storeSize) const override;
156 bool SupportsDarkMode() const override { return false; }
157
158 HBITMAP hbmMouse;
159 HBITMAP hbmMouse2;
160 HBITMAP hbmCursor;
161 HBITMAP hbmCursor2;
162 HBITMAP hbmBrush;
163 HBITMAP hbmBrush2;
164 HBITMAP hbmPlay;
165 HBITMAP hbmPlay2;
166 HBITMAP hbmHalt;
167 HBITMAP hbmHalt2;
168 friend INT_PTR CALLBACK ConsoleDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam);
169
170#elif defined(WITH_DEVELOPER_MODE)
171
172 virtual GtkWidget *InitGUI() override;
173
174 GdkCursor *cursorDefault;
175 GdkCursor *cursorWait;
176
177 GtkWidget *txtLog;
178 GtkWidget *txtScript;
179 GtkWidget *btnPlay;
180 GtkWidget *btnHalt;
181 GtkWidget *btnModePlay;
182 GtkWidget *btnModeEdit;
183 GtkWidget *btnModeDraw;
184
185 GtkWidget *menuBar;
186 GtkWidget *itemNet;
187
188 GtkWidget *menuViewport;
189 GtkWidget *menuPlayer;
190
191 GtkWidget *fileOpen;
192 GtkWidget *fileOpenWithPlayers;
193 GtkWidget *fileSave;
194 GtkWidget *fileSaveAs;
195 GtkWidget *fileSaveGame;
196 GtkWidget *fileSaveGameAs;
197 GtkWidget *fileRecord;
198 GtkWidget *fileClose;
199 GtkWidget *fileQuit;
200
201 GtkWidget *compScript;
202 GtkWidget *compTitle;
203 GtkWidget *compInfo;
204 GtkWidget *compObjects;
205
206 GtkWidget *plrJoin;
207
208 GtkWidget *viewNew;
209
210 GtkWidget *helpAbout;
211
212 GtkWidget *lblCursor;
213 GtkWidget *lblFrame;
214 GtkWidget *lblScript;
215 GtkWidget *lblTime;
216
217 gulong handlerPlay;
218 gulong handlerHalt;
219 gulong handlerModePlay;
220 gulong handlerModeEdit;
221 gulong handlerModeDraw;
222
223 static void OnScriptEntry(GtkWidget *entry, gpointer data);
224 static void OnPlay(GtkWidget *button, gpointer data);
225 static void OnHalt(GtkWidget *button, gpointer data);
226 static void OnModePlay(GtkWidget *button, gpointer data);
227 static void OnModeEdit(GtkWidget *button, gpointer data);
228 static void OnModeDraw(GtkWidget *button, gpointer data);
229
230 static void OnFileOpen(GtkWidget *item, gpointer data);
231 static void OnFileOpenWPlrs(GtkWidget *item, gpointer data);
232 static void OnFileSave(GtkWidget *item, gpointer data);
233 static void OnFileSaveAs(GtkWidget *item, gpointer data);
234 static void OnFileSaveGame(GtkWidget *item, gpointer data);
235 static void OnFileSaveGameAs(GtkWidget *item, gpointer data);
236 static void OnFileRecord(GtkWidget *item, gpointer data);
237 static void OnFileClose(GtkWidget *item, gpointer data);
238 static void OnFileQuit(GtkWidget *item, gpointer data);
239
240 static void OnCompObjects(GtkWidget *item, gpointer data);
241 static void OnCompScript(GtkWidget *item, gpointer data);
242 static void OnCompTitle(GtkWidget *item, gpointer data);
243 static void OnCompInfo(GtkWidget *item, gpointer data);
244
245 static void OnPlrJoin(GtkWidget *item, gpointer data);
246 static void OnPlrQuit(GtkWidget *item, gpointer data);
247 static void OnViewNew(GtkWidget *item, gpointer data);
248 static void OnViewNewPlr(GtkWidget *item, gpointer data);
249 static void OnHelpAbout(GtkWidget *item, gpointer data);
250
251 static void OnNetClient(GtkWidget *item, gpointer data);
252
253#elif defined(USE_X11) && !defined(WITH_DEVELOPER_MODE)
254
255 virtual void HandleMessage(XEvent &) override;
256
257#endif
258};
259
260extern C4Console Console;
261
262#ifdef WITH_DEVELOPER_MODE
263
264C4Console::GCharStringWrapper LoadResStrGtkV(C4ResStrTableKey id);
265
266inline C4Console::GCharStringWrapper LoadResStrGtk(const C4ResStrTableKeyFormat<> id)
267{
268 return LoadResStrGtkV(id: id.Id);
269}
270
271#endif
272