OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
consolewidget.cpp
Go to the documentation of this file.
1#include "consolewidget.h"
2
3#include <Tempest/Painter>
4#include <Tempest/UiOverlay>
5#include <Tempest/Application>
6
7#include "mainwindow.h"
8#include "utils/gthfont.h"
9#include "resources.h"
10#include "gothic.h"
11#include "build.h"
12
13using namespace Tempest;
14
15struct ConsoleWidget::Overlay : public Tempest::UiOverlay {
17
19
20 void mouseDownEvent(MouseEvent& e) override {
21 e.accept();
22 }
23
24 void mouseMoveEvent(MouseEvent& e) override {
25 e.accept();
26 }
27
28 void mouseWheelEvent(MouseEvent& e) override {
29 e.accept();
30 }
31
32 void paintEvent(PaintEvent&) override {
33 }
34
35 void keyDownEvent(Tempest::KeyEvent& e) override {
37 e.accept();
38 }
39
40 void keyRepeatEvent(Tempest::KeyEvent& e) override {
42 e.accept();
43 }
44
45 void keyUpEvent(Tempest::KeyEvent& e) override {
46 owner.keyUpEvent(e);
47 e.accept();
48 }
49
50 void closeEvent(Tempest::CloseEvent& e) override {
51 e.ignore();
52 }
53 };
54
56 :mainWindow(owner) {
58
59 setMargins(Margin(8,8,8,8));
60 setSizePolicy(Fixed);
61
62 log.emplace_back(appBuild);
63 log.emplace_back("");
64
65 closeSk = Shortcut(*this,Event::M_NoModifier,Event::K_F2);
66 closeSk.onActivated.bind(this,&ConsoleWidget::close);
67
68 background = Resources::loadTexture("CONSOLE.TGA");
69
70 marvin.print.bind(this,&ConsoleWidget::printLine);
71 }
72
76
78 if(overlay==nullptr)
79 return;
80 Tempest::UiOverlay* ov = overlay;
81 overlay = nullptr;
82
83 setVisible(false);
84 CloseEvent e;
85 this->closeEvent(e);
86
87 ov->takeWidget(this);
88 delete ov;
89 }
90
92 if(overlay==nullptr){
93 overlay = new Overlay(*this);
94
95 SystemApi::addOverlay(std::move(overlay));
96 overlay->setLayout(Vertical);
97 overlay->addWidget(this);
98 overlay->addWidget(new Widget());
99 }
100
102 setVisible(true);
103 while(overlay && Application::isRunning()) {
104 Application::processEvents();
105 }
106 return 0;
107 }
108
109void ConsoleWidget::paintEvent(PaintEvent& e) {
110 Painter p(e);
111 if(background!=nullptr)
112 p.setBrush(*background);
113 p.drawRect(0,0,w(),h(),
114 0,0,p.brush().w(),p.brush().h());
115
116 const float scale = Gothic::interfaceScale(&mainWindow);
117 auto& fnt = Resources::font(scale);
118 int y = h() - margins().bottom;
119
120 for(size_t i=log.size(); i>0;) {
121 --i;
122 fnt.drawText(p, margins().left, y, log[i]);
123 y-=fnt.pixelSize();
124 if(i+1==log.size()) {
125 int x = margins().left + fnt.textSize(log[i].data(),log[i].data()+cursPos).w;
126 float a = float(Application::tickCount()%2000)/2000.f;
127 p.setBrush(Color(1,1,1,a));
128 p.drawRect(x,y,1,fnt.pixelSize());
129 update();
130 }
131 if(y<0)
132 break;
133 }
134 }
135
137 if(Event::K_F1<=e.key && e.key<=Event::K_F12) {
138 e.ignore();
139 return;
140 }
141
142 if(e.key==Event::K_ESCAPE) {
143 close();
144 }
145
146 if(e.key==Event::K_Left) {
147 if (cursPos>0)
148 cursPos--;
149 return;
150 }
151 if(e.key==Event::K_Right) {
152 if(cursPos<log.back().size())
153 cursPos++;
154 return;
155 }
156 if(e.key==Event::K_Up) {
157 histPos++;
158 if(histPos<cmdHist.size()) {
159 if(histPos==0)
160 currCmd = log.back();
161 log.back() = cmdHist[cmdHist.size()-1-histPos];
162 cursPos = log.back().size();
163 }
164 else {
165 histPos = size_t(cmdHist.size()-1);
166 }
167 return;
168 }
169 if(e.key==Event::K_Down) {
170 if(histPos==size_t(-1))
171 return;
172 histPos--;
173 if(histPos<cmdHist.size())
174 log.back() = cmdHist[cmdHist.size()-1-histPos];
175 else
176 log.back() = currCmd;
177 cursPos = log.back().size();
178 return;
179 }
180
181 if(e.key==Event::K_C && (e.modifier&Event::M_Command)==Event::M_Command) {
182 log.emplace_back("");
183 cursPos = 0;
184 currCmd = "";
185 histPos = size_t(-1);
186 return;
187 }
188
189 if(e.key==Event::K_Back) {
190 if(0<cursPos && cursPos<=log.back().size()) {
191 log.back().erase(--cursPos,1);
192 }
193 return;
194 }
195 if(e.key==Event::K_Delete) {
196 if(log.back().size()>cursPos) {
197 log.back().erase(cursPos,1);
198 }
199 return;
200 }
201 if(e.key==Event::K_Tab) {
202 if(log.back().size()>0 && marvin.autoComplete(log.back()))
203 cursPos = log.back().size();
204 return;
205 }
206 if(e.key==Event::K_Return) {
207 if(log.back().size()>0) {
208 const auto cmd = log.back();
209 const size_t cmdId = log.size()-1;
210 cmdHist.emplace_back(cmd);
211 log.push_back("");
212 if(!marvin.exec(cmd) && cmdId<log.size()) {
213 log[cmdId] = "Unknown command : " + cmd;
214 }
215 cursPos = 0;
216 currCmd = "";
217 histPos = size_t(-1);
218 }
219 return;
220 }
221
222 char ch = '\0';
223 if(('a'<=e.code && e.code<='z') || ('A'<=e.code && e.code<='Z') ||
224 ('0'<=e.code && e.code<='9') || e.code==' ' || e.code=='.' || e.code=='_' || e.code=='-')
225 ch = char(e.code);
226 if(ch=='\0')
227 return;
228 log.back().insert(cursPos,1,ch);
229 cursPos++;
230 }
231
233 keyDownEvent(e);
234 }
235
236void ConsoleWidget::printLine(std::string_view s) {
237 auto cmd = std::move(log.back());
238 log.back() = s;
239 log.emplace_back(std::move(cmd));
240 }
241
243 const float scale = Gothic::interfaceScale(this);
244 setSizeHint(int(1024*scale), int(256*scale));
245 }
246
247
static const char * appBuild
Definition build.h:3
void printLine(std::string_view s)
void keyDownEvent(Tempest::KeyEvent &e) override
void paintEvent(Tempest::PaintEvent &e) override
ConsoleWidget(const MainWindow &owner)
void keyRepeatEvent(Tempest::KeyEvent &e) override
static float interfaceScale(const Tempest::Widget *w)
Definition gothic.cpp:471
Main application window handling game rendering and input.
Definition mainwindow.h:58
bool exec(std::string_view v)
Definition marvin.cpp:255
Tempest::Signal< void(std::string_view)> print
Definition marvin.h:13
bool autoComplete(std::string &v)
Definition marvin.cpp:243
static const GthFont & font(const float scale)
static const Tempest::Texture2d * loadTexture(std::string_view name, bool forceMips=false)
Main application window for OpenGothic.
void mouseMoveEvent(MouseEvent &e) override
void keyRepeatEvent(Tempest::KeyEvent &e) override
void keyUpEvent(Tempest::KeyEvent &e) override
Overlay(ConsoleWidget &owner)
void paintEvent(PaintEvent &) override
void mouseDownEvent(MouseEvent &e) override
void mouseWheelEvent(MouseEvent &e) override
void keyDownEvent(Tempest::KeyEvent &e) override
void closeEvent(Tempest::CloseEvent &e) override