mirror of
https://github.com/tuxbox-neutrino/neutrino.git
synced 2025-08-28 07:51:19 +02:00
481 lines
8.9 KiB
C++
481 lines
8.9 KiB
C++
/*
|
|
Neutrino-GUI - DBoxII-Project
|
|
|
|
Copyright (C) 2001 Steffen Hehn 'McClean'
|
|
Copyright (C) 2004 Martin Griep 'vivamiga'
|
|
Copyright (C) 2017 Sven Hoefer
|
|
|
|
License: GPL
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
#ifndef __epgplus__
|
|
#define __epgplus__
|
|
|
|
#include <gui/components/cc.h>
|
|
#include "widget/menue.h"
|
|
|
|
#include <string>
|
|
|
|
class CFrameBuffer;
|
|
class Font;
|
|
class CBouquetList;
|
|
class ConfigFile;
|
|
struct button_label;
|
|
|
|
class EpgPlus
|
|
{
|
|
//// types, inner classes
|
|
public:
|
|
enum SizeSettingID
|
|
{
|
|
EPGPlus_channelentry_width = 0,
|
|
EPGPlus_separationline_thickness,
|
|
NumberOfSizeSettings
|
|
};
|
|
|
|
struct SizeSetting
|
|
{
|
|
SizeSettingID settingID;
|
|
int size;
|
|
};
|
|
|
|
enum TViewMode
|
|
{
|
|
ViewMode_Stretch,
|
|
ViewMode_Scroll
|
|
};
|
|
|
|
enum TSwapMode
|
|
{
|
|
SwapMode_ByPage,
|
|
SwapMode_ByBouquet
|
|
};
|
|
|
|
class Footer;
|
|
|
|
class Header
|
|
{
|
|
//// construction / destruction
|
|
public:
|
|
Header(CFrameBuffer* frameBuffer,
|
|
int x,
|
|
int y,
|
|
int width);
|
|
|
|
~Header();
|
|
|
|
//// methods
|
|
public:
|
|
static void init();
|
|
|
|
void paint(const char * Name = NULL);
|
|
|
|
static int getUsedHeight();
|
|
|
|
//// attributes
|
|
public:
|
|
CFrameBuffer* frameBuffer;
|
|
|
|
int x;
|
|
int y;
|
|
int width;
|
|
|
|
static Font* font;
|
|
CComponentsHeader *head;
|
|
};
|
|
|
|
|
|
class TimeLine
|
|
{
|
|
//// construction / destruction
|
|
public:
|
|
TimeLine(CFrameBuffer* frameBuffer,
|
|
int x,
|
|
int y,
|
|
int width,
|
|
int startX,
|
|
int durationX);
|
|
|
|
~TimeLine();
|
|
|
|
//// methods
|
|
public:
|
|
static void init();
|
|
|
|
void paint(time_t startTime, int duration);
|
|
|
|
void paintMark(time_t startTime, int duration, int x, int width);
|
|
|
|
void paintGrid();
|
|
|
|
void clearMark();
|
|
|
|
static int getUsedHeight();
|
|
|
|
//// attributes
|
|
public:
|
|
CFrameBuffer* frameBuffer;
|
|
|
|
int currentDuration;
|
|
|
|
int x;
|
|
int y;
|
|
int width;
|
|
static int separationLineThickness;
|
|
|
|
static Font* font;
|
|
|
|
int startX;
|
|
int durationX;
|
|
};
|
|
|
|
class ChannelEventEntry
|
|
{
|
|
//// construction / destruction
|
|
public:
|
|
ChannelEventEntry(const CChannelEvent* channelEvent,
|
|
CFrameBuffer* frameBuffer,
|
|
TimeLine* timeLine,
|
|
Footer* footer,
|
|
int x,
|
|
int y,
|
|
int width);
|
|
|
|
~ChannelEventEntry();
|
|
|
|
//// methods
|
|
public:
|
|
static void init();
|
|
|
|
bool isSelected(time_t selectedTime) const;
|
|
|
|
void paint(bool isSelected, bool toggleColor);
|
|
|
|
static int getUsedHeight();
|
|
|
|
//// attributes
|
|
public:
|
|
CChannelEvent channelEvent;
|
|
|
|
CFrameBuffer* frameBuffer;
|
|
TimeLine* timeLine;
|
|
Footer* footer;
|
|
|
|
int x;
|
|
int y;
|
|
int width;
|
|
static int separationLineThickness;
|
|
|
|
static Font* font;
|
|
};
|
|
|
|
typedef std::vector<ChannelEventEntry*> TCChannelEventEntries;
|
|
|
|
class ChannelEntry
|
|
{
|
|
//// construction / destruction
|
|
public:
|
|
ChannelEntry(const CZapitChannel* channel,
|
|
int index,
|
|
CFrameBuffer* frameBuffer,
|
|
Footer* footer,
|
|
CBouquetList* bouquetList,
|
|
int x,
|
|
int y,
|
|
int width);
|
|
|
|
~ChannelEntry();
|
|
|
|
//// methods
|
|
public:
|
|
static void init();
|
|
|
|
void paint(bool isSelected, time_t selectedTime);
|
|
|
|
static int getUsedHeight();
|
|
|
|
//// attributes
|
|
public:
|
|
const CZapitChannel * channel;
|
|
std::string displayNumber;
|
|
std::string displayName;
|
|
int index;
|
|
|
|
CFrameBuffer* frameBuffer;
|
|
Footer* footer;
|
|
CBouquetList* bouquetList;
|
|
|
|
int x;
|
|
int y;
|
|
int width;
|
|
static int separationLineThickness;
|
|
|
|
static Font* font;
|
|
|
|
TCChannelEventEntries channelEventEntries;
|
|
CComponentsDetailsLine *detailsLine;
|
|
};
|
|
|
|
typedef std::vector<ChannelEntry*> TChannelEntries;
|
|
|
|
class Footer
|
|
{
|
|
//// construction / destruction
|
|
public:
|
|
Footer(CFrameBuffer* frameBuffer,
|
|
int x,
|
|
int y,
|
|
int width,
|
|
int height);
|
|
|
|
~Footer();
|
|
|
|
//// methods
|
|
public:
|
|
static void init();
|
|
|
|
void setBouquetChannelName(const std::string& newBouquetName, const std::string& newChannelName);
|
|
|
|
void paintEventDetails(const std::string& description, const std::string& shortDescription);
|
|
|
|
void paintButtons(button_label* buttonLabels, int numberOfButtons);
|
|
|
|
static int getUsedHeight();
|
|
|
|
//// attributes
|
|
public:
|
|
CFrameBuffer* frameBuffer;
|
|
|
|
int x;
|
|
int y;
|
|
int width;
|
|
|
|
int buttonY;
|
|
int buttonHeight;
|
|
|
|
static Font* fontBouquetChannelName;
|
|
static Font* fontEventDescription;
|
|
static Font* fontEventInfo1;
|
|
|
|
std::string currentBouquetName;
|
|
std::string currentChannelName;
|
|
};
|
|
|
|
class MenuTargetAddReminder : public CMenuTarget
|
|
{
|
|
public:
|
|
MenuTargetAddReminder(EpgPlus* epgPlus);
|
|
|
|
public:
|
|
int exec(CMenuTarget* parent, const std::string& actionKey);
|
|
|
|
private:
|
|
EpgPlus* epgPlus;
|
|
|
|
};
|
|
|
|
class MenuTargetAddRecordTimer : public CMenuTarget
|
|
{
|
|
public:
|
|
MenuTargetAddRecordTimer(EpgPlus* epgPlus);
|
|
|
|
public:
|
|
int exec(CMenuTarget* parent, const std::string& actionKey);
|
|
|
|
private:
|
|
EpgPlus* epgPlus;
|
|
|
|
};
|
|
|
|
class MenuTargetRefreshEpg : public CMenuTarget
|
|
{
|
|
public:
|
|
MenuTargetRefreshEpg(EpgPlus* epgPlus);
|
|
|
|
public:
|
|
int exec(CMenuTarget* parent, const std::string& actionKey);
|
|
|
|
private:
|
|
EpgPlus* epgPlus;
|
|
|
|
};
|
|
|
|
class MenuOptionChooserSwitchSwapMode : public CMenuOptionChooser
|
|
{
|
|
public:
|
|
MenuOptionChooserSwitchSwapMode(EpgPlus* epgPlus);
|
|
|
|
virtual ~MenuOptionChooserSwitchSwapMode();
|
|
|
|
public:
|
|
int exec(CMenuTarget* parent);
|
|
|
|
private:
|
|
EpgPlus* epgPlus;
|
|
int oldTimingMenuSettings;
|
|
TSwapMode oldSwapMode;
|
|
};
|
|
|
|
class MenuOptionChooserSwitchViewMode : public CMenuOptionChooser
|
|
{
|
|
public:
|
|
MenuOptionChooserSwitchViewMode(EpgPlus* epgPlus);
|
|
|
|
virtual ~MenuOptionChooserSwitchViewMode();
|
|
|
|
public:
|
|
int exec(CMenuTarget* parent);
|
|
|
|
private:
|
|
int oldTimingMenuSettings;
|
|
};
|
|
|
|
class MenuTargetSettings : public CMenuTarget
|
|
{
|
|
public:
|
|
MenuTargetSettings(EpgPlus* epgPlus);
|
|
|
|
public:
|
|
int exec(CMenuTarget* parent, const std::string& actionKey);
|
|
|
|
private:
|
|
EpgPlus* epgPlus;
|
|
};
|
|
|
|
typedef time_t DurationSetting;
|
|
|
|
/*
|
|
struct Settings
|
|
{
|
|
Settings(bool doInit = true);
|
|
|
|
virtual ~Settings();
|
|
|
|
FontSetting* fontSettings;
|
|
SizeSetting* sizeSettings;
|
|
DurationSetting durationSetting;
|
|
};
|
|
typedef std::map<int, Font*> Fonts;
|
|
typedef std::map<int, int> Sizes;
|
|
static Font * fonts[NumberOfFontSettings];
|
|
static int sizes[NumberOfSizeSettings];
|
|
*/
|
|
|
|
friend class EpgPlus::ChannelEventEntry;
|
|
friend class EpgPlus::ChannelEntry;
|
|
friend class EpgPlus::MenuOptionChooserSwitchSwapMode;
|
|
friend class EpgPlus::MenuOptionChooserSwitchViewMode;
|
|
|
|
//// construction / destruction
|
|
public:
|
|
EpgPlus();
|
|
~EpgPlus();
|
|
|
|
//// methods
|
|
public:
|
|
void init();
|
|
void free();
|
|
|
|
int exec(CChannelList* channelList, int selectedChannelIndex, CBouquetList* bouquetList);
|
|
|
|
private:
|
|
static std::string getTimeString(const time_t& time, const std::string& format);
|
|
|
|
TCChannelEventEntries::const_iterator getSelectedEvent() const;
|
|
|
|
void createChannelEntries(int selectedChannelEntryIndex);
|
|
void paint();
|
|
void paintChannelEntry(int position);
|
|
void hide();
|
|
|
|
//// properties
|
|
private:
|
|
CFrameBuffer* frameBuffer;
|
|
|
|
TChannelEntries displayedChannelEntries;
|
|
|
|
Header* header;
|
|
TimeLine* timeLine;
|
|
|
|
CChannelList* channelList;
|
|
CBouquetList* bouquetList;
|
|
|
|
Footer* footer;
|
|
|
|
ChannelEntry* selectedChannelEntry;
|
|
time_t selectedTime;
|
|
|
|
int channelListStartIndex;
|
|
int maxNumberOfDisplayableEntries; // maximal number of displayable entrys
|
|
static int channelNumberOffset;
|
|
|
|
time_t startTime;
|
|
time_t firstStartTime;
|
|
static time_t duration;
|
|
|
|
int entryHeight;
|
|
static int entryFontSize;
|
|
|
|
TViewMode currentViewMode;
|
|
TSwapMode currentSwapMode;
|
|
|
|
int headerX;
|
|
int headerY;
|
|
int headerWidth;
|
|
|
|
int usableScreenWidth;
|
|
int usableScreenHeight;
|
|
int usableScreenX;
|
|
int usableScreenY;
|
|
|
|
int timeLineX;
|
|
int timeLineY;
|
|
int timeLineWidth;
|
|
|
|
int bodyHeight;
|
|
|
|
int channelsTableX;
|
|
int channelsTableY;
|
|
static int channelsTableWidth;
|
|
int channelsTableHeight;
|
|
|
|
int eventsTableX;
|
|
int eventsTableY;
|
|
int eventsTableWidth;
|
|
int eventsTableHeight;
|
|
|
|
int sliderX;
|
|
int sliderY;
|
|
static int sliderWidth;
|
|
int sliderHeight;
|
|
|
|
int footerX;
|
|
int footerY;
|
|
int footerWidth;
|
|
|
|
bool refreshAll;
|
|
bool refreshFooterButtons;
|
|
};
|
|
|
|
class CEPGplusHandler : public CMenuTarget
|
|
{
|
|
public:
|
|
int exec(CMenuTarget* parent, const std::string &actionKey);
|
|
};
|
|
|
|
#endif // __epgplus__
|