mirror of
https://github.com/tuxbox-neutrino/neutrino.git
synced 2025-08-27 23:42:58 +02:00
- rework recording menu and infobar style of recording icon (patch by micha-bbg) -> todo: add proper localization
*add possibility to start recording of current channel via menu *add timeshift to menu *add stop all recordings to menu *change infobar style (shows number of running recordings beside recording icon) git-svn-id: file:///home/bas/coolstream_public_svn/THIRDPARTY/applications/neutrino-beta@1627 e54a6e83-5905-42d5-8d5c-058d10e6a962
This commit is contained in:
@@ -40,6 +40,7 @@
|
|||||||
#include <global.h>
|
#include <global.h>
|
||||||
#include <neutrino.h>
|
#include <neutrino.h>
|
||||||
#include <gui/filebrowser.h>
|
#include <gui/filebrowser.h>
|
||||||
|
#include <gui/movieplayer.h>
|
||||||
#include <gui/widget/hintbox.h>
|
#include <gui/widget/hintbox.h>
|
||||||
#include <gui/widget/messagebox.h>
|
#include <gui/widget/messagebox.h>
|
||||||
#include <gui/widget/mountchooser.h>
|
#include <gui/widget/mountchooser.h>
|
||||||
@@ -1023,51 +1024,159 @@ int CRecordManager::handleMsg(const neutrino_msg_t msg, neutrino_msg_data_t data
|
|||||||
return messages_return::unhandled;
|
return messages_return::unhandled;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CRecordManager::exec(CMenuTarget* parent, const std::string & /*actionKey */)
|
int CRecordManager::exec(CMenuTarget* parent, const std::string & actionKey )
|
||||||
{
|
{
|
||||||
if(parent)
|
if(parent)
|
||||||
parent->hide();
|
parent->hide();
|
||||||
|
|
||||||
|
if(actionKey == "StopAll")
|
||||||
|
{
|
||||||
|
char rec_msg[256];
|
||||||
|
int records = recmap.size();
|
||||||
|
int i = 0;
|
||||||
|
snprintf(rec_msg, sizeof(rec_msg)-1, "Wirklich alle %d Aufnahmen beenden?", records);
|
||||||
|
if(ShowMsgUTF(LOCALE_SHUTDOWN_RECODING_QUERY, rec_msg,
|
||||||
|
CMessageBox::mbrNo, CMessageBox::mbYes | CMessageBox::mbNo, NULL, 450, 30, false) == CMessageBox::mbrYes)
|
||||||
|
{
|
||||||
|
snprintf(rec_msg, sizeof(rec_msg)-1, "%d Aufnahmen werden beendet.", records);
|
||||||
|
CHintBox * hintBox = new CHintBox(LOCALE_MESSAGEBOX_INFO, rec_msg);
|
||||||
|
hintBox->paint();
|
||||||
|
int recording_ids[RECORD_MAX_COUNT];
|
||||||
|
t_channel_id channel_ids[RECORD_MAX_COUNT];
|
||||||
|
t_channel_id channel_id;
|
||||||
|
recmap_iterator_t it;
|
||||||
|
mutex.lock();
|
||||||
|
for(it = recmap.begin(); it != recmap.end(); it++)
|
||||||
|
{
|
||||||
|
recording_ids[i] = 0;
|
||||||
|
channel_id = it->first;
|
||||||
|
CRecordInstance * inst = it->second;
|
||||||
|
if(inst)
|
||||||
|
{
|
||||||
|
channel_ids[i] = channel_id;
|
||||||
|
recording_ids[i] = inst->GetRecordingId();
|
||||||
|
printf("CRecordManager::exec(ExitAll) found channel %llx recording_id %d\n", channel_ids[i], recording_ids[i]);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mutex.unlock();
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
for(int i2 = 0; i2 < i; i2++)
|
||||||
|
{
|
||||||
|
mutex.lock();
|
||||||
|
CRecordInstance * inst = FindInstance(channel_ids[i2]);
|
||||||
|
if(inst == NULL || recording_ids[i2] != inst->GetRecordingId())
|
||||||
|
{
|
||||||
|
printf("CRecordManager::exec(ExitAll) channel %llx event id %d not found\n", channel_ids[i2], recording_ids[i2]);
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
usleep(500000);
|
||||||
|
g_Timerd->stopTimerEvent(recording_ids[i2]);
|
||||||
|
}
|
||||||
|
mutex.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hintBox->hide();
|
||||||
|
delete hintBox;
|
||||||
|
}
|
||||||
|
return menu_return::RETURN_EXIT_ALL;
|
||||||
|
}else if(actionKey == "Record")
|
||||||
|
{
|
||||||
|
printf("[neutrino] direct record\n");
|
||||||
|
if(CRecordManager::getInstance()->RecordingStatus(live_channel_id))
|
||||||
|
CRecordManager::getInstance()->AskToStop(live_channel_id);
|
||||||
|
else
|
||||||
|
CRecordManager::getInstance()->Record(live_channel_id);
|
||||||
|
return menu_return::RETURN_EXIT_ALL;
|
||||||
|
}else if(actionKey == "Timeshift")
|
||||||
|
{
|
||||||
|
if(g_RemoteControl->is_video_started)
|
||||||
|
{
|
||||||
|
std::string tmode;
|
||||||
|
bool res = true;
|
||||||
|
if(CRecordManager::getInstance()->RecordingStatus(live_channel_id))
|
||||||
|
{
|
||||||
|
tmode = "ptimeshift"; // already recording, pause
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
if(g_settings.temp_timeshift)
|
||||||
|
res = CRecordManager::getInstance()->StartAutoRecord();
|
||||||
|
else
|
||||||
|
res = CRecordManager::getInstance()->Record(live_channel_id);
|
||||||
|
tmode = "timeshift"; // record just started
|
||||||
|
}
|
||||||
|
if(res)
|
||||||
|
CMoviePlayerGui::getInstance().exec(NULL, tmode);
|
||||||
|
}
|
||||||
|
return menu_return::RETURN_EXIT_ALL;
|
||||||
|
}
|
||||||
|
|
||||||
ShowMenu();
|
ShowMenu();
|
||||||
return menu_return::RETURN_REPAINT;
|
return menu_return::RETURN_REPAINT;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CRecordManager::ShowMenu(void)
|
bool CRecordManager::ShowMenu(void)
|
||||||
{
|
{
|
||||||
int select = -1, i = 0;
|
int select = -1, i = 0, shortcut = 1, recmap_size = recmap.size();
|
||||||
char cnt[5];
|
char cnt[5];
|
||||||
|
CMenuForwarderNonLocalized * item;
|
||||||
t_channel_id channel_ids[RECORD_MAX_COUNT];
|
t_channel_id channel_ids[RECORD_MAX_COUNT];
|
||||||
int recording_ids[RECORD_MAX_COUNT];
|
int recording_ids[RECORD_MAX_COUNT];
|
||||||
|
|
||||||
CMenuSelectorTarget * selector = new CMenuSelectorTarget(&select);
|
CMenuSelectorTarget * selector = new CMenuSelectorTarget(&select);
|
||||||
|
|
||||||
CMenuWidget menu(LOCALE_MAINMENU_RECORDING, NEUTRINO_ICON_SETTINGS /*, width*/);
|
CMenuWidget menu(LOCALE_MAINMENU_RECORDING, NEUTRINO_ICON_SETTINGS /*, width*/);
|
||||||
menu.addIntroItems(NONEXISTANT_LOCALE, LOCALE_MAINMENU_RECORDING_STOP, CMenuWidget::BTN_TYPE_CANCEL);
|
menu.addIntroItems(NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, CMenuWidget::BTN_TYPE_CANCEL);
|
||||||
|
|
||||||
//FIXME do we need "Start current channel record" menu point ?
|
// Record / Timeshift
|
||||||
|
item = new CMenuForwarderNonLocalized("Aufnahme aktueller Kanal", true, NULL,
|
||||||
|
this, "Record", CRCInput::RC_red, NEUTRINO_ICON_BUTTON_RED);
|
||||||
|
menu.addItem(item, false);
|
||||||
|
item = new CMenuForwarderNonLocalized("Timeshift", true, NULL,
|
||||||
|
this, "Timeshift", CRCInput::RC_yellow, NEUTRINO_ICON_BUTTON_YELLOW);
|
||||||
|
menu.addItem(item, false);
|
||||||
|
|
||||||
mutex.lock();
|
if(recmap_size > 0)
|
||||||
for(recmap_iterator_t it = recmap.begin(); it != recmap.end(); it++) {
|
{
|
||||||
t_channel_id channel_id = it->first;
|
menu.addItem(new CMenuSeparator(CMenuSeparator::LINE | CMenuSeparator::STRING, LOCALE_MAINMENU_RECORDING_STOP));
|
||||||
CRecordInstance * inst = it->second;
|
|
||||||
|
|
||||||
channel_ids[i] = channel_id;
|
//FIXME do we need "Start current channel record" menu point ?
|
||||||
recording_ids[i] = inst->GetRecordingId();
|
mutex.lock();
|
||||||
|
for(recmap_iterator_t it = recmap.begin(); it != recmap.end(); it++) {
|
||||||
|
t_channel_id channel_id = it->first;
|
||||||
|
CRecordInstance * inst = it->second;
|
||||||
|
|
||||||
std::string title;
|
channel_ids[i] = channel_id;
|
||||||
inst->GetRecordString(title);
|
recording_ids[i] = inst->GetRecordingId();
|
||||||
|
std::string title;
|
||||||
sprintf(cnt, "%d", i);
|
inst->GetRecordString(title);
|
||||||
CMenuForwarderNonLocalized * item = new CMenuForwarderNonLocalized(title.c_str(), true, NULL, selector, cnt, CRCInput::RC_nokey, NULL);
|
sprintf(cnt, "%d", i);
|
||||||
item->setItemButton(NEUTRINO_ICON_BUTTON_OKAY, true);
|
item = new CMenuForwarderNonLocalized(title.c_str(), true, NULL,
|
||||||
menu.addItem(item, false);
|
selector, cnt, CRCInput::convertDigitToKey((recmap_size == 1) ? 0 : shortcut++));
|
||||||
i++;
|
item->setItemButton(NEUTRINO_ICON_BUTTON_OKAY, true);
|
||||||
|
menu.addItem(item, false);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if(i > 1) // Men<65>punkt "alle Aufn. verenden"
|
||||||
|
{
|
||||||
|
menu.addItem(GenericMenuSeparatorLine);
|
||||||
|
item = new CMenuForwarderNonLocalized("Alle Aufnahmen beenden", true, NULL,
|
||||||
|
this, "StopAll", CRCInput::convertDigitToKey(0));
|
||||||
|
item->setItemButton(NEUTRINO_ICON_BUTTON_OKAY, true);
|
||||||
|
menu.addItem(item, false);
|
||||||
|
}
|
||||||
|
mutex.unlock();
|
||||||
}
|
}
|
||||||
mutex.unlock();
|
#if 0
|
||||||
|
|
||||||
if(i == 0)
|
if(i == 0)
|
||||||
|
{
|
||||||
|
// neutrino.cpp #2458 + #2449
|
||||||
|
ShowMsgUTF(LOCALE_MESSAGEBOX_ERROR, "Keine Aufnahme zum Anzeigen oder Stoppen.",
|
||||||
|
CMessageBox::mbrOk, CMessageBox::mbOk,NEUTRINO_ICON_ERROR, 450, 10); // UTF-8
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
menu.exec(NULL, "");
|
menu.exec(NULL, "");
|
||||||
delete selector;
|
delete selector;
|
||||||
|
|
||||||
@@ -1325,7 +1434,7 @@ bool CRecordManager::MountDirectory(const char *recordingDir)
|
|||||||
strcat(msg,recordingDir);
|
strcat(msg,recordingDir);
|
||||||
|
|
||||||
ShowMsgUTF(LOCALE_MESSAGEBOX_ERROR, msg,
|
ShowMsgUTF(LOCALE_MESSAGEBOX_ERROR, msg,
|
||||||
CMessageBox::mbrBack, CMessageBox::mbBack,NEUTRINO_ICON_ERROR, 450, 10); // UTF-8
|
CMessageBox::mbrOk, CMessageBox::mbOk,NEUTRINO_ICON_ERROR, 450, 10); // UTF-8
|
||||||
ret = false;
|
ret = false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@@ -191,5 +191,6 @@ class CRecordManager : public CMenuTarget, public CChangeObserver
|
|||||||
int recordingstatus;
|
int recordingstatus;
|
||||||
bool doGuiRecord();
|
bool doGuiRecord();
|
||||||
bool changeNotify(const neutrino_locale_t OptionName, void * /*data*/);
|
bool changeNotify(const neutrino_locale_t OptionName, void * /*data*/);
|
||||||
|
int GetRecmapSize() { return recmap.size(); };
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@@ -291,20 +291,23 @@ void CInfoViewer::showRecordIcon (const bool show)
|
|||||||
//recordModeActive = CNeutrinoApp::getInstance ()->recordingstatus || shift_timer;
|
//recordModeActive = CNeutrinoApp::getInstance ()->recordingstatus || shift_timer;
|
||||||
recordModeActive = CRecordManager::getInstance()->RecordingStatus() || CRecordManager::getInstance()->Timeshift();
|
recordModeActive = CRecordManager::getInstance()->RecordingStatus() || CRecordManager::getInstance()->Timeshift();
|
||||||
if (recordModeActive) {
|
if (recordModeActive) {
|
||||||
printf("CInfoViewer::showRecordIcon RecordingStatus() %d Timeshift() %d\n", CRecordManager::getInstance()->RecordingStatus(), CRecordManager::getInstance()->Timeshift());
|
//printf("CInfoViewer::showRecordIcon RecordingStatus() %d Timeshift() %d\n", CRecordManager::getInstance()->RecordingStatus(), CRecordManager::getInstance()->Timeshift());
|
||||||
int icon_w = 0,icon_h = 0;
|
int icon_w = 0,icon_h = 0;
|
||||||
frameBuffer->getIconSize(autoshift ? NEUTRINO_ICON_AUTO_SHIFT : NEUTRINO_ICON_REC, &icon_w, &icon_h);
|
frameBuffer->getIconSize(autoshift ? NEUTRINO_ICON_AUTO_SHIFT : NEUTRINO_ICON_REC, &icon_w, &icon_h);
|
||||||
int chanH = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getHeight ();
|
int chanH = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getHeight ();
|
||||||
int ChanName_X = BoxStartX + ChanWidth + SHADOW_OFFSET;
|
int ChanName_X = BoxStartX + ChanWidth + SHADOW_OFFSET;
|
||||||
const int icon_space = 3, box_len = 300, box_pos= 12;
|
const int icon_space = 3, box_len = 34 + icon_w, box_pos = 12;
|
||||||
if (show) {
|
if (show) {
|
||||||
//if (!autoshift && !shift_timer)
|
//if (!autoshift && !shift_timer)
|
||||||
if(!CRecordManager::getInstance()->Timeshift())
|
if(!CRecordManager::getInstance()->Timeshift())
|
||||||
{
|
{
|
||||||
frameBuffer->paintBoxRel (ChanName_X + SHADOW_OFFSET, BoxStartY + box_pos + SHADOW_OFFSET, box_len, chanH, COL_INFOBAR_SHADOW_PLUS_0);
|
frameBuffer->paintBoxRel (ChanName_X + SHADOW_OFFSET, BoxStartY + box_pos + SHADOW_OFFSET, box_len, chanH, COL_INFOBAR_SHADOW_PLUS_0);
|
||||||
frameBuffer->paintBoxRel (ChanName_X , BoxStartY + box_pos , box_len, chanH, COL_INFOBAR_PLUS_0);
|
frameBuffer->paintBoxRel (ChanName_X , BoxStartY + box_pos , box_len, chanH, COL_INFOBAR_PLUS_0);
|
||||||
|
char records_msg[8];
|
||||||
|
int records = CRecordManager::getInstance()->GetRecmapSize();
|
||||||
|
snprintf(records_msg, sizeof(records_msg)-1, "%d%s", records, "x");
|
||||||
g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->RenderString (ChanName_X +icon_w + (icon_space*2), BoxStartY + box_pos + chanH, box_len,
|
g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->RenderString (ChanName_X +icon_w + (icon_space*2), BoxStartY + box_pos + chanH, box_len,
|
||||||
g_Zapit->getChannelName(rec_channel_id)/*ext_channel_name.c_str()*/, COL_INFOBAR, 0, true);
|
records_msg, COL_INFOBAR, 0, true);
|
||||||
} else {
|
} else {
|
||||||
frameBuffer->paintBackgroundBoxRel (ChanName_X , BoxStartY + box_pos, box_len + SHADOW_OFFSET, chanH + SHADOW_OFFSET);
|
frameBuffer->paintBackgroundBoxRel (ChanName_X , BoxStartY + box_pos, box_len + SHADOW_OFFSET, chanH + SHADOW_OFFSET);
|
||||||
}
|
}
|
||||||
|
@@ -531,7 +531,7 @@ bool CNeutrinoApp::showUserMenu(int button)
|
|||||||
menu_items++;
|
menu_items++;
|
||||||
menu_prev = SNeutrinoSettings::ITEM_RECORD;
|
menu_prev = SNeutrinoSettings::ITEM_RECORD;
|
||||||
keyhelper.get(&key,&icon,CRCInput::RC_red);
|
keyhelper.get(&key,&icon,CRCInput::RC_red);
|
||||||
#if 0 //NEW, show menu, how better ?
|
#if 1 //NEW, show menu, how better ?
|
||||||
menu_item = new CMenuForwarder(LOCALE_MAINMENU_RECORDING, true, NULL, CRecordManager::getInstance(), "-1", key, icon);
|
menu_item = new CMenuForwarder(LOCALE_MAINMENU_RECORDING, true, NULL, CRecordManager::getInstance(), "-1", key, icon);
|
||||||
#else //OLD, show start/stop chooser
|
#else //OLD, show start/stop chooser
|
||||||
menu_item = new CMenuOptionChooser(LOCALE_MAINMENU_RECORDING, &CRecordManager::getInstance()->recordingstatus,
|
menu_item = new CMenuOptionChooser(LOCALE_MAINMENU_RECORDING, &CRecordManager::getInstance()->recordingstatus,
|
||||||
|
Reference in New Issue
Block a user