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
|
#include "symbols/mute.xpm"
#include "displayvolume.h"
cNopacityDisplayVolume::cNopacityDisplayVolume(void) {
config.setDynamicValues();
initial = true;
muted = false;
FrameTime = config.volumeFrameTime;
FadeTime = config.volumeFadeTime;
width = cOsd::OsdHeight() * config.volumeWidth / 100;
height = cOsd::OsdHeight() * config.volumeHeight / 100;
int top = (cOsd::OsdHeight() - height) / 2;
int left = (cOsd::OsdWidth() - width) / 2;
osd = CreateOsd(left, top, width, height);
pixmapContent = osd->CreatePixmap(1, cRect(0, 0, width, height));
pixmapContent->Fill(Theme.Color(clrMenuBorder));
cImageLoader imgLoader;
imgLoader.DrawBackground(Theme.Color(clrMenuItem), Theme.Color(clrMenuItemBlend), width-2, height-2);
pixmapContent->DrawImage(cPoint(1,1), imgLoader.GetImage());
labelHeight = height/3;
pixmapLabel = osd->CreatePixmap(2, cRect(0, 5, width, labelHeight));
progressBarWidth = 0.9 * width;
progressBarHeight = 0.3 * height;
if (progressBarHeight%2 != 0)
progressBarHeight++;
pixmapProgressBar = osd->CreatePixmap(2, cRect((width - progressBarWidth) / 2, (height - progressBarHeight)*2/3, progressBarWidth, progressBarHeight));
if (config.volumeFadeTime) {
pixmapContent->SetAlpha(0);
pixmapProgressBar->SetAlpha(0);
pixmapLabel->SetAlpha(0);
}
font = cFont::CreateFont(config.fontName, labelHeight - 6 + config.fontVolume);
}
cNopacityDisplayVolume::~cNopacityDisplayVolume() {
osd->DestroyPixmap(pixmapContent);
osd->DestroyPixmap(pixmapLabel);
osd->DestroyPixmap(pixmapProgressBar);
delete font;
delete osd;
}
void cNopacityDisplayVolume::SetVolume(int Current, int Total, bool Mute) {
pixmapLabel->Fill(clrTransparent);
cString label = cString::sprintf("%s: %d", tr("Volume"), Current);
pixmapLabel->DrawText(cPoint((width - font->Width(*label)) / 2, (labelHeight - font->Height()) / 2), *label, Theme.Color(clrVolumeFont), clrTransparent, font);
if (Mute) {
cBitmap bmMute(mute_xpm);
pixmapLabel->DrawBitmap(cPoint(width - 2*bmMute.Width(), (labelHeight - bmMute.Height()) / 2), bmMute, Theme.Color(clrDiskAlert), clrTransparent);
}
pixmapProgressBar->Fill(clrTransparent);
double percent = ((double)Current) / (double)Total;
int barWidth = progressBarWidth - progressBarHeight;
pixmapProgressBar->DrawEllipse(cRect(0, 0, progressBarHeight, progressBarHeight), Theme.Color(clrProgressBarBack));
pixmapProgressBar->DrawEllipse(cRect(progressBarWidth - progressBarHeight, 0, progressBarHeight, progressBarHeight), Theme.Color(clrProgressBarBack));
pixmapProgressBar->DrawRectangle(cRect(progressBarHeight/2, 0, progressBarWidth - progressBarHeight, progressBarHeight), Theme.Color(clrProgressBarBack));
if (Current > 0) {
pixmapProgressBar->DrawEllipse(cRect(1, 1, progressBarHeight-2, progressBarHeight-2), Theme.Color(clrProgressBar));
pixmapProgressBar->DrawEllipse(cRect(barWidth * percent - 1, 1, progressBarHeight-2, progressBarHeight-2), Theme.Color(clrProgressBar));
pixmapProgressBar->DrawRectangle(cRect(progressBarHeight / 2 - 1, 1, barWidth * percent - 2, progressBarHeight - 2), Theme.Color(clrProgressBar));
}
}
void cNopacityDisplayVolume::Flush(void) {
if (initial)
if (FadeTime)
Start();
initial = false;
osd->Flush();
}
void cNopacityDisplayVolume::Action(void) {
uint64_t Start = cTimeMs::Now();
while (true) {
uint64_t Now = cTimeMs::Now();
cPixmap::Lock();
double t = min(double(Now - Start) / FadeTime, 1.0);
int Alpha = t * ALPHA_OPAQUE;
pixmapContent->SetAlpha(Alpha);
pixmapProgressBar->SetAlpha(Alpha);
pixmapLabel->SetAlpha(Alpha);
osd->Flush();
cPixmap::Unlock();
int Delta = cTimeMs::Now() - Now;
if (Delta < FrameTime)
cCondWait::SleepMs(FrameTime - Delta);
if ((int)(Now - Start) > FadeTime)
break;
}
}
|