Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reflow text on resize #1864

Merged
merged 38 commits into from
Jan 25, 2019
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
8a50729
Reflow wider
Tyriar Dec 28, 2018
314f98f
Mostly working for reflowing to smaller
Tyriar Dec 28, 2018
fa47036
Fix row removal in reflowLarger
Tyriar Dec 28, 2018
8bc04c2
Tidy up
Tyriar Dec 28, 2018
3311ed5
Do shrink in reverse, fix up row remove count again
Tyriar Dec 28, 2018
ae29dbb
Fix scrollbar when wrapping beyond single viewport of data
Tyriar Dec 28, 2018
7684f93
Fix ydisp/ybase after trimming buffer
Tyriar Dec 28, 2018
358898d
Fix some tests
Tyriar Dec 28, 2018
a33e8a6
Properly shrink rows to cols every time
Tyriar Dec 28, 2018
2a0da17
Add a bunch of reflow tests
Tyriar Dec 28, 2018
72369e0
Only enable reflow on the normal buffer
Tyriar Dec 28, 2018
7435971
Merge remote-tracking branch 'origin/master' into 622_reflow3
Tyriar Dec 29, 2018
4a9f10d
Remove some of Buffer's dependency on Terminal
Tyriar Dec 29, 2018
dde9618
Keep track of cols/rows inside Buffer
Tyriar Dec 29, 2018
478742a
Make reflow small crazy fast
Tyriar Dec 30, 2018
c9f4a65
Clean up comments and todos
Tyriar Dec 31, 2018
b7081ab
Move loop into reflowLarger (adjust indent)
Tyriar Dec 31, 2018
135e31f
Speed up reflow larger by batching removals
Tyriar Dec 31, 2018
1612cec
Fix reflow larger bug, add regression test
Tyriar Dec 31, 2018
db488eb
Reflow combined chars
Tyriar Dec 31, 2018
40e8618
Discard cut off combined data when resizing BufferLines
Tyriar Dec 31, 2018
840970e
Update markers after a reflow
Tyriar Dec 31, 2018
6559931
Add lots of tests
Tyriar Dec 31, 2018
2ce67b8
Remove unneeded MockTerminal member
Tyriar Dec 31, 2018
90950e2
Merge branch 'master' into 622_reflow3
jerch Jan 5, 2019
6581eb7
fix leftover BufferLineConstructor
jerch Jan 5, 2019
7fe3f0a
Improve BufferLine test
Tyriar Jan 11, 2019
68197ed
Merge branch 'master' into 622_reflow3
Tyriar Jan 17, 2019
4843ca5
Fix reflow larger with wide chars
Tyriar Jan 21, 2019
ce69dce
Progress on reflow smaller with wide chars
Tyriar Jan 24, 2019
df7cd9c
Get reflow smaller working for wide chars
Tyriar Jan 24, 2019
178c513
Clean up
Tyriar Jan 24, 2019
deb04ca
Merge branch 'master' into 622_reflow3
Tyriar Jan 24, 2019
dfff04c
Pull toRemove step into BufferReflow
Tyriar Jan 24, 2019
d4bd8ae
Pull more parts out of reflow larger
Tyriar Jan 24, 2019
99ac780
Remove out param from reflow large method
Tyriar Jan 24, 2019
109e3a5
jsdoc
Tyriar Jan 24, 2019
52a429f
Merge branch 'master' into 622_reflow3
Tyriar Jan 25, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 104 additions & 2 deletions src/Buffer.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,12 +108,12 @@ describe('Buffer', () => {

describe('resize', () => {
describe('column size is reduced', () => {
it('should not trim the data in the buffer', () => {
it('should trim the data in the buffer', () => {
buffer.fillViewportRows();
buffer.resize(INIT_COLS / 2, INIT_ROWS);
assert.equal(buffer.lines.length, INIT_ROWS);
for (let i = 0; i < INIT_ROWS; i++) {
assert.equal(buffer.lines.get(i).length, INIT_COLS);
assert.equal(buffer.lines.get(i).length, INIT_COLS / 2);
}
});
});
Expand Down Expand Up @@ -233,6 +233,108 @@ describe('Buffer', () => {
}
});
});

describe('reflow', () => {
it('should not wrap empty lines', () => {
buffer.fillViewportRows();
assert.equal(buffer.lines.length, INIT_ROWS);
buffer.resize(INIT_COLS - 5, INIT_ROWS);
assert.equal(buffer.lines.length, INIT_ROWS);
});
it('should shrink row length', () => {
buffer.fillViewportRows();
buffer.resize(5, 10);
assert.equal(buffer.lines.length, 10);
assert.equal(buffer.lines.get(0).length, 5);
assert.equal(buffer.lines.get(1).length, 5);
assert.equal(buffer.lines.get(2).length, 5);
assert.equal(buffer.lines.get(3).length, 5);
assert.equal(buffer.lines.get(4).length, 5);
assert.equal(buffer.lines.get(5).length, 5);
assert.equal(buffer.lines.get(6).length, 5);
assert.equal(buffer.lines.get(7).length, 5);
assert.equal(buffer.lines.get(8).length, 5);
assert.equal(buffer.lines.get(9).length, 5);
});
it('should wrap and unwrap lines', () => {
buffer.fillViewportRows();
buffer.resize(5, 10);
const firstLine = buffer.lines.get(0);
for (let i = 0; i < 5; i++) {
const code = 'a'.charCodeAt(0) + i;
const char = String.fromCharCode(code);
firstLine.set(i, [null, char, 1, code]);
}
assert.equal(buffer.lines.get(0).length, 5);
assert.equal(buffer.lines.get(0).translateToString(), 'abcde');
buffer.resize(1, 10);
assert.equal(buffer.lines.length, 10);
assert.equal(buffer.lines.get(0).translateToString(), 'a');
assert.equal(buffer.lines.get(1).translateToString(), 'b');
assert.equal(buffer.lines.get(2).translateToString(), 'c');
assert.equal(buffer.lines.get(3).translateToString(), 'd');
assert.equal(buffer.lines.get(4).translateToString(), 'e');
assert.equal(buffer.lines.get(5).translateToString(), ' ');
assert.equal(buffer.lines.get(6).translateToString(), ' ');
assert.equal(buffer.lines.get(7).translateToString(), ' ');
assert.equal(buffer.lines.get(8).translateToString(), ' ');
assert.equal(buffer.lines.get(9).translateToString(), ' ');
buffer.resize(5, 10);
assert.equal(buffer.lines.length, 10);
assert.equal(buffer.lines.get(0).translateToString(), 'abcde');
assert.equal(buffer.lines.get(1).translateToString(), ' ');
assert.equal(buffer.lines.get(2).translateToString(), ' ');
assert.equal(buffer.lines.get(3).translateToString(), ' ');
assert.equal(buffer.lines.get(4).translateToString(), ' ');
assert.equal(buffer.lines.get(5).translateToString(), ' ');
assert.equal(buffer.lines.get(6).translateToString(), ' ');
assert.equal(buffer.lines.get(7).translateToString(), ' ');
assert.equal(buffer.lines.get(8).translateToString(), ' ');
assert.equal(buffer.lines.get(9).translateToString(), ' ');
});
it('should discard parts of wrapped lines that go out of the scrollback', () => {
buffer.fillViewportRows();
terminal.options.scrollback = 1;
buffer.resize(10, 5);
const lastLine = buffer.lines.get(4);
for (let i = 0; i < 10; i++) {
const code = 'a'.charCodeAt(0) + i;
const char = String.fromCharCode(code);
lastLine.set(i, [null, char, 1, code]);
}
assert.equal(buffer.lines.length, 5);
buffer.y = 4;
buffer.resize(2, 5);
assert.equal(buffer.y, 4);
assert.equal(buffer.ybase, 1);
assert.equal(buffer.lines.length, 6);
assert.equal(buffer.lines.get(0).translateToString(), ' ');
assert.equal(buffer.lines.get(1).translateToString(), 'ab');
assert.equal(buffer.lines.get(2).translateToString(), 'cd');
assert.equal(buffer.lines.get(3).translateToString(), 'ef');
assert.equal(buffer.lines.get(4).translateToString(), 'gh');
assert.equal(buffer.lines.get(5).translateToString(), 'ij');
buffer.resize(1, 5);
assert.equal(buffer.y, 4);
assert.equal(buffer.ybase, 1);
assert.equal(buffer.lines.length, 6);
assert.equal(buffer.lines.get(0).translateToString(), 'e');
assert.equal(buffer.lines.get(1).translateToString(), 'f');
assert.equal(buffer.lines.get(2).translateToString(), 'g');
assert.equal(buffer.lines.get(3).translateToString(), 'h');
assert.equal(buffer.lines.get(4).translateToString(), 'i');
assert.equal(buffer.lines.get(5).translateToString(), 'j');
buffer.resize(10, 5);
assert.equal(buffer.y, 0);
assert.equal(buffer.ybase, 0);
assert.equal(buffer.lines.length, 5);
assert.equal(buffer.lines.get(0).translateToString(), 'efghij ');
assert.equal(buffer.lines.get(1).translateToString(), ' ');
assert.equal(buffer.lines.get(2).translateToString(), ' ');
assert.equal(buffer.lines.get(3).translateToString(), ' ');
assert.equal(buffer.lines.get(4).translateToString(), ' ');
});
});
});

describe('buffer marked to have no scrollback', () => {
Expand Down
Loading