summaryrefslogtreecommitdiff
path: root/manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'manager.cpp')
-rw-r--r--manager.cpp62
1 files changed, 46 insertions, 16 deletions
diff --git a/manager.cpp b/manager.cpp
index 059a33f..af8844c 100644
--- a/manager.cpp
+++ b/manager.cpp
@@ -15,20 +15,38 @@ void Manager::receive(const Command &cmd){
if(cmd[0]=="open_file"){
buffers.emplace_back(this);
buffers.back().receive(cmd);
- if(activeIdx==-1)activeIdx=buffers.size()-1;
- } else if(cmd[0]=="error"){
+ activeIdx=buffers.size()-1;
+ } else if(cmd[0]=="open_prompt"){
+ Maybe<string> mfname=runPrompt("open: ");
+ if(mfname.isNothing())return;
+ buffers.emplace_back(this);
+ buffers.back().receive({"open_file",mfname.fromJust()});
+ activeIdx=buffers.size()-1;
+ } else if(cmd[0]=="save_prompt"){
+ if(activeIdx==-1){
+ receive({"error","No buffers open!"});
+ return;
+ }
+ Maybe<string> mfname=runPrompt("save: ");
+ if(mfname.isNothing())return;
+ buffers[activeIdx].filename=mfname.fromJust();
+ buffers[activeIdx].receive({"save_file"});
+ } else if(cmd[0]=="error"||cmd[0]=="info"){
+ if(!have_screen)return;
+ bool isError=cmd[0]=="error";
pushcursor();
Size termsize=gettermsize();
- Style errorStyle={1,9,true,false};
+ Style style={isError?1:9,9,isError,false};
fillrect(0,termsize.h-1,termsize.w,1,' ');
moveto(0,termsize.h-1);
- setstyle(&errorStyle);
+ setstyle(&style);
tprintf("%s",cmd[1].data());
popcursor();
} else if(cmd[0]=="quit_app"){
should_quit=true;
} else if(cmd[0]=="display_prompt"){
- runPrompt();
+ Maybe<string> mline=runPrompt(":");
+ if(mline.isJust())receive({"info",{mline.fromJust()}});
} else {
if(activeIdx==-1)bel();
else buffers[activeIdx].receive(cmd);
@@ -94,6 +112,7 @@ void Manager::show(){
pushcursor();
moveto(0,0);
setstyle(&backStyle);
+ fillrect(0,0,termsize.w,1,' ');
if(print_start>=hilight_start+hilight_len||print_start+termsize.w<=hilight_start){
string text=bartext.substr(print_start,termsize.w);
tprintf("%s",text.data());
@@ -113,19 +132,23 @@ void Manager::show(){
}
class TermioRAII{
+ bool *variable;
+
public:
- TermioRAII(){
+ TermioRAII(bool *variable):variable(variable){
initscreen();
initkeyboard(true);
+ *variable=true;
}
~TermioRAII(){
+ *variable=false;
endkeyboard();
endscreen();
}
};
int Manager::io(){
- TermioRAII termioRAII;
+ TermioRAII termioRAII(&have_screen);
if(activeIdx==-1){
buffers.emplace_back(this);
@@ -156,10 +179,17 @@ int Manager::io(){
}
-void Manager::runPrompt(){
+//Returns entered text, or Nothing if cancelled
+Maybe<string> Manager::runPrompt(const string &promptString){
Size termsize=gettermsize();
moveto(0,termsize.h-1);
- tputc(':');
+ i64 leftX=promptString.size();
+ if((i64)promptString.size()>termsize.w*3/4){
+ string truncated(promptString.begin(),promptString.begin()+(termsize.w*3/4-3));
+ tprintf("%s...",truncated.data());
+ } else {
+ tprintf("%s",promptString.data());
+ }
global_keyinput.cancel();
@@ -167,7 +197,7 @@ void Manager::runPrompt(){
Buffer promptBuffer(this,true);
while(true){
termsize=gettermsize();
- promptBuffer.show(1,termsize.h-1,termsize.w-1,1);
+ promptBuffer.show(leftX,termsize.h-1,termsize.w-leftX,1);
redraw();
int key=tgetkey();
@@ -178,14 +208,14 @@ void Manager::runPrompt(){
bel();
}
} else {
- if(ret.fromRight()[0]=="insert_newline"){
- inputLine=promptBuffer.getText();
- break;
+ Command cmd=ret.fromRight();;
+ if(cmd[0]=="insert_newline"){
+ return promptBuffer.getText();
+ } else if(cmd[0]=="cancel"){
+ return {};
} else {
- promptBuffer.receive(ret.fromRight());
+ promptBuffer.receive(cmd);
}
}
}
-
- receive({"error",inputLine});
}