summaryrefslogtreecommitdiff
path: root/src/client/interface.cpp
blob: 0da56538c2224bc996501de00cda7b7dd06b37b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#define NORMAL_MODE 0
#define INSERT_MODE 1

class Interface {
	Socket io;
	Window window;
	Cursor cursor;

	public:

	Interface() : cursor(window) {
		io.connect();
	}

	void run() {
		int mode = NORMAL_MODE;
		int quit = 0;
		while (!quit) {
			update();

			int input = window.get_input();
			if (mode == NORMAL_MODE) {
				switch (input) {
					case '':
						quit = 1;
						break;
					case 'i':
						mode = INSERT_MODE;
						break;
					case 'h':
						move_left();
						break;
					case 'l':
						move_right();
						break;
				}
			} else {
				switch (input) {
					case '':
						mode = NORMAL_MODE;
						break;
					case KEY_BACKSPACE:
						delete_element();
						break;
					default:
						insert_element(input);
				}
			}
		}
	}

	void update() {
		int8_t msg[5];
		msg[0] = OP_SHOW;
		encode2(window.width, msg, 1);
		encode2(window.height, msg, 3);
		io.send(msg, 5);
		io.recv(window.view, window.width * window.height);
		io.recv(window.line_ends, window.height);

		window.update();
		cursor.update();
	}

	void move_left() {
		int8_t mov[2];
		mov[0] = OP_MOVE1;
		mov[1] = -1;
		io.send(mov, 2);
		cursor.move_left();
	}

	void move_right() {
		int8_t mov[2];
		mov[0] = OP_MOVE1;
		mov[1] = 1;
		io.send(mov, 2);
		cursor.move_right();
	}

	void delete_element() {
		int8_t del;
		del = OP_DELETE;
		io.send(&del, 1);
		cursor.move_left();
	}

	void insert_element(int input) {
		int8_t ins[2];
		ins[0] = OP_INSERT;
		ins[1] = input;
		io.send(ins, 2);
		cursor.move_right();
	}
};