Merge remote-tracking branch 'warmist/dev-cmdprompt' into develop

develop
Alexander Gavrilov 2014-03-24 20:10:58 +04:00
commit 36b069e981
5 changed files with 198 additions and 0 deletions

@ -9,6 +9,7 @@ DFHack future
New commands:
- move the 'grow', 'extirpate' and 'immolate' commands as 'plant' subcommands
- 'plant create' - spawn a new shrub under the cursor
- command-prompt: a dfhack command prompt in df.
Misc improvements:
- digfort: improved csv parsing, add start() comment handling

@ -329,6 +329,12 @@ Options:
The building must be one of stockpile, workshop, furnace, trap,
siege engine or an activity zone.
command-prompt
--------------
A one line command prompt in df. Same as entering command into dfhack console. Best
used as a keybinding. Can be called with optional "entry" that will start prompt with
that pre-filled.
Adventure mode
==============

@ -31,6 +31,9 @@ keybinding add Ctrl-Alt-S@dwarfmode/Default quicksave
keybinding add Ctrl-Shift-N gui/rename
keybinding add Ctrl-Shift-T "gui/rename unit-profession"
# a dfhack prompt in df. Sublime text like.
keybinding add Ctrl-Shift-P command-prompt
##############################
# Generic adv mode bindings #
##############################

@ -163,6 +163,7 @@ if (BUILD_SUPPORTED)
DFHACK_PLUGIN(cleanconst cleanconst.cpp)
DFHACK_PLUGIN(3dveins 3dveins.cpp)
DFHACK_PLUGIN(strangemood strangemood.cpp)
DFHACK_PLUGIN(command-prompt command-prompt.cpp)
endif()
# this is the skeleton plugin. If you want to make your own, make a copy and then change it

@ -0,0 +1,187 @@
//command-prompt a one line command entry at the top of the screen for quick commands
#include "Core.h"
#include <Console.h>
#include <Export.h>
#include <PluginManager.h>
#include <ColorText.h>
#include <modules/Screen.h>
#include <set>
#include <list>
#include <utility>
#include "df/interface_key.h"
#include "df/ui.h"
#include "df/graphic.h"
#include "df/enabler.h"
using namespace DFHack;
using namespace df::enums;
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<df::interface_key> *events);
void logic() {
dfhack_viewscreen::logic();
}
void render();
void help() { }
std::string getFocusString() { return "commandprompt"; }
viewscreen_commandpromptst(std::string entry):is_response(false),entry(entry)
{
show_fps=df::global::gps->display_frames;
df::global::gps->display_frames=0;
}
~viewscreen_commandpromptst()
{
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<std::pair<color_value,std::string> > 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))
return;
dfhack_viewscreen::render();
auto dim = Screen::getWindowSize();
parent->render();
if(is_response)
{
auto it=responses.begin();
for(int i=0;i<dim.y && it!=responses.end();i++,it++)
{
Screen::fillRect(Screen::Pen(' ', 7, 0),0,i,dim.x,i);
std::string cur_line=it->second;
Screen::paintString(Screen::Pen(' ',it->first,0),0,i,cur_line.substr(0,cur_line.size()-1));
}
}
else
{
Screen::fillRect(Screen::Pen(' ', 7, 0),0,0,dim.x,0);
Screen::paintString(Screen::Pen(' ', 7, 0), 0, 0,"[DFHack]#");
if(entry.size()<dim.x)
Screen::paintString(Screen::Pen(' ', 7, 0), 10,0 , entry);
else
{
Screen::paintTile(Screen::Pen('>', 7, 0), 9, 0);
Screen::paintString(Screen::Pen(' ', 7, 0), 10, 0, entry.substr(entry.size()-dim.x));
}
}
}
void viewscreen_commandpromptst::submit()
{
CoreSuspendClaimer suspend;
if(is_response)
{
Screen::dismiss(this);
return;
}
//color_ostream_proxy out(Core::getInstance().getConsole());
prompt_ostream out(this);
Core::getInstance().runCommand(out, entry);
if(out.empty() && responses.empty())
Screen::dismiss(this);
else
{
is_response=true;
}
}
void viewscreen_commandpromptst::feed(std::set<df::interface_key> *events)
{
bool leave_all = events->count(interface_key::LEAVESCREEN_ALL);
if (leave_all || events->count(interface_key::LEAVESCREEN))
{
events->clear();
Screen::dismiss(this);
if (leave_all)
{
events->insert(interface_key::LEAVESCREEN);
parent->feed(events);
events->clear();
}
return;
}
if(events->count(interface_key::SELECT))
{
submit();
return;
}
if(is_response)
return;
for (auto it = events->begin(); it != events->end(); ++it)
{
auto key = *it;
if (key==interface_key::STRING_A000) //delete?
{
if(entry.size())
entry.pop_back();
continue;
}
if (key >= interface_key::STRING_A000 &&
key <= interface_key::STRING_A255)
{
entry.push_back(char(key - interface_key::STRING_A000));
}
}
}
DFHACK_PLUGIN("command-prompt");
command_result show_prompt(color_ostream &out, std::vector <std::string> & parameters)
{
std::string params;
for(size_t i=0;i<parameters.size();i++)
params+=parameters[i]+" ";
Screen::show(new viewscreen_commandpromptst(params));
return CR_OK;
}
DFhackCExport command_result plugin_init ( color_ostream &out, std::vector <PluginCommand> &commands)
{
commands.push_back(PluginCommand(
"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;
}
DFhackCExport command_result plugin_shutdown ( color_ostream &out )
{
return CR_OK;
}