neutrino eventlist: show timer conflicts

This is a partial port from tuxbox.
TODO: solution for zapto timer events

git-svn-id: file:///home/bas/coolstream_public_svn/THIRDPARTY/applications/neutrino-beta@1791 e54a6e83-5905-42d5-8d5c-058d10e6a962


Origin commit data
------------------
Branch: ni/coolstream
Commit: fe181e7d01
Author: Thilo Graf <dbt@novatux.de>
Date: 2011-10-29 (Sat, 29 Oct 2011)

Origin message was:
------------------
*neutrino eventlist: show timer conflicts

This is a partial port from tuxbox.
TODO: solution for zapto timer events

git-svn-id: file:///home/bas/coolstream_public_svn/THIRDPARTY/applications/neutrino-beta@1791 e54a6e83-5905-42d5-8d5c-058d10e6a962


------------------
This commit was generated by Migit
This commit is contained in:
2011-10-28 22:16:04 +00:00
parent 5e6b5cee3f
commit 9cd9fdceed
2 changed files with 76 additions and 18 deletions

View File

@@ -59,6 +59,8 @@ extern CBouquetList * bouquetList;
#include <zapit/client/zapittools.h> #include <zapit/client/zapittools.h>
#include <zapit/zapit.h> #include <zapit/zapit.h>
#include <daemonc/remotecontrol.h>
extern CRemoteControl *g_RemoteControl; /* neutrino.cpp */
#include <algorithm> #include <algorithm>
extern CPictureViewer * g_PicViewer; extern CPictureViewer * g_PicViewer;
@@ -107,12 +109,40 @@ EventList::EventList()
x = frameBuffer->getScreenX() + (frameBuffer->getScreenWidth() - width) / 2; x = frameBuffer->getScreenX() + (frameBuffer->getScreenWidth() - width) / 2;
y = frameBuffer->getScreenY() + (frameBuffer->getScreenHeight() - height) / 2; y = frameBuffer->getScreenY() + (frameBuffer->getScreenHeight() - height) / 2;
item_event_ID = 0;
} }
EventList::~EventList() EventList::~EventList()
{ {
} }
void EventList::UpdateTimerList(void)
{
timerlist.clear();
g_Timerd->getTimerList (timerlist);
g_Timerd->getRecordingSafety(timerPre,timerPost);
}
// Function: HasTimerConflicts
// search for timer conflicts for given time
// return: true if found any conflict, you can watch with parameter epg_ID
bool EventList::HasTimerConflicts(time_t starttime, time_t duration, event_id_t * epg_ID)
{
for(uint i= 0; i < timerlist.size(); i++)
{
if(timerlist[i].stopTime > starttime-timerPre && timerlist[i].alarmTime < starttime+duration+timerPost)
{
*epg_ID = timerlist[i].epgID;
return true;
}
}
*epg_ID = 0;
return false;
}
void EventList::readEvents(const t_channel_id channel_id) void EventList::readEvents(const t_channel_id channel_id)
{ {
//evtlist = g_Sectionsd->getEventsServiceKey(channel_id &0xFFFFFFFFFFFFULL); //evtlist = g_Sectionsd->getEventsServiceKey(channel_id &0xFFFFFFFFFFFFULL);
@@ -276,6 +306,7 @@ int EventList::exec(const t_channel_id channel_id, const std::string& channelnam
fadeTimer = g_RCInput->addTimer( FADE_TIME, false ); fadeTimer = g_RCInput->addTimer( FADE_TIME, false );
} }
readEvents(channel_id); readEvents(channel_id);
UpdateTimerList();
if(channelname_prev.empty(), channelname_next.empty()){ if(channelname_prev.empty(), channelname_next.empty()){
paintHead(channel_id, channelname); paintHead(channel_id, channelname);
@@ -690,7 +721,7 @@ CTimerd::CTimerEventTypes EventList::isScheduled(t_channel_id channel_id, CChann
if(tID) if(tID)
*tID = timer->eventID; *tID = timer->eventID;
return timer->eventType; return timer->eventType;
} }
} }
} }
} }
@@ -703,9 +734,10 @@ void EventList::paintItem(unsigned int pos, t_channel_id channel_idI)
fb_pixel_t bgcolor; fb_pixel_t bgcolor;
int ypos = y+ theight+0 + pos*fheight; int ypos = y+ theight+0 + pos*fheight;
std::string datetime1_str, datetime2_str, duration_str; std::string datetime1_str, datetime2_str, duration_str;
unsigned int curpos = liststart + pos;
const char * icontype = 0; const char * icontype = 0;
if (liststart+pos==selected) if (curpos==selected)
{ {
color = COL_MENUCONTENTSELECTED; color = COL_MENUCONTENTSELECTED;
bgcolor = COL_MENUCONTENTSELECTED_PLUS_0; bgcolor = COL_MENUCONTENTSELECTED_PLUS_0;
@@ -713,7 +745,7 @@ void EventList::paintItem(unsigned int pos, t_channel_id channel_idI)
frameBuffer->paintBoxRel(x, ypos, width- 15, fheight, COL_MENUCONTENT_PLUS_0, 0); frameBuffer->paintBoxRel(x, ypos, width- 15, fheight, COL_MENUCONTENT_PLUS_0, 0);
} }
else if (liststart+pos == current_event ) else if (curpos == current_event )
{ {
color = COL_MENUCONTENT + 1; color = COL_MENUCONTENT + 1;
bgcolor = COL_MENUCONTENT_PLUS_1; bgcolor = COL_MENUCONTENT_PLUS_1;
@@ -726,12 +758,12 @@ void EventList::paintItem(unsigned int pos, t_channel_id channel_idI)
frameBuffer->paintBoxRel(x, ypos, width- 15, fheight, bgcolor, color == COL_MENUCONTENTSELECTED ? RADIUS_LARGE : 0); frameBuffer->paintBoxRel(x, ypos, width- 15, fheight, bgcolor, color == COL_MENUCONTENTSELECTED ? RADIUS_LARGE : 0);
if(liststart+pos<evtlist.size()) if(curpos<evtlist.size())
{ {
if ( evtlist[liststart+pos].eventID != 0 ) if ( evtlist[curpos].eventID != 0 )
{ {
char tmpstr[256]; char tmpstr[256];
struct tm *tmStartZeit = localtime(&evtlist[liststart+pos].startTime); struct tm *tmStartZeit = localtime(&evtlist[curpos].startTime);
datetime1_str = g_Locale->getText(CLocaleManager::getWeekday(tmStartZeit)); datetime1_str = g_Locale->getText(CLocaleManager::getWeekday(tmStartZeit));
@@ -748,23 +780,20 @@ void EventList::paintItem(unsigned int pos, t_channel_id channel_idI)
if ( m_showChannel ) // show the channel if we made a event search only (which could be made through all channels ). if ( m_showChannel ) // show the channel if we made a event search only (which could be made through all channels ).
{ {
t_channel_id channel = evtlist[liststart+pos].channelID; t_channel_id channel = evtlist[curpos].channelID;
datetime2_str += " "; datetime2_str += " ";
datetime2_str += g_Zapit->getChannelName(channel); datetime2_str += g_Zapit->getChannelName(channel);
} }
snprintf(tmpstr,sizeof(tmpstr), "[%d min]", evtlist[liststart+pos].duration / 60 ); snprintf(tmpstr,sizeof(tmpstr), "[%d min]", evtlist[curpos].duration / 60 );
duration_str = tmpstr; duration_str = tmpstr;
} }
CTimerd::CTimerEventTypes etype = isScheduled(channel_idI, &evtlist[liststart+pos]);
icontype = etype == CTimerd::TIMER_ZAPTO ? NEUTRINO_ICON_BUTTON_YELLOW : etype == CTimerd::TIMER_RECORD ? NEUTRINO_ICON_BUTTON_RED : 0;
// 1st line // 1st line
g_Font[SNeutrinoSettings::FONT_TYPE_EVENTLIST_DATETIME]->RenderString(x+5, ypos+ fheight1+3, fwidth1+5, datetime1_str, color, 0, true); // UTF-8 g_Font[SNeutrinoSettings::FONT_TYPE_EVENTLIST_DATETIME]->RenderString(x+5, ypos+ fheight1+3, fwidth1+5, datetime1_str, color, 0, true); // UTF-8
g_Font[SNeutrinoSettings::FONT_TYPE_EVENTLIST_DATETIME]->RenderString(x+5+fwidth1, ypos+ fheight1+3, width-fwidth1-10- 20, datetime2_str, color, 0, true); // UTF-8 g_Font[SNeutrinoSettings::FONT_TYPE_EVENTLIST_DATETIME]->RenderString(x+5+fwidth1, ypos+ fheight1+3, width-fwidth1-10- 20, datetime2_str, color, 0, true); // UTF-8
int seit = ( evtlist[liststart+pos].startTime - time(NULL) ) / 60; int seit = ( evtlist[curpos].startTime - time(NULL) ) / 60;
if ( (seit> 0) && (seit<100) && (duration_str.length()!=0) ) if ( (seit> 0) && (seit<100) && (duration_str.length()!=0) )
{ {
char beginnt[100]; char beginnt[100];
@@ -774,14 +803,36 @@ void EventList::paintItem(unsigned int pos, t_channel_id channel_idI)
g_Font[SNeutrinoSettings::FONT_TYPE_EVENTLIST_ITEMSMALL]->RenderString(x+width-fwidth2-5- 20- w, ypos+ fheight1+3, fwidth2, beginnt, color); g_Font[SNeutrinoSettings::FONT_TYPE_EVENTLIST_ITEMSMALL]->RenderString(x+width-fwidth2-5- 20- w, ypos+ fheight1+3, fwidth2, beginnt, color);
} }
g_Font[SNeutrinoSettings::FONT_TYPE_EVENTLIST_ITEMSMALL]->RenderString(x+width-fwidth2-5- 20, ypos+ fheight1+3, fwidth2, duration_str, color, 0, true); // UTF-8 g_Font[SNeutrinoSettings::FONT_TYPE_EVENTLIST_ITEMSMALL]->RenderString(x+width-fwidth2-5- 20, ypos+ fheight1+3, fwidth2, duration_str, color, 0, true); // UTF-8
// 2nd line
// set status icons
CTimerd::CTimerEventTypes etype = isScheduled(channel_idI, &evtlist[curpos]);
icontype = etype == CTimerd::TIMER_ZAPTO ? NEUTRINO_ICON_ZAP : etype == CTimerd::TIMER_RECORD ? NEUTRINO_ICON_REC : 0;
int iw = 0, ih; int iw = 0, ih;
if(icontype != 0) { if(icontype != 0) {
frameBuffer->getIconSize(icontype, &iw, &ih); frameBuffer->getIconSize(icontype, &iw, &ih);
//frameBuffer->paintIcon(icontype, x+5, ypos + fheight - 16 - (fheight1 - 16)/2);
frameBuffer->paintIcon(icontype, x+5, ypos + fheight1+3 - (fheight1 - ih)/2, fheight1); frameBuffer->paintIcon(icontype, x+5, ypos + fheight1+3 - (fheight1 - ih)/2, fheight1);
} }
// 2nd line
g_Font[SNeutrinoSettings::FONT_TYPE_EVENTLIST_ITEMLARGE]->RenderString(x+10+iw, ypos+ fheight, width- 25- 20, evtlist[liststart+pos].description, color, 0, true); // detecting timer conflict and set start position of event text depending of possible painted icon
bool conflict = HasTimerConflicts(evtlist[curpos].startTime, evtlist[curpos].duration, &item_event_ID);
int i2w = 0, i2h;
//printf ("etype %d , conflicts %d -> %s, conflict event_ID %d -> current event_ID %d\n", etype, conflict, evtlist[curpos].description.c_str(), item_event_ID, evtlist[curpos].eventID);
//TODO: solution for zapto timer events
if (conflict && item_event_ID != evtlist[curpos].eventID)
{
//paint_warning = true;
frameBuffer->getIconSize(NEUTRINO_ICON_IMPORTANT, &i2w, &i2h);
frameBuffer->paintIcon(NEUTRINO_ICON_IMPORTANT, x+iw+7, ypos + fheight1+3 - (fheight1 - i2h)/2, fheight1);
iw += i2w+4;
}
// paint 2nd line text
g_Font[SNeutrinoSettings::FONT_TYPE_EVENTLIST_ITEMLARGE]->RenderString(x+10+iw, ypos+ fheight, width- 25- 20, evtlist[curpos].description, color, 0, true);
} }
} }
void EventList::paintHead(std::string _channelname, std::string _channelname_prev, std::string _channelname_next) void EventList::paintHead(std::string _channelname, std::string _channelname_prev, std::string _channelname_next)
@@ -1275,4 +1326,4 @@ int CEventFinderMenu::showMenu(void)
res = searchMenu.exec(NULL,""); res = searchMenu.exec(NULL,"");
return(res); return(res);
} }

