Skip to content

Commit a849c3a

Browse files
committed
Add console panel
1 parent 2de4001 commit a849c3a

File tree

3 files changed

+71
-11
lines changed

3 files changed

+71
-11
lines changed

apps/freeablo/engine/engineinputmanager.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
#pragma once
32

43
#include "../components/misc/misc.h"

apps/freeablo/fagui/guimanager.cpp

Lines changed: 68 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ namespace FAGui
5151
return PanelPlacement::left;
5252
case PanelType::quests:
5353
return PanelPlacement::left;
54+
case PanelType::console:
55+
return PanelPlacement::right;
5456
}
5557
return PanelPlacement::none;
5658
}
@@ -60,6 +62,7 @@ namespace FAGui
6062
switch (type)
6163
{
6264
case PanelType::none:
65+
case PanelType::console:
6366
break;
6467
case PanelType::inventory:
6568
return "data/inv/inv.cel";
@@ -87,6 +90,8 @@ namespace FAGui
8790
return "character";
8891
case PanelType::quests:
8992
return "quests";
93+
case PanelType::console:
94+
return "console";
9095
}
9196
return "";
9297
}
@@ -135,7 +140,7 @@ namespace FAGui
135140
anim->update();
136141
}
137142

138-
void GuiManager::drawPanel(nk_context* ctx, PanelType panelType, std::function<void(void)> op)
143+
void GuiManager::drawPanel(nk_context* ctx, PanelType panelType, std::function<void(void)> op, int32_t panelW, int32_t panelH)
139144
{
140145
PanelPlacement placement = panelPlacementByType(panelType);
141146
bool shown = *getPanelAtLocation(placement) == panelType;
@@ -144,7 +149,15 @@ namespace FAGui
144149
if (!shown)
145150
return;
146151
auto renderer = FARender::Renderer::get();
147-
auto invTex = renderer->loadImage(bgImgPath(panelType));
152+
const auto bgImg = bgImgPath(panelType);
153+
FARender::FASpriteGroup* invTex = nullptr;
154+
if (bgImg)
155+
{
156+
invTex = renderer->loadImage(bgImgPath(panelType));
157+
panelW = invTex->getWidth();
158+
panelH = invTex->getHeight();
159+
}
160+
148161
int32_t screenW, screenH;
149162
renderer->getWindowDimensions(screenW, screenH);
150163
struct nk_rect dims = nk_rect(
@@ -157,16 +170,24 @@ namespace FAGui
157170
case PanelPlacement::left:
158171
return 0;
159172
case PanelPlacement::right:
160-
return screenW - invTex->getWidth();
173+
return screenW - panelW;
161174
}
162175
return 0;
163176
}(),
164-
(screenH - 125 - invTex->getHeight()) / 2,
165-
invTex->getWidth(),
166-
invTex->getHeight());
177+
(screenH - 125 - panelH) / 2,
178+
panelW,
179+
panelH);
167180
nk_flags flags = NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BACKGROUND;
168181

169-
nk_fa_begin_image_window(ctx, panelName(panelType), dims, flags, invTex->getNkImage(), op, false);
182+
if (invTex)
183+
{
184+
nk_fa_begin_image_window(ctx, panelName(panelType), dims, flags, invTex->getNkImage(), op, false);
185+
}
186+
187+
else
188+
{
189+
nk_fa_begin_window(ctx, panelName(panelType), dims, flags, op, false);
190+
}
170191
}
171192

172193
void GuiManager::triggerItem(const FAWorld::EquipTarget& target)
@@ -509,6 +530,38 @@ namespace FAGui
509530
});
510531
}
511532

533+
void GuiManager::consolePanel(nk_context* ctx)
534+
{
535+
static constexpr size_t bufferSize = 1024 * 1024;
536+
static std::string boxBuffer;
537+
static int boxLen;
538+
static constexpr size_t inputSize = 512;
539+
static char input[inputSize];
540+
static int inputLen;
541+
drawPanel(ctx,
542+
PanelType::console,
543+
[&]() {
544+
nk_layout_space_begin(ctx, NK_STATIC, 0, INT_MAX);
545+
nk_layout_space_push(ctx, nk_rect(5, 5, 490, 250));
546+
nk_edit_string(ctx, NK_EDIT_BOX | NK_EDIT_READ_ONLY, const_cast<char*>(boxBuffer.c_str()), &boxLen, bufferSize, nk_filter_default);
547+
const int32_t height = FARender::Renderer::get()->smallFont()->height + 15;
548+
nk_layout_space_push(ctx, nk_rect(5, 270, 490, height));
549+
nk_flags active = nk_edit_string(ctx, NK_EDIT_FIELD | NK_EDIT_SIG_ENTER, input, &inputLen, inputSize, nk_filter_ascii);
550+
551+
if (active & NK_EDIT_COMMITED)
552+
{
553+
input[inputLen] = '\n';
554+
++inputLen;
555+
boxBuffer.append(input, inputLen);
556+
boxLen += inputLen;
557+
inputLen = 0;
558+
}
559+
nk_layout_space_end(ctx);
560+
},
561+
500,
562+
300);
563+
}
564+
512565
void GuiManager::belt(nk_context* ctx)
513566
{
514567
auto beltTopLeft = nk_vec2(205, 21);
@@ -757,6 +810,7 @@ namespace FAGui
757810
spellsPanel(ctx);
758811
questsPanel(ctx);
759812
characterPanel(ctx);
813+
consolePanel(ctx);
760814
bottomMenu(ctx, hoverStatus);
761815

762816
mDialogManager.update(ctx);
@@ -766,7 +820,7 @@ namespace FAGui
766820
mMenuHandler->update(ctx);
767821
}
768822

769-
if (isModalDlgShown() || mMenuHandler->isActive())
823+
if (isModalDlgShown() || mMenuHandler->isActive() || *getPanelAtLocation(PanelPlacement::right) == PanelType::console)
770824
Engine::EngineMain::get()->getLocalInputHandler()->blockInput();
771825
else
772826
Engine::EngineMain::get()->getLocalInputHandler()->unblockInput();
@@ -797,7 +851,7 @@ namespace FAGui
797851

798852
// Can't use hotkeys when dialogs are open.
799853
// TODO: mGoldSplitTarget might be better as a standard dialog if possible?
800-
if (mGoldSplitTarget || mDialogManager.hasDialog())
854+
if (mGoldSplitTarget || mDialogManager.hasDialog() || *getPanelAtLocation(PanelPlacement::right) == PanelType::console)
801855
return false;
802856

803857
return true;
@@ -827,6 +881,11 @@ namespace FAGui
827881
return;
828882
togglePanel(PanelType::spells);
829883
break;
884+
case Engine::KeyboardInputAction::toggleConsole:
885+
if (!hotkeysEnabled())
886+
return;
887+
togglePanel(PanelType::console);
888+
break;
830889
case Engine::KeyboardInputAction::reject:
831890
if (mGoldSplitTarget)
832891
mGoldSplitTarget = nullptr;

apps/freeablo/fagui/guimanager.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ namespace FAGui
5757
spells,
5858
character,
5959
quests,
60+
console
6061
};
6162

6263
enum class PanelPlacement
@@ -123,7 +124,7 @@ namespace FAGui
123124
void updateAnimations();
124125
void startingScreen();
125126
void togglePanel(PanelType type);
126-
void drawPanel(nk_context* ctx, PanelType panelType, std::function<void(void)> op);
127+
void drawPanel(nk_context* ctx, PanelType panelType, std::function<void(void)> op, int32_t panelW = 0, int32_t panelH = 0);
127128
void triggerItem(const FAWorld::EquipTarget& target);
128129

129130
// TODO: remove this + use std::variant when we switch to c++17
@@ -161,6 +162,7 @@ namespace FAGui
161162
void characterPanel(nk_context* ctx);
162163
void questsPanel(nk_context* ctx);
163164
void spellsPanel(nk_context* ctx);
165+
void consolePanel(nk_context* ctx);
164166
void belt(nk_context* ctx);
165167
void bottomMenu(nk_context* ctx, const FAWorld::HoverStatus& hoverStatus);
166168

0 commit comments

Comments
 (0)