From cec4c8cd30730ce6d05513065f20e9e10e26af8e Mon Sep 17 00:00:00 2001 From: Warmist Date: Fri, 7 Mar 2014 18:52:06 +0200 Subject: [PATCH] Added an output stream, now response is visible in same window. Also added a way to start prompt pre-filled. It's nice to bind it to e.g. ctrl-shift-o "command-prompt :lua" --- Readme.rst | 3 +- plugins/command-prompt.cpp | 81 ++++++++++++++++++++++++++++++++------ 2 files changed, 71 insertions(+), 13 deletions(-) diff --git a/Readme.rst b/Readme.rst index 261892fe4..c35942894 100644 --- a/Readme.rst +++ b/Readme.rst @@ -332,7 +332,8 @@ Options: command-prompt -------------- A one line command prompt in df. Same as entering command into dfhack console. Best -used as a keybinding. +used as a keybinding. Can be called with optional "entry" that will start prompt with +that pre-filled. Adventure mode diff --git a/plugins/command-prompt.cpp b/plugins/command-prompt.cpp index 1deb241a4..842daad7b 100644 --- a/plugins/command-prompt.cpp +++ b/plugins/command-prompt.cpp @@ -4,10 +4,13 @@ #include #include #include +#include #include #include +#include +#include #include "df/interface_key.h" #include "df/ui.h" @@ -20,6 +23,16 @@ using df::global::ui; using df::global::gps; using df::global::enabler; +class viewscreen_commandpromptst; +class prompt_ostream:public buffered_color_ostream +{ + viewscreen_commandpromptst *parent_; + protected: + void flush_proxy(); + public: + prompt_ostream(viewscreen_commandpromptst* parent):parent_(parent){} + bool empty(){return buffer.empty();} +}; class viewscreen_commandpromptst : public dfhack_viewscreen { public: void feed(std::set *events); @@ -32,7 +45,7 @@ public: void help() { } std::string getFocusString() { return "commandprompt"; } - viewscreen_commandpromptst() + viewscreen_commandpromptst(std::string entry):is_response(false),entry(entry) { show_fps=df::global::gps->display_frames; df::global::gps->display_frames=0; @@ -41,11 +54,26 @@ public: { df::global::gps->display_frames=show_fps; } + + void add_response(color_value v,std::string s) + { + responses.push_back(std::make_pair(v,s)); + } protected: + std::list > responses; + bool is_response; bool show_fps; void submit(); std::string entry; }; +void prompt_ostream::flush_proxy() +{ + if (buffer.empty()) + return; + for(auto it=buffer.begin();it!=buffer.end();it++) + parent_->add_response(it->first,it->second); + buffer.clear(); +} void viewscreen_commandpromptst::render() { if (Screen::isDismissed(this)) @@ -55,23 +83,46 @@ void viewscreen_commandpromptst::render() auto dim = Screen::getWindowSize(); parent->render(); - Screen::fillRect(Screen::Pen(' ', 7, 0),0,0,dim.x,0); - Screen::paintString(Screen::Pen(' ', 7, 0), 0, 0,"[DFHack]#"); - if(entry.size()second; + Screen::paintString(Screen::Pen(' ',it->first,0),0,i,cur_line.substr(0,cur_line.size()-1)); + } + } else { - Screen::paintTile(Screen::Pen('>', 7, 0), 9, 0); - Screen::paintString(Screen::Pen(' ', 7, 0), 10, 0, entry.substr(entry.size()-dim.x)); + Screen::fillRect(Screen::Pen(' ', 7, 0),0,0,dim.x,0); + Screen::paintString(Screen::Pen(' ', 7, 0), 0, 0,"[DFHack]#"); + if(entry.size()', 7, 0), 9, 0); + Screen::paintString(Screen::Pen(' ', 7, 0), 10, 0, entry.substr(entry.size()-dim.x)); + } } - } void viewscreen_commandpromptst::submit() { CoreSuspendClaimer suspend; - color_ostream_proxy out(Core::getInstance().getConsole()); + if(is_response) + { + Screen::dismiss(this); + return; + } + //color_ostream_proxy out(Core::getInstance().getConsole()); + prompt_ostream out(this); Core::getInstance().runCommand(out, entry); - Screen::dismiss(this); + if(out.empty() && responses.empty()) + Screen::dismiss(this); + else + { + is_response=true; + } } void viewscreen_commandpromptst::feed(std::set *events) { @@ -94,6 +145,8 @@ void viewscreen_commandpromptst::feed(std::set *events) submit(); return; } + if(is_response) + return; for (auto it = events->begin(); it != events->end(); ++it) { auto key = *it; @@ -113,13 +166,17 @@ void viewscreen_commandpromptst::feed(std::set *events) DFHACK_PLUGIN("command-prompt"); command_result show_prompt(color_ostream &out, std::vector & parameters) { - Screen::show(new viewscreen_commandpromptst); + std::string params; + for(size_t i=0;i &commands) { commands.push_back(PluginCommand( - "command-prompt","Shows a command prompt on window.",show_prompt + "command-prompt","Shows a command prompt on window.",show_prompt,false, + "command-prompt [entry] - shows a cmd prompt in df window. Entry is used for default prefix (e.g. ':lua')" )); return CR_OK; }