-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcurses_interface.cpp
124 lines (114 loc) · 3.29 KB
/
curses_interface.cpp
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "curses_interface.h"
#include "player.h"
#include "util.h"
#include <curses.h>
CursesInterface::CursesInterface(Player& player) : m_player(player), m_running(true), m_old_x(0), m_old_y(0) {
initscr();
timeout(15);
//SCREEN *s = newterm(NULL, stdin, stdout);
cbreak();
noecho();
keypad(stdscr, true);
}
void CursesInterface::run() {
init_window();
while(m_running) {
key_management();
render_window();
}
}
void CursesInterface::init_window() {
}
void CursesInterface::render_window() {
pos_t marker_a_pos = m_player.get_marker(Marker_A);
pos_t marker_b_pos = m_player.get_marker(Marker_B);
pos_t pos = m_player.get_pos();
pos_t end = m_player.get_end();
int x, y;
getmaxyx(stdscr, y, x);
if (m_old_x != x || m_old_y != y) {
clear();
m_old_x = x;
m_old_y = y;
}
metadata_t metadata = m_player.get_metadata();
int titlelength = 3 + metadata["artist"].size() + metadata["title"].size();
mvprintw(3, (x-titlelength)/2, "%s - %s", metadata["artist"].c_str(), metadata["title"].c_str());
mvprintw(8, (x-ms_to_readable(pos).size()-4)/2-1, "Pos: %s", ms_to_readable(pos).c_str());
mvprintw(5, 1, "[");
mvprintw(5, x-2, "]");
for (uint p=2; p<x-2; ++p)
mvprintw(5, p, "=");
mvprintw(5, 2 + (int) (x-4)*(pos/(double) end), "#");
if(marker_a_pos)
mvprintw(6, 2 + (int) (x-4)*(marker_a_pos/(double) end), "^");
if(marker_b_pos)
mvprintw(6, 2 + (int) (x-4)*(marker_b_pos/(double) end), "^");
mvprintw(9, (x-ms_to_readable(end).size()-3)/2, "of: %s", ms_to_readable(end).c_str());
mvprintw(8, 1, "Marker A: %s", ms_to_readable(marker_a_pos).c_str());
mvprintw(8, x-23, "Marker B: %s", ms_to_readable(marker_b_pos).c_str());
refresh();
}
void CursesInterface::key_management() {
int ch = getch();
switch(ch) {
case KEY_LEFT:
m_player.seek(m_player.get_pos() - 500);
break;
case KEY_RIGHT:
m_player.seek(m_player.get_pos() + 500);
break;
case KEY_SLEFT:
m_player.seek(m_player.get_pos() - 5000);
break;
case KEY_SRIGHT:
m_player.seek(m_player.get_pos() + 5000);
break;
case KEY_DOWN:
m_player.seek(m_player.get_pos() - 30000);
break;
case KEY_UP:
m_player.seek(m_player.get_pos() + 30000);
break;
case KEY_PPAGE:
m_player.seek(m_player.get_pos() - 300000);
break;
case KEY_NPAGE:
m_player.seek(m_player.get_pos() + 300000);
break;
case 'd':
m_player.set_marker(Marker_A, m_player.get_pos());
break;
case 'e':
m_player.set_marker(Marker_A, 0);
break;
case 'f':
m_player.set_marker(Marker_A, m_player.get_marker(Marker_A) + 10);
break;
case 's':
m_player.set_marker(Marker_A, m_player.get_marker(Marker_A) - 10);
break;
case 'j':
m_player.set_marker(Marker_B, m_player.get_pos());
break;
case 'u':
m_player.set_marker(Marker_B, 0);
break;
case 'k':
m_player.set_marker(Marker_B, m_player.get_marker(Marker_B) + 10);
break;
case 'h':
m_player.set_marker(Marker_B, m_player.get_marker(Marker_B) - 10);
break;
case ' ':
m_player.pause();
break;
case 'q':
m_player.stop();
m_running = false;
break;
}
}
CursesInterface::~CursesInterface() {
endwin();
}