Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[vdr] Re: Submenus in plugins



Jan Ekholm wrote:
> 
> Hi,
> 
> Anyone have any ideas for how plugins can use submenus? I'd like an
> menu structure that's arbitrarily deep, at least two submenus. Creating
> the initial menu for my plugin works well, my plugin just returns an
> object that subclasses cOsdMenu in the MainMenuAction() of the plugin.
> 
> The menu then processes keypresses in its ProcessKey() method, and that
> also works nicely. But when the user selects an item that is supposed to
> open a submenu, how should that be done? The submenu is also an instance
> of the same cOsdMenu as my "toplevel" menu. How is that submenu made to be
> the current one? My current code tries to do roughly this:
> 
> eOSState Menu::ProcessKey (eKeys key) {
>     switch () {
>     case kRight:
>         // find the submenu
>         Menu * submenu = ...;
> 
>         // display it
>         submenu->Display ();
> 
>         // continue with the OSD active
>         return osContinue;
>     }
> }
> 
> That seems to work somehow, but not really fully. Is this the proper way
> to do it, just call Display() for the submenus? What about closing a
> submenu. I want the user to be able to navigate up in the hierarchy by
> pressing kLeft. My current code tries to do this (insert into the same
> switch() above):
> 
>     case kLeft:
>        // does the current submenu have a parent?
>        if ( current_has_parent() ) {
>            // yes, find and activate
>            m_parent->Display()
>            return osContinue;
>        }
>        else {
>            // no parent, we're up back at our plugin's toplevel menu
>            Interface->Close();
>            return osEnd;
>        }
>        break;
> 
> But this does not work at all. I always end up having the normal faded OSD
> background remain on the screen, it never gets cleared away, not until VDR
> is restarted. So obvioulsy I do something that's wrong, but still not
> wrong enough to crash. What would be the proper way for a cOsdMenu to
> close the OSD? I've seen most plugins just return osEnd and be done with
> it. Another plugin I've done that uses a custom raw OSD display also
> returns osEnd from ProcessKey() and it works nicely.
> 
> Any hints?

Why don't you just take a look at the existing VDR code to see how it is
done there? ;-)

You should do something like this:

  return AddSubMenu(new cMyMenu(MyParameters...));

Klaus
-- 
_______________________________________________________________

Klaus Schmidinger                       Phone: +49-8635-6989-10
CadSoft Computer GmbH                   Fax:   +49-8635-6989-40
Hofmark 2                               Email:   kls@cadsoft.de
D-84568 Pleiskirchen, Germany           URL:     www.cadsoft.de
_______________________________________________________________


-- 
Info:
To unsubscribe send a mail to listar@linuxtv.org with "unsubscribe vdr" as subject.



Home | Main Index | Thread Index