summaryrefslogtreecommitdiff
path: root/displayvolume.c
blob: c6e6a81a77cbe6c704e7a5fa16321608dbb2bb71 (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
#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;
    }
}