summaryrefslogtreecommitdiff
path: root/skins.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2004-05-16 10:35:36 +0200
committerKlaus Schmidinger <vdr@tvdr.de>2004-05-16 10:35:36 +0200
commit5d99df7b7760c4a2b497c737a15b609008f6d56d (patch)
treea342f2f7465a73fe2bd63848d87566af8d646dd3 /skins.c
parent7aab06d8b1c6de59d06756d44c631984acd299b3 (diff)
downloadvdr-5d99df7b7760c4a2b497c737a15b609008f6d56d.tar.gz
vdr-5d99df7b7760c4a2b497c737a15b609008f6d56d.tar.bz2
Implemented 'skins' and 'themes'
Diffstat (limited to 'skins.c')
-rw-r--r--skins.c201
1 files changed, 201 insertions, 0 deletions
diff --git a/skins.c b/skins.c
new file mode 100644
index 00000000..6872a947
--- /dev/null
+++ b/skins.c
@@ -0,0 +1,201 @@
+/*
+ * skins.c: The optical appearance of the OSD
+ *
+ * See the main source file 'vdr.c' for copyright information and
+ * how to reach the author.
+ *
+ * $Id: skins.c 1.1 2004/05/15 12:34:38 kls Exp $
+ */
+
+#include "skins.h"
+#include "interface.h"
+#include "status.h"
+#include "tools.h"
+
+// --- cSkinDisplay ----------------------------------------------------------
+
+cSkinDisplay *cSkinDisplay::current = NULL;
+
+cSkinDisplay::cSkinDisplay(void)
+{
+ current = this;
+ editableWidth = 100; //XXX
+}
+
+cSkinDisplay::~cSkinDisplay()
+{
+ current = NULL;
+}
+
+// --- cSkinDisplayMenu ------------------------------------------------------
+
+cSkinDisplayMenu::cSkinDisplayMenu(void)
+{
+ SetTabs(0);
+}
+
+void cSkinDisplayMenu::SetTabs(int Tab1, int Tab2, int Tab3, int Tab4, int Tab5)
+{
+ tabs[0] = 0;
+ tabs[1] = Tab1 ? tabs[0] + Tab1 : 0;
+ tabs[2] = Tab2 ? tabs[1] + Tab2 : 0;
+ tabs[3] = Tab3 ? tabs[2] + Tab3 : 0;
+ tabs[4] = Tab4 ? tabs[3] + Tab4 : 0;
+ tabs[5] = Tab5 ? tabs[4] + Tab5 : 0;
+ for (int i = 1; i < MaxTabs; i++)
+ tabs[i] *= 12;//XXX average character width of font used for items!!!
+}
+
+void cSkinDisplayMenu::Scroll(bool Up, bool Page)
+{
+ textScroller.Scroll(Up, Page);
+}
+
+const char *cSkinDisplayMenu::GetTabbedText(const char *s, int Tab)
+{
+ if (!s)
+ return NULL;
+ static char buffer[1000];
+ const char *a = s;
+ const char *b = strchrnul(a, '\t');
+ while (*b && Tab-- > 0) {
+ a = b + 1;
+ b = strchrnul(a, '\t');
+ }
+ if (!*b)
+ return (Tab <= 0) ? a : NULL;
+ unsigned int n = b - a;
+ if (n >= sizeof(buffer))
+ n = sizeof(buffer) - 1;
+ strncpy(buffer, a, n);
+ buffer[n] = 0;
+ return buffer;
+}
+
+// --- cSkinDisplayReplay::cProgressBar --------------------------------------
+
+cSkinDisplayReplay::cProgressBar::cProgressBar(int Width, int Height, int Current, int Total, const cMarks *Marks, tColor ColorSeen, tColor ColorRest, tColor ColorSelected, tColor ColorMark, tColor ColorCurrent)
+:cBitmap(Width, Height, 2)
+{
+ total = Total;
+ if (total > 0) {
+ int p = Pos(Current);
+ DrawRectangle(0, 0, p, Height - 1, ColorSeen);
+ DrawRectangle(p + 1, 0, Width - 1, Height - 1, ColorRest);
+ if (Marks) {
+ bool Start = true;
+ for (const cMark *m = Marks->First(); m; m = Marks->Next(m)) {
+ int p1 = Pos(m->position);
+ if (Start) {
+ const cMark *m2 = Marks->Next(m);
+ int p2 = Pos(m2 ? m2->position : total);
+ int h = Height / 3;
+ DrawRectangle(p1, h, p2, Height - h, ColorSelected);
+ }
+ Mark(p1, Start, m->position == Current, ColorMark, ColorCurrent);
+ Start = !Start;
+ }
+ }
+ }
+}
+
+void cSkinDisplayReplay::cProgressBar::Mark(int x, bool Start, bool Current, tColor ColorMark, tColor ColorCurrent)
+{
+ DrawRectangle(x, 0, x, Height() - 1, ColorMark);
+ const int d = Height() / (Current ? 3 : 9);
+ for (int i = 0; i < d; i++) {
+ int h = Start ? i : Height() - 1 - i;
+ DrawRectangle(x - d + i, h, x + d - i, h, Current ? ColorCurrent : ColorMark);
+ }
+}
+
+// --- cSkinDisplayReplay ----------------------------------------------------
+
+cSkinDisplayReplay::cSkinDisplayReplay(void)
+{
+ marks = NULL;
+}
+
+void cSkinDisplayReplay::SetMarks(const cMarks *Marks)
+{
+ marks = Marks;
+}
+
+// --- cSkin -----------------------------------------------------------------
+
+cSkin::cSkin(const char *Name, cTheme *Theme)
+{
+ name = strdup(Name);
+ theme = Theme;
+ if (theme)
+ cThemes::Save(name, theme);
+ Skins.Add(this);
+}
+
+cSkin::~cSkin()
+{
+ free(name);
+}
+
+// --- cSkins ----------------------------------------------------------------
+
+cSkins Skins;
+
+cSkins::cSkins(void)
+{
+ displayMessage = NULL;
+}
+
+cSkins::~cSkins()
+{
+ delete displayMessage;
+}
+
+bool cSkins::SetCurrent(const char *Name)
+{
+ if (Name) {
+ for (cSkin *Skin = First(); Skin; Skin = Next(Skin)) {
+ if (strcmp(Skin->Name(), Name) == 0) {
+ current = Skin;
+ return true;
+ }
+ }
+ }
+ current = First();
+ return current != NULL;
+}
+
+eKeys cSkins::Message(eMessageType Type, const char *s, int Seconds)
+{
+ switch (Type) {
+ case mtInfo: isyslog("info: %s", s); break;
+ case mtError: esyslog("ERROR: %s", s); break;
+ default: ;
+ }
+ if (!cSkinDisplay::Current() && !displayMessage)
+ displayMessage = Current()->DisplayMessage();
+ cSkinDisplay::Current()->SetMessage(Type, s);
+ cSkinDisplay::Current()->Flush();
+ cStatus::MsgOsdStatusMessage(s);
+ eKeys k = kNone;
+ if (Type != mtStatus) {
+ k = Interface->Wait(Seconds);
+ if (displayMessage) {
+ delete displayMessage;
+ displayMessage = NULL;
+ }
+ else
+ cSkinDisplay::Current()->SetMessage(Type, NULL);
+ }
+ else if (!s && displayMessage) {
+ delete displayMessage;
+ displayMessage = NULL;
+ }
+ return k;
+}
+
+void cSkins::Flush(void)
+{
+ if (cSkinDisplay::Current())
+ cSkinDisplay::Current()->Flush();
+}