Ctrl cursor movement and fix selection draw bug

This commit is contained in:
Krzosa Karol
2024-07-20 09:15:15 +02:00
parent adeb2de366
commit ba4ed9afff
3 changed files with 102 additions and 8 deletions

View File

@@ -55,6 +55,7 @@ int main(void) {
String s = Format(scratch, "line1: %d line2: %d line3: %d line4: %d line5: %d line6: %d line1: %d line2: %d line3: %d line4: %d line5: %d line6: %d\n", i, i, i, i, i, i, i, i, i, i, i, i);
String16 s16 = ToString16(scratch, s);
ReplaceText(view.buffer, GetEndAsRange(*view.buffer), s16);
ReplaceText(view.buffer, GetEndAsRange(*view.buffer), L" \n");
}
}
}

View File

@@ -11,9 +11,101 @@ struct View {
Rect2 rect;
};
Int MovePos(Buffer &buffer, Int pos, XY offset) {
XY xy = PosToXY(buffer, pos);
Int result = XYToPos(buffer, {xy.col + offset.col, xy.line + offset.line});
Int MoveOnWhitespaceBoundaryForward(Buffer &buffer, Int pos) {
pos = Clamp(pos, (Int)0, buffer.len);
bool standing_on_whitespace = IsWhitespace(buffer.str[pos]);
bool seek_whitespace = standing_on_whitespace == false;
bool seek_word = standing_on_whitespace;
Int result = buffer.len;
Int prev_pos = pos;
for (Int i = pos; i < buffer.len; i += 1) {
bool whitespace = IsWhitespace(buffer.str[i]);
if (seek_word && !whitespace) {
result = i;
break;
}
if (seek_whitespace && whitespace) {
result = i;
break;
}
prev_pos = i;
}
return result;
}
Int MoveOnWhitespaceBoundaryBackward(Buffer &buffer, Int pos) {
pos = Clamp(pos - 1, (Int)0, buffer.len);
bool standing_on_whitespace = IsWhitespace(buffer.str[pos]);
bool seek_whitespace = standing_on_whitespace == false;
bool seek_word = standing_on_whitespace;
Int result = 0;
Int prev_pos = pos;
for (Int i = pos; i >= 0; i -= 1) {
bool whitespace = IsWhitespace(buffer.str[i]);
if (seek_word && !whitespace) {
result = prev_pos;
break;
}
if (seek_whitespace && whitespace) {
result = prev_pos;
break;
}
prev_pos = i;
}
return result;
}
Int MoveOnWhitespaceBoundaryDown(Buffer &buffer, Int pos) {
Int result = pos;
Int next_line = PosToLine(buffer, pos) + 1;
for (Int line = next_line; line < buffer.line_starts.len; line += 1) {
Range line_range = GetLine(buffer, line);
result = line_range.min;
bool whitespace_line = true;
for (Int i = line_range.min; i < line_range.max; i += 1) {
if (!IsWhitespace(buffer.str[i])) {
whitespace_line = false;
break;
}
}
if (whitespace_line) break;
}
return result;
}
Int MoveOnWhitespaceBoundaryUp(Buffer &buffer, Int pos) {
Int result = pos;
Int next_line = PosToLine(buffer, pos) - 1;
for (Int line = next_line; line >= 0; line -= 1) {
Range line_range = GetLine(buffer, line);
result = line_range.min;
bool whitespace_line = true;
for (Int i = line_range.min; i < line_range.max; i += 1) {
if (!IsWhitespace(buffer.str[i])) {
whitespace_line = false;
break;
}
}
if (whitespace_line) break;
}
return result;
}
Int MovePos(Buffer &buffer, Int pos, XY offset, bool ctrl_pressed) {
Int result = pos;
if (ctrl_pressed) {
if (offset.col == 1 && offset.line == 0) return MoveOnWhitespaceBoundaryForward(buffer, pos);
if (offset.col == -1 && offset.line == 0) return MoveOnWhitespaceBoundaryBackward(buffer, pos);
if (offset.col == 0 && offset.line == 1) return MoveOnWhitespaceBoundaryDown(buffer, pos);
if (offset.col == 0 && offset.line == -1) return MoveOnWhitespaceBoundaryUp(buffer, pos);
} else {
XY xy = PosToXY(buffer, pos);
result = XYToPos(buffer, {xy.col + offset.col, xy.line + offset.line});
}
return result;
}
@@ -39,10 +131,10 @@ void HandleKeybindings(View *_view) {
For(view.cursors) {
if (IsKeyDown(KEY_LEFT_SHIFT)) {
Int front = GetFront(it);
Int new_front = MovePos(buf, front, keys_offset[i]);
Int new_front = MovePos(buf, front, keys_offset[i], IsKeyDown(KEY_LEFT_CONTROL));
it = ChangeFront(it, new_front);
} else {
it.range.max = it.range.min = MovePos(buf, it.range.max, keys_offset[i]);
it.range.max = it.range.min = MovePos(buf, it.range.max, keys_offset[i], IsKeyDown(KEY_LEFT_CONTROL));
}
}
}

View File

@@ -58,10 +58,11 @@ void DrawCursor(const View &view, Cursor it) {
for (Int col = range.min; col < range.max; col += 1) {
bool a = line > min.line && line < max.line;
bool b = line == min.line && col >= min.col;
bool c = line == max.line && col < max.col;
bool b = min.line != max.line && (line == min.line && col >= min.col);
bool c = min.line != max.line && (line == max.line && col < max.col);
bool d = min.line == max.line && line == max.line && col >= min.col && col < max.col;
if (a || b || c) {
if (a || b || c || d) {
Vec2 pos = {col * view.char_spacing, line * view.line_spacing};
pos -= view.scroll;
Rectangle rectangle = {pos.x, pos.y, view.char_spacing, view.line_spacing};