Ctrl cursor movement and fix selection draw bug
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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};
|
||||
|
||||
Reference in New Issue
Block a user