OpenClonk
C4ConsoleQtState.h
Go to the documentation of this file.
1 /*
2  * OpenClonk, http://www.openclonk.org
3  *
4  * Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/
5  * Copyright (c) 2013, The OpenClonk 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 /* Editor windows using Qt - internal state */
18 
19 #ifndef INC_C4ConsoleQtState
20 #define INC_C4ConsoleQtState
21 
22 #ifdef WITH_QT_EDITOR
23 
24 #include "C4Include.h" // needed for automoc
25 #include "editor/C4ConsoleGUI.h"
26 #include "editor/C4ToolsDlg.h"
27 #include "editor/C4ConsoleQt.h"
28 #include "ui_C4ConsoleQtMainWindow.h"
29 
30 /* Forward string translation to GetResStr */
31 
32 class C4ConsoleQtTranslator : public QTranslator
33 {
34  Q_OBJECT
35 public:
36  bool isEmpty() const override { return false; }
37  QString translate(const char * context, const char * sourceText, const char * disambiguation = nullptr, int n = -1) const override;
38 };
39 
40 extern C4ConsoleQtTranslator qt_translator;
41 
42 class C4ConsoleClientAction : public QAction
43 {
44  Q_OBJECT
45 
46  int32_t client_id;
48 
49 public:
50  C4ConsoleClientAction(int32_t client_id, const char *text, QObject *parent, C4ConsoleGUI::ClientOperation op);
51  int32_t GetClientID() const { return client_id; }
52  private slots:
53  void Execute();
54 };
55 
56 class C4ConsoleRemovePlayerAction : public QAction
57 {
58  Q_OBJECT
59 
60  int32_t player_num;
61 public:
62  C4ConsoleRemovePlayerAction(int32_t player_num, const char *text, QObject *parent);
63  int32_t GetPlayerNum() const { return player_num; }
64  private slots:
65  void Execute();
66 };
67 
68 class C4ConsoleOpenViewportAction : public QAction
69 {
70  Q_OBJECT
71 
72  int32_t player_num;
73 public:
74  C4ConsoleOpenViewportAction(int32_t player_num, const char *text, QObject *parent);
75  int32_t GetPlayerNum() const { return player_num; }
76  private slots:
77  void Execute();
78 };
79 
80 /* Disable shortcut on some actions */
81 
82 class C4DisableShortcutFilter : public QObject
83 {
84  Q_OBJECT
85 
86 public:
87  C4DisableShortcutFilter(QObject *parent) : QObject(parent) {}
88 
89  bool eventFilter(QObject *target, QEvent *event) override
90  {
91  if (event->type() == QEvent::Shortcut) return true;
92  return QObject::eventFilter(target, event);
93  }
94 };
95 
96 class C4ConsoleQtMainWindow : public QMainWindow
97 {
98  Q_OBJECT
99  class C4ConsoleGUIState *state;
100 
101 protected:
102  void keyPressEvent(QKeyEvent * event) override;
103  void keyReleaseEvent(QKeyEvent * event) override;
104 
105 public:
106  C4ConsoleQtMainWindow(class C4AbstractApp *app, class C4ConsoleGUIState *state);
107 
108  void closeEvent(class QCloseEvent *event) override;
109  void LoadGeometry();
110  class C4ConsoleGUIState *GetConsoleState() const { return state; }
111 
112 public slots:
113  // Toolbar items
114  void PlayPressed(bool down);
115  void PausePressed(bool down);
116  void CursorGamePressed(bool down);
117  void CursorSelectPressed(bool down);
118  void CursorCreateObjPressed(bool down);
119  void CursorDrawPenPressed(bool down);
120  void CursorDrawLinePressed(bool down);
121  void CursorDrawRectPressed(bool down);
122  void CursorFillPressed(bool down);
123  void CursorPickerPressed(bool down);
124  void DynamicLandscapePressed(bool down);
125  void StaticLandscapePressed(bool down);
126  void StaticFlatLandscapePressed(bool down);
127  void ExactLandscapePressed(bool down);
128  void DrawSizeChanged(int newval);
129  void OpenTranslationsOverview();
130  // File menu
131  void FileNew();
132  void FileOpen();
133  void FileOpenInNetwork();
134  void FileOpenWithPlayers();
135  void FileRecord();
136  void FileSave();
137  void FileSaveAs();
138  void FileSaveGameAs();
139  void FileExportPacked();
140  void FileClose();
141  void FileQuit();
142  void FileReInitScenario();
143  // Player menu
144  void PlayerJoin();
145  // Window menu
146  void ViewportNew();
147  // Help menu
148  void HelpAbout();
149  void HelpToggle(bool enabled);
150  // Console edits enter pressed events
151  void MainConsoleEditEnter(); // console edit below log
152  void PropertyConsoleEditEnter(); // console edit of property window
153  // View selection changes
154  void OnCreatorSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected);
155  void OnCreatorCurrentChanged(const QModelIndex & current, const QModelIndex & previous);
156  void OnObjectListSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected);
157  void AscendPropertyPath();
158  void AddArrayElement();
159  void RemoveArrayElement();
160  // Global editor key processing
161  bool HandleEditorKeyDown(QKeyEvent *event);
162  bool HandleEditorKeyUp(QKeyEvent *event);
163  // Material changed in landscape drawing mode
164  void ForegroundMaterialChanged(const QString &new_selection);
165  void BackgroundMaterialChanged(const QString &new_selection);
166  // Links on welcome page
167  void WelcomeLinkActivated(const QString &link);
168  // Object context menu
169  void SelectionDelete();
170  void SelectionDuplicate();
171  void SelectionEjectContents();
172  // Shortcut actions
173  void FocusGlobalScriptBox();
174  void FocusObjectScriptBox();
175  void OpenMaterialSelection();
176  void FocusNextViewport();
177  void GradeUp();
178  void GradeDown();
179 };
180 
181 
182 /* Main Qt editor class controlled through ControlGUI */
183 
184 class C4ConsoleGUIState // Avoid direct declaration of C4ConsoleGUI::State because qmake doesn't like some declarations in the nested class
185 {
186 public:
187  std::unique_ptr<QApplication> application;
188  std::unique_ptr<C4ConsoleQtMainWindow> window;
189  std::unique_ptr<class C4ConsoleQtPropListModel> property_model;
190  std::unique_ptr<class C4PropertyDelegateFactory> property_delegate_factory;
191  std::unique_ptr<class C4PropertyNameDelegate> property_name_delegate;
192  std::unique_ptr<class C4ConsoleQtObjectListModel> object_list_model;
193  std::unique_ptr<class C4ConsoleQtDefinitionListModel> definition_list_model;
194  std::unique_ptr<class C4DisableShortcutFilter> disable_shortcut_filter;
195  std::unique_ptr<class C4ConsoleQtLocalizeOverviewDlg> translation_overview_dialogue;
196  std::list<class C4ConsoleQtViewportDockWidget *> viewports;
197  std::list<std::unique_ptr<C4ConsoleClientAction> > client_actions;
198  std::list<std::unique_ptr<C4ConsoleRemovePlayerAction> > player_actions;
199  std::list<std::unique_ptr<C4ConsoleOpenViewportAction> > viewport_actions;
200  Ui::MainWindow ui;
201 
202  // ptrs owned by window
203  QMainWindow *viewport_area;
204  QLabel *status_cursor, *status_framecounter, *status_timefps;
205  QAction *window_menu_separator;
206 
207  // Current editor/tool states
208  // Cannot use direct members in C4EditorCursor because callbacks into the GUI happen before the values change.
209  // If other C4Console implementations are removed, the state could be merged and these members removed.
210  bool enabled, recording, net_enabled;
211  LandscapeMode landscape_mode;
212  bool flat_chunk_shapes;
213  int32_t editcursor_mode, drawing_tool;
214  StdCopyStrBuf material, texture, back_material, back_texture;
215 
216  // Updating states to prevent callbacks on internal selection updates
217  int32_t is_object_selection_updating;
218 
219  // Currently selected single object
220  C4Value action_object;
221 
222  C4ConsoleGUIState(C4ConsoleGUI *console);
223  ~C4ConsoleGUIState();
224 
225  void AddToolbarSpacer(int space);
226  bool CreateConsoleWindow(C4AbstractApp *app);
227  void DeleteConsoleWindow();
228  void Execute(bool redraw_only=false);
229  void Redraw() { Execute(true); }
230  void UpdateActionStates();
231  void UpdateMatTex();
232  void UpdateBackMatTex();
233  // Set modes and tools
234  void SetEnabled(bool to_enabled) { enabled = to_enabled; UpdateActionStates(); ReInitDefinitions(); }
235  void SetLandscapeMode(LandscapeMode to_landscape_mode, bool to_flat_chunk_shapes) { landscape_mode = to_landscape_mode; flat_chunk_shapes = to_flat_chunk_shapes; UpdateActionStates(); }
236  void SetEditCursorMode(int32_t to_editcursor_mode) { editcursor_mode = to_editcursor_mode; UpdateActionStates(); }
237  void SetDrawingTool(int32_t to_drawing_tool) { drawing_tool = to_drawing_tool; UpdateActionStates(); }
238  void SetMaterial(const char *new_material) { material.Copy(new_material); UpdateMatTex(); }
239  void SetTexture(const char *new_texture) { texture.Copy(new_texture); UpdateMatTex(); }
240  void SetBackMaterial(const char *new_material) { back_material.Copy(new_material); UpdateBackMatTex(); }
241  void SetBackTexture(const char *new_texture) { back_texture.Copy(new_texture); UpdateBackMatTex(); }
242  void SetRecording(bool to_recording) { recording = to_recording; UpdateActionStates(); }
243  void SetNetEnabled(bool enabled) { net_enabled = enabled; UpdateActionStates(); }
244 
245  void AddNetMenuItem(int32_t index, const char *text, C4ConsoleGUI::ClientOperation op);
246  void ClearNetMenu();
247  void AddKickPlayerMenuItem(int32_t plr, const char *text, bool item_enabled);
248  void ClearPlayerMenu();
249  void AddPlayerViewportMenuItem(int32_t plr, const char *text);
250  void ClearViewportMenu();
251  void AddViewport(class C4ViewportWindow *cvp);
252  void RemoveViewport(class C4ViewportWindow *cvp);
253  void SetInputFunctions(std::list<const char*> &functions);
254  void PropertyDlgUpdate(C4EditCursorSelection &rSelection, bool force_function_update);
255  void ReInitDefinitions();
256  void OnCreatorSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected);
257  void SetObjectSelection(class C4EditCursorSelection &rSelection);
258  void OnObjectListSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected);
259  void OnCreatorCurrentChanged(const QModelIndex & current, const QModelIndex & previous);
260  void UpdateActionObject(C4Object *new_action_object);
261 
262  bool CreateNewScenario(StdStrBuf *out_filename, bool *out_host_as_network); // show "new scenario" dialogue; return true if new scenario is created
263 
264 #ifdef USE_WIN32_WINDOWS
265  bool HandleWin32KeyboardMessage(MSG *msg);
266 #endif
267 
268  void InitWelcomeScreen();
269  void ShowWelcomeScreen();
270  void HideWelcomeScreen();
271 
272  void ClearGamePointers();
273 
274  void Draw(C4TargetFacet &cgo);
275 };
276 
277 class C4ConsoleGUI::State : public C4ConsoleGUIState
278 {
279 public:
280  State(C4ConsoleGUI *console) : C4ConsoleGUIState(console) {}
281 };
282 
283 class C4ToolsDlg::State : C4ConsoleGUI::InternalState<class C4ToolsDlg>
284 {
285 public:
286  State(C4ToolsDlg *toolsDlg) : C4ConsoleGUI::InternalState<class C4ToolsDlg>(toolsDlg) {}
287  ~State() = default;
288 
289  void Clear() {}
290  void Default() {}
291 };
292 
293 #endif // WITH_QT_EDITOR
294 #endif // INC_C4ConsoleQtState
C4ConsoleQtTranslator qt_translator
LandscapeMode
Definition: C4Landscape.h:30
State(C4ConsoleGUI *console)
Definition: C4Console.cpp:654
State(C4ToolsDlg *dlg)
Definition: C4Console.cpp:658
void Copy()
Definition: StdBuf.h:467