diff options
| author | tomsmeding <tom.smeding@gmail.com> | 2017-01-09 14:16:28 +0100 | 
|---|---|---|
| committer | tomsmeding <tom.smeding@gmail.com> | 2017-01-09 14:16:28 +0100 | 
| commit | 99142b0661ba8f54e1ff8dda035c67be54cac6a6 (patch) | |
| tree | fb74342482890cf33b644c6cde62b465d83ef0de | |
| parent | de013a7b1e16f021b3bc97818a5d7007ea0a92e9 (diff) | |
Backspace/delete and end-of-line cursor fix
| -rw-r--r-- | buffer.cpp | 34 | ||||
| -rw-r--r-- | config.cpp | 2 | 
2 files changed, 34 insertions, 2 deletions
| @@ -16,6 +16,8 @@ Buffer::Buffer(Manager *manager)  	:manager(manager){}  void Buffer::receive(const Command &cmd){ +	//TODO: optimise the renewLayout's in this function +  	if(cmd[0]=="open_file"){  		const string &fname=cmd[1];  		filename=fname; @@ -33,17 +35,37 @@ void Buffer::receive(const Command &cmd){  			tb.insert(cursor.line,cursor.x,cmd[1][0]);  			cursor.x++;  		} -		//TODO: optimise this  		renewLayout(screen[0].line,screen[0].part,lastWidth,lastHeight);  	} else if(cmd[0]=="insert_newline"){  		tb.insert(cursor.line,cursor.x,'\n');  		cursor.x=0;  		cursor.line++; -		//TODO: optimise this  		renewLayout(screen[0].line,screen[0].part,lastWidth,lastHeight); +	} else if(cmd[0]=="delete_backward"){ +		if(cursor.x==0&&cursor.line==0){ +			bel(); +		} else { +			if(cursor.x>0){ +				cursor.x--; +				tb.erase(cursor.line,cursor.x); +			} else { +				cursor.line--; +				cursor.x=tb.lineLen(cursor.line); +				tb.erase(cursor.line,cursor.x); +			} +			renewLayout(screen[0].line,screen[0].part,lastWidth,lastHeight); +		} +	} else if(cmd[0]=="delete_forward"){ +		if(cursor.line==tb.numLines()-1&&cursor.x==tb.lineLen(cursor.line)){ +			bel(); +		} else { +			tb.erase(cursor.line,cursor.x); +			renewLayout(screen[0].line,screen[0].part,lastWidth,lastHeight); +		}  	} else {  		THROW("Unknown command");  	} +	cerr<<"New cursor is (line="<<cursor.line<<", x="<<cursor.x<<")"<<endl;  }  static string showChar(char c){ @@ -234,6 +256,14 @@ void Buffer::show(i64 atx,i64 aty,i64 width,i64 height){  			}  			screenX++;  		} + +		//Maybe the cursor should be positioned AFTER this line +		if(curScreenX==-1&&screen[y].line==cursor.line&&cursor.x==tb.lineLen(cursor.line)&& +		   (y==(i64)screen.size()-1||screen[y+1].line>cursor.line)){ +			if(screenX==atx+width)curScreenX=screenX-1; +			else curScreenX=screenX; +			curScreenY=aty+y; +		}  	}  	setstyle(&textStyle);  	if(y<height)fillrect(atx,aty+y,width,height-y,' '); @@ -9,6 +9,8 @@ using namespace std;  Keybindings global_keybindings={  	{KEY_CTRL+'Q',{"quit_app"}},  	{'\n',{"insert_newline"}}, +	{KEY_BACKSPACE,{"delete_backward"}}, +	{KEY_DELETE,{"delete_forward"}},  };  class Init{public: Init(){ | 
