* More cursor movement. This thing is flaky!
This commit is contained in:
parent
53fe751648
commit
b3848b4dca
|
@ -150,9 +150,16 @@ function MultiLineEditTextView(options) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.updateRenderBuffer = function() {
|
this.updateRenderBuffer = function() {
|
||||||
|
//
|
||||||
|
// We can estimate what is visible:
|
||||||
|
// * Starting point = start of buffer or previous LF from where we were previously
|
||||||
|
// * Ending point = start + width * height (max chars possible)
|
||||||
|
// If this system is kept, this can be optimized as per above
|
||||||
|
//
|
||||||
|
|
||||||
self.renderBuffer = [];
|
self.renderBuffer = [];
|
||||||
// :TODO: optimize this with asArray() taking the slice information
|
// :TODO: optimize this with asArray() taking the slice information
|
||||||
var lines = self.textBuffer.asArray().slice(self.renderStartIndex, self.renderStartIndex + self.dimens.width * self.dimens.height)
|
var lines = self.textBuffer.asArray()//.slice(self.renderStartIndex, self.renderStartIndex + self.dimens.width * self.dimens.height)
|
||||||
.join('')
|
.join('')
|
||||||
.split(/\r\n|\n|\r/g);
|
.split(/\r\n|\n|\r/g);
|
||||||
|
|
||||||
|
@ -196,6 +203,10 @@ function MultiLineEditTextView(options) {
|
||||||
//return self.renderBuffer[row].replace(/\n/g, '').length;
|
//return self.renderBuffer[row].replace(/\n/g, '').length;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.getRenderTextLength = function(row) {
|
||||||
|
return self.renderBuffer[row].replace(/\n/g, '').length;
|
||||||
|
};
|
||||||
|
|
||||||
this.getLineTextLengthToColumn = function(row, col) {
|
this.getLineTextLengthToColumn = function(row, col) {
|
||||||
return self.renderBuffer[row].replace(self.getReplaceTabsRegExp(), '\t').replace(/\n/g, '').slice(0, col).length;
|
return self.renderBuffer[row].replace(self.getReplaceTabsRegExp(), '\t').replace(/\n/g, '').slice(0, col).length;
|
||||||
};
|
};
|
||||||
|
@ -252,6 +263,55 @@ function MultiLineEditTextView(options) {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.cursorMoveJumpTab = function(cursorDir) {
|
||||||
|
assert('\t' === self.getCharAtCursorPosition());
|
||||||
|
|
||||||
|
//
|
||||||
|
// A few scenarios:
|
||||||
|
// * Cursor just moved up or down and we got dumped in the middle of a tab sequence. Always jump right here.
|
||||||
|
// * Cursor moved left or right: We should be on the first \t in either direction & need to jump
|
||||||
|
// * Tabs may expand to start/end of line -- in this case we should move to the next line
|
||||||
|
//
|
||||||
|
// Example tab sequence when up/down (tabSize=8)
|
||||||
|
// Actual: Hello\tWorld!
|
||||||
|
// Render: Hello\t\t\t\t\t\t\t\tWorld!
|
||||||
|
// ^-- cursor up from here
|
||||||
|
//
|
||||||
|
switch(cursorDir) {
|
||||||
|
case 'left' :
|
||||||
|
self.cursorPos.col -= (self.tabWidth - 1);
|
||||||
|
if(self.cursorPos.col <= 0) {
|
||||||
|
self.cursorToEndOfPreviousLine();
|
||||||
|
} else {
|
||||||
|
self.client.term.write(ansi.left(self.tabWidth - 1));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'right' :
|
||||||
|
self.cursorPos.col += (self.tabWidth - 1);
|
||||||
|
if(self.cursorPos.col >= self.dimens.width) {
|
||||||
|
self.cursorToStartOfNextLine();
|
||||||
|
} else {
|
||||||
|
self.client.term.write(ansi.right(self.tabWidth - 1));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'up' :
|
||||||
|
case 'down' :
|
||||||
|
//
|
||||||
|
// We're going to move right, but we need to know where we're at in
|
||||||
|
// in the render buffer expanded tabs
|
||||||
|
//
|
||||||
|
var pos = self.cursorPos.col;
|
||||||
|
var prevTabs = 0;
|
||||||
|
while('\t' === self.renderBuffer[pos--]) {
|
||||||
|
prevTabs++;
|
||||||
|
}
|
||||||
|
console.log(prevTabs)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
this.cursorDown = function() {
|
this.cursorDown = function() {
|
||||||
var lastRow = self.dimens.height - self.position.row; // :TODO: should be calculated elsewhere
|
var lastRow = self.dimens.height - self.position.row; // :TODO: should be calculated elsewhere
|
||||||
if(self.cursorPos.row > lastRow) {
|
if(self.cursorPos.row > lastRow) {
|
||||||
|
@ -271,9 +331,9 @@ function MultiLineEditTextView(options) {
|
||||||
|
|
||||||
// make tab adjustment if necessary
|
// make tab adjustment if necessary
|
||||||
if('\t' === self.getCharAtCursorPosition()) {
|
if('\t' === self.getCharAtCursorPosition()) {
|
||||||
//self.cursorPos.col++;
|
self.cursorMoveJumpTab('right');
|
||||||
self.cursorPos.col += (self.tabWidth - 1);
|
//self.cursorPos.col += (self.tabWidth - 1);
|
||||||
self.client.term.write(ansi.right(self.tabWidth - 1));
|
//self.client.term.write(ansi.right(self.tabWidth - 1));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// :TODO: completely backwards -- should go down
|
// :TODO: completely backwards -- should go down
|
||||||
|
@ -285,7 +345,7 @@ function MultiLineEditTextView(options) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
this.cursorUpOneLine = function() {
|
this.cursorToStartOfPreviousLine = function() {
|
||||||
if(self.cursorPos.row > 0) {
|
if(self.cursorPos.row > 0) {
|
||||||
self.cursorPos.row--;
|
self.cursorPos.row--;
|
||||||
self.cursorPos.col = 0;
|
self.cursorPos.col = 0;
|
||||||
|
@ -295,18 +355,34 @@ function MultiLineEditTextView(options) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
this.cursorDownOneLine = function() {
|
this.cursorToEndOfPreviousLine = function() {
|
||||||
|
if(self.cursorPos.row > 0) {
|
||||||
|
self.cursorPos.row--;
|
||||||
|
self.cursorPos.col = self.getRenderTextLength(self.cursorPos.row) - 1;
|
||||||
|
self.moveCursorTo(self.cursorPos.row, self.cursorPos.col);
|
||||||
|
} else {
|
||||||
|
// can we scroll??!!!
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.cursorToStartOfNextLine = function() {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.cursorLeft = function() {
|
this.cursorLeft = function() {
|
||||||
if(self.cursorPos.col > 0) {
|
if(self.cursorPos.col > 0) {
|
||||||
self.cursorPos.col--;
|
self.cursorPos.col--;
|
||||||
|
self.client.term.write(ansi.left());
|
||||||
|
|
||||||
|
if('\t' === self.getCharAtCursorPosition()) {
|
||||||
|
self.cursorMoveJumpTab('left');
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if(self.cursorPos.row > 0) {
|
self.cursorToEndOfPreviousLine();
|
||||||
|
/*if(self.cursorPos.row > 0) {
|
||||||
self.cursorPos.row--;
|
self.cursorPos.row--;
|
||||||
self.cursorPos.col = self.renderBuffer[self.cursorPos.row].length;
|
self.cursorPos.col = self.renderBuffer[self.cursorPos.row].length;
|
||||||
}
|
}
|
||||||
//self.cursorUp();
|
*/
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue