From 2275e9ab7cb53dbb40887028544e80dd39597402 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Thu, 12 Jan 2017 20:30:40 +0100 Subject: Opening and saving --- manager.cpp | 62 +++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 16 deletions(-) (limited to 'manager.cpp') 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 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 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 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 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}); } -- cgit v1.2.3-70-g09d2