View File

@@ -102,7 +102,8 @@ class EventList
int height, fh; int height, fh;
int x; int x;
int y; int y;
int sort_mode; int sort_mode;
event_id_t item_event_ID;
void paintItem(unsigned pos, t_channel_id channel_id = 0); void paintItem(unsigned pos, t_channel_id channel_id = 0);
void paint(t_channel_id channel_id = 0); void paint(t_channel_id channel_id = 0);
@@ -110,8 +111,14 @@ class EventList
void paintHead(std::string _channelname, std::string _channelname_prev, std::string _channelname_next); void paintHead(std::string _channelname, std::string _channelname_prev, std::string _channelname_next);
void hide(); void hide();
void showFunctionBar(bool show, t_channel_id channel_id); void showFunctionBar(bool show, t_channel_id channel_id);
int timerPre;
int timerPost;
void UpdateTimerList(void);
bool HasTimerConflicts(time_t starttime, time_t duration, event_id_t * epg_ID);
CTimerd::CTimerEventTypes isScheduled(t_channel_id channel_id, CChannelEvent * event, int * tID = NULL); CTimerd::CTimerEventTypes isScheduled(t_channel_id channel_id, CChannelEvent * event, int * tID = NULL);
public: public:
EventList(); EventList();
~EventList(); ~EventList();