diff options
author | louis <louis.braun@gmx.de> | 2014-09-27 09:25:14 +0200 |
---|---|---|
committer | louis <louis.braun@gmx.de> | 2014-09-27 09:25:14 +0200 |
commit | b0509b5182b6e0d04f05e6b3d5676b0d21f51966 (patch) | |
tree | 22b302342f22843e0815eb5f516c85f1478cbf0b /views/displaymenuview.c | |
download | vdr-plugin-skindesigner-0.0.1.tar.gz vdr-plugin-skindesigner-0.0.1.tar.bz2 |
initial commit version 0.0.10.0.1
Diffstat (limited to 'views/displaymenuview.c')
-rw-r--r-- | views/displaymenuview.c | 539 |
1 files changed, 539 insertions, 0 deletions
diff --git a/views/displaymenuview.c b/views/displaymenuview.c new file mode 100644 index 0000000..3b8c657 --- /dev/null +++ b/views/displaymenuview.c @@ -0,0 +1,539 @@ +#define __STL_CONFIG_H +#include <vdr/menu.h> +#include <vdr/videodir.h> +#include "displaymenuview.h" +#include "../config.h" +#include "../libcore/helpers.h" +#include "../libcore/timers.h" + +cDisplayMenuView::cDisplayMenuView(cTemplateView *tmplView, bool menuInit) : cView(tmplView) { + if (menuInit) + SetFadeTime(tmplView->GetNumericParameter(ptFadeTime)); + else + SetFadeTime(0); + cat = mcUndefined; +} + +cDisplayMenuView::~cDisplayMenuView() { + CancelSave(); + FadeOut(); +} + +bool cDisplayMenuView::DrawBackground(void) { + if (!ViewElementImplemented(veBackground)) { + return false; + } + DrawViewElement(veBackground); + return true; +} + +bool cDisplayMenuView::DrawHeader(void) { + if (!ViewElementImplemented(veHeader)) { + return false; + } + + map < string, string > stringTokens; + map < string, int > intTokens; + + stringTokens.insert(pair<string,string>("title", menuTitle)); + stringTokens.insert(pair<string,string>("vdrversion", VDRVERSION)); + + //check for standard menu entries + bool hasIcon = false; + string icon = imgCache->GetIconName(menuTitle); + if (icon.size() > 0) + hasIcon = true; + stringTokens.insert(pair<string,string>("icon", icon)); + intTokens.insert(pair<string,int>("hasicon", hasIcon)); + + ClearViewElement(veHeader); + DrawViewElement(veHeader, &stringTokens, &intTokens); + return true; +} + +bool cDisplayMenuView::DrawDateTime(void) { + if (!ViewElementImplemented(veDateTime)) { + return false; + } + + cString curDate = DayDateTime(); + + map < string, string > stringTokens; + map < string, int > intTokens; + + time_t t = time(0); // get time now + struct tm * now = localtime(&t); + + intTokens.insert(pair<string, int>("year", now->tm_year + 1900)); + intTokens.insert(pair<string, int>("day", now->tm_mday)); + + char monthname[20]; + char monthshort[10]; + strftime(monthshort, sizeof(monthshort), "%b", now); + strftime(monthname, sizeof(monthname), "%B", now); + + stringTokens.insert(pair<string,string>("monthname", monthname)); + stringTokens.insert(pair<string,string>("monthnameshort", monthshort)); + stringTokens.insert(pair<string,string>("month", *cString::sprintf("%02d", now->tm_mon + 1))); + stringTokens.insert(pair<string,string>("dayleadingzero", *cString::sprintf("%02d", now->tm_mday))); + stringTokens.insert(pair<string,string>("dayname", *WeekDayNameFull(now->tm_wday))); + stringTokens.insert(pair<string,string>("daynameshort", *WeekDayName(now->tm_wday))); + stringTokens.insert(pair<string,string>("time", *TimeString(t))); + + ClearViewElement(veDateTime); + DrawViewElement(veDateTime, &stringTokens, &intTokens); + return true; +} + +bool cDisplayMenuView::DrawColorButtons(void) { + if (!ViewElementImplemented(veButtons)) { + return false; + } + map < string, string > stringTokens; + map < string, int > intTokens; + + stringTokens.insert(pair<string,string>("red", buttonTexts[0])); + stringTokens.insert(pair<string,string>("green", buttonTexts[1])); + stringTokens.insert(pair<string,string>("yellow", buttonTexts[2])); + stringTokens.insert(pair<string,string>("blue", buttonTexts[3])); + + int colorKeys[4] = { Setup.ColorKey0, Setup.ColorKey1, Setup.ColorKey2, Setup.ColorKey3 }; + + for (int button = 1; button < 5; button++) { + string red = *cString::sprintf("red%d", button); + string green = *cString::sprintf("green%d", button); + string yellow = *cString::sprintf("yellow%d", button); + string blue = *cString::sprintf("blue%d", button); + bool isRed = false; + bool isGreen = false; + bool isYellow = false; + bool isBlue = false; + switch (colorKeys[button-1]) { + case 0: + isRed = true; + break; + case 1: + isGreen = true; + break; + case 2: + isYellow = true; + break; + case 3: + isBlue = true; + break; + default: + break; + } + intTokens.insert(pair<string, int>(red, isRed)); + intTokens.insert(pair<string, int>(green, isGreen)); + intTokens.insert(pair<string, int>(yellow, isYellow)); + intTokens.insert(pair<string, int>(blue, isBlue)); + } + + ClearViewElement(veButtons); + DrawViewElement(veButtons, &stringTokens, &intTokens); + return true; +} + +bool cDisplayMenuView::DrawMessage(eMessageType type, const char *text) { + if (!ViewElementImplemented(veMessage)) { + return false; + } + if (!text) { + ClearViewElement(veMessage); + return true; + } + map < string, string > stringTokens; + map < string, int > intTokens; + + intTokens.insert(pair<string, int>("status", (type == mtStatus) ? true : false)); + intTokens.insert(pair<string, int>("info", (type == mtInfo) ? true : false)); + intTokens.insert(pair<string, int>("warning", (type == mtWarning) ? true : false)); + intTokens.insert(pair<string, int>("error", (type == mtError) ? true : false)); + stringTokens.insert(pair<string,string>("text", text)); + + ClearViewElement(veMessage); + DrawViewElement(veMessage, &stringTokens, &intTokens); + return true; +} + +void cDisplayMenuView::DrawScrollbar(int numMax, int numDisplayed, int offset) { + if (!ViewElementImplemented(veScrollbar)) { + return; + } + map < string, string > stringTokens; + map < string, int > intTokens; + if (numDisplayed < 1) + return; + + int barHeight = 0; + if (numDisplayed < numMax) + barHeight = 1000; + else + barHeight = (double)numMax * 1000 / (double)numDisplayed; + + int barOffset = (double)offset * 1000 / (double)numDisplayed; + + intTokens.insert(pair<string, int>("height", barHeight)); + intTokens.insert(pair<string, int>("offset", barOffset)); + + ClearViewElement(veScrollbar); + DrawViewElement(veScrollbar, &stringTokens, &intTokens); +} + +bool cDisplayMenuView::BackgroundImplemented(void) { + if (!ViewElementImplemented(veBackground)) { + return false; + } + return true; +} + + +void cDisplayMenuView::Action(void) { + SetInitFinished(); + FadeIn(); + DoFlush(); +} + +/************************************************************************ +* cDisplayMenuMainView +************************************************************************/ + +cDisplayMenuMainView::cDisplayMenuMainView(cTemplateView *tmplView, bool menuInit) : cDisplayMenuView(tmplView, menuInit) { + initial = true; + lastSystemLoad = 0.0; + InitDevices(); +} + +cDisplayMenuMainView::~cDisplayMenuMainView() { + CancelSave(); + FadeOut(); + delete[] lastSignalStrength; + delete[] lastSignalQuality; + delete[] recDevices; +} + +void cDisplayMenuMainView::DrawStaticViewElements(void) { + DrawTimers(); + DrawDiscUsage(); +} + +bool cDisplayMenuMainView::DrawDynamicViewElements(void) { + bool loadChanged = DrawLoad(); + bool devicesChanged = DrawDevices(); + initial = false; + return loadChanged || devicesChanged; + +} + +void cDisplayMenuMainView::DrawTimers(void) { + if (!ViewElementImplemented(veTimers)) { + return; + } + + map < string, string > stringTokens; + map < string, int > intTokens; + + map < string, vector< map< string, string > > > timerLoopTokens; + vector< map< string, string > > timers; + + cGlobalSortedTimers SortedTimers;// local and remote timers + int numTimers = SortedTimers.Size(); + + intTokens.insert(pair<string, int>("numtimers", numTimers)); + + int numTimerConflicts = SortedTimers.NumTimerConfilicts(); + intTokens.insert(pair<string, int>("numtimerconflicts", numTimerConflicts)); + + for (int i=0; i<15; i++) { + stringstream name; + name << "timer" << i+1 << "exists"; + if (i < numTimers) { + intTokens.insert(pair<string, int>(name.str(), true)); + } else { + intTokens.insert(pair<string, int>(name.str(), false)); + } + } + + for (int i = 0; i < numTimers; i++) { + if (i >=15) + break; + map< string, string > timerVals; + const cTimer *Timer = SortedTimers[i]; + const cEvent *event = Timer->Event(); + if (event) { + timerVals.insert(pair< string, string >("timers[title]", event->Title())); + } else { + const char *File = Setup.FoldersInTimerMenu ? NULL : strrchr(Timer->File(), FOLDERDELIMCHAR); + if (File && strcmp(File + 1, TIMERMACRO_TITLE) && strcmp(File + 1, TIMERMACRO_EPISODE)) + File++; + else + File = Timer->File(); + timerVals.insert(pair< string, string >("timers[title]", File)); + } + const cChannel *channel = Timer->Channel(); + if (channel) { + timerVals.insert(pair< string, string >("timers[channelname]", channel->Name())); + stringstream chanNum; + chanNum << channel->Number(); + timerVals.insert(pair< string, string >("timers[channelnumber]", chanNum.str())); + string channelID = *(channel->GetChannelID().ToString()); + timerVals.insert(pair< string, string >("timers[channelid]", channelID)); + bool logoExists = imgCache->LogoExists(channelID); + timerVals.insert(pair< string, string >("timers[channellogoexists]", logoExists ? "1" : "0")); + } else { + timerVals.insert(pair< string, string >("timers[channelname]", "")); + timerVals.insert(pair< string, string >("timers[channelnumber]", "0")); + timerVals.insert(pair< string, string >("timers[channelid]", "")); + timerVals.insert(pair< string, string >("timers[channellogoexists]", "0")); + } + + timerVals.insert(pair< string, string >("timers[recording]", Timer->Recording() ? "1" : "0")); + + cString timerDate(""); + if (Timer->Recording()) { + timerDate = cString::sprintf("-%s", *TimeString(Timer->StopTime())); + } else { + time_t Now = time(NULL); + cString Today = WeekDayName(Now); + cString Time = TimeString(Timer->StartTime()); + cString Day = WeekDayName(Timer->StartTime()); + if (Timer->StartTime() > Now + 6 * SECSINDAY) { + time_t ttm = Timer->StartTime(); + struct tm * timerTime = localtime(&ttm); + timerDate = cString::sprintf("%02d.%02d %s", timerTime->tm_mday, timerTime->tm_mon + 1, *Time); + } else if (strcmp(Day, Today) != 0) + timerDate = cString::sprintf("%s %s", *Day, *Time); + else + timerDate = Time; + if (Timer->Flags() & tfVps) + timerDate = cString::sprintf("VPS %s", *timerDate); + } + timerVals.insert(pair< string, string >("timers[datetime]", *timerDate)); + + timers.push_back(timerVals); + } + + timerLoopTokens.insert(pair< string, vector< map< string, string > > >("timers", timers)); + + ClearViewElement(veTimers); + DrawViewElement(veTimers, &stringTokens, &intTokens, &timerLoopTokens); +} + +void cDisplayMenuMainView::DrawDiscUsage(void) { + if (!ViewElementImplemented(veDiscUsage)) { + return; + } + + map < string, string > stringTokens; + map < string, int > intTokens; + + string vdrUsageString = *cVideoDiskUsage::String(); + int discUsage = cVideoDiskUsage::UsedPercent(); + bool discAlert = (discUsage > 95) ? true : false; + string freeTime = *cString::sprintf("%02d:%02d", cVideoDiskUsage::FreeMinutes() / 60, cVideoDiskUsage::FreeMinutes() % 60); + int freeGB = cVideoDiskUsage::FreeMB() / 1024; + + intTokens.insert(pair<string, int>("usedpercent", discUsage)); + intTokens.insert(pair<string, int>("freepercent", 100-discUsage)); + intTokens.insert(pair<string, int>("discalert", discAlert)); + intTokens.insert(pair<string, int>("freegb", freeGB)); + stringTokens.insert(pair<string,string>("freetime", freeTime)); + stringTokens.insert(pair<string,string>("vdrusagestring", vdrUsageString)); + + ClearViewElement(veDiscUsage); + DrawViewElement(veDiscUsage, &stringTokens, &intTokens); +} + +void cDisplayMenuMainView::InitDevices(void) { + int numDevices = cDevice::NumDevices(); + lastSignalStrength = new int[numDevices]; + lastSignalQuality = new int[numDevices]; + recDevices = new bool[numDevices]; + for (int i=0; i<numDevices; i++) { + lastSignalStrength[i] = 0; + lastSignalQuality[i] = 0; + recDevices[i] = false; + } +} + +bool cDisplayMenuMainView::DrawLoad(void) { + if (!ViewElementImplemented(veSystemLoad)) { + return false; + } + + map < string, string > stringTokens; + map < string, int > intTokens; + + double systemLoad; + if (getloadavg(&systemLoad, 1) > 0) { + if (lastSystemLoad == systemLoad) { + return false; + } + string load = *cString::sprintf("%.2f", systemLoad); + stringTokens.insert(pair<string,string>("load", load)); + lastSystemLoad = systemLoad; + } + + ClearViewElement(veSystemLoad); + DrawViewElement(veSystemLoad, &stringTokens, &intTokens); + + return true; +} + +bool cDisplayMenuMainView::DrawDevices(void) { + if (!ViewElementImplemented(veDevices)) { + return false; + } + int numDevices = cDevice::NumDevices(); + if (!initial) { + //check if drawing is necessary + bool changed = false; + for (int i = 0; i < numDevices; i++) { + const cDevice *device = cDevice::GetDevice(i); + if (!device || !device->NumProvidedSystems()) { + continue; + } + if ((device->SignalStrength() != lastSignalStrength[i]) || (device->SignalQuality() != lastSignalQuality[i])) { + changed = true; + break; + } + } + if (!changed) { + return false; + } + } + + map < string, string > stringTokens; + map < string, int > intTokens; + + map < string, vector< map< string, string > > > deviceLoopTokens; + vector< map< string, string > > devices; + + //check device which currently displays live tv + int deviceLiveTV = -1; + cDevice *primaryDevice = cDevice::PrimaryDevice(); + if (primaryDevice) { + if (!primaryDevice->Replaying() || primaryDevice->Transferring()) + deviceLiveTV = cDevice::ActualDevice()->DeviceNumber(); + else + deviceLiveTV = primaryDevice->DeviceNumber(); + } + + //check currently recording devices + for (cTimer *timer = Timers.First(); timer; timer = Timers.Next(timer)) { + if (!timer->Recording()) { + continue; + } + if (cRecordControl *RecordControl = cRecordControls::GetRecordControl(timer)) { + const cDevice *recDevice = RecordControl->Device(); + if (recDevice) { + recDevices[recDevice->DeviceNumber()] = true; + } + } + } + int actualNumDevices = 0; + for (int i = 0; i < numDevices; i++) { + const cDevice *device = cDevice::GetDevice(i); + if (!device || !device->NumProvidedSystems()) { + continue; + } + actualNumDevices++; + map< string, string > deviceVals; + stringstream strNum; + strNum << actualNumDevices; + deviceVals.insert(pair< string, string >("devices[num]", strNum.str())); + deviceVals.insert(pair< string, string >("devices[type]", *(device->DeviceType()))); + cCamSlot *camSlot = device->CamSlot(); + int camNumber = -1; + if (camSlot) { + camNumber = camSlot->SlotNumber(); + deviceVals.insert(pair< string, string >("devices[hascam]", "1")); + } else { + deviceVals.insert(pair< string, string >("devices[hascam]", "0")); + } + int signalStrength = device->SignalStrength(); + int signalQuality = device->SignalQuality(); + stringstream strCamNumber; + strCamNumber << camNumber; + deviceVals.insert(pair< string, string >("devices[cam]", strCamNumber.str())); + stringstream strStrength; + strStrength << signalStrength; + deviceVals.insert(pair< string, string >("devices[signalstrength]", strStrength.str())); + stringstream strQuality; + strQuality << signalQuality; + deviceVals.insert(pair< string, string >("devices[signalquality]", strQuality.str())); + + deviceVals.insert(pair< string, string >("devices[livetv]", i == deviceLiveTV ? "1" : "0")); + deviceVals.insert(pair< string, string >("devices[recording]", recDevices[i] ? "1" : "0")); + + const cChannel *channel = device->GetCurrentlyTunedTransponder(); + const cSource *source = (channel) ? Sources.Get(channel->Source()) : NULL; + if (channel && channel->Number() > 0) { + stringstream strChanNum; + strChanNum << channel->Number(); + deviceVals.insert(pair< string, string >("devices[channelnumber]", strChanNum.str())); + deviceVals.insert(pair< string, string >("devices[channelname]", channel->Name())); + deviceVals.insert(pair< string, string >("devices[channelid]", *(channel->GetChannelID().ToString()))); + deviceVals.insert(pair< string, string >("devices[istuned]", "1")); + } else { + deviceVals.insert(pair< string, string >("devices[channelnumber]", "0")); + deviceVals.insert(pair< string, string >("devices[channelname]", "")); + deviceVals.insert(pair< string, string >("devices[channelid]", "")); + deviceVals.insert(pair< string, string >("devices[istuned]", "0")); + } + + deviceVals.insert(pair< string, string >("devices[source]", source ? source->Description() : "")); + + devices.push_back(deviceVals); + + lastSignalStrength[i] = signalStrength; + lastSignalQuality[i] = signalQuality; + } + deviceLoopTokens.insert(pair< string, vector< map< string, string > > >("devices", devices)); + + intTokens.insert(pair<string, int>("numdevices", actualNumDevices)); + + ClearViewElement(veDevices); + DrawViewElement(veDevices, &stringTokens, &intTokens, &deviceLoopTokens); + return true; +} + +/************************************************************************ +* cDisplayMenuSchedulesView +************************************************************************/ + +cDisplayMenuSchedulesView::cDisplayMenuSchedulesView(cTemplateView *tmplView, eMenuCategory menuCat, bool menuInit) : cDisplayMenuView(tmplView, menuInit) { + cat = menuCat; + channel = NULL; +} + +cDisplayMenuSchedulesView::~cDisplayMenuSchedulesView() { + CancelSave(); + FadeOut(); +} + +bool cDisplayMenuSchedulesView::DrawHeader(void) { + if (!ViewElementImplemented(veHeader)) { + return false; + } + + map < string, string > stringTokens; + map < string, int > intTokens; + + intTokens.insert(pair<string,int>("whatson", (cat == mcSchedule) ? true: false)); + intTokens.insert(pair<string,int>("whatsonnow", (cat == mcScheduleNow) ? true: false)); + intTokens.insert(pair<string,int>("whatsonnext", (cat == mcScheduleNext) ? true: false)); + + stringTokens.insert(pair<string,string>("title", menuTitle)); + stringTokens.insert(pair<string,string>("vdrversion", VDRVERSION)); + if (channel) { + stringTokens.insert(pair<string,string>("channelnumber", *cString::sprintf("%d", channel->Number()))); + stringTokens.insert(pair<string,string>("channelname", channel->Name())); + stringTokens.insert(pair<string,string>("channelid", *(channel->GetChannelID().ToString()))); + + } + ClearViewElement(veHeader); + DrawViewElement(veHeader, &stringTokens, &intTokens); + return true; +}
\ No newline at end of file |