summaryrefslogtreecommitdiff
path: root/render.h
blob: 286c6ecc6659a4c6c974f586b0fa9076a5c550b9 (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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*
 * $Id: render.h,v 1.17 2004/06/07 19:08:42 lordjaxom Exp $
 */

#ifndef VDR_TEXT2SKIN_RENDER_H
#define VDR_TEXT2SKIN_RENDER_H

#include "common.h"
#include "data.h"
#include <vdr/osd.h>
#include <vdr/skins.h>
#include <vdr/thread.h>

class cChannel;
class cEvent;
class cText2SkinLoader;
class cText2SkinData;
class cText2SkinI18n;
class cText2SkinTheme;

class cText2SkinRender: public cThread {
	friend class cText2SkinDisplayChannel;
	friend class cText2SkinDisplayVolume;
	friend class cText2SkinDisplayReplay;
	friend class cText2SkinDisplayMessage;
	friend class cText2SkinDisplayMenu;

private:
	cText2SkinData   *mData;
	cText2SkinI18n   *mI18n;
	cText2SkinTheme  *mTheme;
	eSkinSection      mSection;
	cOsd             *mOsd;
	cTextScroller    *mScroller;

	// channel display
	const cChannel   *mChannel;
	int               mChannelNumber;
	const cEvent     *mChannelPresent;
	const cEvent     *mChannelFollowing;

	// volume display
	int               mVolumeCurrent;
	int               mVolumeTotal;
	bool              mVolumeMute;

	// replay display
	string            mReplayTitle;
	bool              mReplayPlay;
	bool              mReplayForward;
	int               mReplaySpeed;
	int               mReplayCurrent;
	int               mReplayTotal;
	const cMarks     *mReplayMarks;
	string            mReplayCurrentText;
	string            mReplayTotalText;
	string            mReplayJump;

	// message display
	eMessageType      mMessageType;
	string            mMessageText;

	// menu
	struct MenuItem {
		string          text;
		string          tabs[cSkinDisplayMenu::MaxTabs];
		bool            sel;
		bool operator!=(const MenuItem &b) { return b.text != text || b.sel != sel; }
	};
	string            mMenuTitle;
	vector<MenuItem>  mMenuItems;
	int               mMenuCurrent;
	string            mMenuRed;
	string            mMenuGreen;
	string            mMenuYellow;
	string            mMenuBlue;
	const cEvent     *mMenuEvent;
	const cRecording *mMenuRecording;
	string            mMenuText;
	bool              mMenuTextFixedFont;
	bool              mMenuScroll;
	bool              mMenuScrollUp;
	bool              mMenuScrollPage;
	int               mMenuTabs[cSkinDisplayMenu::MaxTabs];
	
	// update thread
	bool              mActive;
	cCondVar          mDoUpdate;
	cMutex            mMutex;
	
protected:
	// Update thread
	void Lock(void) { mMutex.Lock(); }
	void Unlock(void) { mMutex.Unlock(); }
	virtual void Action(void);

	// Basic operations
	void DrawBackground(const POINT &Pos, const SIZE &Size, const tColor *Bg, const tColor *Fg, const string &Path);
	void DrawImage(const POINT &Pos, const SIZE &Size, const tColor *Bg, const tColor *Fg, const string &Path);
	void DrawText(const POINT &Pos, const SIZE &Size, const tColor *Fg, const string &Text, const cFont *Font, int Align);
	void DrawRectangle(const POINT &Pos, const SIZE &Size, const tColor *Fg);
	void DrawEllipse(const POINT &Pos, const SIZE &Size, const tColor *Fg, int Arc);
	void DrawSlope(const POINT &Pos, const SIZE &Size, const tColor *Fg, int Arc);
	void DrawProgressbar(const POINT &Pos, const SIZE &Size, int Current, int Total, const tColor *Fg, const tColor *Bg, const cMarks *Marks = NULL);
 	void DrawMark(const POINT &Pos, const SIZE &Size, bool Start, bool Current, bool Horizontal);
	void DrawScrollText(const POINT &Pos, const SIZE &Size, const tColor *Fg, const string &Text, const cFont *Font, int Align);

	// High-level operations
	void DisplayBackground(cText2SkinItem *Item); 
	void DisplayChannelLogo(cText2SkinItem *Item); 
	void DisplayLanguage(cText2SkinItem *Item); 
	void DisplayText(cText2SkinItem *Item); 
	void DisplayImage(cText2SkinItem *Item); 
	void DisplayDateTime(cText2SkinItem *Item); 
	void DisplayChannelNumberName(cText2SkinItem *Item); 
	void DisplayChannelNumber(cText2SkinItem *Item); 
	void DisplayChannelName(cText2SkinItem *Item); 
	void DisplayRectangle(cText2SkinItem *Item); 
	void DisplayEllipse(cText2SkinItem *Item); 
	void DisplaySlope(cText2SkinItem *Item); 
	void DisplayTimebar(cText2SkinItem *Item); 
	void DisplayPresentTime(cText2SkinItem *Item); 
	void DisplayPresentTitle(cText2SkinItem *Item); 
	void DisplayPresentShortText(cText2SkinItem *Item); 
	void DisplayFollowingTime(cText2SkinItem *Item); 
	void DisplayFollowingTitle(cText2SkinItem *Item); 
	void DisplayFollowingShortText(cText2SkinItem *Item); 
	void DisplaySymbol(cText2SkinItem *Item);
	void DisplayVolumebar(cText2SkinItem *Item); 
	void DisplayMute(cText2SkinItem *Item); 
	void DisplayReplaybar(cText2SkinItem *Item); 
	void DisplayReplayTitle(cText2SkinItem *Item);
	void DisplayReplayCurrent(cText2SkinItem *Item);
	void DisplayReplayTotal(cText2SkinItem *Item);
	void DisplayReplayJump(cText2SkinItem *Item);
	void DisplayMessage(cText2SkinItem *Item);
	void DisplayMenuItems(cText2SkinItem *Item);
	void DisplayMenuTitle(cText2SkinItem *Item);
	void DisplayMenuColorbutton(cText2SkinItem *Item);
	void DisplayMenuText(cText2SkinItem *Item);
	void DisplayMenuEventTitle(cText2SkinItem *Item);
	void DisplayMenuEventShortText(cText2SkinItem *Item);
	void DisplayMenuEventDescription(cText2SkinItem *Item);
	void DisplayMenuEventTime(cText2SkinItem *Item);
	void DisplayMenuRecording(cText2SkinItem *Item);

	// Helpers
	string ItemText(cText2SkinItem *Item);
	string ItemText(cText2SkinItem *Item, const string &Content);
	tColor *ItemFg(cText2SkinItem *Item);
	tColor *ItemBg(cText2SkinItem *Item);
	int GetEditableWidth(MenuItem Item, bool Current);

public:
	cText2SkinRender(cText2SkinLoader *Loader, eSkinSection Section);
	virtual ~cText2SkinRender();

	void Flush(void);
};

#endif // VDR_TEXT2SKIN_RENDER_H