summaryrefslogtreecommitdiffstats
path: root/application/ColorCache.h
blob: 1ce1c211a80477af604010734a14c022ab3bb7a8 (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
#pragma once
#include <QtGui/QColor>
#include <rainbow.h>
#include <MessageLevel.h>
#include <QMap>

class ColorCache
{
public:
	ColorCache(QColor front, QColor back, qreal bias)
	{
		m_front = front;
		m_back = back;
		m_bias = bias;
	};

	void addColor(int key, QColor color)
	{
		m_colors[key] = {color, blend(color), blendBackground(color)};
	}

	void setForeground(QColor front)
	{
		if(m_front != front)
		{
			m_front = front;
			recolorAll();
		}
	}

	void setBackground(QColor back)
	{
		if(m_back != back)
		{
			m_back = back;
			recolorAll();
		}
	}

	QColor getFront(int key)
	{
		auto iter = m_colors.find(key);
		if(iter == m_colors.end())
		{
			return QColor();
		}
		return (*iter).front;
	}

	QColor getBack(int key)
	{
		auto iter = m_colors.find(key);
		if(iter == m_colors.end())
		{
			return QColor();
		}
		return (*iter).back;
	}

	/**
	 * Blend the color with the front color, adapting to the back color
	 */
	QColor blend(QColor color);

	/**
	 * Blend the color with the back color
	 */
	QColor blendBackground(QColor color);

protected:
	void recolorAll();

protected:
	struct ColorEntry
	{
		QColor original;
		QColor front;
		QColor back;
	};

protected:
	qreal m_bias;
	QColor m_front;
	QColor m_back;
	QMap<int, ColorEntry> m_colors;
};

class LogColorCache : public ColorCache
{
public:
	LogColorCache(QColor front, QColor back)
		: ColorCache(front, back, 1.0)
	{
		addColor((int)MessageLevel::MultiMC, QColor("purple"));
		addColor((int)MessageLevel::Debug, QColor("green"));
		addColor((int)MessageLevel::Warning, QColor("orange"));
		addColor((int)MessageLevel::Error, QColor("red"));
		addColor((int)MessageLevel::Fatal, QColor("red"));
		addColor((int)MessageLevel::Message, front);
	}

	QColor getFront(MessageLevel::Enum level)
	{
		if(!m_colors.contains((int) level))
		{
			return ColorCache::getFront((int)MessageLevel::Message);
		}
		return ColorCache::getFront((int)level);
	}

	QColor getBack(MessageLevel::Enum level)
	{
		if(level == MessageLevel::Fatal)
		{
			return QColor(Qt::black);
		}
		return QColor(Qt::transparent);
	}
};