浏览代码

Extracting buffer related functions to buffer.h

Vinicius Teshima 1 年之前
父节点
当前提交
f233e909fc
共有 3 个文件被更改,包括 125 次插入28 次删除
  1. 10 7
      src/app.h
  2. 109 0
      src/buffer.h
  3. 6 21
      src/main.c

+ 10 - 7
src/app.h

@@ -9,10 +9,7 @@
 #include "vec2.h"
 #include "window.h"
 
-struct buffer {
-	DA_DEF_STRUCT_ITEM(char, data);
-	uint64_t cur;
-};
+#include "buffer.h"
 
 struct app {
 	struct window win;
@@ -35,7 +32,6 @@ void app_render_char(struct app app, const char c, struct vec2 pos,
 void app_render_text(struct app app, const char *text, size_t text_size,
 		     struct vec2 pos, uint32_t color, double scale);
 
-#define IMP
 #if defined(APP_IMP) || defined(IMP)
 
 #define UNHEX_COLOR(hex)			\
@@ -52,7 +48,8 @@ app_create(const char *win_title)
 	struct app app = {
 		.win = window_create(win_title),
 		.rdr = NULL,
-		.running = true
+		.running = true,
+		.buf = buffer_create()
 	};
 
 	app.rdr = SDL_CreateRenderer(app.win.ptr, -1, SDL_RENDERER_ACCELERATED);
@@ -63,6 +60,7 @@ app_create(const char *win_title)
 	}
 	SCP(app.rdr);
 
+
 	return app;
 }
 
@@ -117,6 +115,9 @@ app_render_text(struct app app, const char *text, size_t text_size,
 	for ( ; i < text_size; ++i ) {
 		c = text[i];
 		if ( c == '\n' ) {
+			if ( i == app.buf.cur ) {
+				app_render_cursor_in_pos(app, pen, 0xFF00FFFF);
+			}
 			pen.x = pos.x;
 			pen.y += (double) (app.font.ch_h * scale);
 			continue;
@@ -146,9 +147,11 @@ app_render_cursor_in_pos(struct app app, struct vec2 pos, uint32_t color)
 	SCE(SDL_RenderFillRect(app.rdr, &rect));
 
 	if ( app.buf.cur < app.buf.data.size ) {
+		char c = app.buf.data.items[app.buf.cur];
+		if ( c == '\n' ) return ;
+
 		uint32_t old_color = app_get_text_color(app);
 		app_set_text_color(app, ((~color) | 0xFF));
-		char c = app.buf.data.items[app.buf.cur];
 		app_render_char(app, c, pos, app.font.scale);
 		app_set_text_color(app, old_color);
 	}

+ 109 - 0
src/buffer.h

@@ -0,0 +1,109 @@
+#ifndef BUFFER_H
+#define BUFFER_H
+
+struct buffer {
+	DA_DEF_STRUCT_ITEM(char, data);
+	uint64_t cur;
+};
+
+struct buffer buffer_create(void);
+void buffer_destroy(struct buffer buf);
+
+struct buffer buffer_mv_cur_letf(struct buffer buf);
+struct buffer buffer_mv_cur_right(struct buffer buf);
+struct buffer buffer_mv_cur_up(struct buffer buf);
+struct buffer buffer_mv_cur_down(struct buffer buf);
+
+struct buffer buffer_insert_char(struct buffer buf, size_t index, char c);
+struct buffer buffer_remove_char(struct buffer buf, size_t index);
+#if defined(BUFFER_IMP) || defined(IMP)
+
+struct buffer
+buffer_create(void)
+{
+	struct buffer buf = {0};
+	DA_CREATE(buf.data, sizeof(char));
+
+	return buf;
+}
+
+void
+buffer_destroy(struct buffer buf)
+{
+	free(buf.data.items);
+}
+
+
+struct buffer
+buffer_mv_cur_letf(struct buffer buf)
+{
+	if ( buf.cur == 0 ) {
+		return buf;
+	}
+	--buf.cur;
+	return buf;
+}
+
+struct buffer
+buffer_mv_cur_right(struct buffer buf)
+{
+	if ( buf.cur == buf.data.size ) {
+		return buf;
+	}
+	++buf.cur;
+	return buf;
+}
+
+struct buffer
+buffer_mv_cur_up(struct buffer buf)
+{
+	return buf;
+}
+
+struct buffer
+buffer_mv_cur_down(struct buffer buf)
+{
+	return buf;
+}
+
+
+struct buffer
+buffer_insert_char(struct buffer buf, size_t index, char c)
+{
+	if ( index > buf.data.size ) {
+		DA_APPEND(buf.data, c);
+		++buf.cur;
+		return buf;
+	}
+
+	DA_INSERT(buf.data, c, index);
+	++buf.cur;
+	return buf;
+
+}
+
+struct buffer
+buffer_remove_char(struct buffer buf, size_t index)
+{
+	if ( buf.data.size == 0 ) {
+		return buf;
+	}
+
+	if ( buf.data.size == index ) {
+		buf.data.items[--buf.data.size] = 0;
+		--buf.cur;
+		return buf;
+	}
+
+	/* if ( buf.data.items[buf.data.size-1] == '\n' ) { */
+	/* } */
+
+	DA_DELETE(buf.data, index);
+	--buf.cur;
+
+	return buf;
+}
+
+#endif /* defined(BUFFER_IMP) || defined(IMP) */
+
+#endif

+ 6 - 21
src/main.c

@@ -39,7 +39,7 @@ main(int32_t argc, char **argv)
 	const char *font_path = "./charmap-oldschool_white.png";
 
 	struct app app = app_create("ged");
-	DA_CREATE(app.buf.data, sizeof(char));
+
 
 	app.font = font_create(app.rdr, font_path, 7, 18);
 	app.font.scale = 2.0;
@@ -81,30 +81,16 @@ handle_events(struct app app, struct buffer buf)
 		case SDL_KEYDOWN: {
 			switch ( e.key.keysym.sym ) {
 			case SDLK_BACKSPACE: {
-				if ( buf.data.size == 0 ) {
-					break;
-				}
-
-				if ( buf.data.items[buf.data.size-1] == '\n' ) {
-				}
-				buf.data.items[--buf.data.size] = 0;
-				--buf.cur;
+				buf = buffer_remove_char(buf, buf.cur-1);
 			} break;
 			case SDLK_RETURN: {
-				DA_APPEND(buf.data, '\n');
-				++buf.cur;
+				buf = buffer_insert_char(buf, buf.cur, '\n');
 			} break;
 			case SDLK_LEFT: {
-				if ( buf.cur == 0 ) {
-					break;
-				}
-				--buf.cur;
+				buf = buffer_mv_cur_letf(buf);
 			} break;
 			case SDLK_RIGHT: {
-				if ( buf.cur == buf.data.size ) {
-					break;
-				}
-				++buf.cur;
+				buf = buffer_mv_cur_right(buf);
 			} break;
 			case SDLK_PLUS: {
 			} break;
@@ -113,8 +99,7 @@ handle_events(struct app app, struct buffer buf)
 		case SDL_TEXTINPUT: {
 			char *t = e.text.text;
 			while( *t != '\0' ) {
-				DA_APPEND(buf.data, *t++);
-				++buf.cur;
+				buf = buffer_insert_char(buf, buf.cur, *t++);
 			}
 		} break;
 		}