summaryrefslogtreecommitdiff
path: root/render.h
blob: 2433dbf2c755b6ab5d9e56ef0e47d403310a2e3a (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
162
/*
 * $Id: render.h,v 1.21 2004/06/12 18:00:05 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;

	struct ItemData {
		string text;
		string path;
		int current;
		int total;
		const cMarks *marks;
		ItemData(void) { marks = NULL; }
	};

	// 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;
	int               mUpdateIn;
	
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, int Alpha, const string &Path);
	void DrawImage(const POINT &Pos, const SIZE &Size, const tColor *Bg, const tColor *Fg, int Alpha, 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);

	// displays a full item
	void DisplayItem(cText2SkinItem *Item, const ItemData *Data = NULL);

	// High-level operations
	void DisplayDateTime(cText2SkinItem *Item);
	void DisplayChannelNumberName(cText2SkinItem *Item);
	void DisplayPresentTime(cText2SkinItem *Item); 
	void DisplayPresentIcon(cText2SkinItem *Item); 
	void DisplayPresentText(cText2SkinItem *Item); 
	void DisplayFollowingTime(cText2SkinItem *Item); 
	void DisplayFollowingTitle(cText2SkinItem *Item); 
	void DisplayFollowingShortText(cText2SkinItem *Item); 
	void DisplayLanguage(cText2SkinItem *Item); 
	void DisplayChannelIcon(cText2SkinItem *Item);
	void DisplayVolume(cText2SkinItem *Item); 
	void DisplayMuteIcon(cText2SkinItem *Item); 
	void DisplayReplayTime(cText2SkinItem *Item);
	void DisplayReplayTitle(cText2SkinItem *Item);
	void DisplayReplayPrompt(cText2SkinItem *Item);
	void DisplayReplaySymbol(cText2SkinItem *Item);
	void DisplayReplayMode(cText2SkinItem *Item);
	void DisplayMessage(cText2SkinItem *Item);
	void DisplayMenuTitle(cText2SkinItem *Item);
	void DisplayMenuButton(cText2SkinItem *Item);
	void DisplayMenuText(cText2SkinItem *Item);
	void DisplayMenuScrollIcon(cText2SkinItem *Item);
	void DisplayMenuItems(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);
	void TriggerUpdate(void) { mDoUpdate.Broadcast(); }
	void Update(void);

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

	void Flush(void) { TriggerUpdate(); }
};

#endif // VDR_TEXT2SKIN_RENDER_H