summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSoeren Moch <smoch@web.de>2021-02-28 23:18:59 +0100
committerkamel5 <vdr.kamel5 (at) gmx (dot) net>2021-03-10 16:32:14 +0100
commitb249d2003fb6d02e8127b7744af2f2b09be8010e (patch)
tree756fae2cef5f8eb1752f3df9497e68370499f3c2
parent88dd896bf6843e7738f5457e8d990a947871ea9a (diff)
downloadskin-nopacity-b249d2003fb6d02e8127b7744af2f2b09be8010e.tar.gz
skin-nopacity-b249d2003fb6d02e8127b7744af2f2b09be8010e.tar.bz2
Convert menuItems from cList to std::vector
This allows to access menu items in arbitrary order. This is required to learn remote control keys in the remote plugin. Also clear Tabs when creating menu to avoid uninitialized use. Signed-off-by: Soeren Moch <smoch@web.de>
-rw-r--r--displaymenu.c155
-rw-r--r--displaymenu.h6
-rw-r--r--displaytracks.c17
-rw-r--r--displaytracks.h6
-rw-r--r--menuitem.h5
5 files changed, 92 insertions, 97 deletions
diff --git a/displaymenu.c b/displaymenu.c
index a97bc93..7056b75 100644
--- a/displaymenu.c
+++ b/displaymenu.c
@@ -17,12 +17,10 @@ cNopacityDisplayMenu::cNopacityDisplayMenu(cImageCache *imgCache) {
FadeTime = config.GetValue("menuFadeTime");
FrameTime = FadeTime / 10;
initial = true;
- initMenu = true;
diskUsageDrawn = false;
timersDrawn = false;
lastDiskUsageState = -1;
lastTimersState = -1;
- menuItemIndexLast = -1;
currentNumItems = 0;
detailView = NULL;
SetButtonPositions();
@@ -34,6 +32,7 @@ cNopacityDisplayMenu::cNopacityDisplayMenu(cImageCache *imgCache) {
menuView->DrawHeaderLogo();
menuView->DrawBorderDecoration();
currentFeed = 0;
+ SetTabs(0);
}
cNopacityDisplayMenu::~cNopacityDisplayMenu() {
@@ -41,7 +40,7 @@ cNopacityDisplayMenu::~cNopacityDisplayMenu() {
while (Active())
cCondWait::SleepMs(10);
delete menuView;
- menuItems.Clear();
+ menuItems.clear();
if (detailView) {
delete detailView;
}
@@ -211,9 +210,7 @@ void cNopacityDisplayMenu::Clear(void) {
delete detailView;
detailView = NULL;
}
- menuItemIndexLast = -1;
- initMenu = true;
- menuItems.Clear();
+ menuItems.clear();
}
void cNopacityDisplayMenu::SetMenuCategory(eMenuCategory MenuCategory) {
@@ -266,11 +263,7 @@ void cNopacityDisplayMenu::SetMenuCategory(eMenuCategory MenuCategory) {
void cNopacityDisplayMenu::SetTitle(const char *Title) {
//resetting menuitems if no call to clear
- if (!initMenu) {
- initMenu = true;
- menuItemIndexLast = -1;
- menuItems.Clear();
- }
+ menuItems.clear();
int left = 5;
menuView->DestroyHeaderIcon();
if (Title) {
@@ -369,9 +362,12 @@ bool cNopacityDisplayMenu::SetItemEvent(const cEvent *Event, int Index, bool Cur
if (!config.GetValue("narrowScheduleMenu"))
return false;
- if ((initMenu)&&(Index > menuItemIndexLast)) {
+ if ((int)menuItems.size() <= Index)
+ menuItems.resize(currentNumItems);
+ if (!menuItems[Index]) {
cNopacityMenuItem *item = new cNopacityScheduleMenuItem(osd, imgCache, Event, Channel, TimerMatch, Selectable, MenuCategory(), &videoWindowRect);
cPoint itemSize;
+ menuItems[Index].reset(item);
menuView->GetMenuItemSize(MenuCategory(), &itemSize);
item->SetFont(fontManager->menuItemSchedule);
item->SetFontSmall(fontManager->menuItemScheduleSmall);
@@ -389,9 +385,7 @@ bool cNopacityDisplayMenu::SetItemEvent(const cEvent *Event, int Index, bool Cur
}
item->CreatePixmapStatic();
item->CreatePixmapTextScroller(textWidth);
- menuItems.Add(item);
item->Render();
- menuItemIndexLast = Index;
if (initial) {
if (FadeTime) {
item->SetAlpha(0);
@@ -400,7 +394,7 @@ bool cNopacityDisplayMenu::SetItemEvent(const cEvent *Event, int Index, bool Cur
}
}
} else {
- cNopacityMenuItem *item = menuItems.Get(Index);
+ cNopacityMenuItem *item = menuItems[Index].get();
item->SetCurrent(Current);
item->Render();
}
@@ -410,9 +404,12 @@ bool cNopacityDisplayMenu::SetItemEvent(const cEvent *Event, int Index, bool Cur
bool cNopacityDisplayMenu::SetItemTimer(const cTimer *Timer, int Index, bool Current, bool Selectable) {
if (!config.GetValue("narrowTimerMenu"))
return false;
- if ((initMenu)&&(Index > menuItemIndexLast)) {
+ if ((int)menuItems.size() <= Index)
+ menuItems.resize(currentNumItems);
+ if (!menuItems[Index]) {
cNopacityMenuItem *item = new cNopacityTimerMenuItem(osd, imgCache, Timer, Selectable, &videoWindowRect);
cPoint itemSize;
+ menuItems[Index].reset(item);
menuView->GetMenuItemSize(MenuCategory(), &itemSize);
item->SetFont(fontManager->menuItemTimers);
item->SetFontSmall(fontManager->menuItemTimersSmall);
@@ -430,9 +427,7 @@ bool cNopacityDisplayMenu::SetItemTimer(const cTimer *Timer, int Index, bool Cur
}
item->CreatePixmapStatic();
item->CreatePixmapTextScroller(textWidth);
- menuItems.Add(item);
item->Render();
- menuItemIndexLast = Index;
if (initial) {
if (FadeTime) {
item->SetAlpha(0);
@@ -441,7 +436,7 @@ bool cNopacityDisplayMenu::SetItemTimer(const cTimer *Timer, int Index, bool Cur
}
}
} else {
- cNopacityMenuItem *item = menuItems.Get(Index);
+ cNopacityMenuItem *item = menuItems[Index].get();
item->SetCurrent(Current);
item->Render();
}
@@ -451,9 +446,12 @@ bool cNopacityDisplayMenu::SetItemTimer(const cTimer *Timer, int Index, bool Cur
bool cNopacityDisplayMenu::SetItemChannel(const cChannel *Channel, int Index, bool Current, bool Selectable, bool WithProvider) {
if (!config.GetValue("narrowChannelMenu"))
return false;
- if ((initMenu)&&(Index > menuItemIndexLast)) {
+ if ((int)menuItems.size() <= Index)
+ menuItems.resize(currentNumItems);
+ if (!menuItems[Index]) {
cNopacityMenuItem *item = new cNopacityChannelMenuItem(osd, imgCache, Channel, Selectable, &videoWindowRect);
cPoint itemSize;
+ menuItems[Index].reset(item);
menuView->GetMenuItemSize(MenuCategory(), &itemSize);
item->SetFont(fontManager->menuItemChannel);
item->SetFontSmall(fontManager->menuItemChannelSmall);
@@ -470,9 +468,7 @@ bool cNopacityDisplayMenu::SetItemChannel(const cChannel *Channel, int Index, bo
if (config.GetValue("displayType") == dtGraphical) {
item->CreatePixmapForeground();
}
- menuItems.Add(item);
item->Render();
- menuItemIndexLast = Index;
if (initial) {
if (FadeTime) {
item->SetAlpha(0);
@@ -481,7 +477,7 @@ bool cNopacityDisplayMenu::SetItemChannel(const cChannel *Channel, int Index, bo
}
}
} else {
- cNopacityMenuItem *item = menuItems.Get(Index);
+ cNopacityMenuItem *item = menuItems[Index].get();
item->SetCurrent(Current);
item->Render();
}
@@ -492,12 +488,15 @@ bool cNopacityDisplayMenu::SetItemRecording(const cRecording *Recording, int Ind
int Level, int Total, int New) {
if (!config.GetValue("narrowRecordingMenu"))
return false;
- if ((initMenu)&&(Index > menuItemIndexLast)) {
+ if ((int)menuItems.size() <= Index)
+ menuItems.resize(currentNumItems);
+ if (!menuItems[Index]) {
bool isFolder = false;
if (Total > 0)
isFolder = true;
cNopacityMenuItem *item = new cNopacityRecordingMenuItem(osd, imgCache, Recording, Selectable, isFolder, Level, Total, New, &videoWindowRect);
cPoint itemSize;
+ menuItems[Index].reset(item);
menuView->GetMenuItemSize(MenuCategory(), &itemSize);
item->SetFont(fontManager->menuItemRecordings);
item->SetFontSmall(fontManager->menuItemRecordingsSmall);
@@ -516,9 +515,7 @@ bool cNopacityDisplayMenu::SetItemRecording(const cRecording *Recording, int Ind
if (config.GetValue("displayType") == dtGraphical) {
item->CreatePixmapForeground();
}
- menuItems.Add(item);
item->Render();
- menuItemIndexLast = Index;
if (initial) {
if (FadeTime) {
item->SetAlpha(0);
@@ -527,7 +524,7 @@ bool cNopacityDisplayMenu::SetItemRecording(const cRecording *Recording, int Ind
}
}
} else {
- cNopacityMenuItem *item = menuItems.Get(Index);
+ cNopacityMenuItem *item = menuItems[Index].get();
item->SetCurrent(Current);
item->Render();
}
@@ -546,61 +543,47 @@ void cNopacityDisplayMenu::SetItem(const char *Text, int Index, bool Current, bo
tabItems[i+MaxTabs] = 0;
}
SplitItem(Text, strItems, tabItems);
- if (initMenu) {
- if (Index > menuItemIndexLast) {
- cNopacityMenuItem *item;
- cPoint itemSize;
- if (((MenuCategory() == mcMain)&&(config.GetValue("narrowMainMenu"))) || ((MenuCategory() == mcSetup)&&(config.GetValue("narrowSetupMenu")))){
- MainOrSetup = true;
- bool isSetup = (MenuCategory() == mcSetup)?true:false;
- item = new cNopacityMainMenuItem(osd, imgCache, Text, Selectable, isSetup);
- menuView->GetMenuItemSize(MenuCategory(), &itemSize);
- item->SetFont(fontManager->menuItemLarge);
- if (config.GetValue("useMenuIcons"))
- hasIcons = true;
- } else {
- item = new cNopacityDefaultMenuItem(osd, imgCache, Text, Selectable);
- menuView->GetMenuItemSize(mcUnknown, &itemSize);
- item->SetFont(fontManager->menuItemDefault);
- }
- int spaceTop = menuView->GetMenuTop(currentNumItems, itemSize.Y());
- item->SetGeometry(Index, spaceTop, menuView->GetMenuItemLeft(itemSize.X()), itemSize.X(), itemSize.Y(), geoManager->menuSpace);
- item->SetCurrent(Current);
- item->SetTabs(strItems, tabItems, MaxTabs);
- item->CreateText();
- int textWidth = item->CheckScrollable(hasIcons);
- item->CreatePixmapBackground();
- if (config.GetValue("displayType") == dtGraphical && MainOrSetup) {
- item->CreatePixmapForeground();
- }
- item->CreatePixmapStatic();
- if (textWidth > 0)
- item->CreatePixmapTextScroller(textWidth);
- menuItems.Add(item);
- item->Render();
- menuItemIndexLast = Index;
- if (initial) {
- if (FadeTime) {
- item->SetAlpha(0);
- item->SetAlphaIcon(0);
- item->SetAlphaText(0);
- }
- }
+ if ((int)menuItems.size() <= Index)
+ menuItems.resize(MaxItems());
+ menuItems[Index].reset();
+ if (*Text != '\0') {
+ cNopacityMenuItem *item;
+ cPoint itemSize;
+ if (((MenuCategory() == mcMain)&&(config.GetValue("narrowMainMenu"))) || ((MenuCategory() == mcSetup)&&(config.GetValue("narrowSetupMenu")))){
+ MainOrSetup = true;
+ bool isSetup = (MenuCategory() == mcSetup)?true:false;
+ item = new cNopacityMainMenuItem(osd, imgCache, Text, Selectable, isSetup);
+ menuItems[Index].reset(item);
+ menuView->GetMenuItemSize(MenuCategory(), &itemSize);
+ item->SetFont(fontManager->menuItemLarge);
+ if (config.GetValue("useMenuIcons"))
+ hasIcons = true;
} else {
- //adjust Current if item was added twice
- cNopacityMenuItem *item = menuItems.Get(Index);
- item->SetCurrent(Current);
- item->Render();
+ item = new cNopacityDefaultMenuItem(osd, imgCache, Text, Selectable);
+ menuItems[Index].reset(item);
+ menuView->GetMenuItemSize(mcUnknown, &itemSize);
+ item->SetFont(fontManager->menuItemDefault);
}
- } else {
- //redraw item when switching through menu
- cNopacityMenuItem *item = menuItems.Get(Index);
- if (item) {
- item->SetTabs(strItems, tabItems, MaxTabs);
- item->SetCurrent(Current);
- if ((MenuCategory() != mcMain) && (MenuCategory() != mcSetup))
- item->CheckScrollable(false);
- item->Render();
+ int spaceTop = menuView->GetMenuTop(currentNumItems, itemSize.Y());
+ item->SetGeometry(Index, spaceTop, menuView->GetMenuItemLeft(itemSize.X()), itemSize.X(), itemSize.Y(), geoManager->menuSpace);
+ item->SetCurrent(Current);
+ item->SetTabs(strItems, tabItems, MaxTabs);
+ item->CreateText();
+ int textWidth = item->CheckScrollable(hasIcons);
+ item->CreatePixmapBackground();
+ if (config.GetValue("displayType") == dtGraphical && MainOrSetup) {
+ item->CreatePixmapForeground();
+ }
+ item->CreatePixmapStatic();
+ if (textWidth > 0)
+ item->CreatePixmapTextScroller(textWidth);
+ item->Render();
+ if (initial) {
+ if (FadeTime) {
+ item->SetAlpha(0);
+ item->SetAlphaIcon(0);
+ item->SetAlphaText(0);
+ }
}
}
SetEditableWidth(menuView->GetEditableWidth());
@@ -713,7 +696,6 @@ void cNopacityDisplayMenu::Flush(void) {
if (FadeTime)
Start();
}
- initMenu = false;
initial = false;
osd->Flush();
cDevice::PrimaryDevice()->ScaleVideo(videoWindowRect);
@@ -727,10 +709,13 @@ void cNopacityDisplayMenu::Action(void) {
double t = std::min(double(Now - Start) / FadeTime, 1.0);
int Alpha = t * ALPHA_OPAQUE;
menuView->SetPixmapAlpha(Alpha);
- for (cNopacityMenuItem *item = menuItems.First(); Running() && item; item = menuItems.Next(item)) {
- item->SetAlpha(Alpha);
- item->SetAlphaIcon(Alpha);
- item->SetAlphaText(Alpha);
+ for (auto i = menuItems.begin(); i != menuItems.end(); ++i) {
+ if (*i && Running()) {
+ cNopacityMenuItem *item = i->get();
+ item->SetAlpha(Alpha);
+ item->SetAlphaIcon(Alpha);
+ item->SetAlphaText(Alpha);
+ }
}
for (cNopacityTimer *t = timers.First(); Running() && t; t = timers.Next(t))
t->SetAlpha(Alpha);
diff --git a/displaymenu.h b/displaymenu.h
index a90e2ce..e08b6f0 100644
--- a/displaymenu.h
+++ b/displaymenu.h
@@ -4,6 +4,8 @@
#include "nopacity.h"
#include "menuitem.h"
#include <vdr/thread.h>
+#include <memory>
+#include <vector>
class cNopacityDisplayMenu : public cSkinDisplayMenu , cThread {
private:
@@ -15,15 +17,13 @@ private:
int FrameTime;
int FadeTime;
bool initial;
- bool initMenu;
bool diskUsageDrawn;
int lastDiskUsageState;
int lastTimersState;
bool timersDrawn;
- int menuItemIndexLast;
int currentNumItems;
cList<cNopacityTimer> timers;
- cList<cNopacityMenuItem> menuItems;
+ std::vector<std::unique_ptr<cNopacityMenuItem>> menuItems;
int positionButtons[4];
cRect videoWindowRect;
int currentFeed;
diff --git a/displaytracks.c b/displaytracks.c
index f403e26..536e85b 100644
--- a/displaytracks.c
+++ b/displaytracks.c
@@ -26,7 +26,7 @@ cNopacityDisplayTracks::~cNopacityDisplayTracks() {
osd->DestroyPixmap(pixmapContainer);
osd->DestroyPixmap(pixmapHeader);
osd->DestroyPixmap(pixmapHeaderAudio);
- menuItems.Clear();
+ menuItems.clear();
delete osd;
}
@@ -118,6 +118,9 @@ void cNopacityDisplayTracks::DrawHeader(const char *Title) {
void cNopacityDisplayTracks::SetItem(const char *Text, int Index, bool Current) {
cNopacityMenuItem *item;
item = new cNopacityTrackMenuItem(osd, imgCache, Text);
+ if ((int)menuItems.size() <= Index)
+ menuItems.resize(Index+4);
+ menuItems[Index].reset(item);
item->SetCurrent(Current);
item->SetFont(fontManager->trackText);
item->SetGeometry(Index, menuItemHeight+4, 2, menuItemWidth, menuItemHeight, 4);
@@ -125,18 +128,17 @@ void cNopacityDisplayTracks::SetItem(const char *Text, int Index, bool Current)
item->CreatePixmapStatic();
if (config.GetValue("displayType") == dtGraphical)
item->CreatePixmapForeground();
- menuItems.Add(item);
item->Render();
}
void cNopacityDisplayTracks::SetTrack(int Index, const char * const *Tracks) {
cNopacityMenuItem *item;
if (currentIndex >= 0) {
- item = menuItems.Get(currentIndex);
+ item = menuItems[currentIndex].get();
item->SetCurrent(false);
item->Render();
}
- item = menuItems.Get(Index);
+ item = menuItems[Index].get();
item->SetCurrent(true);
item->Render();
currentIndex = Index;
@@ -183,8 +185,11 @@ void cNopacityDisplayTracks::Action(void) {
pixmapContainer->SetAlpha(Alpha);
pixmapHeader->SetAlpha(Alpha);
pixmapHeaderAudio->SetAlpha(Alpha);
- for (cNopacityMenuItem *item = menuItems.First(); Running() && item; item = menuItems.Next(item)) {
- item->SetAlpha(Alpha);
+ for (auto i = menuItems.begin(); i != menuItems.end(); ++i) {
+ if (*i && Running()) {
+ cNopacityMenuItem *item = i->get();
+ item->SetAlpha(Alpha);
+ }
}
cPixmap::Unlock();
if (Running())
diff --git a/displaytracks.h b/displaytracks.h
index 05c5596..0442b9a 100644
--- a/displaytracks.h
+++ b/displaytracks.h
@@ -4,6 +4,8 @@
#include <vdr/skins.h>
#include <vdr/thread.h>
#include "menuitem.h"
+#include <memory>
+#include <vector>
class cNopacityDisplayTracks : public cSkinDisplayTracks, cThread {
private:
@@ -22,7 +24,7 @@ private:
cPixmap *pixmapHeader;
cPixmap *pixmapHeaderAudio;
cPixmap *pixmapIcon;
- cList<cNopacityMenuItem> menuItems;
+ std::vector<std::unique_ptr<cNopacityMenuItem>> menuItems;
virtual void Action(void);
void SetItem(const char *Text, int Index, bool Current);
void SetGeometry(void);
@@ -37,4 +39,4 @@ public:
};
-#endif //__NOPACITY_DISPLAYTRACKS_H \ No newline at end of file
+#endif //__NOPACITY_DISPLAYTRACKS_H
diff --git a/menuitem.h b/menuitem.h
index 536a77e..aaefb19 100644
--- a/menuitem.h
+++ b/menuitem.h
@@ -5,7 +5,7 @@
#include <string>
#include "imagecache.h"
-class cNopacityMenuItem : public cListObject, public cThread {
+class cNopacityMenuItem : public cThread {
protected:
cOsd *osd;
cImageCache *imgCache;
@@ -64,6 +64,9 @@ public:
virtual void Render() = 0;
};
+// avoid confusion between vdr swap() and std::swap() for std::unique_ptr<cNopacityMenuItem>
+inline void swap(cNopacityMenuItem*& a, cNopacityMenuItem*& b) {std::swap(a,b);}
+
class cNopacityMainMenuItem : public cNopacityMenuItem {
private:
bool isSetup;