@@ -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 ;
0 commit comments