summaryrefslogtreecommitdiffstats
path: root/src/curses-ui/curses-ui.vala
blob: e98c6ea620457587188869674ca439ff5a669365 (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
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
/* Copyright 2013, Sebastian Reichel <sre@ring0.de>
 * Copyright 2017-2018, Johannes Rudolph <johannes.rudolph@gmx.com>
 * Copyright 2018, Malte Modler <malte@malte-modler.de>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

public class CursesUI {
	MessageBox messages;
	Dialog dialog;
	Logo banner;
	ClockWindow clkwin;
	//StatusPanel statuswin;
	MessageBoxOverlay mbOverlay;

	public CursesUI(string datadir) {
		/* unicode support */
		Intl.setlocale(LocaleCategory.CTYPE, "");

		/* initialize curses */
		Curses.initscr();

		/* disable cursor */
		Curses.curs_set(0);

		/* initialize color mode and define color pairs */
		Curses.start_color();
		Curses.init_pair(0, Curses.Color.WHITE, Curses.Color.BLACK);
		Curses.init_pair(1, Curses.Color.GREEN, Curses.Color.BLACK);
		Curses.init_pair(2, Curses.Color.WHITE, Curses.Color.RED);

		/* initialize widgets */
		banner    = new Logo(datadir);
		//statuswin = new StatusPanel();
		messages  = new MessageBox();
		clkwin    = new ClockWindow();

		clkwin.update();

		Timeout.add_seconds(10, update_time);
	}

	~CursesUI() {
		exit();
	}

	public void exit() {
		/* Reset the terminal mode */
		Curses.endwin();
	}

	bool update_time() {
		clkwin.update();
		return true;
	}

	// we've disabled the status bar to have more space
	//public void status(string message) {
	//	statuswin.set(message);
	//}

	public void log(MessageType type, string message) {
		switch (type) {
			case MessageType.WARNING:
				messages.add(message, MessageBox.WARN_COLOR);
				break;
			case MessageType.ERROR:
				messages.add(message, MessageBox.ERROR_COLOR);
				break;
			default:
				messages.add(message, MessageBox.INFO_COLOR);
				break;
		}

	}

	public void log_overlay(string title, string message, int closeAfter) {
		mbOverlay = new MessageBoxOverlay(title, message, closeAfter);
		Timeout.add_seconds(closeAfter, closeMbOverlay);
	}

	public void dialog_open(string title, string message, int closeAfter=0) {
		dialog = new Dialog(message, title, closeAfter);
		if (closeAfter > 0) {
			Timeout.add_seconds(closeAfter, close);
		}
	}

	bool closeMbOverlay() {
		mbOverlay = null;
		messages.redraw();
		//statuswin.redraw();
		// just call me once
		return false;
	}

	bool close() {
		dialog_close();
		// just call me once
		return false;
	}

	public void dialog_close() {
		dialog = null;
		messages.redraw();
		banner.redraw();
		clkwin.redraw();
		//statuswin.redraw();
	}
}