diff options
author | horchi <vdr@jwendel.de> | 2017-03-05 14:51:57 +0100 |
---|---|---|
committer | horchi <vdr@jwendel.de> | 2017-03-05 14:51:57 +0100 |
commit | 5eacf5bf36ddbac082a9e40a2bcdfd0f04fd3f9f (patch) | |
tree | 392875cb707b94aaba9d8941113eae35efaf2ec2 /menusearchtimer.c | |
download | vdr-plugin-epg2vdr-5eacf5bf36ddbac082a9e40a2bcdfd0f04fd3f9f.tar.gz vdr-plugin-epg2vdr-5eacf5bf36ddbac082a9e40a2bcdfd0f04fd3f9f.tar.bz2 |
Diffstat (limited to 'menusearchtimer.c')
-rw-r--r-- | menusearchtimer.c | 381 |
1 files changed, 381 insertions, 0 deletions
diff --git a/menusearchtimer.c b/menusearchtimer.c new file mode 100644 index 0000000..dd59c1b --- /dev/null +++ b/menusearchtimer.c @@ -0,0 +1,381 @@ +/* + * menusearchtimer.c: EPG2VDR plugin for the Video Disk Recorder + * + * See the README file for copyright information and how to reach the author. + * + */ + +#include <vdr/interface.h> + +#include "lib/searchtimer.h" +#include "menu.h" + +//*************************************************************************** +// Class cEpgMenuSearchTimerEdit +//*************************************************************************** + +class cEpgMenuSearchTimerEdit : public cOsdMenu +{ + public: + + cEpgMenuSearchTimerEdit(cMenuDb* db, long id, bool New = no); + virtual ~cEpgMenuSearchTimerEdit(); + + virtual eOSState ProcessKey(eKeys Key); + + protected: + + cMenuDb* menuDb; +}; + +cEpgMenuSearchTimerEdit::cEpgMenuSearchTimerEdit(cMenuDb* db, long id, bool New) + : cOsdMenu(tr("Edit Search Timer"), 12) +{ + menuDb = db; + menuDb->searchtimerDb->clear(); + menuDb->searchtimerDb->setValue("ID", id); + + if (!menuDb->searchtimerDb->find()) + return; + + cDbTableDef* def = menuDb->searchtimerDb->getTableDef(); + + for (int i = 0; i < def->fieldCount(); i++) + { + cDbValue* value = menuDb->searchtimerDb->getValue(def->getField(i)->getName()); + const char* name = def->getField(i)->getDescription(); + + if (!value || def->getField(i)->hasType(cDBS::ftMeta)) + continue; + + if (isEmpty(name)) + name = def->getField(i)->getName(); + + if (def->getField(i)->hasFormat(cDBS::ffAscii)) + Add(new cMenuEditStrItem(tr(name), (char*)value->getStrValueRef(), def->getField(i)->getSize())); + + else if (def->getField(i)->hasFormat(cDBS::ffInt)) + Add(new cMenuEditIntItem(tr(name), (int*)value->getIntValueRef())); + } + + Display(); +} + +cEpgMenuSearchTimerEdit::~cEpgMenuSearchTimerEdit() +{ +} + +eOSState cEpgMenuSearchTimerEdit::ProcessKey(eKeys Key) +{ + eOSState state = cOsdMenu::ProcessKey(Key); + + return state; +} + +//*************************************************************************** +// Class cEpgMenuSearchTimerItem +//*************************************************************************** + +class cEpgMenuSearchTimerItem : public cOsdItem +{ + public: + + cEpgMenuSearchTimerItem(long aId, int aActive, const char* text) + { + id = aId; + active = aActive; + SetText(text); + } + + ~cEpgMenuSearchTimerItem() { } + + long getId() { return id; } + int isActive() { return active; } + + protected: + + long id; + int active; +}; + +//*************************************************************************** +//*************************************************************************** +// Class cEpgMenuSearchResult +//*************************************************************************** + +class cEpgMenuSearchResult : public cOsdMenu +{ + public: + + cEpgMenuSearchResult(cMenuDb* db, long id); + virtual ~cEpgMenuSearchResult(); + virtual eOSState ProcessKey(eKeys Key); + + protected: + + int refresh(long id); + + cMenuDb* menuDb; +}; + +cEpgMenuSearchResult::cEpgMenuSearchResult(cMenuDb* db, long id) + : cOsdMenu(tr("Edit Search Timer"), 17, CHNAMWIDTH, 3, 30) +{ + menuDb = db; + refresh(id); +} + +cEpgMenuSearchResult::~cEpgMenuSearchResult() +{ +} + +//*************************************************************************** +// Refresh +//*************************************************************************** + +int cEpgMenuSearchResult::refresh(long id) +{ + cDbStatement* select = 0; + + menuDb->searchtimerDb->setValue("ID", id); + + if (!menuDb->searchtimerDb->find()) + return done; + + if (!(select = menuDb->search->prepareSearchStatement(menuDb->searchtimerDb->getRow(), menuDb->useeventsDb))) + return fail; + +#if defined (APIVERSNUM) && (APIVERSNUM >= 20301) + cChannelsLock channelsLock(false); + const cChannels* channels = channelsLock.Channels(); +#else + cChannels* channels = &Channels; +#endif + + menuDb->useeventsDb->clear(); + + for (int res = select->find(); res; res = select->fetch()) + { + int cnt = 0; + cDbStatement* selectDones = 0; + + menuDb->useeventsDb->find(); // get all fields .. + + if (!menuDb->search->matchCriterias(menuDb->searchtimerDb->getRow(), menuDb->useeventsDb->getRow())) + continue; + + // dones ... + + if (menuDb->search->prepareDoneSelect(menuDb->useeventsDb->getRow(), + menuDb->searchtimerDb->getIntValue("REPEATFIELDS"), + selectDones) == success + && selectDones) + { + // first only count - #TODO show them in a sub-menu oder let delete by kYellow? + + for (int f = selectDones->find(); f; f = selectDones->fetch()) + cnt++; + + selectDones->freeResult(); + } + + // + + const char* strChannelId = menuDb->useeventsDb->getStrValue("CHANNELID"); + const cChannel* channel = channels->GetByChannelID(tChannelID::FromString(strChannelId)); + + Add(new cEpgMenuTextItem(menuDb->useeventsDb->getIntValue("USEID"), + cString::sprintf("%s\t%s\t%s\t%s\t%s", + l2pTime(menuDb->useeventsDb->getIntValue("STARTTIME")).c_str(), + channel->Name(), + cnt ? num2Str(cnt).c_str() : "", + menuDb->useeventsDb->getStrValue("TITLE"), + menuDb->useeventsDb->getStrValue("SHORTTEXT")))); + } + + select->freeResult(); + menuDb->searchtimerDb->reset(); + + SetHelp(0, 0, "Delete dones", 0); + Display(); + + return success; +} + +//*************************************************************************** +// Process Key +//*************************************************************************** + +eOSState cEpgMenuSearchResult::ProcessKey(eKeys Key) +{ + eOSState state = cOsdMenu::ProcessKey(Key); + + if (state == osUnknown) + { + switch (Key) + { + case kYellow: + { + cDbStatement* selectDones = 0; + cEpgMenuTextItem* item = (cEpgMenuTextItem*)Get(Current()); + + if (item && Interface->Confirm(tr("Remove all done entries of this event?"))) + { + menuDb->useeventsDb->clear(); + menuDb->useeventsDb->setValue("USEID", item->getId()); + + if (menuDb->useeventsDb->find()) + { + if (menuDb->search->prepareDoneSelect(menuDb->useeventsDb->getRow(), + menuDb->searchtimerDb->getIntValue("REPEATFIELDS"), + selectDones) == success + && selectDones) + { + for (int f = selectDones->find(); f; f = selectDones->fetch()) + selectDones->getTable()->deleteWhere("id = %ld", selectDones->getTable()->getIntValue("ID")); + + selectDones->freeResult(); + } + } + } + } + + default: break; + } + } + + return state; +} + +//*************************************************************************** +// Class cMenuEpgSearchTimers +//*************************************************************************** +//*************************************************************************** +// Object +//*************************************************************************** + +cMenuEpgSearchTimers::cMenuEpgSearchTimers() + : cOsdMenu(tr("Search Timers"), 2, 6) +{ + menuDb = new cMenuDb; + refresh(); +} + +cMenuEpgSearchTimers::~cMenuEpgSearchTimers() +{ + delete menuDb; +} + +int cMenuEpgSearchTimers::refresh() +{ + int current = Current(); + + menuDb->searchtimerDb->clear(); + + Clear(); + + for (int f = menuDb->selectSearchTimers->find(); f && menuDb->dbConnected(); f = menuDb->selectSearchTimers->fetch()) + { + char* buf; + asprintf(&buf, "%c\t%ld\t%s", + menuDb->searchtimerDb->getIntValue("ACTIVE") ? '>' : ' ', + menuDb->searchtimerDb->getIntValue("HITS"), + menuDb->searchtimerDb->getStrValue("EXPRESSION")); + Add(new cEpgMenuSearchTimerItem(menuDb->searchtimerDb->getIntValue("ID"), + menuDb->searchtimerDb->getIntValue("ACTIVE"), buf)); + free(buf); + } + + menuDb->selectSearchTimers->freeResult(); + + Sort(); + SetCurrent(current >= 0 ? Get(current) : First()); + + setHelpKeys(); + Display(); + + return done; +} + +void cMenuEpgSearchTimers::setHelpKeys() +{ + cEpgMenuSearchTimerItem* item = (cEpgMenuSearchTimerItem*)Get(Current()); + + if (item) + SetHelp(item->isActive() ? tr("Deactivate") : tr("Activate"), + tr("Test"), + tr("Delete"), + 0); + else + SetHelp(0, 0, 0, 0); + + return ; +} + +//*************************************************************************** +// Process Key +//*************************************************************************** + +eOSState cMenuEpgSearchTimers::ProcessKey(eKeys Key) +{ + eOSState state = cOsdMenu::ProcessKey(Key); + cEpgMenuSearchTimerItem* item = (cEpgMenuSearchTimerItem*)Get(Current()); + + if (state == osUnknown) + { + switch (Key) + { + case kOk: + { + if (HasSubMenu() || Count() == 0) + return osContinue; + + return osContinue; // #TODO + return AddSubMenu(new cEpgMenuSearchTimerEdit(menuDb, item->getId())); + } + + case kRed: + { + menuDb->searchtimerDb->setValue("ID", item->getId()); + + if (menuDb->searchtimerDb->find()) + { + menuDb->searchtimerDb->setValue("ACTIVE", !menuDb->searchtimerDb->getIntValue("ACTIVE")); + menuDb->searchtimerDb->update(); + refresh(); + } + + return osContinue; + } + + case kGreen: + { + return AddSubMenu(new cEpgMenuSearchResult(menuDb, item->getId())); + } + + case kYellow: + { + if (item && Interface->Confirm(tr("Delete search timer?"))) + { + menuDb->searchtimerDb->setValue("ID", item->getId()); + + if (menuDb->searchtimerDb->find()) + { + menuDb->searchtimerDb->setCharValue("STATE", 'D'); + menuDb->searchtimerDb->update(); + refresh(); + } + } + + return osContinue; + } + + default: break; + } + } + + if (!HasSubMenu() && Key != kNone) + setHelpKeys(); + + return state; +} |