Hi,

today many TV equipment offers online help, even my remote does ;)
VDR currently only gives help by manuals or WIKI, but this is far away every time you need it, i.e. if you whatch TV. So I was wondering if it would be interesting to add online help for VDR with the following requirements:

- a dedicated key should give help in any situations (-> kHelp)
- help may be available per OSD item, or - if not present - per OSD menu
  (e.g. some setup values could give an extra explanation)
- help may be available for all player controls
  (e.g. I'll never keep in mind the keys for the dvd-plugin ;) )
- the implementation should also work for plugins

What do you (especially Klaus) think about an online help?

I've added a quick and dirty patch, that adds the basics for an online help. With the patch the implemenation of an online help works like this:

To add help to an OSD item, simply replace for example

Add(new cMenuEditItem(tr("an osd item"), &data.value));

with

cOsdItem* item = new cMenuEditItem(tr("an osd item"), &data.value);
Add(item);
item->SetOnlineHelp(tr("Help for item"));

To add help for an OSD menu add the following line to the contructor:

SetOnlineHelp(tr("Help for this menu"));

The same for an object derived from cControl.

Whenever the user presses the 'Help' key he gets a simple text menu with the online help.

I've already added online help to epgsearch's setup previously, but I think it would be better if there was core support in VDR for this and a common implementation.

The patch really needs some refinement (especially the part in vdr.c), but it should only serve as a starting point for a discussion.

BR,

Christian




diff -Nru --exclude PLUGINS vdr-1.5.6/keys.c vdr-1.5.6-patched/keys.c
--- vdr-1.5.6/keys.c	2006-10-14 12:18:05.000000000 +0200
+++ vdr-1.5.6-patched/keys.c	2007-08-12 11:23:05.000000000 +0200
@@ -64,6 +64,7 @@
                     { kUser7,         "User7"      },
                     { kUser8,         "User8"      },
                     { kUser9,         "User9"      },
+                    { kHelp,          "Help"       },
                     { kNone,          ""           },
                     { k_Setup,        "_Setup"     },
                     { kNone,          NULL         },
diff -Nru --exclude PLUGINS vdr-1.5.6/keys.h vdr-1.5.6-patched/keys.h
--- vdr-1.5.6/keys.h	2007-02-25 11:49:35.000000000 +0100
+++ vdr-1.5.6-patched/keys.h	2007-08-12 11:05:50.000000000 +0200
@@ -50,6 +50,7 @@
              kSetup,
              kCommands,
              kUser1, kUser2, kUser3, kUser4, kUser5, kUser6, kUser7, kUser8, kUser9,
+	     kHelp,
              kNone,
              kKbd,
              // The following codes are used internally:
diff -Nru --exclude PLUGINS vdr-1.5.6/osdbase.c vdr-1.5.6-patched/osdbase.c
--- vdr-1.5.6/osdbase.c	2007-06-09 12:07:46.000000000 +0200
+++ vdr-1.5.6-patched/osdbase.c	2007-08-12 13:38:00.000000000 +0200
@@ -13,6 +13,7 @@
 #include "i18n.h"
 #include "remote.h"
 #include "status.h"
+#include "menu.h"
 
 // --- cOsdItem --------------------------------------------------------------
 
@@ -22,6 +23,7 @@
   state = State;
   selectable = true;
   fresh = true;
+  help = NULL;
 }
 
 cOsdItem::cOsdItem(const char *Text, eOSState State, bool Selectable)
@@ -30,12 +32,14 @@
   state = State;
   selectable = Selectable;
   fresh = true;
+  help = NULL;
   SetText(Text);
 }
 
 cOsdItem::~cOsdItem()
 {
   free(text);
+  free(help);
 }
 
 void cOsdItem::SetText(const char *Text, bool Copy)
@@ -54,6 +58,12 @@
   fresh = Fresh;
 }
 
+void cOsdItem::SetOnlineHelp(const char *Help, bool Copy)
+{
+  free(help);
+  help = Copy ? strdup(Help) : (char *)Help; // help assumes ownership!
+}
+
 eOSState cOsdItem::ProcessKey(eKeys Key)
 {
   return Key == kOk ? state : osUnknown;
@@ -67,6 +77,12 @@
      ((cOsdMenu *)this)->Display();
 }
 
+void cOsdObject::SetOnlineHelp(const char *Help, bool Copy)
+{
+  free(help);
+  help = Copy ? strdup(Help) : (char *)Help; // help assumes ownership!
+}
+
 // --- cOsdMenu --------------------------------------------------------------
 
 cSkinDisplayMenu *cOsdMenu::displayMenu = NULL;
@@ -447,6 +463,18 @@
      }
 }
 
