From 54c9128b894dc3f09623b0c83a8994870e2e4281 Mon Sep 17 00:00:00 2001 From: FlatTV Date: Tue, 25 Oct 2016 18:17:29 +0200 Subject: [PATCH 01/37] CamMenu: add "no other CI channel" option to usable channels while recording Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/f790f6d05df932c92f0fe0e9ee8f64add3a1e67c Author: FlatTV Date: 2016-10-25 (Tue, 25 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- data/locale/deutsch.locale | 1 + data/locale/english.locale | 1 + src/gui/cam_menu.cpp | 3 ++- src/gui/channellist.cpp | 10 ++++++---- src/system/locals.h | 1 + src/system/locals_intern.h | 1 + 6 files changed, 12 insertions(+), 5 deletions(-) diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale index 97beeb96f..325b39feb 100644 --- a/data/locale/deutsch.locale +++ b/data/locale/deutsch.locale @@ -312,6 +312,7 @@ ci.inserted CAM im Slot ci.mode CI Kanäle während einer Aufnahme ci.mode_0 alle Kanäle ci.mode_1 gleicher Transponder +ci.mode_2 keine CI Kanäle ci.rec_zapto Umschalten bei Aufnahmen mit CAM ci.removed CAM entfernt -> Slot ci.reset Reset diff --git a/data/locale/english.locale b/data/locale/english.locale index 37f6eb128..26bffbd5a 100644 --- a/data/locale/english.locale +++ b/data/locale/english.locale @@ -312,6 +312,7 @@ ci.inserted CAM inserted in slot ci.mode Usable CI channel while recording ci.mode_0 all channels ci.mode_1 same transponder +ci.mode_2 no other CI channel ci.rec_zapto Zap when recording needs CAM ci.removed CAM removed from slot ci.reset Reset diff --git a/src/gui/cam_menu.cpp b/src/gui/cam_menu.cpp index 32b941047..109165b03 100644 --- a/src/gui/cam_menu.cpp +++ b/src/gui/cam_menu.cpp @@ -68,7 +68,8 @@ const CMenuOptionChooser::keyval OPTIONS_CA_INIT_OPTIONS[] = const CMenuOptionChooser::keyval OPTIONS_CI_MODE_OPTIONS[] = { { 0, LOCALE_CI_MODE_0 }, - { 1, LOCALE_CI_MODE_1 } + { 1, LOCALE_CI_MODE_1 }, + { 2, LOCALE_CI_MODE_2 } }; #define OPTIONS_CI_MODE_OPTION_COUNT (sizeof(OPTIONS_CI_MODE_OPTIONS)/sizeof(CMenuOptionChooser::keyval)) diff --git a/src/gui/channellist.cpp b/src/gui/channellist.cpp index 0fb5eeb3e..9d31576ee 100644 --- a/src/gui/channellist.cpp +++ b/src/gui/channellist.cpp @@ -2289,10 +2289,12 @@ bool CChannelList::SameTP(CZapitChannel * channel) if (IS_WEBTV(channel->getChannelID())) return true; - //NI - if(g_settings.ci_mode == 1) { - if(channel->bUseCI && CRecordManager::getInstance()->getUseCI()) - return (CRecordManager::getInstance()->SameTransponder(channel->getChannelID())); + //NI - Usable CI channel while recording + if(g_settings.ci_mode != 0 && channel->bUseCI && CRecordManager::getInstance()->getUseCI()) { + if(g_settings.ci_mode == 1) + return (CRecordManager::getInstance()->SameTransponder(channel->getChannelID())); // SameTransponder + else + return false; // No other CI channel } iscurrent = CFEManager::getInstance()->canTune(channel); diff --git a/src/system/locals.h b/src/system/locals.h index 4f9f86c42..855fd9343 100644 --- a/src/system/locals.h +++ b/src/system/locals.h @@ -339,6 +339,7 @@ typedef enum LOCALE_CI_MODE, LOCALE_CI_MODE_0, LOCALE_CI_MODE_1, + LOCALE_CI_MODE_2, LOCALE_CI_REC_ZAPTO, LOCALE_CI_REMOVED, LOCALE_CI_RESET, diff --git a/src/system/locals_intern.h b/src/system/locals_intern.h index efafae68e..6ac49c195 100644 --- a/src/system/locals_intern.h +++ b/src/system/locals_intern.h @@ -339,6 +339,7 @@ const char * locale_real_names[] = "ci.mode", "ci.mode_0", "ci.mode_1", + "ci.mode_2", "ci.rec_zapto", "ci.removed", "ci.reset", From 0fd68eb6a7df3e0756a5ee7c8eabe26cc6bff9fd Mon Sep 17 00:00:00 2001 From: FlatTV Date: Tue, 25 Oct 2016 18:05:02 +0200 Subject: [PATCH 02/37] don't execute ci "hack", if calling from movieplayer Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/a2193c9e447f1bb187d13aa32adc5ddf6b555759 Author: FlatTV Date: 2016-10-25 (Tue, 25 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/movieplayer.cpp | 3 +++ src/zapit/include/zapit/capmt.h | 12 ++++++++---- src/zapit/include/zapit/zapit.h | 1 + src/zapit/src/capmt.cpp | 12 ++++++++---- src/zapit/src/zapit.cpp | 5 +++++ 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/gui/movieplayer.cpp b/src/gui/movieplayer.cpp index 45b75e682..b1a8deb61 100644 --- a/src/gui/movieplayer.cpp +++ b/src/gui/movieplayer.cpp @@ -224,6 +224,9 @@ void CMoviePlayerGui::cutNeutrino() if (isUPNP) return; + //NI + CZapit::getInstance()->setMoviePlayer(true);// let CCamManager::SetMode know, the call is from MoviePlayer + g_Zapit->lockPlayBack(); //NI if (!isWebTV) //NI g_Sectionsd->setPauseScanning(true); diff --git a/src/zapit/include/zapit/capmt.h b/src/zapit/include/zapit/capmt.h index 8e5037316..fb029b99d 100644 --- a/src/zapit/include/zapit/capmt.h +++ b/src/zapit/include/zapit/capmt.h @@ -94,8 +94,10 @@ class CCamManager static CCamManager * manager; bool SetMode(t_channel_id id, enum runmode mode, bool enable, bool force_update = false); void StopCam(t_channel_id id, CCam *cam); - bool useCI; //NI - unsigned int rmode; //NI + //NI + bool mp; + bool useCI; + unsigned int rmode; enum ci_aktive { CI_OFF, CI_ON, @@ -111,8 +113,10 @@ class CCamManager void SetCITuner(int tuner); int GetCITuner(void) { return tunerno; }; void EnableChannelFilter(bool enable) { filter_channels = enable; }; - bool getUseCI() { return useCI; }; //NI - bool getChannelFilter() { return filter_channels; }; //NI + //NI + bool getUseCI() { return useCI; }; + bool getChannelFilter() { return filter_channels; }; + void enableMoviePlayer(bool enable) { mp = enable; }; }; #endif /* __capmt_h__ */ diff --git a/src/zapit/include/zapit/zapit.h b/src/zapit/include/zapit/zapit.h index d1f08fd70..907405ef7 100644 --- a/src/zapit/include/zapit/zapit.h +++ b/src/zapit/include/zapit/zapit.h @@ -275,5 +275,6 @@ class CZapit : public OpenThreads::Thread std::list *GetWebTVXML(void) { return webtv_xml; } //NI bool getUseChannelFilter(); + void setMoviePlayer(bool enable); }; #endif /* __zapit_h__ */ diff --git a/src/zapit/src/capmt.cpp b/src/zapit/src/capmt.cpp index 1b7c2138d..b604a8050 100644 --- a/src/zapit/src/capmt.cpp +++ b/src/zapit/src/capmt.cpp @@ -172,8 +172,10 @@ CCamManager::CCamManager() channel_map.clear(); tunerno = -1; filter_channels = false; - useCI = false; //NI - rmode = CI_OFF; //NI + //NI + useCI = false; + rmode = CI_OFF; + mp = false; } CCamManager::~CCamManager() @@ -283,11 +285,13 @@ bool CCamManager::SetMode(t_channel_id channel_id, enum runmode mode, bool start CZapitChannel * chan = CServiceManager::getInstance()->GetCurrentChannel(); INFO(" ##NI: GetCurrentChannel (%s)\n",chan->getName().c_str()); - //NI - this is a hack for rezaping to the recording channel - if((!mode || (mode && !chan->scrambled)) && (!start && rmode==CI_ON)){ + //NI - this is a hack for rezaping to the recording channe + //if commig from movieplayer, disable hack + if(!mp && ( (!mode || (mode && !chan->scrambled)) && (!start && rmode==CI_ON)) ){ INFO(" ##NI: HACK: disabling TS\n"); cCA::GetInstance()->SetTS(CA_DVBCI_TS_INPUT_DISABLED); } + mp = false; #endif } diff --git a/src/zapit/src/zapit.cpp b/src/zapit/src/zapit.cpp index a8286493c..dbe38c98e 100644 --- a/src/zapit/src/zapit.cpp +++ b/src/zapit/src/zapit.cpp @@ -2474,6 +2474,11 @@ bool CZapit::getUseChannelFilter() { return CCamManager::getInstance()->getChannelFilter(); } +//NI +void CZapit::setMoviePlayer(bool enable) +{ + CCamManager::getInstance()->enableMoviePlayer(enable); +} void CZapit::run() { From fe4f04cc08574e2ef5fd86a73c26ec479d5e337b Mon Sep 17 00:00:00 2001 From: vanhofen Date: Tue, 25 Oct 2016 22:40:50 +0200 Subject: [PATCH 03/37] followscreenings: don't show menu if just one event is found Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/56e668ae952f57e3b036083e5377e33a9670c416 Author: vanhofen Date: 2016-10-25 (Tue, 25 Oct 2016) Origin message was: ------------------ - followscreenings: don't show menu if just one event is found ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/followscreenings.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/gui/followscreenings.cpp b/src/gui/followscreenings.cpp index 292878930..f8a63edf0 100644 --- a/src/gui/followscreenings.cpp +++ b/src/gui/followscreenings.cpp @@ -87,14 +87,12 @@ int CFollowScreenings::exec(CMenuTarget* /*parent*/, const std::string & actionK if (i->eventType == CTimerd::TIMER_RECORD) { if (channel_id == i->channel_id && e->startTime == i->epg_starttime) { Timer.removeTimerEvent(i->eventID); -#if 0 - if (followlist.size() > 1) + if (!forwarders.empty()) forwarders[ix]->iconName_Info_right = ""; +#if 0 else ShowMsg(LOCALE_TIMER_EVENTREMOVED_TITLE, LOCALE_TIMER_EVENTREMOVED_MSG, CMessageBox::mbrBack, CMessageBox::mbBack, NEUTRINO_ICON_INFO); -#else - forwarders[ix]->iconName_Info_right = ""; #endif return menu_return::RETURN_REPAINT; } @@ -108,14 +106,12 @@ int CFollowScreenings::exec(CMenuTarget* /*parent*/, const std::string & actionK e->startTime, e->startTime - (ANNOUNCETIME + 120 ), apids, true, e->startTime - (ANNOUNCETIME + 120) > time(NULL), recDir, true) == -1) { //FIXME -- no error handling, but this shouldn't happen ... } else { -#if 0 - if (followlist.size() > 1) + if (!forwarders.empty()) forwarders[ix]->iconName_Info_right = NEUTRINO_ICON_REC; +#if 0 else ShowMsg(LOCALE_TIMER_EVENTRECORD_TITLE, LOCALE_TIMER_EVENTRECORD_MSG, CMessageBox::mbrBack, CMessageBox::mbBack, NEUTRINO_ICON_INFO); -#else - forwarders[ix]->iconName_Info_right = NEUTRINO_ICON_REC; #endif return menu_return::RETURN_REPAINT; } @@ -152,12 +148,10 @@ void CFollowScreenings::show() getFollowScreenings(); -#if 0 if (followlist.size() == 1) { snprintf(actionstr, sizeof(actionstr), "%lu", followlist.front().startTime); exec(NULL, actionstr); } else { -#endif CMenuWidget m(LOCALE_EPGVIEWER_SELECT_SCREENING, NEUTRINO_ICON_SETTINGS); const char *icon = NEUTRINO_ICON_BUTTON_RED; neutrino_msg_t directKey = CRCInput::RC_red; @@ -180,8 +174,6 @@ void CFollowScreenings::show() } m.enableSaveScreen(true); m.exec(NULL, ""); -#if 0 } -#endif } From 7d11d5508bf05f4d34bb4bb56dd4d5d9cee2aa6e Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Wed, 26 Oct 2016 09:20:12 +0200 Subject: [PATCH 04/37] CExtendedInput: Add saveScreen & restoreScreen() functions Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/f3960370780316de1a536c40202eea6f6846bcb7 Author: Michael Liebmann Date: 2016-10-26 (Wed, 26 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/widget/stringinput_ext.cpp | 38 +++++++++++++++++++++++++++++- src/gui/widget/stringinput_ext.h | 7 ++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/gui/widget/stringinput_ext.cpp b/src/gui/widget/stringinput_ext.cpp index 4b4923e00..a70187c54 100644 --- a/src/gui/widget/stringinput_ext.cpp +++ b/src/gui/widget/stringinput_ext.cpp @@ -92,6 +92,9 @@ void CExtendedInput::Init(void) x = getScreenStartX(width); y = getScreenStartY(height); + + savescreen = false; + background = NULL; } CExtendedInput::~CExtendedInput() @@ -136,6 +139,34 @@ void CExtendedInput::calculateDialog() y = getScreenStartY(height); } +void CExtendedInput::saveScreen() +{ + if(!savescreen) + return; + + delete[] background; + + background = new fb_pixel_t [width * height]; + if(background) + frameBuffer->SaveScreen(x, y, width, height, background); +} + +void CExtendedInput::restoreScreen() +{ + if(background) { + if(savescreen) + frameBuffer->RestoreScreen(x, y, width, height, background); + } +} + +void CExtendedInput::enableSaveScreen(bool enable) +{ + savescreen = enable; + if (!enable && background) { + delete[] background; + background = NULL; + } +} int CExtendedInput::exec( CMenuTarget* parent, const std::string & ) { @@ -151,6 +182,8 @@ int CExtendedInput::exec( CMenuTarget* parent, const std::string & ) std::string oldval = *valueString; std::string dispval = *valueString; + if (savescreen) + saveScreen(); paint(); frameBuffer->blit(); @@ -285,7 +318,10 @@ int CExtendedInput::exec( CMenuTarget* parent, const std::string & ) void CExtendedInput::hide() { - frameBuffer->paintBackgroundBoxRel(x, y, width, height); + if (savescreen && background) + restoreScreen(); + else + frameBuffer->paintBackgroundBoxRel(x, y, width, height); frameBuffer->blit(); } diff --git a/src/gui/widget/stringinput_ext.h b/src/gui/widget/stringinput_ext.h index af3e838fd..78440df27 100644 --- a/src/gui/widget/stringinput_ext.h +++ b/src/gui/widget/stringinput_ext.h @@ -70,6 +70,11 @@ class CExtendedInput : public CMenuTarget CChangeObserver* observ; bool* cancel; + fb_pixel_t *background; + bool savescreen; + void saveScreen(); + void restoreScreen(); + virtual void paint(); virtual void onBeforeExec(){}; virtual void onAfterExec(){}; @@ -85,6 +90,8 @@ class CExtendedInput : public CMenuTarget void calculateDialog(); void addInputField( CExtendedInput_Item* ); + + void enableSaveScreen(bool enable); }; From 3e6623f4de81622953166a2f710de5ceeb5f3b1d Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Wed, 26 Oct 2016 09:22:32 +0200 Subject: [PATCH 05/37] CTimerList: Use enableSaveScreen() for CIPInput Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/a13296954736d2cc8a8954d3466d33a767be5a5e Author: Michael Liebmann Date: 2016-10-26 (Wed, 26 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/timerlist.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/timerlist.cpp b/src/gui/timerlist.cpp index 70d603a02..7243933f9 100644 --- a/src/gui/timerlist.cpp +++ b/src/gui/timerlist.cpp @@ -296,6 +296,7 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) if(actionKey == "add_ip") { std::string remoteip; CIPInput remotebox_NetworkIP(LOCALE_REMOTEBOX_IP , &remoteip); + remotebox_NetworkIP.enableSaveScreen(true); if ((remotebox_NetworkIP.exec(NULL,"") == true) && (!remoteip.empty())) { remboxmenu->addItem(new CMenuForwarder(remoteip, true, NULL, this, "cha_ip")); remotebox_NetworkIP.hide(); @@ -321,6 +322,7 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) CMenuForwarder *f = static_cast(item); std::string remoteip = f->getName(); CIPInput remotebox_NetworkIP(LOCALE_REMOTEBOX_IP , &remoteip); + remotebox_NetworkIP.enableSaveScreen(true); if (remotebox_NetworkIP.exec(NULL,"") == true) { f->setName(remoteip); remotebox_NetworkIP.hide(); From 3472c4c80caee3a52568bfdab49883916a1738e7 Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Wed, 26 Oct 2016 13:46:04 +0200 Subject: [PATCH 06/37] CMenuWidget::saveScreen: Fix segfault Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/a3e0a0e91797be15cbce097857275cfcd90e8406 Author: Michael Liebmann Date: 2016-10-26 (Wed, 26 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/widget/menue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/widget/menue.cpp b/src/gui/widget/menue.cpp index 32533c863..3253c53d7 100644 --- a/src/gui/widget/menue.cpp +++ b/src/gui/widget/menue.cpp @@ -1389,7 +1389,7 @@ void CMenuWidget::saveScreen() delete[] background; - background = new fb_pixel_t [full_width * full_height]; + background = new fb_pixel_t [full_width * (full_height+fbutton_height)]; if(background) frameBuffer->SaveScreen(x /*-ConnectLineBox_Width*/, y, full_width, full_height + fbutton_height, background); } From 2c390c94e60ddb3983fd113e9a56fe5cbe19b253 Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Wed, 26 Oct 2016 13:50:43 +0200 Subject: [PATCH 07/37] remotetimer: Don't repaint timerlist when no changes to remote ip Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/4c8de6960ec1747d453f5e25979386ded18b3daf Author: Michael Liebmann Date: 2016-10-26 (Wed, 26 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/timerlist.cpp | 17 ++++++++++++----- src/gui/timerlist.h | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/gui/timerlist.cpp b/src/gui/timerlist.cpp index 7243933f9..c752f7039 100644 --- a/src/gui/timerlist.cpp +++ b/src/gui/timerlist.cpp @@ -300,6 +300,8 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) if ((remotebox_NetworkIP.exec(NULL,"") == true) && (!remoteip.empty())) { remboxmenu->addItem(new CMenuForwarder(remoteip, true, NULL, this, "cha_ip")); remotebox_NetworkIP.hide(); + remboxmenu->enableSaveScreen(false); + remboxmenu->hide(); changed = true; } return menu_return::RETURN_REPAINT; @@ -309,7 +311,8 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) bselected = remboxmenu->getSelected(); if (bselected >= item_offset) { remboxmenu->removeItem(bselected); - remboxmenu->hide(); + remboxmenu->enableSaveScreen(false); + remboxmenu->hide(); bselected = remboxmenu->getSelected(); changed = true; } @@ -326,6 +329,8 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) if (remotebox_NetworkIP.exec(NULL,"") == true) { f->setName(remoteip); remotebox_NetworkIP.hide(); + remboxmenu->enableSaveScreen(false); + remboxmenu->hide(); changed = true; } return menu_return::RETURN_REPAINT; @@ -905,8 +910,7 @@ int CTimerList::show() } else if (msg==CRCInput::RC_setup) { - enterRemoteBox(); - update=true; + update = enterRemoteBox(); } else if (msg==CRCInput::RC_yellow) { @@ -969,8 +973,9 @@ void CTimerList::hide() } } -void CTimerList::enterRemoteBox() +bool CTimerList::enterRemoteBox() { + bool ret = false; remboxmenu = new CMenuWidget(LOCALE_REMOTEBOX_HEAD, NEUTRINO_ICON_TIMER); remboxmenu->addKey(CRCInput::RC_red, this, "del_ip"); remboxmenu->addKey(CRCInput::RC_green, this, "add_ip"); @@ -984,8 +989,8 @@ void CTimerList::enterRemoteBox() remboxmenu->setFooter(RemoteBoxFooterButtons, RemoteBoxFooterButtonCount); + remboxmenu->enableSaveScreen(true); remboxmenu->exec(NULL, ""); - remboxmenu->hide(); if (changed) { g_settings.timer_remotebox_ip.clear(); for (int i = item_offset; i < remboxmenu->getItemsCount(); i++) { @@ -994,8 +999,10 @@ void CTimerList::enterRemoteBox() g_settings.timer_remotebox_ip.push_back(f->getName()); } changed = false; + ret = true; } delete remboxmenu; + return ret; } void CTimerList::paintItem(int pos) diff --git a/src/gui/timerlist.h b/src/gui/timerlist.h index 7a633cb7f..82b01c55f 100644 --- a/src/gui/timerlist.h +++ b/src/gui/timerlist.h @@ -86,7 +86,7 @@ class CTimerList : public CMenuTarget, public CListHelpers /* todo: properly import the enum CVFD::MODES */ int saved_dispmode; void remoteTimerList(CTimerd::TimerList &timerlist); - void enterRemoteBox(); + bool enterRemoteBox(); void select_remotebox_ip(); bool remoteChanExists(t_channel_id channel_id); bool localChanExists(t_channel_id channel_id); From d360e11bbcd69e9df4266c128b77d8d6dd736fd5 Mon Sep 17 00:00:00 2001 From: FlatTV Date: Wed, 7 Sep 2016 14:58:40 +0200 Subject: [PATCH 08/37] system/httptool: make timeouts flexible Signed-off-by: M. Liebmann Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/f62a3ada8b4fa39d43c7580ad47a5afff9e44f8f Author: FlatTV Date: 2016-09-07 (Wed, 07 Sep 2016) ------------------ This commit was generated by Migit --- src/system/httptool.cpp | 12 ++++++------ src/system/httptool.h | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/system/httptool.cpp b/src/system/httptool.cpp index 9f8aca4a4..2d023c124 100644 --- a/src/system/httptool.cpp +++ b/src/system/httptool.cpp @@ -66,7 +66,7 @@ int CHTTPTool::show_progress( void *clientp, double dltotal, double dlnow, doubl return 0; } //#define DEBUG -bool CHTTPTool::downloadFile(const std::string & URL, const char * const downloadTarget, int globalProgressEnd) +bool CHTTPTool::downloadFile(const std::string & URL, const char * const downloadTarget, int globalProgressEnd, int connecttimeout/*=10*/, int timeout/*=1800*/) { CURL *curl; CURLcode res; @@ -97,8 +97,8 @@ printf("url is %s\n", URL.c_str()); curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); curl_easy_setopt(curl, CURLOPT_USERAGENT, userAgent.c_str()); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, (long)1); - curl_easy_setopt(curl, CURLOPT_TIMEOUT, 1800); - curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, connecttimeout); curl_easy_setopt(curl, CURLOPT_FAILONERROR, true); #ifdef DEBUG curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); @@ -136,7 +136,7 @@ printf("download code %d\n", res); return res==CURLE_OK; } -std::string CHTTPTool::downloadString(const std::string & URL, int globalProgressEnd) +std::string CHTTPTool::downloadString(const std::string & URL, int globalProgressEnd, int connecttimeout/*=10*/, int timeout/*=1800*/) { CURL *curl; CURLcode res; @@ -161,8 +161,8 @@ printf("url is %s\n", URL.c_str()); curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); curl_easy_setopt(curl, CURLOPT_USERAGENT, userAgent.c_str()); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, (long)1); - curl_easy_setopt(curl, CURLOPT_TIMEOUT, 1800); - curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, connecttimeout); curl_easy_setopt(curl, CURLOPT_FAILONERROR, true); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); #ifdef DEBUG diff --git a/src/system/httptool.h b/src/system/httptool.h index 93a5f43c3..919cf4dbb 100644 --- a/src/system/httptool.h +++ b/src/system/httptool.h @@ -52,8 +52,8 @@ class CHTTPTool CHTTPTool(); void setStatusViewer( CProgressWindow* statusview ); - bool downloadFile( const std::string & URL, const char * const downloadTarget, int globalProgressEnd=-1 ); - std::string downloadString(const std::string & URL, int globalProgressEnd=-1 ); + bool downloadFile( const std::string & URL, const char * const downloadTarget, int globalProgressEnd=-1, int connecttimeout=10, int timeout=1800); + std::string downloadString(const std::string & URL, int globalProgressEnd=-1, int connecttimeout=10, int timeout=1800); }; From db7fc457eb7154c49af811a26c76a43f201d1ebe Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Wed, 26 Oct 2016 14:54:38 +0200 Subject: [PATCH 09/37] CTimerList: Set httpConnectTimeout for remote timer = 3 sec Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/4dceb70ce1f0c91ef19189db0ee98908d3658379 Author: Michael Liebmann Date: 2016-10-26 (Wed, 26 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/timerlist.cpp | 17 +++++++++-------- src/gui/timerlist.h | 1 + 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/gui/timerlist.cpp b/src/gui/timerlist.cpp index c752f7039..27172088a 100644 --- a/src/gui/timerlist.cpp +++ b/src/gui/timerlist.cpp @@ -278,6 +278,7 @@ CTimerList::CTimerList() Timer = new CTimerdClient(); timerNew_message = ""; timerNew_pluginName = ""; + httpConnectTimeout = 3; /* most probable default */ saved_dispmode = (int)CVFD::MODE_TVRADIO; @@ -369,7 +370,7 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) r_url += "&rs=on"; r_url += "&id=" + to_string((int)timerlist[selected].eventID); //printf("[remotetimer] url:%s\n",r_url.c_str()); - r_url = httpTool.downloadString(r_url); + r_url = httpTool.downloadString(r_url, -1, httpConnectTimeout); //printf("[remotetimer] status:%s\n",r_url.c_str()); } else { @@ -394,7 +395,7 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) r_url += "&aj=on"; r_url += "&rs=on"; //printf("[remotetimer] url:%s\n",r_url.c_str()); - r_url = httpTool.downloadString(r_url); + r_url = httpTool.downloadString(r_url, -1, httpConnectTimeout); //printf("[remotetimer] status:%s\n",r_url.c_str()); if (r_url=="ok") Timer->removeTimerEvent(timerlist[selected].eventID); @@ -430,7 +431,7 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) r_url += "&id=" + eventID; //printf("[remotetimer] url:%s\n",r_url.c_str()); if (res > 0) - r_url = httpTool.downloadString(r_url); + r_url = httpTool.downloadString(r_url, -1, httpConnectTimeout); //printf("[remotetimer] status:%s\n",r_url.c_str()); } else if (strcmp(key, "del_remotetimer") == 0) @@ -442,7 +443,7 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) r_url += "/control/timer?action=remove"; r_url += "&id=" + to_string((int)timerlist[selected].eventID); //printf("[remotetimer] url:%s\n",r_url.c_str()); - r_url = httpTool.downloadString(r_url); + r_url = httpTool.downloadString(r_url, -1, httpConnectTimeout); //printf("[remotetimer] status:%s\n",r_url.c_str()); } else if (strcmp(key, "update_remotetimer") == 0) @@ -459,7 +460,7 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) r_url += "&aj=on"; r_url += "&rs=on"; //printf("[remotetimer] url:%s\n",r_url.c_str()); - r_url = httpTool.downloadString(r_url); + r_url = httpTool.downloadString(r_url, -1, httpConnectTimeout); //printf("[remotetimer] status:%s\n",r_url.c_str()); } else if (strcmp(key, "newtimer") == 0) @@ -672,7 +673,7 @@ bool CTimerList::remoteChanExists(t_channel_id channel_id) r_url += timerlist[selected].remotebox_ip; r_url += "/control/getchannel?format=json&id="; r_url += string_printf_helper(PRINTF_CHANNEL_ID_TYPE_NO_LEADING_ZEROS, channel_id); - r_url = httpTool.downloadString(r_url); + r_url = httpTool.downloadString(r_url, -1, httpConnectTimeout); Json::Value root; Json::Reader reader; @@ -712,7 +713,7 @@ void CTimerList::remoteTimerList(CTimerd::TimerList &rtimerlist) r_url = "http://"; r_url += *it; r_url += "/control/timer?format=json"; - r_url = httpTool.downloadString(r_url); + r_url = httpTool.downloadString(r_url, -1, httpConnectTimeout); //printf("[remotetimer] timers:%s\n",r_url.c_str()); Json::Value root; @@ -1149,7 +1150,7 @@ void CTimerList::paintItem(int pos) r_url += std::string(timer.remotebox_ip); r_url += "/control/getchannel?format=json&id="; r_url += string_printf_helper(PRINTF_CHANNEL_ID_TYPE_NO_LEADING_ZEROS, timer.channel_id); - r_url = httpTool.downloadString(r_url); + r_url = httpTool.downloadString(r_url, -1, httpConnectTimeout); Json::Value root; Json::Reader reader; diff --git a/src/gui/timerlist.h b/src/gui/timerlist.h index 82b01c55f..329a7fe55 100644 --- a/src/gui/timerlist.h +++ b/src/gui/timerlist.h @@ -59,6 +59,7 @@ class CTimerList : public CMenuTarget, public CListHelpers int liststart; unsigned int listmaxshow; bool visible; + int httpConnectTimeout; CTimerdClient *Timer; CTimerd::TimerList timerlist; // List of timers From f83231ec06b3db3f2fe2ffed4a191e023f2df6b6 Mon Sep 17 00:00:00 2001 From: Jacek Jendrzej Date: Wed, 26 Oct 2016 18:31:44 +0200 Subject: [PATCH 10/37] src/gui/timerlist.cpp update timerlist after show epgview Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/48c596e2cae1336bee22ecd9dd8f8243c944f530 Author: Jacek Jendrzej Date: 2016-10-26 (Wed, 26 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/timerlist.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/gui/timerlist.cpp b/src/gui/timerlist.cpp index 27172088a..387371448 100644 --- a/src/gui/timerlist.cpp +++ b/src/gui/timerlist.cpp @@ -934,9 +934,10 @@ int CTimerList::show() if (timer->eventType == CTimerd::TIMER_RECORD || timer->eventType == CTimerd::TIMER_REMOTEBOX || timer->eventType == CTimerd::TIMER_ZAPTO) { hide(); - if (timer->epgID != 0) + if (timer->epgID != 0){ res = g_EpgData->show(timer->channel_id, timer->epgID, &timer->epg_starttime); - else + update=true; + }else ShowHint(LOCALE_MESSAGEBOX_INFO, LOCALE_EPGVIEWER_NOTFOUND); if (res==menu_return::RETURN_EXIT_ALL) loop=false; From eb3486ed025baa667fd3dbfe6d64984489e0f239 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Thu, 27 Oct 2016 11:02:18 +0200 Subject: [PATCH 11/37] textbox: fix lineBreakWidth calculation Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/99a9f8a7e586e5fddcc01c2ae2d3fe3bc039253c Author: vanhofen Date: 2016-10-27 (Thu, 27 Oct 2016) Origin message was: ------------------ - textbox: fix lineBreakWidth calculation ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/widget/textbox.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/gui/widget/textbox.cpp b/src/gui/widget/textbox.cpp index a4f719240..5091a2086 100644 --- a/src/gui/widget/textbox.cpp +++ b/src/gui/widget/textbox.cpp @@ -353,12 +353,13 @@ void CTextBox::refreshTextLineArray(void) m_cLineArray.clear(); m_nNrOfLines = 0; + int MaxWidth = m_nMaxWidth - m_cFrameScrollRel.iWidth - 2*text_Hborder_width; if( m_nMode & AUTO_WIDTH){ /* In case of autowidth, we calculate the max allowed width of the textbox */ - lineBreakWidth = m_nMaxWidth - m_cFrameScrollRel.iWidth - 2*text_Hborder_width; + lineBreakWidth = MaxWidth; }else{ /* If not autowidth, we just take the actuall textframe width */ - lineBreakWidth = std::max(m_nMaxWidth, m_cFrameTextRel.iWidth - 2*text_Hborder_width); + lineBreakWidth = std::max(MaxWidth, m_cFrameTextRel.iWidth - 2*text_Hborder_width); } if(m_nMaxTextWidth) From 7fed1697310b0f35c4d2d11829885f2a5740cb4e Mon Sep 17 00:00:00 2001 From: Jacek Jendrzej Date: Thu, 27 Oct 2016 17:06:12 +0200 Subject: [PATCH 12/37] src/gui/widget/menue.cpp fix segfault if items is empty Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/83976f40b41dc55af9b0670d5c02f067c5177077 Author: Jacek Jendrzej Date: 2016-10-27 (Thu, 27 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/widget/menue.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gui/widget/menue.cpp b/src/gui/widget/menue.cpp index 3253c53d7..c80a8ebb4 100644 --- a/src/gui/widget/menue.cpp +++ b/src/gui/widget/menue.cpp @@ -891,9 +891,11 @@ int CMenuWidget::exec(CMenuTarget* parent, const std::string &) pos -= dir * items.size(); wrap = true; } - if (pos >= (int)items.size()) + if (!items.empty() && pos >= (int)items.size()) pos = (int)items.size() - 1; do { + if(items.empty()) + break; CMenuItem* item = items[pos]; if (item->isSelectable()) { if (pos < page_start[current_page + 1] && pos >= page_start[current_page]) { From d2ec61edf3c85d0b85b46f2c3ccc3378b9baa19d Mon Sep 17 00:00:00 2001 From: Jacek Jendrzej Date: Thu, 27 Oct 2016 18:56:13 +0200 Subject: [PATCH 13/37] src/gui/eventlist.cpp supplement to 8da554c0fa63b95d60cbf76edf0ff3c05b7bd770, fix chanel_id in search-mode Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/a71c71edcccb1a96c8b871c88b11f6a5409fad2b Author: Jacek Jendrzej Date: 2016-10-27 (Thu, 27 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/eventlist.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/eventlist.cpp b/src/gui/eventlist.cpp index ddb63f8cb..1fcb9fab6 100644 --- a/src/gui/eventlist.cpp +++ b/src/gui/eventlist.cpp @@ -481,7 +481,7 @@ int CEventList::exec(const t_channel_id channel_id, const std::string& channelna t_channel_id used_id = IS_WEBTV(channel_id) ? channel_id : evtlist[selected].channelID; if (!recDir.empty() && doRecord) //add/remove recording timer events and check/warn for conflicts { - CFollowScreenings m(channel_id, + CFollowScreenings m(used_id, evtlist[selected].startTime, evtlist[selected].startTime + evtlist[selected].duration, evtlist[selected].description, evtlist[selected].eventID, TIMERD_APIDS_CONF, true, "", &evtlist); From 56ba19313d723be9332c680ae73689c61ac637a0 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Thu, 27 Oct 2016 23:11:43 +0200 Subject: [PATCH 14/37] cc_item_picture: fix wrong operator in width calculation Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/874f54af4b58db012097d909899872c06b32ea6e Author: vanhofen Date: 2016-10-27 (Thu, 27 Oct 2016) Origin message was: ------------------ - cc_item_picture: fix wrong operator in width calculation ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/components/cc_item_picture.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/components/cc_item_picture.cpp b/src/gui/components/cc_item_picture.cpp index 1fd538ac5..89ffaed86 100644 --- a/src/gui/components/cc_item_picture.cpp +++ b/src/gui/components/cc_item_picture.cpp @@ -224,7 +224,7 @@ void CComponentsPicture::initCCItem() width = GetWidth4FB_HW_ACC(x+fr_thickness, width-2*fr_thickness)+2*fr_thickness; #endif } - if (keep_dy_aspect & dx){ + if (keep_dy_aspect && dx){ float w_ratio = float(width)*100/(float)dx; height = int(w_ratio*(float)dy/100); } From 4b91651de8e5cf73d6aa9af012fc8edcf2656fc5 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Fri, 28 Oct 2016 09:55:40 +0200 Subject: [PATCH 15/37] textbox: fix box width in round corners mode Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/002277fb5f3d8901eee375d8899b653e1ea7d121 Author: vanhofen Date: 2016-10-28 (Fri, 28 Oct 2016) Origin message was: ------------------ - textbox: fix box width in round corners mode ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/widget/textbox.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/widget/textbox.cpp b/src/gui/widget/textbox.cpp index 5091a2086..7120b7a16 100644 --- a/src/gui/widget/textbox.cpp +++ b/src/gui/widget/textbox.cpp @@ -587,7 +587,7 @@ void CTextBox::refreshText(void) //bg variables int ax = m_cFrameTextRel.iX+m_cFrame.iX; int ay = m_cFrameTextRel.iY+m_cFrame.iY; - int dx = m_old_cText != m_cText || m_nNrOfPages>1 ? m_cFrameTextRel.iWidth : m_nMaxTextWidth; + int dx = m_old_cText != m_cText || m_nNrOfPages>1 ? m_cFrameTextRel.iWidth : m_nMaxTextWidth - m_nBgRadius; int dy = m_cFrameTextRel.iHeight; //avoid artefacts in transparent cornes From d2ab0e9ce5a34135fb4c5c7c674602d6758b68e4 Mon Sep 17 00:00:00 2001 From: Jacek Jendrzej Date: Fri, 28 Oct 2016 20:50:52 +0200 Subject: [PATCH 16/37] src/gui/osd_setup.cpp try to fix segfault, call from channellist Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/682b6f578e321abff15d77624b8399ee2f86c756 Author: Jacek Jendrzej Date: 2016-10-28 (Fri, 28 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/osd_setup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/osd_setup.cpp b/src/gui/osd_setup.cpp index 414c6fe00..8a5f85d59 100644 --- a/src/gui/osd_setup.cpp +++ b/src/gui/osd_setup.cpp @@ -1389,7 +1389,7 @@ int COsdSetup::showContextChanlistMenu(CChannelList *parent_channellist) CMenuWidget * menu_chanlist = new CMenuWidget(LOCALE_MAINMENU_SETTINGS, NEUTRINO_ICON_SETTINGS, width); //using native callback to ensure stop header clock in parent channellist before paint this menu window - if (parent_channellist && g_settings.menu_pos == CMenuWidget::MENU_POS_TOP_RIGHT) + if (parent_channellist) menu_chanlist->OnBeforePaint.connect(sigc::mem_fun(parent_channellist->getHeaderObject()->getClockObject(), &CComponentsFrmClock::block)); menu_chanlist->enableSaveScreen(true); From 0e87207cabf38422c22ba84426cd36f8b7dc1da8 Mon Sep 17 00:00:00 2001 From: TangoCash Date: Fri, 28 Oct 2016 22:17:41 +0200 Subject: [PATCH 17/37] add possibility to add Name,Url,Port, Username and Password if needed. Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/3776340268df676c8d0ad22bb1f93e1ed8512145 Author: TangoCash Date: 2016-10-28 (Fri, 28 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- data/locale/deutsch.locale | 6 +- data/locale/english.locale | 6 +- lib/timerdclient/timerdtypes.h | 2 +- src/gui/timerlist.cpp | 149 ++++++++++++++++++++++----------- src/gui/timerlist.h | 12 +-- src/neutrino.cpp | 45 +++++++--- src/system/locals.h | 6 +- src/system/locals_intern.h | 6 +- src/system/settings.h | 11 ++- 9 files changed, 173 insertions(+), 70 deletions(-) diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale index dc2a2c1b6..cac819112 100644 --- a/data/locale/deutsch.locale +++ b/data/locale/deutsch.locale @@ -2100,8 +2100,12 @@ remotebox_add hinzufügen remotebox_channel_na Kanal auf Remote-Box nicht verfügbar remotebox_del löschen remotebox_head Remote-Boxen -remotebox_ip Remote-Box IP remotebox_mod bearbeiten +remotebox_user Benutzer +remotebox_pass Passwort +remotebox_port Port +remotebox_rbaddr Adresse +remotebox_rbname Anzeigename reset_all Werkseinstellungen und Reboot reset_channels Lösche Kanäle reset_confirm Sind Sie sich sicher? diff --git a/data/locale/english.locale b/data/locale/english.locale index 220663cbe..c2b581deb 100644 --- a/data/locale/english.locale +++ b/data/locale/english.locale @@ -2100,8 +2100,12 @@ remotebox_add add remotebox_channel_na Channel not available on Remote-Box remotebox_del delete remotebox_head Remote-Boxes -remotebox_ip Remote-Box IP remotebox_mod modify +remotebox_user User +remotebox_pass Password +remotebox_port Port +remotebox_rbaddr Address +remotebox_rbname Screenname reset_all Factory reset and reboot reset_channels Delete all channels reset_confirm Are you sure ? diff --git a/lib/timerdclient/timerdtypes.h b/lib/timerdclient/timerdtypes.h index 040094c1e..76294f409 100644 --- a/lib/timerdclient/timerdtypes.h +++ b/lib/timerdclient/timerdtypes.h @@ -162,7 +162,7 @@ class CTimerd char pluginName[EXEC_PLUGIN_NAME_MAXLEN]; //only filled if applicable char recordingDir[RECORD_DIR_MAXLEN]; //only filled if applicable char epgTitle[EPG_TITLE_MAXLEN]; //only filled if applicable - char remotebox_ip[16]; + char remotebox_name[25]; int rem_pre; int rem_post; diff --git a/src/gui/timerlist.cpp b/src/gui/timerlist.cpp index 387371448..556a5030b 100644 --- a/src/gui/timerlist.cpp +++ b/src/gui/timerlist.cpp @@ -295,14 +295,36 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) const char * key = actionKey.c_str(); if(actionKey == "add_ip") { - std::string remoteip; - CIPInput remotebox_NetworkIP(LOCALE_REMOTEBOX_IP , &remoteip); - remotebox_NetworkIP.enableSaveScreen(true); - if ((remotebox_NetworkIP.exec(NULL,"") == true) && (!remoteip.empty())) { - remboxmenu->addItem(new CMenuForwarder(remoteip, true, NULL, this, "cha_ip")); - remotebox_NetworkIP.hide(); + std::string rbname,rbaddress,user,pass = ""; + std::string port = "80"; + CKeyboardInput remotebox_name(LOCALE_REMOTEBOX_RBNAME , &rbname, 25); + CKeyboardInput remotebox_address(LOCALE_REMOTEBOX_RBADDR , &rbaddress, 50); + CStringInput remotebox_port(LOCALE_REMOTEBOX_PORT , &port, 5); + CKeyboardInput remotebox_user(LOCALE_REMOTEBOX_USER , &user, 15); + CKeyboardInput remotebox_pass(LOCALE_REMOTEBOX_PASS , &pass, 15); + CMenuWidget * rbsetup = new CMenuWidget(LOCALE_REMOTEBOX_HEAD, NEUTRINO_ICON_TIMER); + rbsetup->addItem(new CMenuForwarder(LOCALE_REMOTEBOX_RBNAME, true, rbname, &remotebox_name)); + rbsetup->addItem(new CMenuForwarder(LOCALE_REMOTEBOX_RBADDR, true, rbaddress, &remotebox_address)); + rbsetup->addItem(new CMenuForwarder(LOCALE_REMOTEBOX_PORT, true, port, &remotebox_port)); + rbsetup->addItem(new CMenuForwarder(LOCALE_REMOTEBOX_USER, true, user, &remotebox_user)); + rbsetup->addItem(new CMenuForwarder(LOCALE_REMOTEBOX_PASS, true, pass, &remotebox_pass)); + rbsetup->enableSaveScreen(true); + if ((rbsetup->exec(NULL,"") == true) && (!rbaddress.empty())) { + remboxmenu->addItem(new CMenuForwarder(rbname, true, NULL, this, "cha_ip")); + rbsetup->hide(); remboxmenu->enableSaveScreen(false); remboxmenu->hide(); + timer_remotebox_item timer_rb; + timer_rb.rbaddress = rbaddress; + if (!timer_rb.rbaddress.empty()) { + timer_rb.port = atoi(port); + timer_rb.user = user; + timer_rb.pass = pass; + timer_rb.rbname = rbname; + if (timer_rb.rbname.empty()) + timer_rb.rbname = timer_rb.rbaddress; + g_settings.timer_remotebox_ip.push_back(timer_rb); + } changed = true; } return menu_return::RETURN_REPAINT; @@ -324,12 +346,25 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) bselected = remboxmenu->getSelected(); CMenuItem* item = remboxmenu->getItem(bselected); CMenuForwarder *f = static_cast(item); - std::string remoteip = f->getName(); - CIPInput remotebox_NetworkIP(LOCALE_REMOTEBOX_IP , &remoteip); - remotebox_NetworkIP.enableSaveScreen(true); - if (remotebox_NetworkIP.exec(NULL,"") == true) { - f->setName(remoteip); - remotebox_NetworkIP.hide(); + std::vector::iterator it = g_settings.timer_remotebox_ip.begin(); + std::advance(it,bselected-item_offset); + std::string port = to_string(it->port); + CKeyboardInput remotebox_name(LOCALE_REMOTEBOX_RBNAME , &it->rbname, 25); + CKeyboardInput remotebox_address(LOCALE_REMOTEBOX_RBADDR , &it->rbaddress, 50); + CStringInput remotebox_port(LOCALE_REMOTEBOX_PORT , &port, 5); + CKeyboardInput remotebox_user(LOCALE_REMOTEBOX_USER , &it->user, 15); + CKeyboardInput remotebox_pass(LOCALE_REMOTEBOX_PASS , &it->pass, 15); + CMenuWidget * rbsetup = new CMenuWidget(LOCALE_REMOTEBOX_HEAD, NEUTRINO_ICON_TIMER); + rbsetup->addItem(new CMenuForwarder(LOCALE_REMOTEBOX_RBNAME, true, it->rbname, &remotebox_name)); + rbsetup->addItem(new CMenuForwarder(LOCALE_REMOTEBOX_RBADDR, true, it->rbaddress, &remotebox_address)); + rbsetup->addItem(new CMenuForwarder(LOCALE_REMOTEBOX_PORT, true, port, &remotebox_port)); + rbsetup->addItem(new CMenuForwarder(LOCALE_REMOTEBOX_USER, true, it->user, &remotebox_user)); + rbsetup->addItem(new CMenuForwarder(LOCALE_REMOTEBOX_PASS, true, it->pass, &remotebox_pass)); + rbsetup->enableSaveScreen(true); + if ((rbsetup->exec(NULL,"") == true) && (!it->rbaddress.empty())) { + it->port = atoi(port); + f->setName(it->rbname); + rbsetup->hide(); remboxmenu->enableSaveScreen(false); remboxmenu->hide(); changed = true; @@ -360,7 +395,7 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) CHTTPTool httpTool; std::string r_url; r_url = "http://"; - r_url += timerlist[selected].remotebox_ip; + r_url += RemoteBoxConnectUrl(timerlist[selected].remotebox_name); r_url += "/control/timer?action=new&update=1"; r_url += "&alarm=" + to_string((int)timerlist[selected].alarmTime); r_url += "&stop=" + to_string((int)timerlist[selected].stopTime); @@ -381,12 +416,12 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) } return menu_return::RETURN_EXIT; } - else if ((strcmp(key, "send_remotetimer") == 0) && remoteChanExists(timerlist[selected].channel_id)) + else if ((strcmp(key, "send_remotetimer") == 0) && RemoteBoxChanExists(timerlist[selected].channel_id)) { CHTTPTool httpTool; std::string r_url; r_url = "http://"; - r_url += timerlist[selected].remotebox_ip; + r_url += RemoteBoxConnectUrl(timerlist[selected].remotebox_name); r_url += "/control/timer?action=new"; r_url += "&alarm=" + to_string((int)timerlist[selected].alarmTime + timerlist[selected].rem_pre); r_url += "&stop=" + to_string((int)timerlist[selected].stopTime - timerlist[selected].rem_post); @@ -400,11 +435,11 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) if (r_url=="ok") Timer->removeTimerEvent(timerlist[selected].eventID); } - else if ((strcmp(key, "fetch_remotetimer") == 0) && localChanExists(timerlist[selected].channel_id)) + else if ((strcmp(key, "fetch_remotetimer") == 0) && LocalBoxChanExists(timerlist[selected].channel_id)) { int pre,post; Timer->getRecordingSafety(pre,post); - std::string remotebox_ip = timerlist[selected].remotebox_ip; + std::string remotebox_name = timerlist[selected].remotebox_name; std::string eventID = to_string((int)timerlist[selected].eventID); int res = Timer->addRecordTimerEvent(timerlist[selected].channel_id, timerlist[selected].alarmTime + pre, @@ -426,7 +461,7 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) CHTTPTool httpTool; std::string r_url; r_url = "http://"; - r_url += remotebox_ip; + r_url += RemoteBoxConnectUrl(remotebox_name); r_url += "/control/timer?action=remove"; r_url += "&id=" + eventID; //printf("[remotetimer] url:%s\n",r_url.c_str()); @@ -439,7 +474,7 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) CHTTPTool httpTool; std::string r_url; r_url = "http://"; - r_url += timerlist[selected].remotebox_ip; + r_url += RemoteBoxConnectUrl(timerlist[selected].remotebox_name); r_url += "/control/timer?action=remove"; r_url += "&id=" + to_string((int)timerlist[selected].eventID); //printf("[remotetimer] url:%s\n",r_url.c_str()); @@ -451,7 +486,7 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) CHTTPTool httpTool; std::string r_url; r_url = "http://"; - r_url += timerlist[selected].remotebox_ip; + r_url += RemoteBoxConnectUrl(timerlist[selected].remotebox_name); r_url += "/control/timer?action=new&update=1"; r_url += "&alarm=" + to_string((int)timerlist[selected].alarmTime); r_url += "&stop=" + to_string((int)timerlist[selected].stopTime); @@ -609,7 +644,7 @@ void CTimerList::updateEvents(void) { timerlist.clear(); Timer->getTimerList (timerlist); - remoteTimerList (timerlist); + RemoteBoxTimerList (timerlist); sort(timerlist.begin(), timerlist.end()); theight = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->getHeight(); @@ -640,37 +675,37 @@ void CTimerList::updateEvents(void) y = getScreenStartY(height); } -void CTimerList::select_remotebox_ip() +void CTimerList::RemoteBoxSelect() { int select = 0; CMenuWidget *m = new CMenuWidget(LOCALE_REMOTEBOX_HEAD, NEUTRINO_ICON_TIMER); CMenuSelectorTarget * selector = new CMenuSelectorTarget(&select); - for (std::list::iterator it = g_settings.timer_remotebox_ip.begin(); it != g_settings.timer_remotebox_ip.end(); ++it) - m->addItem(new CMenuForwarder(*it, true, NULL, selector, to_string(std::distance(g_settings.timer_remotebox_ip.begin(),it)).c_str())); + for (std::vector::iterator it = g_settings.timer_remotebox_ip.begin(); it != g_settings.timer_remotebox_ip.end(); ++it) + m->addItem(new CMenuForwarder(it->rbname, true, NULL, selector, to_string(std::distance(g_settings.timer_remotebox_ip.begin(),it)).c_str())); m->exec(NULL, ""); delete selector; - std::list::iterator it = g_settings.timer_remotebox_ip.begin(); + std::vector::iterator it = g_settings.timer_remotebox_ip.begin(); std::advance(it,select); - if (askUserOnRemoteTimerConflict(timerlist[selected].announceTime, timerlist[selected].stopTime, (char*) it->c_str())) + if (askUserOnRemoteTimerConflict(timerlist[selected].announceTime, timerlist[selected].stopTime, (char*) it->rbname.c_str())) { - strncpy(timerlist[selected].remotebox_ip,it->c_str(),sizeof(timerlist[selected].remotebox_ip)); - timerlist[selected].remotebox_ip[sizeof(timerlist[selected].remotebox_ip) - 1] = 0; + strncpy(timerlist[selected].remotebox_name,it->rbname.c_str(),sizeof(timerlist[selected].remotebox_name)); + timerlist[selected].remotebox_name[sizeof(timerlist[selected].remotebox_name) - 1] = 0; } } -bool CTimerList::remoteChanExists(t_channel_id channel_id) +bool CTimerList::RemoteBoxChanExists(t_channel_id channel_id) { - if (strcmp(timerlist[selected].remotebox_ip,"") == 0) + if (strcmp(timerlist[selected].remotebox_name,"") == 0) return false; CHTTPTool httpTool; std::string r_url; r_url = "http://"; - r_url += timerlist[selected].remotebox_ip; + r_url += RemoteBoxConnectUrl(timerlist[selected].remotebox_name); r_url += "/control/getchannel?format=json&id="; r_url += string_printf_helper(PRINTF_CHANNEL_ID_TYPE_NO_LEADING_ZEROS, channel_id); r_url = httpTool.downloadString(r_url, -1, httpConnectTimeout); @@ -692,7 +727,7 @@ bool CTimerList::remoteChanExists(t_channel_id channel_id) return (r_url == "true"); } -bool CTimerList::localChanExists(t_channel_id channel_id) +bool CTimerList::LocalBoxChanExists(t_channel_id channel_id) { CZapitChannel * channel = CServiceManager::getInstance()->FindChannel(channel_id); if (channel) @@ -701,17 +736,33 @@ bool CTimerList::localChanExists(t_channel_id channel_id) return false; } -void CTimerList::remoteTimerList(CTimerd::TimerList &rtimerlist) +std::string CTimerList::RemoteBoxConnectUrl(std::string _rbname) +{ + std::string c_url = ""; + for (std::vector::iterator it = g_settings.timer_remotebox_ip.begin(); + it != g_settings.timer_remotebox_ip.end(); ++it) { + if (it->rbname == _rbname) { + if (!it->user.empty() && !it->pass.empty()) + c_url += it->user + ":" + it->pass +"@"; + c_url += it->rbaddress; + c_url += ":" + to_string(it->port); + break; + } + } + return c_url; +} + +void CTimerList::RemoteBoxTimerList(CTimerd::TimerList &rtimerlist) { if (g_settings.timer_remotebox_ip.size() == 0) return; CHTTPTool httpTool; std::string r_url; - for (std::list::iterator it = g_settings.timer_remotebox_ip.begin(); + for (std::vector::iterator it = g_settings.timer_remotebox_ip.begin(); it != g_settings.timer_remotebox_ip.end(); ++it) { r_url = "http://"; - r_url += *it; + r_url += RemoteBoxConnectUrl(it->rbname); r_url += "/control/timer?format=json"; r_url = httpTool.downloadString(r_url, -1, httpConnectTimeout); //printf("[remotetimer] timers:%s\n",r_url.c_str()); @@ -735,8 +786,8 @@ void CTimerList::remoteTimerList(CTimerd::TimerList &rtimerlist) for (unsigned int i= 0; ic_str(),sizeof(rtimer.remotebox_ip)); - rtimer.remotebox_ip[sizeof(rtimer.remotebox_ip) - 1] = 0; + strncpy(rtimer.remotebox_name,it->rbname.c_str(),sizeof(rtimer.remotebox_name)); + rtimer.remotebox_name[sizeof(rtimer.remotebox_name) - 1] = 0; rtimer.rem_pre = rem_pre; rtimer.rem_post = rem_post; rtimer.eventID = atoi(remotetimers[i].get("id","").asString()); @@ -845,7 +896,7 @@ int CTimerList::show() else if ((msg == CRCInput::RC_play) && !(timerlist.empty()) && (g_settings.timer_remotebox_ip.size() > 0)) { if (timerlist[selected].eventType == CTimerd::TIMER_RECORD ) { - select_remotebox_ip(); + RemoteBoxSelect(); if (exec(this,"send_remotetimer")) { res=menu_return::RETURN_EXIT_ALL; @@ -911,7 +962,7 @@ int CTimerList::show() } else if (msg==CRCInput::RC_setup) { - update = enterRemoteBox(); + update = RemoteBoxSetup(); } else if (msg==CRCInput::RC_yellow) { @@ -975,7 +1026,7 @@ void CTimerList::hide() } } -bool CTimerList::enterRemoteBox() +bool CTimerList::RemoteBoxSetup() { bool ret = false; remboxmenu = new CMenuWidget(LOCALE_REMOTEBOX_HEAD, NEUTRINO_ICON_TIMER); @@ -985,20 +1036,24 @@ bool CTimerList::enterRemoteBox() remboxmenu->addIntroItems(); item_offset = remboxmenu->getItemsCount(); - for (std::list::iterator it = g_settings.timer_remotebox_ip.begin(); + for (std::vector::iterator it = g_settings.timer_remotebox_ip.begin(); it != g_settings.timer_remotebox_ip.end(); ++it) - remboxmenu->addItem(new CMenuForwarder(*it, true, NULL, this, "cha_ip")); + remboxmenu->addItem(new CMenuForwarder(it->rbname, true, NULL, this, "cha_ip")); remboxmenu->setFooter(RemoteBoxFooterButtons, RemoteBoxFooterButtonCount); remboxmenu->enableSaveScreen(true); remboxmenu->exec(NULL, ""); if (changed) { + std::vector old_timer_remotebox_ip = g_settings.timer_remotebox_ip; g_settings.timer_remotebox_ip.clear(); for (int i = item_offset; i < remboxmenu->getItemsCount(); i++) { CMenuItem *item = remboxmenu->getItem(i); CMenuForwarder *f = static_cast(item); - g_settings.timer_remotebox_ip.push_back(f->getName()); + for (std::vector::iterator it = old_timer_remotebox_ip.begin(); + it != old_timer_remotebox_ip.end(); ++it) + if (it->rbname == f->getName()) { + g_settings.timer_remotebox_ip.push_back(*it);} } changed = false; ret = true; @@ -1066,7 +1121,7 @@ void CTimerList::paintItem(int pos) sprintf(srepeatcount,"%ux",timer.repeatCount); g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(x+fw*13+(real_width-fw*23)/2,ypos+fheight, (real_width-fw*13)/2-5, srepeatcount, color, fheight); } - std::string t_type = (timer.eventType == CTimerd::TIMER_REMOTEBOX) ? std::string(convertTimerType2String(timer.eventType)) + " (" + std::string(timer.remotebox_ip) + ")" : convertTimerType2String(timer.eventType); + std::string t_type = (timer.eventType == CTimerd::TIMER_REMOTEBOX) ? std::string(convertTimerType2String(timer.eventType)) + " (" + std::string(timer.remotebox_name) + ")" : convertTimerType2String(timer.eventType); g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(x+fw*13+(real_width-fw*13)/2,ypos+fheight, (real_width-fw*13)/2-5, t_type, color, fheight); // paint rec icon when recording in progress @@ -1148,7 +1203,7 @@ void CTimerList::paintItem(int pos) CHTTPTool httpTool; std::string r_url; r_url = "http://"; - r_url += std::string(timer.remotebox_ip); + r_url += RemoteBoxConnectUrl(timer.remotebox_name); r_url += "/control/getchannel?format=json&id="; r_url += string_printf_helper(PRINTF_CHANNEL_ID_TYPE_NO_LEADING_ZEROS, timer.channel_id); r_url = httpTool.downloadString(r_url, -1, httpConnectTimeout); @@ -1680,7 +1735,7 @@ int CTimerList::newTimer() return ret; } -bool CTimerList::askUserOnRemoteTimerConflict(time_t announceTime, time_t stopTime, char * remotebox_ip) +bool CTimerList::askUserOnRemoteTimerConflict(time_t announceTime, time_t stopTime, char * remotebox_name) { CTimerd::TimerList overlappingTimers; int pre,post; @@ -1690,7 +1745,7 @@ bool CTimerList::askUserOnRemoteTimerConflict(time_t announceTime, time_t stopTi it != timerlist.end();++it) { - if (strcmp(it->remotebox_ip,remotebox_ip) == 0) { + if (strcmp(it->remotebox_name,remotebox_name) == 0) { if(it->stopTime != 0 && stopTime != 0) { diff --git a/src/gui/timerlist.h b/src/gui/timerlist.h index 329a7fe55..32f2500ff 100644 --- a/src/gui/timerlist.h +++ b/src/gui/timerlist.h @@ -41,6 +41,7 @@ #include #include +#include class CTimerdClient; @@ -86,11 +87,12 @@ class CTimerList : public CMenuTarget, public CListHelpers int newTimer(); /* todo: properly import the enum CVFD::MODES */ int saved_dispmode; - void remoteTimerList(CTimerd::TimerList &timerlist); - bool enterRemoteBox(); - void select_remotebox_ip(); - bool remoteChanExists(t_channel_id channel_id); - bool localChanExists(t_channel_id channel_id); + void RemoteBoxTimerList(CTimerd::TimerList &timerlist); + bool RemoteBoxSetup(); + void RemoteBoxSelect(); + std::string RemoteBoxConnectUrl(std::string _rbname); + bool RemoteBoxChanExists(t_channel_id channel_id); + bool LocalBoxChanExists(t_channel_id channel_id); int rem_pre,rem_post; int item_offset; bool changed; diff --git a/src/neutrino.cpp b/src/neutrino.cpp index 07187bda3..a82795d94 100644 --- a/src/neutrino.cpp +++ b/src/neutrino.cpp @@ -459,14 +459,26 @@ int CNeutrinoApp::loadSetup(const char * fname) g_settings.sleeptimer_min = configfile.getInt32("sleeptimer_min", 0); g_settings.timer_remotebox_ip.clear(); - int timer_remotebox_ip_count = configfile.getInt32("timer_remotebox_ip_count", 0); - if (timer_remotebox_ip_count) { - for (int i = 0; i < timer_remotebox_ip_count; i++) { - std::string k = "timer_remotebox_ip_" + to_string(i); - std::string timer_remotebox_ip = configfile.getString(k, ""); - if (timer_remotebox_ip.empty()) + int timer_remotebox_itemcount = configfile.getInt32("timer_remotebox_ip_count", 0); + if (timer_remotebox_itemcount) { + for (int i = 0; i < timer_remotebox_itemcount; i++) { + timer_remotebox_item timer_rb; + std::string k; + k = "timer_remotebox_ip_" + to_string(i); + timer_rb.rbaddress = configfile.getString(k, ""); + if (timer_rb.rbaddress.empty()) continue; - g_settings.timer_remotebox_ip.push_back(timer_remotebox_ip); + k = "timer_remotebox_port_" + to_string(i); + timer_rb.port = configfile.getInt32(k, 80); + k = "timer_remotebox_user_" + to_string(i); + timer_rb.user = configfile.getString(k, ""); + k = "timer_remotebox_pass_" + to_string(i); + timer_rb.pass = configfile.getString(k, ""); + k = "timer_remotebox_rbname_" + to_string(i); + timer_rb.rbname = configfile.getString(k, ""); + if (timer_rb.rbname.empty()) + timer_rb.rbname = timer_rb.rbaddress; + g_settings.timer_remotebox_ip.push_back(timer_rb); } } @@ -1056,11 +1068,20 @@ void CNeutrinoApp::saveSetup(const char * fname) configfile.setInt32("shutdown_min" , g_settings.shutdown_min ); configfile.setInt32("sleeptimer_min", g_settings.sleeptimer_min); - int timer_remotebox_ip_count = 0; - for (std::list::iterator it = g_settings.timer_remotebox_ip.begin(); it != g_settings.timer_remotebox_ip.end(); ++it) { - std::string k = "timer_remotebox_ip_" + to_string(timer_remotebox_ip_count); - configfile.setString(k, *it); - timer_remotebox_ip_count++; + int timer_remotebox_itemcount = 0; + for (std::vector::iterator it = g_settings.timer_remotebox_ip.begin(); it != g_settings.timer_remotebox_ip.end(); ++it) { + std::string k; + k = "timer_remotebox_ip_" + to_string(timer_remotebox_itemcount); + configfile.setString(k, it->rbaddress); + k = "timer_remotebox_rbname_" + to_string(timer_remotebox_itemcount); + configfile.setString(k, it->rbname); + k = "timer_remotebox_user_" + to_string(timer_remotebox_itemcount); + configfile.setString(k, it->user); + k = "timer_remotebox_pass_" + to_string(timer_remotebox_itemcount); + configfile.setString(k, it->pass); + k = "timer_remotebox_port_" + to_string(timer_remotebox_itemcount); + configfile.setInt32(k, it->port); + timer_remotebox_itemcount++; } configfile.setInt32 ( "timer_remotebox_ip_count", g_settings.timer_remotebox_ip.size()); diff --git a/src/system/locals.h b/src/system/locals.h index f94923248..b705a9f65 100644 --- a/src/system/locals.h +++ b/src/system/locals.h @@ -2127,8 +2127,12 @@ typedef enum LOCALE_REMOTEBOX_CHANNEL_NA, LOCALE_REMOTEBOX_DEL, LOCALE_REMOTEBOX_HEAD, - LOCALE_REMOTEBOX_IP, LOCALE_REMOTEBOX_MOD, + LOCALE_REMOTEBOX_USER, + LOCALE_REMOTEBOX_PASS, + LOCALE_REMOTEBOX_PORT, + LOCALE_REMOTEBOX_RBADDR, + LOCALE_REMOTEBOX_RBNAME, LOCALE_RESET_ALL, LOCALE_RESET_CHANNELS, LOCALE_RESET_CONFIRM, diff --git a/src/system/locals_intern.h b/src/system/locals_intern.h index 482e7d875..b0e4ade50 100644 --- a/src/system/locals_intern.h +++ b/src/system/locals_intern.h @@ -2127,8 +2127,12 @@ const char * locale_real_names[] = "remotebox_channel_na", "remotebox_del", "remotebox_head", - "remotebox_ip", "remotebox_mod", + "remotebox_user", + "remotebox_pass", + "remotebox_port", + "remotebox_rbaddr", + "remotebox_rbname", "reset_all", "reset_channels", "reset_confirm", diff --git a/src/system/settings.h b/src/system/settings.h index 6744aaaae..60f322cbf 100644 --- a/src/system/settings.h +++ b/src/system/settings.h @@ -145,6 +145,15 @@ struct SNeutrinoTheme unsigned char clock_Digit_blue; }; +struct timer_remotebox_item +{ + unsigned int port; + std::string user; + std::string pass; + std::string rbname; + std::string rbaddress; +}; + struct SNeutrinoSettings { std::string version_pseudo; @@ -450,7 +459,7 @@ struct SNeutrinoSettings int recording_slow_warning; int recording_startstop_msg; int shutdown_timer_record_type; - std::list timer_remotebox_ip; + std::vector timer_remotebox_ip; std::string recording_filename_template; int recording_already_found_check; From af1670252d8008a2c8be1a4b4fa40c3d370d8acc Mon Sep 17 00:00:00 2001 From: vanhofen Date: Sat, 29 Oct 2016 10:00:25 +0200 Subject: [PATCH 18/37] textbox: add member to get background-radius Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/3f28e50c843d437039baffbdf5916ae300793bd0 Author: vanhofen Date: 2016-10-29 (Sat, 29 Oct 2016) Origin message was: ------------------ - textbox: add member to get background-radius ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/widget/textbox.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/widget/textbox.h b/src/gui/widget/textbox.h index cb5f26a24..d2213db78 100644 --- a/src/gui/widget/textbox.h +++ b/src/gui/widget/textbox.h @@ -204,6 +204,7 @@ class CTextBox : public sigc::trackable inline int getLines(void) {return(m_nNrOfLines);}; inline int getLinesPerPage(void) {return m_nLinesPerPage;}; inline int getPages(void) {return(m_nNrOfPages);}; + inline int getBackGroundRadius(void) {return(m_nBgRadius);}; inline void movePosition(int x, int y) {m_cFrame.iX = x; m_cFrame.iY = y;}; int getFontTextHeight(); inline int getTextMode() {return m_nMode;}; From ced4fd201e6b7c59ef05b37114d2ec52688cfec7 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Sat, 29 Oct 2016 10:01:24 +0200 Subject: [PATCH 19/37] listframe: add some needed get-members Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/f7f76b0dd98580af7bf810565f2c4f5d2080bbfc Author: vanhofen Date: 2016-10-29 (Sat, 29 Oct 2016) Origin message was: ------------------ - listframe: add some needed get-members ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/widget/listframe.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/widget/listframe.h b/src/gui/widget/listframe.h index 95c3b53e3..97fc72ca9 100644 --- a/src/gui/widget/listframe.h +++ b/src/gui/widget/listframe.h @@ -152,6 +152,9 @@ class CListFrame inline CBox getWindowsPos(void) {return(m_cFrame);}; inline int getSelectedLine(void) {return(m_nSelectedLine);}; +inline int getSelectedLineRel(void) {return(m_nSelectedLine - m_nLinesPerPage*m_nCurrentPage);}; +inline int getTitleHeight(void) {return(m_cFrameTitleRel.iHeight);}; +inline int getHeaderListHeight(void) {return(m_cFrameHeaderListRel.iHeight);}; inline int getLines(void) {return(m_nNrOfLines);}; inline int getPages(void) {return(m_nNrOfPages);}; inline void showSelection(bool show) {m_showSelection = show;refreshLine(m_nSelectedLine);}; From dded0065cb18491b6991973b9be0aad07507cbd3 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Sat, 29 Oct 2016 10:02:07 +0200 Subject: [PATCH 20/37] moviebrowser: allow channellist-design in moviebrowser Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/142ae901b0b44ac062c84e47d120888d72752068 Author: vanhofen Date: 2016-10-29 (Sat, 29 Oct 2016) Origin message was: ------------------ - moviebrowser: allow channellist-design in moviebrowser ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- data/locale/deutsch.locale | 1 + data/locale/english.locale | 1 + src/gui/moviebrowser/mb.cpp | 542 +++++++++++++++++++++++--------- src/gui/moviebrowser/mb.h | 28 +- src/gui/moviebrowser/mb_types.h | 7 +- src/system/locals.h | 1 + src/system/locals_intern.h | 1 + 7 files changed, 415 insertions(+), 166 deletions(-) diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale index cac819112..c873db44a 100644 --- a/data/locale/deutsch.locale +++ b/data/locale/deutsch.locale @@ -1634,6 +1634,7 @@ moviebrowser.book_position Position: moviebrowser.book_type Sprung (<0 zurück, >0 vor): moviebrowser.book_type_backward Wiederholung moviebrowser.book_type_forward Überspringen +moviebrowser.browser_additional Zusätzliche Informationen moviebrowser.browser_frame_high Anzeigehöhe oberes Fenster [%] moviebrowser.browser_row_head Spalten Einstellungen moviebrowser.browser_row_item Spalteninfo diff --git a/data/locale/english.locale b/data/locale/english.locale index c2b581deb..9fc0c5efb 100644 --- a/data/locale/english.locale +++ b/data/locale/english.locale @@ -1634,6 +1634,7 @@ moviebrowser.book_position Position: moviebrowser.book_type Jump (<0 back , >0 for): moviebrowser.book_type_backward Repeat moviebrowser.book_type_forward jump over +moviebrowser.browser_additional Additional informations moviebrowser.browser_frame_high Browser height [%] moviebrowser.browser_row_head Row settings moviebrowser.browser_row_item Row item diff --git a/src/gui/moviebrowser/mb.cpp b/src/gui/moviebrowser/mb.cpp index 452463f25..06592472f 100644 --- a/src/gui/moviebrowser/mb.cpp +++ b/src/gui/moviebrowser/mb.cpp @@ -255,11 +255,14 @@ CMovieBrowser::~CMovieBrowser() clearListLines(); - if (CChannelLogo) - delete CChannelLogo; + if (m_detailsLine) + delete m_detailsLine; - if (pic) - delete pic; + if (m_channelLogo) + delete m_channelLogo; + + if (m_movieCover) + delete m_movieCover; } void CMovieBrowser::clearListLines() @@ -324,9 +327,9 @@ void CMovieBrowser::init(void) m_pcBrowser = NULL; m_pcLastPlay = NULL; m_pcLastRecord = NULL; - m_pcInfo = NULL; + m_pcInfo1 = NULL; + m_pcInfo2 = NULL; m_pcFilter = NULL; - pic = NULL; m_windowFocus = MB_FOCUS_BROWSER; m_textTitle = g_Locale->getText(LOCALE_MOVIEBROWSER_HEAD); @@ -406,7 +409,10 @@ void CMovieBrowser::init(void) filelist_it = filelist.end(); movielist.clear(); - CChannelLogo = NULL; + m_detailsLine = NULL; + m_channelLogo = NULL; + m_movieCover = NULL; + old_EpgId = 0; m_doRefresh = false; m_doLoadMovies = false; @@ -470,6 +476,8 @@ void CMovieBrowser::initGlobalSettings(void) m_settings.browserRowWidth[7] = m_defaultRowWidth[m_settings.browserRowItem[7]]; m_settings.browserRowWidth[8] = m_defaultRowWidth[m_settings.browserRowItem[8]]; + m_settings.browserAdditional = 0; + m_settings.ts_only = 1; m_settings.ytmode = cYTFeedParser::MOST_POPULAR; m_settings.ytorderby = cYTFeedParser::ORDERBY_PUBLISHED; @@ -503,33 +511,42 @@ void CMovieBrowser::initFrames(void) m_cBoxFrameBrowserList.iX = m_cBoxFrame.iX; m_cBoxFrameBrowserList.iY = m_cBoxFrame.iY + m_cBoxFrameTitleRel.iHeight; - m_cBoxFrameBrowserList.iWidth = m_cBoxFrame.iWidth; + if (m_settings.browserAdditional) + m_cBoxFrameBrowserList.iWidth = m_cBoxFrame.iWidth / 3 * 2; + else + m_cBoxFrameBrowserList.iWidth = m_cBoxFrame.iWidth; m_cBoxFrameBrowserList.iHeight = m_cBoxFrame.iHeight * m_settings.browserFrameHeight / 100; - m_cBoxFrameFootRel.iX = 0; + + m_cBoxFrameFootRel.iX = m_cBoxFrameBrowserList.iX; m_cBoxFrameFootRel.iHeight = refreshFoot(false); - m_cBoxFrameFootRel.iY = m_cBoxFrame.iHeight - m_cBoxFrameFootRel.iHeight; - m_cBoxFrameFootRel.iWidth = m_cBoxFrameBrowserList.iWidth; + m_cBoxFrameFootRel.iY = m_cBoxFrameBrowserList.iY + m_cBoxFrameBrowserList.iHeight; + m_cBoxFrameFootRel.iWidth = m_cBoxFrame.iWidth; m_cBoxFrameLastPlayList.iX = m_cBoxFrameBrowserList.iX; m_cBoxFrameLastPlayList.iY = m_cBoxFrameBrowserList.iY ; - m_cBoxFrameLastPlayList.iWidth = (m_cBoxFrameBrowserList.iWidth>>1) - (OFFSET_INTER>>1); + m_cBoxFrameLastPlayList.iWidth = m_cBoxFrame.iWidth / 2; m_cBoxFrameLastPlayList.iHeight = m_cBoxFrameBrowserList.iHeight; - m_cBoxFrameLastRecordList.iX = m_cBoxFrameLastPlayList.iX + m_cBoxFrameLastPlayList.iWidth + OFFSET_INTER; + m_cBoxFrameLastRecordList.iX = m_cBoxFrameLastPlayList.iX + m_cBoxFrameLastPlayList.iWidth; m_cBoxFrameLastRecordList.iY = m_cBoxFrameLastPlayList.iY; - m_cBoxFrameLastRecordList.iWidth = m_cBoxFrame.iWidth - m_cBoxFrameLastPlayList.iWidth - OFFSET_INTER; + m_cBoxFrameLastRecordList.iWidth = m_cBoxFrame.iWidth - m_cBoxFrameLastPlayList.iWidth; m_cBoxFrameLastRecordList.iHeight = m_cBoxFrameLastPlayList.iHeight; - m_cBoxFrameInfo.iX = m_cBoxFrameBrowserList.iX; - m_cBoxFrameInfo.iY = m_cBoxFrameBrowserList.iY + m_cBoxFrameBrowserList.iHeight + OFFSET_INTER; - m_cBoxFrameInfo.iWidth = m_cBoxFrameBrowserList.iWidth; - m_cBoxFrameInfo.iHeight = m_cBoxFrame.iHeight - m_cBoxFrameBrowserList.iHeight - OFFSET_INTER - m_cBoxFrameFootRel.iHeight - m_cBoxFrameTitleRel.iHeight; + m_cBoxFrameInfo1.iX = m_cBoxFrameBrowserList.iX; + m_cBoxFrameInfo1.iY = m_cBoxFrameFootRel.iY + m_cBoxFrameFootRel.iHeight + OFFSET_INTER; + m_cBoxFrameInfo1.iWidth = m_cBoxFrame.iWidth; + m_cBoxFrameInfo1.iHeight = m_cBoxFrame.iHeight - m_cBoxFrameBrowserList.iHeight - OFFSET_INTER - m_cBoxFrameFootRel.iHeight - m_cBoxFrameTitleRel.iHeight; - m_cBoxFrameFilter.iX = m_cBoxFrameInfo.iX; - m_cBoxFrameFilter.iY = m_cBoxFrameInfo.iY; - m_cBoxFrameFilter.iWidth = m_cBoxFrameInfo.iWidth; - m_cBoxFrameFilter.iHeight = m_cBoxFrameInfo.iHeight; + m_cBoxFrameInfo2.iX = m_cBoxFrameBrowserList.iX + m_cBoxFrameBrowserList.iWidth; + m_cBoxFrameInfo2.iY = m_cBoxFrameBrowserList.iY; + m_cBoxFrameInfo2.iWidth = m_cBoxFrame.iWidth - m_cBoxFrameBrowserList.iWidth; + m_cBoxFrameInfo2.iHeight = m_cBoxFrameBrowserList.iHeight; + + m_cBoxFrameFilter.iX = m_cBoxFrameBrowserList.iX; + m_cBoxFrameFilter.iY = m_cBoxFrameBrowserList.iY; + m_cBoxFrameFilter.iWidth = m_cBoxFrameBrowserList.iWidth; + m_cBoxFrameFilter.iHeight = m_cBoxFrameBrowserList.iHeight; } void CMovieBrowser::initRows(void) @@ -614,6 +631,8 @@ bool CMovieBrowser::loadSettings(MB_SETTINGS* settings) settings->browserRowItem[i] = (MB_INFO_ITEM)configfile.getInt32("mb_browserRowItem_" + to_string(i), MB_INFO_MAX_NUMBER); settings->browserRowWidth[i] = configfile.getInt32("mb_browserRowWidth_" + to_string(i), 50); } + settings->browserAdditional = configfile.getInt32("mb_browserAdditional", 0); + settings->ytmode = configfile.getInt32("mb_ytmode", cYTFeedParser::MOST_POPULAR); settings->ytorderby = configfile.getInt32("mb_ytorderby", cYTFeedParser::ORDERBY_PUBLISHED); settings->ytresults = configfile.getInt32("mb_ytresults", 10); @@ -679,6 +698,8 @@ bool CMovieBrowser::saveSettings(MB_SETTINGS* settings) configfile.setInt32("mb_browserRowItem_" + to_string(i), settings->browserRowItem[i]); configfile.setInt32("mb_browserRowWidth_" + to_string(i), settings->browserRowWidth[i]); } + configfile.setInt32("mb_browserAdditional", settings->browserAdditional); + configfile.setInt32("mb_ytmode", settings->ytmode); configfile.setInt32("mb_ytorderby", settings->ytorderby); configfile.setInt32("mb_ytresults", settings->ytresults); @@ -1049,9 +1070,10 @@ int CMovieBrowser::exec(const char* path) void CMovieBrowser::hide(void) { //TRACE("[mb]->%s\n", __func__); - if (CChannelLogo){ - delete CChannelLogo; - CChannelLogo = NULL; + if (m_channelLogo) + { + delete m_channelLogo; + m_channelLogo = NULL; } old_EpgId = 0; framebuffer->paintBackground(); @@ -1078,8 +1100,10 @@ void CMovieBrowser::hide(void) delete m_pcLastRecord; m_pcLastRecord = NULL; - delete m_pcInfo; - m_pcInfo = NULL; + delete m_pcInfo1; + m_pcInfo1 = NULL; + delete m_pcInfo2; + m_pcInfo2 = NULL; } int CMovieBrowser::paint(void) @@ -1103,20 +1127,23 @@ int CMovieBrowser::paint(void) m_pcFilter = new CListFrame(&m_FilterLines, font, CListFrame::SCROLL | CListFrame::TITLE, &m_cBoxFrameFilter, g_Locale->getText(LOCALE_MOVIEBROWSER_HEAD_FILTER), g_Font[SNeutrinoSettings::FONT_TYPE_MOVIEBROWSER_HEAD]); - m_pcInfo = new CTextBox(" ", g_Font[SNeutrinoSettings::FONT_TYPE_MOVIEBROWSER_INFO], CTextBox::TOP | CTextBox::SCROLL, &m_cBoxFrameInfo); + m_pcInfo1 = new CTextBox(" ", g_Font[SNeutrinoSettings::FONT_TYPE_MOVIEBROWSER_INFO], CTextBox::TOP | CTextBox::SCROLL, &m_cBoxFrameInfo1); + m_pcInfo2 = new CTextBox(" ", g_Font[SNeutrinoSettings::FONT_TYPE_MOVIEBROWSER_INFO], CTextBox::TOP | CTextBox::SCROLL, &m_cBoxFrameInfo2); if (m_pcBrowser == NULL || m_pcLastPlay == NULL || - m_pcLastRecord == NULL || m_pcInfo == NULL || m_pcFilter == NULL) + m_pcLastRecord == NULL || m_pcInfo1 == NULL || m_pcInfo2 == NULL || m_pcFilter == NULL) { TRACE("[mb] paint, ERROR: not enought memory to allocate windows"); if (m_pcFilter != NULL)delete m_pcFilter; if (m_pcBrowser != NULL)delete m_pcBrowser; if (m_pcLastPlay != NULL) delete m_pcLastPlay; if (m_pcLastRecord != NULL)delete m_pcLastRecord; - if (m_pcInfo != NULL) delete m_pcInfo; + if (m_pcInfo1 != NULL) delete m_pcInfo1; + if (m_pcInfo2 != NULL) delete m_pcInfo2; - m_pcInfo = NULL; + m_pcInfo1 = NULL; + m_pcInfo2 = NULL; m_pcLastPlay = NULL; m_pcLastRecord = NULL; m_pcBrowser = NULL; @@ -1125,6 +1152,12 @@ int CMovieBrowser::paint(void) return (false); } + m_pcInfo1->setBackGroundColor(COL_MENUCONTENTDARK_PLUS_0); + m_pcInfo1->setTextColor(COL_MENUCONTENTDARK_TEXT); + m_pcInfo1->setBackGroundRadius(RADIUS_LARGE); + //m_pcInfo1->setTextBorderWidth(OFFSET_INNER_MID, OFFSET_INNER_SMALL); + m_pcInfo2->setTextBorderWidth(OFFSET_INNER_MID, OFFSET_INNER_SMALL); + clearSelection(); if (m_file_info_stale == true) { loadMovies(); @@ -1170,7 +1203,7 @@ void CMovieBrowser::refresh(void) m_pcLastPlay->refresh(); if (m_pcLastRecord != NULL && m_showLastRecordFiles == true) m_pcLastRecord->refresh(); - if (m_pcInfo != NULL && m_showMovieInfo == true) + if (m_pcInfo1 != NULL && m_pcInfo2 != NULL && m_showMovieInfo == true) refreshMovieInfo(); if (m_pcFilter != NULL && m_showFilter == true) m_pcFilter->refresh(); @@ -1242,113 +1275,261 @@ std::string CMovieBrowser::getScreenshotName(std::string movie, bool is_dir) return ""; } +void CMovieBrowser::refreshChannelLogo(void) +{ + TRACE("[mb]->%s:%d\n", __func__, __LINE__); + + int w_logo_max = m_cBoxFrameTitleRel.iWidth / 4; + short pb_hdd_offset = 100 + OFFSET_INNER_MID; + + if (show_mode == MB_SHOW_YT) + pb_hdd_offset = 0; + + if (m_channelLogo && (old_EpgId != m_movieSelectionHandler->epgId >> 16)) + { + if (newHeader) + m_channelLogo->clearFbData(); // reset logo screen data + else + m_channelLogo->hide(); + delete m_channelLogo; + m_channelLogo = NULL; + } + + if (old_EpgId != m_movieSelectionHandler->epgId >> 16) + { + if (m_channelLogo == NULL) + m_channelLogo = new CComponentsChannelLogoScalable(0, 0, m_movieSelectionHandler->channelName, m_movieSelectionHandler->epgId >>16); //TODO: add logo into header as item + old_EpgId = m_movieSelectionHandler->epgId >> 16; + } + + if (m_channelLogo && m_channelLogo->hasLogo()) + { + // scale image if required, TODO: move into an own handler, eg. header, so channel logo should be paint in header object + int h_logo = m_channelLogo->getHeight(); + if (h_logo > m_cBoxFrameTitleRel.iHeight) + { + uint8_t ratio = m_cBoxFrameTitleRel.iHeight*100/h_logo; + m_channelLogo->setHeight(m_cBoxFrameTitleRel.iHeight); + int w_logo = ratio*m_channelLogo->getWidth()/100; + m_channelLogo->setWidth(min(w_logo, w_logo_max)); + } + + int x = m_cBoxFrame.iX + m_cBoxFrameTitleRel.iX + m_cBoxFrameTitleRel.iWidth - m_channelLogo->getWidth() - OFFSET_INNER_MID; + int y = m_cBoxFrame.iY + m_cBoxFrameTitleRel.iY + (m_cBoxFrameTitleRel.iHeight - m_channelLogo->getHeight())/2; + m_channelLogo->setXPos(x - pb_hdd_offset); + m_channelLogo->setYPos(y); + m_channelLogo->hide(); + m_channelLogo->paint(); + newHeader = false; + } +} + +void CMovieBrowser::initMovieCover(void) +{ + TRACE("[mb]->%s:%d\n", __func__, __LINE__); + + CBox movieCoverBox; + + int cover_w = 0; + int cover_h = 0; + + if (m_windowFocus == MB_FOCUS_BROWSER && m_settings.browserAdditional) + { + movieCoverBox = m_cBoxFrameInfo2; + + // we have to align cover to box width + cover_w = movieCoverBox.iWidth - 2*OFFSET_INNER_MID - OFFSET_SHADOW; + + TRACE("[mb]->%s:%d m_windowFocus == MB_FOCUS_BROWSER\n", __func__, __LINE__); + + } + else + { + movieCoverBox = m_cBoxFrameInfo1; + + // we have to align cover to box height + cover_h = movieCoverBox.iHeight - 2*OFFSET_INNER_MID - OFFSET_SHADOW; + + TRACE("[mb]->%s:%d m_windowFocus != MB_FOCUS_BROWSER\n", __func__, __LINE__); + + } + + std::string cover_file; + if (show_mode == MB_SHOW_YT) + { + cover_file = m_movieSelectionHandler->tfile; + } + else + { + cover_file = getScreenshotName(m_movieSelectionHandler->file.Name, S_ISDIR(m_movieSelectionHandler->file.Mode)); + if ((cover_file.empty()) && (m_movieSelectionHandler->file.Name.length() > 18)) + { + std::string cover = m_movieSelectionHandler->file.Name; + cover.replace((cover.length()-18), 15, ""); //covername without yyyymmdd_hhmmss + cover_file = getScreenshotName(cover); + } + } + + bool got_cover = !cover_file.empty(); + + if (m_movieCover) + { + if (m_movieCover->getPictureName() != cover_file || !got_cover) + { + delete m_movieCover; + m_movieCover = NULL; + } + } + + if (m_settings.gui != MB_GUI_FILTER && got_cover) + { + if (m_movieCover == NULL) + { + m_movieCover = new CComponentsPicture(0, 0, cover_file, NULL, CC_SHADOW_ON, COL_MENUCONTENTDARK_PLUS_0); + + m_movieCover->enableFrame(true, 1); + m_movieCover->doPaintBg(false); + } + +TRACE("[mb]->%s:%d m_windowFocus: %d\n", __func__, __LINE__, m_windowFocus); + + // always align positions and dimensions + if (m_windowFocus == MB_FOCUS_BROWSER && m_settings.browserAdditional) + { + if (m_movieCover->getWidth() < m_movieCover->getHeight()) + cover_w /= 2; // cover is upright, so we use just half width first + + m_movieCover->setHeight(0); // force recalculation + m_movieCover->setWidth(cover_w, true); + if (m_movieCover->getHeight() > movieCoverBox.iHeight/3) + m_movieCover->setHeight(movieCoverBox.iHeight/3, true); // use maximal one third of box height + + m_movieCover->setXPos(movieCoverBox.iX + (movieCoverBox.iWidth - m_movieCover->getWidth())/2); + m_movieCover->setYPos(movieCoverBox.iY + OFFSET_INNER_MID); + } + else + { + m_movieCover->setWidth(0); // force recalculation +TRACE("[mb]->%s:%d m_movieCover->getWidth(): %d\n", __func__, __LINE__, m_movieCover->getWidth()); + m_movieCover->setHeight(cover_h, true); + + m_movieCover->setXPos(movieCoverBox.iX + movieCoverBox.iWidth - m_movieCover->getWidth() - 2*OFFSET_INNER_MID - OFFSET_SHADOW); + m_movieCover->setYPos(movieCoverBox.iY + (movieCoverBox.iHeight - m_movieCover->getHeight())/2); + } + + if (!m_movieSelectionHandler->epgInfo2.empty()) + { + if (m_pcInfo1->OnAfterScrollPage.empty()) + { + //m_movieCover->enableCache(); + m_pcInfo1->OnAfterScrollPage.connect(sigc::mem_fun(m_movieCover, &CComponentsPicture::paint0)); + } + } + } +} + +void CMovieBrowser::refreshMovieCover(void) +{ + TRACE("[mb]->%s:%d\n", __func__, __LINE__); + + if (m_movieCover) + m_movieCover->paint(CC_SAVE_SCREEN_NO); +} + void CMovieBrowser::refreshMovieInfo(void) { TRACE("[mb]->%s m_vMovieInfo.size %d\n", __func__, m_vMovieInfo.size()); - //reset text before new init, m_pcInfo must be clean + + hideDetailsLine(); + + //reset text before new init, m_pcInfo1 must be clean std::string emptytext = " "; - m_pcInfo->setText(&emptytext); + m_pcInfo1->setText(&emptytext); + if (m_windowFocus == MB_FOCUS_BROWSER && m_settings.browserAdditional) + { + m_pcInfo1->setTextFont(g_Font[SNeutrinoSettings::FONT_TYPE_MOVIEBROWSER_LIST]); + + m_pcInfo2->setWindowMaxDimensions(m_cBoxFrameInfo2.iWidth, m_cBoxFrameInfo2.iHeight); + m_pcInfo2->setWindowMinDimensions(m_cBoxFrameInfo2.iWidth, m_cBoxFrameInfo2.iHeight); + m_pcInfo2->movePosition(m_cBoxFrameInfo2.iX, m_cBoxFrameInfo2.iY); + m_pcInfo2->setText(&emptytext); + } + else + m_pcInfo1->setTextFont(g_Font[SNeutrinoSettings::FONT_TYPE_MOVIEBROWSER_INFO]); + if (m_vMovieInfo.empty() || m_movieSelectionHandler == NULL) return; - std::string fname; - if (show_mode == MB_SHOW_YT) { - fname = m_movieSelectionHandler->tfile; - } else { - fname = getScreenshotName(m_movieSelectionHandler->file.Name, S_ISDIR(m_movieSelectionHandler->file.Mode)); - if ((fname.empty()) && (m_movieSelectionHandler->file.Name.length() > 18)) { - std::string cover = m_movieSelectionHandler->file.Name; - cover.replace((cover.length()-18),15,""); //covername without yyyymmdd_hhmmss - fname = getScreenshotName(cover); - } - } - bool logo_ok = (!fname.empty()); - int flogo_w = 0, flogo_h = 0; - if (logo_ok) { - flogo_w = (int)(((float)16 / (float)9) * (float)m_cBoxFrameInfo.iHeight); - flogo_h = m_cBoxFrameInfo.iHeight*90/100; + refreshChannelLogo(); + + initMovieCover(); + int cover_x_offset = 0; + int cover_y_offset = 0; + if (m_movieCover) + { + cover_x_offset = m_movieCover->getWidth(); + cover_y_offset = m_movieCover->getHeight(); + if (cover_x_offset) + cover_x_offset += 2*OFFSET_INNER_MID; + if (cover_y_offset) + cover_y_offset += 2*OFFSET_INNER_MID; } -// static int logo_w = 0; -// static int logo_h = 0; - int logo_w_max = m_cBoxFrameTitleRel.iWidth / 4; - - //printf("refreshMovieInfo: EpgId %llx id %llx y %d\n", m_movieSelectionHandler->epgId, m_movieSelectionHandler->channelId, m_cBoxFrameTitleRel.iY); - int lx = 0;//never read m_cBoxFrame.iX+m_cBoxFrameTitleRel.iX+m_cBoxFrameTitleRel.iWidth-logo_w-10; - int ly = 0;//never read m_cBoxFrameTitleRel.iY+m_cBoxFrame.iY+ (m_cBoxFrameTitleRel.iHeight-logo_h)/2; - short pb_hdd_offset = 104; - if (show_mode == MB_SHOW_YT) - pb_hdd_offset = 0; - - if (CChannelLogo && (old_EpgId != m_movieSelectionHandler->epgId >>16)) { - if (newHeader) - CChannelLogo->clearFbData(); // reset logo screen data - else - CChannelLogo->hide(); - delete CChannelLogo; - CChannelLogo = NULL; + std::string pcInfo_content; + if (m_windowFocus == MB_FOCUS_BROWSER && m_settings.browserAdditional) + { + m_pcInfo2->setWindowMaxDimensions(m_cBoxFrameInfo2.iWidth, m_cBoxFrameInfo2.iHeight - cover_y_offset); + m_pcInfo2->setWindowMinDimensions(m_cBoxFrameInfo2.iWidth, m_cBoxFrameInfo2.iHeight - cover_y_offset); + m_pcInfo2->movePosition(m_cBoxFrameInfo2.iX, m_cBoxFrameInfo2.iY + cover_y_offset); + m_pcInfo2->setText(&m_movieSelectionHandler->epgInfo2); + pcInfo_content = m_movieSelectionHandler->epgInfo1; + pcInfo_content += "\n"; + pcInfo_content += m_movieSelectionHandler->channelName; } - if (old_EpgId != m_movieSelectionHandler->epgId >>16) { - if (CChannelLogo == NULL) - CChannelLogo = new CComponentsChannelLogoScalable(0, 0, m_movieSelectionHandler->channelName, m_movieSelectionHandler->epgId >>16); //TODO: add logo into header as item - old_EpgId = m_movieSelectionHandler->epgId >>16; + else + { + pcInfo_content = m_movieSelectionHandler->epgInfo2; + } + m_pcInfo1->setText(&pcInfo_content, m_cBoxFrameInfo1.iWidth - cover_x_offset); + + updateInfoSelection(); + + refreshMovieCover(); + + if (m_windowFocus == MB_FOCUS_BROWSER) + refreshDetailsLine(m_pcBrowser->getSelectedLineRel()); +} + +void CMovieBrowser::hideDetailsLine() +{ + refreshDetailsLine(-1); +} + +void CMovieBrowser::refreshDetailsLine(int pos) +{ + if (m_detailsLine) + { + m_detailsLine->kill(); + delete m_detailsLine; + m_detailsLine = NULL; } - if (CChannelLogo && CChannelLogo->hasLogo()) { - //scale image if required, TODO: move into an own handler, eg. header, so channel logo should be paint in header object - int h_logo = CChannelLogo->getHeight(); - if (h_logo > m_cBoxFrameTitleRel.iHeight){ - uint8_t ratio = m_cBoxFrameTitleRel.iHeight*100/h_logo; - CChannelLogo->setHeight(m_cBoxFrameTitleRel.iHeight); - int w_logo = ratio*CChannelLogo->getWidth()/100; - CChannelLogo->setWidth(min(w_logo, logo_w_max)); - } + if (pos >= 0) + { + int fheight = g_Font[SNeutrinoSettings::FONT_TYPE_MOVIEBROWSER_LIST]->getHeight(); + int hheight = m_pcBrowser->getHeaderListHeight(); + int theight = m_pcBrowser->getTitleHeight(); + int bheight = 8 /*TEXT_BORDER_WIDTH*/; - lx = m_cBoxFrame.iX+m_cBoxFrameTitleRel.iX+m_cBoxFrameTitleRel.iWidth-CChannelLogo->getWidth()-10; - ly = m_cBoxFrameTitleRel.iY+m_cBoxFrame.iY+ (m_cBoxFrameTitleRel.iHeight-CChannelLogo->getHeight())/2; - CChannelLogo->setXPos(lx - pb_hdd_offset); - CChannelLogo->setYPos(ly); - CChannelLogo->hide(); - CChannelLogo->paint(); - newHeader = false; + int xpos = m_cBoxFrameBrowserList.iX - ConnectLineBox_Width; + int ypos1 = m_cBoxFrameBrowserList.iY + hheight + theight + bheight + pos*fheight + (fheight/2); + int ypos2 = m_cBoxFrameInfo1.iY + (m_cBoxFrameInfo1.iHeight/2); + + if (m_detailsLine == NULL) + m_detailsLine = new CComponentsDetailLine(xpos, ypos1, ypos2, fheight/2, m_cBoxFrameInfo1.iHeight-2*RADIUS_LARGE); + m_detailsLine->paint(false); } - - if (pic){ - if (pic->getPictureName() != fname || !logo_ok){ - delete pic; pic = NULL; - } - } - - if (m_settings.gui != MB_GUI_FILTER && logo_ok) { - lx = m_cBoxFrameInfo.iX + m_cBoxFrameBrowserList.iWidth - flogo_w -14; - ly = m_cBoxFrameInfo.iY + (m_cBoxFrameInfo.iHeight-flogo_h)/2; - if (pic == NULL){ //TODO: paint custom covers with different ratio, currently only works with default ratio HD 16/9 - pic = new CComponentsPicture(lx, ly, fname, NULL, CC_SHADOW_ON, COL_MENUCONTENTDARK_PLUS_0); - if (pic->getHeight() < flogo_h/2){ - flogo_h = flogo_h/2; - pic->setYPos(m_cBoxFrameInfo.iY + (m_cBoxFrameInfo.iHeight-flogo_h)/2); - } - pic->setHeight(flogo_h, true); - pic->enableFrame(true, 2); - pic->doPaintBg(false); - flogo_w = pic->getWidth(); - pic->setXPos(m_cBoxFrameInfo.iX + m_cBoxFrameInfo.iWidth - flogo_w - 24); - } - - if (!m_movieSelectionHandler->epgInfo2.empty()){ - if (m_pcInfo->OnAfterScrollPage.empty()){ - pic->enableCache(); - m_pcInfo->OnAfterScrollPage.connect(sigc::mem_fun(pic, &CComponentsPicture::paint0)); - } - } - - } - if (pic) - flogo_w = pic->getWidth(); - m_pcInfo->setText(&m_movieSelectionHandler->epgInfo2, m_cBoxFrameInfo.iWidth - flogo_w - (flogo_w ? 24 : 0)); - if (pic) - pic->paint(CC_SAVE_SCREEN_NO); } void CMovieBrowser::info_hdd_level(bool paint_hdd) @@ -1694,7 +1875,7 @@ int CMovieBrowser::refreshFoot(bool show) int cnt = sizeof(footerButtons) / sizeof(button_label_ext); if (show) - return paintButtons(footerButtons + offset, cnt - offset, m_cBoxFrame.iX+m_cBoxFrameFootRel.iX, m_cBoxFrame.iY+m_cBoxFrameFootRel.iY, m_cBoxFrameFootRel.iWidth, m_cBoxFrameFootRel.iHeight, m_cBoxFrameFootRel.iWidth); + return paintButtons(footerButtons + offset, cnt - offset, m_cBoxFrameFootRel.iX, m_cBoxFrameFootRel.iY, m_cBoxFrameFootRel.iWidth, m_cBoxFrameFootRel.iHeight, m_cBoxFrameFootRel.iWidth); else return paintButtons(footerButtons, cnt, 0, 0, 0, 0, 0, false, NULL, NULL); } @@ -1712,7 +1893,7 @@ bool CMovieBrowser::onButtonPress(neutrino_msg_t msg) result = onButtonPressLastPlayList(msg); else if (m_windowFocus == MB_FOCUS_LAST_RECORD) result = onButtonPressLastRecordList(msg); - else if (m_windowFocus == MB_FOCUS_MOVIE_INFO) + else if (m_windowFocus == MB_FOCUS_MOVIE_INFO1 || m_windowFocus == MB_FOCUS_MOVIE_INFO2) result = onButtonPressMovieInfoList(msg); else if (m_windowFocus == MB_FOCUS_FILTER) result = onButtonPressFilterList(msg); @@ -1751,32 +1932,32 @@ bool CMovieBrowser::onButtonPressMainFrame(neutrino_msg_t msg) else if (msg == (neutrino_msg_t) g_settings.mbkey_cover) { if (m_movieSelectionHandler != NULL) { - std::string fname = getScreenshotName(m_movieSelectionHandler->file.Name, S_ISDIR(m_movieSelectionHandler->file.Mode)); - if (!fname.empty()) + std::string cover_file = getScreenshotName(m_movieSelectionHandler->file.Name, S_ISDIR(m_movieSelectionHandler->file.Mode)); + if (!cover_file.empty()) { //delete Cover if (ShowMsg(LOCALE_MESSAGEBOX_INFO, LOCALE_MOVIEBROWSER_DELETE_SCREENSHOT, CMessageBox::mbrNo, CMessageBox:: mbYes | CMessageBox::mbNo) == CMessageBox::mbrYes) { - unlink(fname.c_str()); + unlink(cover_file.c_str()); refresh(); } } else if (g_settings.tmdb_enabled) { //add TMDB Cover - fname = m_movieSelectionHandler->file.Name.c_str(); + cover_file = m_movieSelectionHandler->file.Name.c_str(); int ext_pos = 0; - ext_pos = fname.rfind('.'); + ext_pos = cover_file.rfind('.'); if( ext_pos > 0) { std::string extension; - extension = fname.substr(ext_pos + 1, fname.length() - ext_pos); + extension = cover_file.substr(ext_pos + 1, cover_file.length() - ext_pos); extension = "." + extension; - str_replace(extension, ".jpg", fname); - printf("TMDB: %s : %s\n",m_movieSelectionHandler->file.Name.c_str(),fname.c_str()); + str_replace(extension, ".jpg", cover_file); + printf("TMDB: %s : %s\n",m_movieSelectionHandler->file.Name.c_str(),cover_file.c_str()); cTmdb* tmdb = new cTmdb(m_movieSelectionHandler->epgTitle); if ((tmdb->getResults() > 0) && (tmdb->hasCover())) { - if (!fname.empty()) - if (tmdb->getSmallCover(fname)) + if (!cover_file.empty()) + if (tmdb->getSmallCover(cover_file)) refresh(); } if (tmdb) @@ -1794,12 +1975,16 @@ bool CMovieBrowser::onButtonPressMainFrame(neutrino_msg_t msg) } else if (msg == CRCInput::RC_left) { - if (show_mode != MB_SHOW_YT) + if (m_windowFocus == MB_FOCUS_MOVIE_INFO2 && m_settings.browserAdditional) + onSetFocusNext(); + else if (show_mode != MB_SHOW_YT) onSetGUIWindowPrev(); } else if (msg == CRCInput::RC_right) { - if (show_mode != MB_SHOW_YT) + if (m_windowFocus == MB_FOCUS_BROWSER && m_settings.browserAdditional) + onSetFocusNext(); + else if (show_mode != MB_SHOW_YT) onSetGUIWindowNext(); } else if (msg == CRCInput::RC_green) @@ -2115,12 +2300,20 @@ bool CMovieBrowser::onButtonPressMovieInfoList(neutrino_msg_t msg) bool result = true; if (msg == CRCInput::RC_up) - m_pcInfo->scrollPageUp(1); + if (m_windowFocus == MB_FOCUS_MOVIE_INFO2 && m_settings.browserAdditional) + m_pcInfo2->scrollPageUp(1); + else + m_pcInfo1->scrollPageUp(1); else if (msg == CRCInput::RC_down) - m_pcInfo->scrollPageDown(1); + if (m_windowFocus == MB_FOCUS_MOVIE_INFO2 && m_settings.browserAdditional) + m_pcInfo2->scrollPageDown(1); + else + m_pcInfo1->scrollPageDown(1); else result = false; + updateInfoSelection(); + return (result); } @@ -2185,9 +2378,9 @@ bool CMovieBrowser::onDeleteFile(MI_MOVIE_INFO *movieinfo, bool skipAsk) hintBox->paint(); delFile(movieinfo->file); - std::string fname = getScreenshotName(movieinfo->file.Name, S_ISDIR(movieinfo->file.Mode)); - if (!fname.empty()) - unlink(fname.c_str()); + std::string cover_file = getScreenshotName(movieinfo->file.Name, S_ISDIR(movieinfo->file.Mode)); + if (!cover_file.empty()) + unlink(cover_file.c_str()); CFile file_xml = movieinfo->file; if (m_movieInfo.convertTs2XmlName(file_xml.Name)) @@ -2313,6 +2506,7 @@ void CMovieBrowser::onSetGUIWindow(MB_GUI gui) m_pcBrowser->hide(); m_pcFilter->hide(); + m_pcInfo2->hide(); m_pcLastRecord->paint(); m_pcLastPlay->paint(); @@ -2328,6 +2522,7 @@ void CMovieBrowser::onSetGUIWindow(MB_GUI gui) m_pcBrowser->hide(); m_pcFilter->hide(); + m_pcInfo2->hide(); m_pcLastRecord->paint(); m_pcLastPlay->paint(); @@ -2337,13 +2532,16 @@ void CMovieBrowser::onSetGUIWindow(MB_GUI gui) m_showMovieInfo = false; - m_pcInfo->hide(); + m_pcInfo1->hide(); + m_pcInfo2->hide(); m_pcFilter->paint(); onSetFocus(MB_FOCUS_FILTER); } if (m_showMovieInfo) { - m_pcInfo->paint(); + m_pcInfo1->paint(); + if (m_windowFocus == MB_FOCUS_BROWSER && m_settings.browserAdditional) + m_pcInfo2->paint(); refreshMovieInfo(); } } @@ -2389,6 +2587,7 @@ void CMovieBrowser::onSetFocus(MB_FOCUS new_focus) m_pcFilter->showSelection(true); updateMovieSelection(); + updateInfoSelection(); refreshFoot(); } @@ -2406,23 +2605,26 @@ void CMovieBrowser::onSetFocusNext(void) else if (m_settings.gui == MB_GUI_MOVIE_INFO) { if (m_windowFocus == MB_FOCUS_BROWSER) - onSetFocus(MB_FOCUS_MOVIE_INFO); + if (m_settings.browserAdditional) + onSetFocus(MB_FOCUS_MOVIE_INFO2); + else + onSetFocus(MB_FOCUS_MOVIE_INFO1); else onSetFocus(MB_FOCUS_BROWSER); } else if (m_settings.gui == MB_GUI_LAST_PLAY) { - if (m_windowFocus == MB_FOCUS_MOVIE_INFO) + if (m_windowFocus == MB_FOCUS_MOVIE_INFO1 || m_windowFocus == MB_FOCUS_MOVIE_INFO2) onSetFocus(MB_FOCUS_LAST_PLAY); else if (m_windowFocus == MB_FOCUS_LAST_PLAY) - onSetFocus(MB_FOCUS_MOVIE_INFO); + onSetFocus(MB_FOCUS_MOVIE_INFO1); } else if (m_settings.gui == MB_GUI_LAST_RECORD) { - if (m_windowFocus == MB_FOCUS_MOVIE_INFO) + if (m_windowFocus == MB_FOCUS_MOVIE_INFO1 || m_windowFocus == MB_FOCUS_MOVIE_INFO2) onSetFocus(MB_FOCUS_LAST_RECORD); else if (m_windowFocus == MB_FOCUS_LAST_RECORD) - onSetFocus(MB_FOCUS_MOVIE_INFO); + onSetFocus(MB_FOCUS_MOVIE_INFO1); } } @@ -2760,6 +2962,25 @@ void CMovieBrowser::updateMovieSelection(void) //TRACE("\n"); } +void CMovieBrowser::updateInfoSelection(void) +{ + int col_frame; + int thickness = 2; + int radius = m_pcInfo1->getBackGroundRadius(); + + /* + Maybe we should change background of box + instead of changing frame color. + */ + if (m_windowFocus == MB_FOCUS_MOVIE_INFO1) + col_frame = COL_MENUCONTENTSELECTED_PLUS_2; + else + col_frame = COL_FRAME_PLUS_0; + + // CTextBox can't paint frames, so let's do it "manually" + framebuffer->paintBoxFrame(m_cBoxFrameInfo1.iX, m_cBoxFrameInfo1.iY, m_cBoxFrameInfo1.iWidth, m_cBoxFrameInfo1.iHeight, thickness, col_frame, radius); +} + void CMovieBrowser::updateFilterSelection(void) { //TRACE("[mb]->updateFilterSelection \n"); @@ -3086,6 +3307,7 @@ bool CMovieBrowser::showMenu(bool calledExternally) /** optionsMenuBrowser **************************************************/ int oldRowNr = m_settings.browserRowNr; int oldFrameHeight = m_settings.browserFrameHeight; + int oldAdditional = m_settings.browserAdditional; CIntInput playMaxUserIntInput(LOCALE_MOVIEBROWSER_LAST_PLAY_MAX_ITEMS, (int *)&m_settings.lastPlayMaxItems, 3, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE); CIntInput recMaxUserIntInput(LOCALE_MOVIEBROWSER_LAST_RECORD_MAX_ITEMS, (int *)&m_settings.lastRecordMaxItems, 3, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE); CIntInput browserFrameUserIntInput(LOCALE_MOVIEBROWSER_BROWSER_FRAME_HIGH, (int *)&m_settings.browserFrameHeight, 3, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE); @@ -3096,6 +3318,7 @@ bool CMovieBrowser::showMenu(bool calledExternally) optionsMenuBrowser.addItem(new CMenuForwarder(LOCALE_MOVIEBROWSER_LAST_PLAY_MAX_ITEMS, true, playMaxUserIntInput.getValue(), &playMaxUserIntInput)); optionsMenuBrowser.addItem(new CMenuForwarder(LOCALE_MOVIEBROWSER_LAST_RECORD_MAX_ITEMS, true, recMaxUserIntInput.getValue(), &recMaxUserIntInput)); optionsMenuBrowser.addItem(new CMenuForwarder(LOCALE_MOVIEBROWSER_BROWSER_FRAME_HIGH, true, browserFrameUserIntInput.getValue(), &browserFrameUserIntInput)); + optionsMenuBrowser.addItem(new CMenuOptionChooser(LOCALE_MOVIEBROWSER_BROWSER_ADDITIONAL, (int*)(&m_settings.browserAdditional), MESSAGEBOX_YES_NO_OPTIONS, MESSAGEBOX_YES_NO_OPTIONS_COUNT, true)); optionsMenuBrowser.addItem(new CMenuSeparator(CMenuSeparator::LINE | CMenuSeparator::STRING, LOCALE_MOVIEBROWSER_BROWSER_ROW_HEAD)); optionsMenuBrowser.addItem(new CMenuForwarder(LOCALE_MOVIEBROWSER_BROWSER_ROW_NR, true, browserRowNrIntInput.getValue(), &browserRowNrIntInput)); optionsMenuBrowser.addItem(GenericMenuSeparator); @@ -3179,7 +3402,24 @@ bool CMovieBrowser::showMenu(bool calledExternally) if (ts_only != m_settings.ts_only || dirMenu.isChanged()) loadMovies(false); - if (oldRowNr != m_settings.browserRowNr || oldFrameHeight != m_settings.browserFrameHeight) { + bool reInitFrames = ( + m_settings.browserRowNr != oldRowNr + || m_settings.browserFrameHeight != oldFrameHeight + || m_settings.browserAdditional != oldAdditional + ); + + if (reInitFrames) { +#if 1 + if (m_settings.browserAdditional && oldAdditional != m_settings.browserAdditional) + { + /* + Bad 'hack' to force a smaller m_pcInfo1 box. + This can be reconfigured by user later. + It's just to align view to channellist's view. + */ + m_settings.browserFrameHeight = 75; + } +#endif initFrames(); hide(); paint(); diff --git a/src/gui/moviebrowser/mb.h b/src/gui/moviebrowser/mb.h index aefffc146..d996f0d7c 100644 --- a/src/gui/moviebrowser/mb.h +++ b/src/gui/moviebrowser/mb.h @@ -96,6 +96,7 @@ typedef struct int browserRowNr; MB_INFO_ITEM browserRowItem[MB_MAX_ROWS]; int browserRowWidth[MB_MAX_ROWS]; + int browserAdditional; // to be added to config later int lastPlayMaxItems; @@ -144,23 +145,29 @@ class CMovieBrowser : public CMenuTarget private: // Variables CFrameBuffer * framebuffer; - CComponentsPicture *pic; + CListFrame* m_pcBrowser; CListFrame* m_pcLastPlay; CListFrame* m_pcLastRecord; - CTextBox* m_pcInfo; + CTextBox* m_pcInfo1; // bottom box + CTextBox* m_pcInfo2; // right box CListFrame* m_pcFilter; CBox m_cBoxFrame; CBox m_cBoxFrameLastPlayList; CBox m_cBoxFrameLastRecordList; CBox m_cBoxFrameBrowserList; - CBox m_cBoxFrameInfo; + CBox m_cBoxFrameInfo1; + CBox m_cBoxFrameInfo2; CBox m_cBoxFrameBookmarkList; CBox m_cBoxFrameFilter; CBox m_cBoxFrameFootRel; CBox m_cBoxFrameTitleRel; + CComponentsDetailLine *m_detailsLine; + CComponentsChannelLogo *m_channelLogo; + CComponentsPicture *m_movieCover; + LF_LINES m_browserListLines; LF_LINES m_recordListLines; LF_LINES m_playListLines; @@ -214,7 +221,6 @@ class CMovieBrowser : public CMenuTarget CFileList::iterator filelist_it; P_MI_MOVIE_LIST movielist; - CComponentsChannelLogo* CChannelLogo; uint64_t old_EpgId; int movieInfoUpdateAll[MB_INFO_MAX_NUMBER]; int movieInfoUpdateAllIfDestEmptyOnly; @@ -284,10 +290,15 @@ class CMovieBrowser : public CMenuTarget void refreshBrowserList(void); //P1 void refreshFilterList(void); //P1 void refreshMovieInfo(void); //P1 + void refreshChannelLogo(void); //P1 + void initMovieCover(void); //P1 + void refreshMovieCover(void); //P1 int refreshFoot(bool show = true); //P2 void refreshTitle(void); //P2 void refreshInfo(void); // P2 void refreshLCD(void); // P2 + void refreshDetailsLine(int pos); + void hideDetailsLine(); ///// Events /////////////////////////// bool onButtonPress(neutrino_msg_t msg); // P1 @@ -339,6 +350,7 @@ class CMovieBrowser : public CMenuTarget bool isParentalLock(MI_MOVIE_INFO& movie_info); bool getMovieInfoItem(MI_MOVIE_INFO& movie_info, MB_INFO_ITEM item, std::string* item_string); void updateMovieSelection(void); + void updateInfoSelection(void); void updateFilterSelection(void); void updateSerienames(void); void autoFindSerie(void); @@ -352,7 +364,6 @@ class CMovieBrowser : public CMenuTarget bool addFile(CFile &file, int dirItNr); }; - // I tried a lot to use the menu.cpp as ListBox selection, and I got three solution which are all garbage. //Might be replaced by somebody who is familiar with this stuff . @@ -365,7 +376,6 @@ class CSelectedMenu : public CMenuTarget inline int exec(CMenuTarget* /*parent*/, const std::string & /*actionKey*/){selected = true; return menu_return::RETURN_EXIT;}; }; - // This Class creates a menue item, which writes its caption to an given string (or an given int value to an given variable). // The programm could use this class to verify, what menu was selected. // A good listbox class might do the same. There might be better ways to do so. @@ -397,7 +407,6 @@ class CMenuWidgetSelection : public CMenuWidget int getSelectedLine(void){return exit_pressed ? -1 : selected;}; }; - class CFileChooser : public CMenuWidget { private: @@ -408,8 +417,6 @@ class CFileChooser : public CMenuWidget int exec(CMenuTarget* parent, const std::string & actionKey); }; - - class CDirMenu : public CMenuWidget { private: @@ -428,7 +435,4 @@ class CDirMenu : public CMenuWidget bool isChanged(){return changed;}; }; - - - #endif /*MOVIEBROWSER_H_*/ diff --git a/src/gui/moviebrowser/mb_types.h b/src/gui/moviebrowser/mb_types.h index b260d0ec7..30ba01b93 100644 --- a/src/gui/moviebrowser/mb_types.h +++ b/src/gui/moviebrowser/mb_types.h @@ -104,9 +104,10 @@ typedef enum MB_FOCUS_BROWSER = 0, MB_FOCUS_LAST_PLAY = 1, MB_FOCUS_LAST_RECORD = 2, - MB_FOCUS_MOVIE_INFO = 3, - MB_FOCUS_FILTER = 4, - MB_FOCUS_MAX_NUMBER = 5 // MUST be allways the last item in the list + MB_FOCUS_MOVIE_INFO1 = 3, + MB_FOCUS_MOVIE_INFO2 = 4, + MB_FOCUS_FILTER = 5, + MB_FOCUS_MAX_NUMBER = 6 // MUST be allways the last item in the list }MB_FOCUS; typedef enum diff --git a/src/system/locals.h b/src/system/locals.h index b705a9f65..7e3f48afa 100644 --- a/src/system/locals.h +++ b/src/system/locals.h @@ -1661,6 +1661,7 @@ typedef enum LOCALE_MOVIEBROWSER_BOOK_TYPE, LOCALE_MOVIEBROWSER_BOOK_TYPE_BACKWARD, LOCALE_MOVIEBROWSER_BOOK_TYPE_FORWARD, + LOCALE_MOVIEBROWSER_BROWSER_ADDITIONAL, LOCALE_MOVIEBROWSER_BROWSER_FRAME_HIGH, LOCALE_MOVIEBROWSER_BROWSER_ROW_HEAD, LOCALE_MOVIEBROWSER_BROWSER_ROW_ITEM, diff --git a/src/system/locals_intern.h b/src/system/locals_intern.h index b0e4ade50..66660b194 100644 --- a/src/system/locals_intern.h +++ b/src/system/locals_intern.h @@ -1661,6 +1661,7 @@ const char * locale_real_names[] = "moviebrowser.book_type", "moviebrowser.book_type_backward", "moviebrowser.book_type_forward", + "moviebrowser.browser_additional", "moviebrowser.browser_frame_high", "moviebrowser.browser_row_head", "moviebrowser.browser_row_item", From 3a5823e382c39b3ad4c561c5e23fb500f14253f0 Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Sat, 29 Oct 2016 08:20:22 +0200 Subject: [PATCH 21/37] Sort locale Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/373ae57e42163eed79202ab8f46bf238528749b7 Author: Michael Liebmann Date: 2016-10-29 (Sat, 29 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- data/locale/deutsch.locale | 2 +- data/locale/english.locale | 2 +- src/system/locals.h | 2 +- src/system/locals_intern.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale index cac819112..f6638ea2f 100644 --- a/data/locale/deutsch.locale +++ b/data/locale/deutsch.locale @@ -2101,11 +2101,11 @@ remotebox_channel_na Kanal auf Remote-Box nicht verfügbar remotebox_del löschen remotebox_head Remote-Boxen remotebox_mod bearbeiten -remotebox_user Benutzer remotebox_pass Passwort remotebox_port Port remotebox_rbaddr Adresse remotebox_rbname Anzeigename +remotebox_user Benutzer reset_all Werkseinstellungen und Reboot reset_channels Lösche Kanäle reset_confirm Sind Sie sich sicher? diff --git a/data/locale/english.locale b/data/locale/english.locale index c2b581deb..a5a01372d 100644 --- a/data/locale/english.locale +++ b/data/locale/english.locale @@ -2101,11 +2101,11 @@ remotebox_channel_na Channel not available on Remote-Box remotebox_del delete remotebox_head Remote-Boxes remotebox_mod modify -remotebox_user User remotebox_pass Password remotebox_port Port remotebox_rbaddr Address remotebox_rbname Screenname +remotebox_user User reset_all Factory reset and reboot reset_channels Delete all channels reset_confirm Are you sure ? diff --git a/src/system/locals.h b/src/system/locals.h index b705a9f65..fc3447568 100644 --- a/src/system/locals.h +++ b/src/system/locals.h @@ -2128,11 +2128,11 @@ typedef enum LOCALE_REMOTEBOX_DEL, LOCALE_REMOTEBOX_HEAD, LOCALE_REMOTEBOX_MOD, - LOCALE_REMOTEBOX_USER, LOCALE_REMOTEBOX_PASS, LOCALE_REMOTEBOX_PORT, LOCALE_REMOTEBOX_RBADDR, LOCALE_REMOTEBOX_RBNAME, + LOCALE_REMOTEBOX_USER, LOCALE_RESET_ALL, LOCALE_RESET_CHANNELS, LOCALE_RESET_CONFIRM, diff --git a/src/system/locals_intern.h b/src/system/locals_intern.h index b0e4ade50..b1cce4e60 100644 --- a/src/system/locals_intern.h +++ b/src/system/locals_intern.h @@ -2128,11 +2128,11 @@ const char * locale_real_names[] = "remotebox_del", "remotebox_head", "remotebox_mod", - "remotebox_user", "remotebox_pass", "remotebox_port", "remotebox_rbaddr", "remotebox_rbname", + "remotebox_user", "reset_all", "reset_channels", "reset_confirm", From bb952faf1bfd8e7729d644ce9cd31d2a190e44ba Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Sat, 29 Oct 2016 08:20:32 +0200 Subject: [PATCH 22/37] CStringInput: Make saveScreen changeable with forceSaveScreen() Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/0e22860ac05aa80fb84face560e424a349248835 Author: Michael Liebmann Date: 2016-10-29 (Sat, 29 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/widget/stringinput.cpp | 29 +++++++++++++++++++++-------- src/gui/widget/stringinput.h | 4 ++++ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/gui/widget/stringinput.cpp b/src/gui/widget/stringinput.cpp index b47a99c4e..8fa986268 100644 --- a/src/gui/widget/stringinput.cpp +++ b/src/gui/widget/stringinput.cpp @@ -150,6 +150,8 @@ void CStringInput::init() y = getScreenStartY(height); selected = 0; smstimer = 0; + force_saveScreen = false; + pixBuf = NULL; } void CStringInput::NormalKeyPressed(const neutrino_msg_t key) @@ -377,6 +379,15 @@ std::string &CStringInput::getValue(void) return *valueString; } +void CStringInput::forceSaveScreen(bool enable) +{ + force_saveScreen = enable; + if (!enable && pixBuf) { + delete[] pixBuf; + pixBuf = NULL; + } +} + int CStringInput::exec( CMenuTarget* parent, const std::string & ) { neutrino_msg_t msg; @@ -392,11 +403,12 @@ int CStringInput::exec( CMenuTarget* parent, const std::string & ) if (size > (int) valueString->length()) valueString->append(size - valueString->length(), ' '); - fb_pixel_t * pixbuf = NULL; - if (!parent) { - pixbuf = new fb_pixel_t[(width + OFFSET_SHADOW) * (height + OFFSET_SHADOW)]; - if (pixbuf) - frameBuffer->SaveScreen(x, y, width + OFFSET_SHADOW, height + OFFSET_SHADOW, pixbuf); + if (pixBuf) + delete[] pixBuf; + if (!parent || force_saveScreen) { + pixBuf = new fb_pixel_t[(width + OFFSET_SHADOW) * (height + OFFSET_SHADOW)]; + if (pixBuf) + frameBuffer->SaveScreen(x, y, width + OFFSET_SHADOW, height + OFFSET_SHADOW, pixBuf); } paint(); @@ -517,10 +529,11 @@ int CStringInput::exec( CMenuTarget* parent, const std::string & ) } } - if (pixbuf) + if (pixBuf) { - frameBuffer->RestoreScreen(x, y, width + OFFSET_SHADOW, height + OFFSET_SHADOW, pixbuf); - delete[] pixbuf;//Mismatching allocation and deallocation: pixbuf + frameBuffer->RestoreScreen(x, y, width + OFFSET_SHADOW, height + OFFSET_SHADOW, pixBuf); + delete[] pixBuf; + pixBuf = NULL; frameBuffer->blit(); } else hide(); diff --git a/src/gui/widget/stringinput.h b/src/gui/widget/stringinput.h index 2a8d9bcd4..d435a7f84 100644 --- a/src/gui/widget/stringinput.h +++ b/src/gui/widget/stringinput.h @@ -61,6 +61,8 @@ class CStringInput : public CMenuTarget int size; int selected; CChangeObserver * observ; + bool force_saveScreen; + fb_pixel_t *pixBuf; virtual void init(); @@ -91,6 +93,8 @@ class CStringInput : public CMenuTarget int exec( CMenuTarget* parent, const std::string & actionKey ); void setMinMax(const int min_value, const int max_value); virtual std::string &getValue(void); + + void forceSaveScreen(bool enable); }; class CStringInputSMS : public CStringInput From c7830d8d7b68fdfbeaf1419b7da68f8bbc1bc47e Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Sat, 29 Oct 2016 08:20:36 +0200 Subject: [PATCH 23/37] CKeyboardInput: Make saveScreen changeable with forceSaveScreen() Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/74b0ce7f7061abc30b094eb12d2956ef42c97c93 Author: Michael Liebmann Date: 2016-10-29 (Sat, 29 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/widget/keyboard_input.cpp | 34 +++++++++++++++++++++++-------- src/gui/widget/keyboard_input.h | 4 ++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/gui/widget/keyboard_input.cpp b/src/gui/widget/keyboard_input.cpp index 72cd73dfc..a7f574cfe 100644 --- a/src/gui/widget/keyboard_input.cpp +++ b/src/gui/widget/keyboard_input.cpp @@ -199,6 +199,8 @@ CKeyboardInput::CKeyboardInput(const neutrino_locale_t Name, std::string* Value, caps = 0; srow = scol = 0; focus = FOCUS_STRING; + force_saveScreen = false; + pixBuf = NULL; } CKeyboardInput::CKeyboardInput(const std::string &Name, std::string *Value, int Size, CChangeObserver* Observ, const char * const Icon, const neutrino_locale_t Hint_1, const neutrino_locale_t Hint_2) @@ -221,6 +223,8 @@ CKeyboardInput::CKeyboardInput(const std::string &Name, std::string *Value, int caps = 0; srow = scol = 0; focus = FOCUS_STRING; + force_saveScreen = false; + pixBuf = NULL; } CKeyboardInput::CKeyboardInput(const std::string &Name, std::string *Value, int Size, CChangeObserver* Observ, const char * const Icon, std::string HintText_1, std::string HintText_2) @@ -243,6 +247,8 @@ CKeyboardInput::CKeyboardInput(const std::string &Name, std::string *Value, int caps = 0; srow = scol = 0; focus = FOCUS_STRING; + force_saveScreen = false; + pixBuf = NULL; } CKeyboardInput::~CKeyboardInput() @@ -515,6 +521,15 @@ std::string &CKeyboardInput::getValue(void) return *valueString; } +void CKeyboardInput::forceSaveScreen(bool enable) +{ + force_saveScreen = enable; + if (!enable && pixBuf) { + delete[] pixBuf; + pixBuf = NULL; + } +} + int CKeyboardInput::exec(CMenuTarget* parent, const std::string &) { neutrino_msg_t msg; @@ -528,11 +543,12 @@ int CKeyboardInput::exec(CMenuTarget* parent, const std::string &) std::string oldval = *valueString; - fb_pixel_t * pixbuf = NULL; - if (!parent) { - pixbuf = new fb_pixel_t[(width + OFFSET_SHADOW) * (height + OFFSET_SHADOW)]; - if (pixbuf) - frameBuffer->SaveScreen(x, y, width + OFFSET_SHADOW, height + OFFSET_SHADOW, pixbuf); + if (pixBuf) + delete[] pixBuf; + if (!parent || force_saveScreen) { + pixBuf = new fb_pixel_t[(width + OFFSET_SHADOW) * (height + OFFSET_SHADOW)]; + if (pixBuf) + frameBuffer->SaveScreen(x, y, width + OFFSET_SHADOW, height + OFFSET_SHADOW, pixBuf); } paint(); @@ -624,10 +640,12 @@ int CKeyboardInput::exec(CMenuTarget* parent, const std::string &) } } - if (pixbuf) + if (pixBuf) { - frameBuffer->RestoreScreen(x, y, width + OFFSET_SHADOW, height + OFFSET_SHADOW, pixbuf); - delete[] pixbuf; + frameBuffer->RestoreScreen(x, y, width + OFFSET_SHADOW, height + OFFSET_SHADOW, pixBuf); + delete[] pixBuf; + pixBuf = NULL; + frameBuffer->blit(); } else hide(); diff --git a/src/gui/widget/keyboard_input.h b/src/gui/widget/keyboard_input.h index 009934b4a..1003e7f39 100644 --- a/src/gui/widget/keyboard_input.h +++ b/src/gui/widget/keyboard_input.h @@ -101,6 +101,8 @@ class CKeyboardInput : public CMenuTarget int selected; bool changed; CChangeObserver * observ; + bool force_saveScreen; + fb_pixel_t *pixBuf; virtual void init(); @@ -133,6 +135,8 @@ class CKeyboardInput : public CMenuTarget void hide(); int exec( CMenuTarget* parent, const std::string & actionKey ); virtual std::string &getValue(void); + + void forceSaveScreen(bool enable); }; #endif From 5b0d909a9fe11093ab42bc4cf40a58a54ab31df6 Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Sat, 29 Oct 2016 08:20:40 +0200 Subject: [PATCH 24/37] Use forceSaveScreen() in COsdSetup & CTimerList Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/e5402057d3148bbb98ef6b218de0905b2b0c96db Author: Michael Liebmann Date: 2016-10-29 (Sat, 29 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/osd_setup.cpp | 1 + src/gui/timerlist.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/gui/osd_setup.cpp b/src/gui/osd_setup.cpp index 8a5f85d59..e14f12de4 100644 --- a/src/gui/osd_setup.cpp +++ b/src/gui/osd_setup.cpp @@ -922,6 +922,7 @@ public: while (value.length() < 3) value = " " + value; CStringInput input(name, &value, 3, LOCALE_IPSETUP_HINT_1, LOCALE_IPSETUP_HINT_2, "0123456789 ", this); + input.forceSaveScreen(true); return input.exec(parent, action_Key); } diff --git a/src/gui/timerlist.cpp b/src/gui/timerlist.cpp index 556a5030b..60b6ce892 100644 --- a/src/gui/timerlist.cpp +++ b/src/gui/timerlist.cpp @@ -298,10 +298,15 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) std::string rbname,rbaddress,user,pass = ""; std::string port = "80"; CKeyboardInput remotebox_name(LOCALE_REMOTEBOX_RBNAME , &rbname, 25); + remotebox_name.forceSaveScreen(true); CKeyboardInput remotebox_address(LOCALE_REMOTEBOX_RBADDR , &rbaddress, 50); + remotebox_address.forceSaveScreen(true); CStringInput remotebox_port(LOCALE_REMOTEBOX_PORT , &port, 5); + remotebox_port.forceSaveScreen(true); CKeyboardInput remotebox_user(LOCALE_REMOTEBOX_USER , &user, 15); + remotebox_user.forceSaveScreen(true); CKeyboardInput remotebox_pass(LOCALE_REMOTEBOX_PASS , &pass, 15); + remotebox_pass.forceSaveScreen(true); CMenuWidget * rbsetup = new CMenuWidget(LOCALE_REMOTEBOX_HEAD, NEUTRINO_ICON_TIMER); rbsetup->addItem(new CMenuForwarder(LOCALE_REMOTEBOX_RBNAME, true, rbname, &remotebox_name)); rbsetup->addItem(new CMenuForwarder(LOCALE_REMOTEBOX_RBADDR, true, rbaddress, &remotebox_address)); @@ -350,10 +355,15 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) std::advance(it,bselected-item_offset); std::string port = to_string(it->port); CKeyboardInput remotebox_name(LOCALE_REMOTEBOX_RBNAME , &it->rbname, 25); + remotebox_name.forceSaveScreen(true); CKeyboardInput remotebox_address(LOCALE_REMOTEBOX_RBADDR , &it->rbaddress, 50); + remotebox_address.forceSaveScreen(true); CStringInput remotebox_port(LOCALE_REMOTEBOX_PORT , &port, 5); + remotebox_port.forceSaveScreen(true); CKeyboardInput remotebox_user(LOCALE_REMOTEBOX_USER , &it->user, 15); + remotebox_user.forceSaveScreen(true); CKeyboardInput remotebox_pass(LOCALE_REMOTEBOX_PASS , &it->pass, 15); + remotebox_pass.forceSaveScreen(true); CMenuWidget * rbsetup = new CMenuWidget(LOCALE_REMOTEBOX_HEAD, NEUTRINO_ICON_TIMER); rbsetup->addItem(new CMenuForwarder(LOCALE_REMOTEBOX_RBNAME, true, it->rbname, &remotebox_name)); rbsetup->addItem(new CMenuForwarder(LOCALE_REMOTEBOX_RBADDR, true, it->rbaddress, &remotebox_address)); @@ -684,6 +694,7 @@ void CTimerList::RemoteBoxSelect() for (std::vector::iterator it = g_settings.timer_remotebox_ip.begin(); it != g_settings.timer_remotebox_ip.end(); ++it) m->addItem(new CMenuForwarder(it->rbname, true, NULL, selector, to_string(std::distance(g_settings.timer_remotebox_ip.begin(),it)).c_str())); + m->enableSaveScreen(true); m->exec(NULL, ""); delete selector; From 96a45db4b2d015070e866f0550abf5efc90ab504 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Sat, 29 Oct 2016 17:16:23 +0200 Subject: [PATCH 25/37] timerlist: change colors for remote-timer (as requested by tewsbo) Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/1e5a472748e04c70038dfcbe0afcdfd1e77f6541 Author: vanhofen Date: 2016-10-29 (Sat, 29 Oct 2016) Origin message was: ------------------ - timerlist: change colors for remote-timer (as requested by tewsbo) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/timerlist.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/gui/timerlist.cpp b/src/gui/timerlist.cpp index fca85f4a6..76fd3b334 100644 --- a/src/gui/timerlist.cpp +++ b/src/gui/timerlist.cpp @@ -1107,6 +1107,12 @@ void CTimerList::paintItem(int pos) if (currpos < timerlist.size()) { CTimerd::responseGetTimer & timer = timerlist[currpos]; + //NI + if (timer.eventType == CTimerd::TIMER_REMOTEBOX) + { + color = COL_MENUCONTENTINACTIVE_TEXT; + bgcolor = COL_MENUCONTENTINACTIVE_PLUS_0; + } char zAlarmTime[25] = {0}; struct tm *alarmTime = localtime(&(timer.alarmTime)); strftime(zAlarmTime,20,"%d.%m. %H:%M",alarmTime); From d2b28dcede83e23c3b87f3c41993f1a5fd57843a Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Sat, 29 Oct 2016 20:47:57 +0200 Subject: [PATCH 26/37] components/widget: add doxygen config file to create documentations If you want to create a documantation, please move into current directory that contains the 'Doxyfile' and do execute command ''doxygen Doxyfile'' This creates usually a subdirectory named /doc/html/ This contains documentation contents in html format. Open /doc/html/index.html in your browser and you will see contents. Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/27dc0228a556304da6af254f8fbb334f5697e555 Author: Thilo Graf Date: 2016-10-29 (Sat, 29 Oct 2016) ------------------ This commit was generated by Migit --- src/gui/components/.gitignore | 1 + src/gui/components/Doxyfile | 2457 +++++++++++++++++++++++++++++++++ src/gui/widget/.gitignore | 1 + src/gui/widget/Doxyfile | 2457 +++++++++++++++++++++++++++++++++ 4 files changed, 4916 insertions(+) create mode 100644 src/gui/components/.gitignore create mode 100644 src/gui/components/Doxyfile create mode 100644 src/gui/widget/.gitignore create mode 100644 src/gui/widget/Doxyfile diff --git a/src/gui/components/.gitignore b/src/gui/components/.gitignore new file mode 100644 index 000000000..7ee662bc4 --- /dev/null +++ b/src/gui/components/.gitignore @@ -0,0 +1 @@ +/doc/html diff --git a/src/gui/components/Doxyfile b/src/gui/components/Doxyfile new file mode 100644 index 000000000..5c54e26f5 --- /dev/null +++ b/src/gui/components/Doxyfile @@ -0,0 +1,2457 @@ +# Doxyfile 1.8.11 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "CComponents Documentation" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = 1.0 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = . + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl, +# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.f90 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf \ + *.as \ + *.js + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 211 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 138 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 240 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /