mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-12-26 23:06:44 +01:00
Implemented 'skins' and 'themes'
This commit is contained in:
296
osdbase.h
296
osdbase.h
@@ -4,221 +4,127 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: osdbase.h 1.9 2004/01/31 10:28:49 kls Exp $
|
||||
* $Id: osdbase.h 1.10 2004/04/30 13:40:11 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __OSDBASE_H
|
||||
#define __OSDBASE_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include "font.h"
|
||||
#include "config.h"
|
||||
#include "osd.h"
|
||||
#include "skins.h"
|
||||
#include "tools.h"
|
||||
|
||||
#define MAXNUMCOLORS 256
|
||||
enum eOSState { osUnknown,
|
||||
osContinue,
|
||||
osSchedule,
|
||||
osChannels,
|
||||
osTimers,
|
||||
osRecordings,
|
||||
osPlugin,
|
||||
osSetup,
|
||||
osCommands,
|
||||
osPause,
|
||||
osRecord,
|
||||
osReplay,
|
||||
osStopRecord,
|
||||
osStopReplay,
|
||||
osCancelEdit,
|
||||
osSwitchDvb,
|
||||
osBack,
|
||||
osEnd,
|
||||
os_User, // the following values can be used locally
|
||||
osUser1,
|
||||
osUser2,
|
||||
osUser3,
|
||||
osUser4,
|
||||
osUser5,
|
||||
osUser6,
|
||||
osUser7,
|
||||
osUser8,
|
||||
osUser9,
|
||||
osUser10,
|
||||
};
|
||||
|
||||
enum eDvbColor {
|
||||
#ifdef DEBUG_OSD
|
||||
clrBackground,
|
||||
clrTransparent = clrBackground,
|
||||
clrBlack = clrBackground,
|
||||
clrRed,
|
||||
clrGreen,
|
||||
clrYellow,
|
||||
clrBlue,
|
||||
clrMagenta,
|
||||
clrCyan,
|
||||
clrWhite,
|
||||
#else
|
||||
clrTransparent = 0x00000000,
|
||||
clrBackground = 0x7F000000, // 50% gray
|
||||
clrBlack = 0xFF000000,
|
||||
clrRed = 0xFF1414FC,
|
||||
clrGreen = 0xFF24FC24,
|
||||
clrYellow = 0xFF24C0FC,
|
||||
clrMagenta = 0xFFFC00B0,
|
||||
clrBlue = 0xFFFC0000,
|
||||
clrCyan = 0xFFFCFC00,
|
||||
clrWhite = 0xFFFCFCFC,
|
||||
#endif
|
||||
};
|
||||
|
||||
class cPalette {
|
||||
class cOsdItem : public cListObject {
|
||||
private:
|
||||
eDvbColor color[MAXNUMCOLORS];
|
||||
int maxColors, numColors;
|
||||
bool used[MAXNUMCOLORS];
|
||||
bool fetched[MAXNUMCOLORS];
|
||||
bool full;
|
||||
char *text;
|
||||
int offset;
|
||||
eOSState state;
|
||||
bool selectable;
|
||||
protected:
|
||||
typedef u_char tIndexes[MAXNUMCOLORS];
|
||||
bool fresh;
|
||||
public:
|
||||
cPalette(int Bpp);
|
||||
int Index(eDvbColor Color);
|
||||
void Reset(void);
|
||||
void SetColor(int Index, eDvbColor Color);
|
||||
eDvbColor GetColor(int Index) { return Index < maxColors ? color[Index] : clrBlack; }
|
||||
const eDvbColor *NewColors(int &FirstColor, int &LastColor);
|
||||
// With every call this function returns a consecutive range of
|
||||
// color entries that have been added since the last call. The
|
||||
// return value is the address of the first new color, and the
|
||||
// index of the first and last new color are returned in the given
|
||||
// int parameters. If there are no new color entries, NULL will
|
||||
// be returned.
|
||||
const eDvbColor *AllColors(int &NumColors);
|
||||
// Returns a pointer to the complete color table and stores the
|
||||
// number of valid entries in NumColors. If no colors have been
|
||||
// stored yet, NumColors will be set to 0 and the function will
|
||||
// return NULL.
|
||||
void Take(const cPalette &Palette, tIndexes *Indexes = NULL);
|
||||
cOsdItem(eOSState State = osUnknown);
|
||||
cOsdItem(const char *Text, eOSState State = osUnknown);
|
||||
virtual ~cOsdItem();
|
||||
bool Selectable(void) { return selectable; }
|
||||
void SetText(const char *Text, bool Copy = true);
|
||||
void SetSelectable(bool Selectable);
|
||||
void SetFresh(bool Fresh);
|
||||
const char *Text(void) { return text; }
|
||||
virtual void Set(void) {}
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
};
|
||||
|
||||
class cBitmap : public cPalette {
|
||||
class cOsdObject {
|
||||
friend class cOsdMenu;
|
||||
private:
|
||||
const cFont *font;
|
||||
eDvbFont fontType;
|
||||
u_char *bitmap;
|
||||
bool clearWithBackground;
|
||||
bool isMenu;
|
||||
protected:
|
||||
int width, height;
|
||||
int dirtyX1, dirtyY1, dirtyX2, dirtyY2;
|
||||
bool needsFastResponse;
|
||||
public:
|
||||
cBitmap(int Width, int Height, int Bpp, bool ClearWithBackground = true);
|
||||
virtual ~cBitmap();
|
||||
bool ClearWithBackground(void) { return clearWithBackground; }
|
||||
eDvbFont SetFont(eDvbFont Font);
|
||||
bool Dirty(int &x1, int &y1, int &x2, int &y2);
|
||||
void SetIndex(int x, int y, u_char Index);
|
||||
void SetPixel(int x, int y, eDvbColor Color);
|
||||
void SetBitmap(int x, int y, const cBitmap &Bitmap);
|
||||
int Width(void) { return width; }
|
||||
int Width(unsigned char c);
|
||||
int Width(const char *s);
|
||||
int Height(void) { return height; }
|
||||
void Text(int x, int y, const char *s, eDvbColor ColorFg = clrWhite, eDvbColor ColorBg = clrBackground);
|
||||
void Fill(int x1, int y1, int x2, int y2, eDvbColor Color);
|
||||
void Clean(void);
|
||||
void Clear(void);
|
||||
const u_char *Data(int x, int y);
|
||||
cOsdObject(bool FastResponse = false) { isMenu = false; needsFastResponse = FastResponse; }
|
||||
virtual ~cOsdObject() {}
|
||||
bool NeedsFastResponse(void) { return needsFastResponse; }
|
||||
bool IsMenu(void) { return isMenu; }
|
||||
virtual void Show(void) {}
|
||||
virtual eOSState ProcessKey(eKeys Key) { return osUnknown; }
|
||||
};
|
||||
|
||||
#define MAXNUMWINDOWS 7 // OSD windows are counted 1...7
|
||||
|
||||
class cWindow : public cBitmap {
|
||||
class cOsdMenu : public cOsdObject, public cList<cOsdItem> {
|
||||
private:
|
||||
int handle; // the index within the OSD's window array (0...MAXNUMWINDOWS - 1)
|
||||
int x0, y0;
|
||||
int bpp;
|
||||
bool tiled;
|
||||
bool shown;
|
||||
public:
|
||||
cWindow(int Handle, int x, int y, int w, int h, int Bpp, bool ClearWithBackground, bool Tiled);
|
||||
int X0(void) { return x0; }
|
||||
int Y0(void) { return y0; }
|
||||
int Bpp(void) { return bpp; }
|
||||
bool Tiled(void) { return tiled; }
|
||||
bool Shown(void) { bool s = shown; shown = true; return s; }
|
||||
int Handle(void) { return handle; }
|
||||
bool Contains(int x, int y);
|
||||
void Relocate(int x, int y);
|
||||
void Fill(int x1, int y1, int x2, int y2, eDvbColor Color);
|
||||
void SetBitmap(int x, int y, const cBitmap &Bitmap);
|
||||
void Text(int x, int y, const char *s, eDvbColor ColorFg = clrWhite, eDvbColor ColorBg = clrBackground);
|
||||
const u_char *Data(int x, int y);
|
||||
};
|
||||
|
||||
typedef int tWindowHandle;
|
||||
|
||||
// '-1' is used as an error return value!
|
||||
#define ALL_WINDOWS (-2)
|
||||
#define ALL_TILED_WINDOWS (-3)
|
||||
#define LAST_CREATED_WINDOW (-4)
|
||||
|
||||
class cOsdBase {
|
||||
private:
|
||||
int numWindows;
|
||||
int x0, y0;
|
||||
cWindow *window[MAXNUMWINDOWS];
|
||||
cWindow *GetWindow(int x, int y);
|
||||
cWindow *GetWindow(tWindowHandle Window);
|
||||
static cSkinDisplayMenu *displayMenu;
|
||||
static int displayMenuCount;
|
||||
static int displayMenuItems;
|
||||
char *title;
|
||||
int cols[cSkinDisplayMenu::MaxTabs];
|
||||
int first, current, marked;
|
||||
cOsdMenu *subMenu;
|
||||
const char *helpRed, *helpGreen, *helpYellow, *helpBlue;
|
||||
char *status;
|
||||
int digit;
|
||||
bool hasHotkeys;
|
||||
protected:
|
||||
cWindow *GetWindowNr(int i) { return i < MAXNUMWINDOWS ? window[i] : NULL; }
|
||||
int NumWindows(void) { return numWindows; }
|
||||
int X0(void) { return x0; }
|
||||
int Y0(void) { return y0; }
|
||||
virtual bool OpenWindow(cWindow *Window) = 0;
|
||||
// Opens the window on the OSD hardware, without actually showing it (the
|
||||
// initial state shall be "hidden").
|
||||
virtual void CommitWindow(cWindow *Window) = 0;
|
||||
// Write any modified data and color definitions to the OSD hardware.
|
||||
// Use the window's Dirty() function to find out which area of data
|
||||
// actually needs to be transferred. If the window has not yet been explicitly
|
||||
// shown through a call to ShowWindow(), no visible activity shall take place.
|
||||
virtual void ShowWindow(cWindow *Window) = 0;
|
||||
// Make the window actually visible on the OSD hardware.
|
||||
virtual void HideWindow(cWindow *Window, bool Hide) = 0;
|
||||
// Temporarily hide the window (if 'Hide' is 'true') or make a previously
|
||||
// hidden window visible again (if 'Hide' is 'false').
|
||||
virtual void MoveWindow(cWindow *Window, int x, int y) = 0;
|
||||
// Move the window to a new location.
|
||||
virtual void CloseWindow(cWindow *Window) = 0;
|
||||
// Close the window and release any OSD hardware resources allocated for it.
|
||||
cSkinDisplayMenu *DisplayMenu(void) { return displayMenu; }
|
||||
const char *hk(const char *s);
|
||||
void SetHasHotkeys(void);
|
||||
virtual void Clear(void);
|
||||
bool SelectableItem(int idx);
|
||||
void SetCurrent(cOsdItem *Item);
|
||||
void RefreshCurrent(void);
|
||||
void DisplayCurrent(bool Current);
|
||||
void CursorUp(void);
|
||||
void CursorDown(void);
|
||||
void PageUp(void);
|
||||
void PageDown(void);
|
||||
void Mark(void);
|
||||
eOSState HotKey(eKeys Key);
|
||||
eOSState AddSubMenu(cOsdMenu *SubMenu);
|
||||
eOSState CloseSubMenu();
|
||||
bool HasSubMenu(void) { return subMenu; }
|
||||
void SetStatus(const char *s);
|
||||
void SetTitle(const char *Title);
|
||||
void SetHelp(const char *Red, const char *Green = NULL, const char *Yellow = NULL, const char *Blue = NULL);
|
||||
virtual void Del(int Index);
|
||||
public:
|
||||
cOsdBase(int x, int y);
|
||||
// Initializes the OSD, starting at screen coordinates (x, y).
|
||||
virtual ~cOsdBase();
|
||||
// Destroys all windows and shuts down the OSD.
|
||||
tWindowHandle Create(int x, int y, int w, int h, int Bpp, bool ClearWithBackground = true, bool Tiled = true);
|
||||
// Creates a window at coordinates (x, y), which are relative to the OSD's
|
||||
// origin given in the constructor, with the given width, height and color
|
||||
// depth. ClearWithBackground controls whether the window will be filled with
|
||||
// clrBackground when it is cleared. Setting this to 'false' may be useful
|
||||
// for windows that don't need clrBackground but want to save this color
|
||||
// palette entry for a different color. Tiled controls whether this will
|
||||
// be part of a multi section OSD (with several windows that all have
|
||||
// different color depths and palettes and form one large OSD area), or
|
||||
// whether this is a "standalone" window that will be drawn "in front"
|
||||
// of any windows defined *after* this one (this can be used for highlighting
|
||||
// certain parts of the OSD, as would be done in a 'cursor').
|
||||
// Returns a handle that can be used to identify this window.
|
||||
void AddColor(eDvbColor Color, tWindowHandle Window = LAST_CREATED_WINDOW);
|
||||
// Adds the Color to the color palette of the given window if it is not
|
||||
// already contained in the palette (and if the palette still has free
|
||||
// slots for new colors). The default value LAST_CREATED_WINDOW will
|
||||
// access the most recently created window, without the need of explicitly
|
||||
// using a window handle.
|
||||
void Flush(void);
|
||||
// Actually commits all data of all windows to the OSD.
|
||||
void Clear(tWindowHandle Window = ALL_TILED_WINDOWS);
|
||||
// Clears the given window. If ALL_TILED_WINDOWS is given, only the tiled
|
||||
// windows will be cleared, leaving the standalone windows untouched. If
|
||||
// ALL_WINDOWS is given, the standalone windows will also be cleared.
|
||||
void Fill(int x1, int y1, int x2, int y2, eDvbColor Color, tWindowHandle Window = ALL_TILED_WINDOWS);
|
||||
// Fills the rectangle defined by the upper left (x1, y2) and lower right
|
||||
// (x2, y2) corners with the given Color. If a specific window is given,
|
||||
// the coordinates are relative to that window's upper left corner.
|
||||
// Otherwise they are relative to the upper left corner of the entire OSD.
|
||||
// If all tiled windows are selected, only that window which contains the
|
||||
// point (x1, y1) will actually be filled.
|
||||
void SetBitmap(int x, int y, const cBitmap &Bitmap, tWindowHandle Window = ALL_TILED_WINDOWS);
|
||||
// Sets the pixels within the given window with the data from the given
|
||||
// Bitmap. See Fill() for details about the coordinates.
|
||||
int Width(unsigned char c);
|
||||
// Returns the width (in pixels) of the given character in the current font.
|
||||
int Width(const char *s);
|
||||
// Returns the width (in pixels) of the given string in the current font.
|
||||
eDvbFont SetFont(eDvbFont Font);
|
||||
// Sets the current font for subsequent Width() and Text() operations.
|
||||
void Text(int x, int y, const char *s, eDvbColor ColorFg = clrWhite, eDvbColor ColorBg = clrBackground, tWindowHandle Window = ALL_TILED_WINDOWS);
|
||||
// Writes the given string at coordinates (x, y) with the given foreground
|
||||
// and background color into the given window (see Fill() for details
|
||||
// about the coordinates).
|
||||
void Relocate(tWindowHandle Window, int x, int y, int NewWidth = -1, int NewHeight = -1);
|
||||
// Moves the given window to the new location at (x, y). If NewWidth and
|
||||
// NewHeight are also given, the window will also be resized to the new
|
||||
// width and height.
|
||||
void Hide(tWindowHandle Window);
|
||||
// Hides the given window.
|
||||
void Show(tWindowHandle Window);
|
||||
// Shows the given window.
|
||||
cOsdMenu(const char *Title, int c0 = 0, int c1 = 0, int c2 = 0, int c3 = 0, int c4 = 0);
|
||||
virtual ~cOsdMenu();
|
||||
int Current(void) { return current; }
|
||||
void Add(cOsdItem *Item, bool Current = false, cOsdItem *After = NULL);
|
||||
void Ins(cOsdItem *Item, bool Current = false, cOsdItem *Before = NULL);
|
||||
virtual void Display(void);
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
};
|
||||
|
||||
#endif //__OSDBASE_H
|
||||
|
||||
Reference in New Issue
Block a user