+eOSState cOsdMenu::Help(void)
+{
+  const char* Help = OnlineHelp();
+  cOsdItem *item = Get(current);
+  if (item && item->OnlineHelp())
+    Help = item->OnlineHelp();
+  if (Help)
+    return AddSubMenu(new cMenuText(tr("Help"), Help));
+  else
+    return osUnknown;
+}
+
 eOSState cOsdMenu::HotKey(eKeys Key)
 {
   for (cOsdItem *item = First(); item; item = Next(item)) {
@@ -517,6 +545,7 @@
                    marked = -1;
                    break;
                    }
+    case kHelp: return Help();
                 // else run into default
     default: if (marked < 0)
                 return osUnknown;
diff -Nru --exclude PLUGINS vdr-1.5.6/osdbase.h vdr-1.5.6-patched/osdbase.h
--- vdr-1.5.6/osdbase.h	2007-06-09 13:49:00.000000000 +0200
+++ vdr-1.5.6-patched/osdbase.h	2007-08-12 14:00:43.000000000 +0200
@@ -51,6 +51,7 @@
   char *text;
   eOSState state;
   bool selectable;
+  char *help;
 protected:
   bool fresh;
 public:
@@ -61,7 +62,9 @@
   void SetText(const char *Text, bool Copy = true);
   void SetSelectable(bool Selectable);
   void SetFresh(bool Fresh);
+  void SetOnlineHelp(const char *Help, bool Copy = true);
   const char *Text(void) { return text; }
+  const char *OnlineHelp(void) { return help; }
   virtual void Set(void) {}
   virtual eOSState ProcessKey(eKeys Key);
   };
@@ -71,15 +74,18 @@
 private:
   bool isMenu;
   bool needsFastResponse;
+  char *help;
 protected:
   void SetNeedsFastResponse(bool NeedsFastResponse) { needsFastResponse = NeedsFastResponse; }
 public:
-  cOsdObject(bool FastResponse = false) { isMenu = false; needsFastResponse = FastResponse; }
-  virtual ~cOsdObject() {}
+  cOsdObject(bool FastResponse = false) { isMenu = false; needsFastResponse = FastResponse; help = NULL; }
+  virtual ~cOsdObject() { free(help); }
   virtual bool NeedsFastResponse(void) { return needsFastResponse; }
   bool IsMenu(void) { return isMenu; }
   virtual void Show(void);
   virtual eOSState ProcessKey(eKeys Key) { return osUnknown; }
+  virtual void SetOnlineHelp(const char *Help, bool Copy = true);
+  const char *OnlineHelp(void) { return help; }
   };
 
 class cOsdMenu : public cOsdObject, public cList<cOsdItem> {
@@ -120,6 +126,7 @@
   void SetTitle(const char *Title);
   void SetHelp(const char *Red, const char *Green = NULL, const char *Yellow = NULL, const char *Blue = NULL);
   virtual void Del(int Index);
+  virtual eOSState Help(void);
 public:
   cOsdMenu(const char *Title, int c0 = 0, int c1 = 0, int c2 = 0, int c3 = 0, int c4 = 0);
   virtual ~cOsdMenu();
diff -Nru --exclude PLUGINS vdr-1.5.6/player.c vdr-1.5.6-patched/player.c
--- vdr-1.5.6/player.c	2007-07-20 17:25:24.000000000 +0200
+++ vdr-1.5.6-patched/player.c	2007-08-12 13:49:24.000000000 +0200
@@ -9,6 +9,7 @@
 
 #include "player.h"
 #include "i18n.h"
+#include "menu.h"
 
 // --- cPlayer ---------------------------------------------------------------
 
@@ -94,3 +95,12 @@
   control = NULL;
   delete c;
 }
+
+cOsdObject *cControl::Help(void)
+{
+  const char* Help = OnlineHelp();
+  if (Help)
+    return new cMenuText(tr("Help"), Help);
+  else
+    return NULL;
+}
diff -Nru --exclude PLUGINS vdr-1.5.6/player.h vdr-1.5.6-patched/player.h
--- vdr-1.5.6/player.h	2006-01-06 12:29:27.000000000 +0100
+++ vdr-1.5.6-patched/player.h	2007-08-12 13:48:50.000000000 +0200
@@ -78,6 +78,7 @@
   static void Attach(void);
   static void Shutdown(void);
   static cControl *Control(void);
+  virtual cOsdObject *Help(void);
   };
 
 #endif //__PLAYER_H
diff -Nru --exclude PLUGINS vdr-1.5.6/vdr.c vdr-1.5.6-patched/vdr.c
--- vdr-1.5.6/vdr.c	2007-07-22 13:40:01.000000000 +0200
+++ vdr-1.5.6-patched/vdr.c	2007-08-12 13:54:35.000000000 +0200
@@ -923,8 +923,18 @@
                      cRemote::Put(kSchedule, true);
                      }
                   }
-               }
+	  }
+               break;
+          // Help:
+          case kHelp: 
+                  if (cControl::Control()) {
+                     cControl::Control()->Hide();
+                     Menu = cControl::Control()->Help();
+                     if (Menu)
+                        Menu->Show();
+                     }	  
                break;
+	       
           // Direct main menu functions:
           #define DirectMainFunction(function)\
             DELETE_MENU;\
_______________________________________________
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr

Reply via email to