summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLarsAC <LarsAC@e10066b5-e1e2-0310-b819-94efdf66514b>2004-02-08 10:48:44 +0000
committerLarsAC <LarsAC@e10066b5-e1e2-0310-b819-94efdf66514b>2004-02-08 10:48:44 +0000
commita6cd0e97d915a7e5fcb3db6fd25eaac624b03d57 (patch)
treeb7f566dca8eec3e8ddb21b189bb23b57273efa24
parentcda41f99d3dcf6b5a3d2a341d95db58c53b0d932 (diff)
downloadvdr-plugin-muggle-a6cd0e97d915a7e5fcb3db6fd25eaac624b03d57.tar.gz
vdr-plugin-muggle-a6cd0e97d915a7e5fcb3db6fd25eaac624b03d57.tar.bz2
Made major revisions in OSD behavior
git-svn-id: https://vdr-muggle.svn.sourceforge.net/svnroot/vdr-muggle/trunk@30 e10066b5-e1e2-0310-b819-94efdf66514b
-rw-r--r--muggle-plugin/menu.txt117
-rw-r--r--muggle-plugin/vdr_menu.c446
-rw-r--r--muggle-plugin/vdr_menu.h21
3 files changed, 295 insertions, 289 deletions
diff --git a/muggle-plugin/menu.txt b/muggle-plugin/menu.txt
index 08c7b2e..57f0049 100644
--- a/muggle-plugin/menu.txt
+++ b/muggle-plugin/menu.txt
@@ -1,76 +1,73 @@
-PLAYLIST
----------
-OK --// should start playing in the future
-BACK --
-
-UP select previous item (VDR-mechanism)
-DOWN select next item (VDR-mechanism)
-LEFT selection pg-up (VDR-mechanism)
-RIGHT selection pg-down (VDR-mechanism)
-
-RED ==>display Tracklist(current filter setting)
-GREEN ==>DisplayFilter
-Yellow ==>DisplayTrackInfo(current)
-Blue ==>DisplayTree( m_root )
-
-FILTER
----------
-
-
-
TREE
---------
-OK Leaf: ==>DisplayTrackInfo( leaf )
+OK Leaf: ==>DisplayTrackInfo( leaf ) // TODO
Node: ==> DisplayTree( child ); // expand
BACK ==> DisplayTree( parent ); // collapse
+ ==> on root: return to VDR main menu
UP select previous item (VDR-mechanism)
-DOWN select next item (VDR-mechanism)
-LEFT selection pg-up (VDR-mechanism)
-RIGHT selection pg-down (VDR-mechanism)
+DOWN select next item (VDR-mechanism)
+LEFT selection pg-up (VDR-mechanism)
+RIGHT selection pg-down (VDR-mechanism)
RED add all tracks under currently highlighted node to playlist
-GREEN ==>DisplayFilter
-YELLOW ==>DisplayPlaylist();
-BLUE --
- // Should be in the future: Collapse all and goto default View
-
-
-TRACKS (Tracklist)
-------------------
- // Andi, ich kapier es nicht. Was unterscheidet Tracks from Tree?
- // IMHO ist Tracks eine Sonderform von Tree, der nur Leaves hat, oder?
-OK DisplayTrackInfo(current)
-BACK ==> DisplayTree( parent ); // collapse
+GREEN ==>Switch to next tree view(TODO?)
+YELLOW ==>Cycle to playlist view
+BLUE ==>Enter tree view submenu
-UP select previous item (VDR-mechanism)
-DOWN select next item (VDR-mechanism)
-LEFT selection pg-up (VDR-mechanism)
-RIGHT selection pg-down (VDR-mechanism)
+PLAYLIST
+---------
+OK -- // should start playing in the future
+BACK --
-RED add currend item to playlist
-GREEN ==>DisplayFilter
-YELLOW ==>DisplayPlaylist();
-BLUE ==>DisplayTree(root)
+UP select previous item (VDR-mechanism)
+DOWN select next item (VDR-mechanism)
+LEFT selection pg-up (VDR-mechanism)
+RIGHT selection pg-down (VDR-mechanism)
-TRACKINFO (previous == TREE || previous == TRACKS )
-------------------
-OK PlayItem
-BACK go to previous view (==> DisplayTracklist || ==>DisplayTree )
+RED ==>Edit playlist (mark/move, VDR mechanism) TODO
+GREEN ==>Playlist -> Track info -> Album info -> Playlist
+YELLOW ==>Cycle to filter view
+BLUE ==>Playlist submenu
-RED add currend item to playlist
-GREEN ==>DisplayFilter
-YELLOW ==>DisplayPlaylist();
-BLUE --
+TRACKINFO (TODO)
+---------
+OK PlayItem (jump/skip to item? useful choice?)
+BACK go to previous view (?)
-TRACKINFO (previous == playlist )
-------------------
-OK PlayItem
-BACK ==>DisplayPlaylist();
+RED ??
+GREEN ==>Album info (TODO)
+YELLOW ==>Cycle to filter view
+BLUE ==>Playlist submenu
-RED --
-GREEN ==>DisplayFilter
-YELLOW ==>DisplayPlaylist(); // also on back
-BLUE --
+ALBUMINFO
+---------
+OK PlayItem (track? album?)
+BACK ==>DisplayPlaylist(); (?)
+RED ??
+GREEN ==>Cycle to playlist view
+YELLOW ==>Cycle to filter view
+BLUE ==>Playlist submenu
+FILTER
+------
+OK Confirm entry (really? VDR mechanism)
+BACK ?
+
+UP Previous filter entry (VDR mechanism)
+DOWN Next filter entry (VDR mechanism)
+
+RED Perform query, display according to view type entry (TODO)
+GREEN ==>Load other filter
+YELLOW ==>Cycle to tree view
+BLUE ==>Filter submenu
+
+/************************************************************
+ *
+ * $Log: menu.txt,v $
+ * Revision 1.3 2004/02/08 10:48:44 LarsAC
+ * Made major revisions in OSD behavior
+ *
+ *
+ ************************************************************/
diff --git a/muggle-plugin/vdr_menu.c b/muggle-plugin/vdr_menu.c
index 4699bb8..317a647 100644
--- a/muggle-plugin/vdr_menu.c
+++ b/muggle-plugin/vdr_menu.c
@@ -2,12 +2,12 @@
/*! \file vdr_menu.c
* \brief Implements menu handling for broswing media libraries within VDR
********************************************************************
- * \version $Revision: 1.11 $
- * \date $Date: 2004/02/03 21:53:32 $
+ * \version $Revision: 1.12 $
+ * \date $Date: 2004/02/08 10:48:44 $
* \author Ralf Klueber, Lars von Wedel, Andreas Kellner
- * \author file owner: $Author: RaK $
+ * \author file owner: $Author: LarsAC $
*
- * $Id: vdr_menu.c,v 1.11 2004/02/03 21:53:32 RaK Exp $
+ * $Id: vdr_menu.c,v 1.12 2004/02/08 10:48:44 LarsAC Exp $
*/
/*******************************************************************/
@@ -105,144 +105,36 @@ void mgMainMenu::SetButtons( )
if( m_state == TREE )
{
- SetHelp( "Add", "Filter", "Playlist", "Change View" );
+ SetHelp( "Add", "Cycle tree", "Playlist", "Submenu" );
}
else if( m_state == PLAYLIST )
{
- SetHelp( "Tracks", "Filter", "Edit PL", "Tree" );
+ SetHelp( "Edit PL", "Track info", "Filter", "Submenu" );
}
else if( m_state == PLAYLIST_TRACKINFO )
{
- SetHelp( "Play/Pause", "Album Info", "Filter", "Tree" );
+ SetHelp( "Edit PL?", "Album info", "Filter", "Submenu" );
}
else if( m_state == PLAYLIST_ALBUMINFO )
{
- SetHelp( "Play/Pause", "Filter", "Playlist", "Tree" );
+ SetHelp( "Edit PL?", "Playlist", "Filter", "Submenu" );
}
else if( m_state == FILTER )
{
- SetHelp( "Add", "Playlist", "Filter", "Tree" );
+ SetHelp( "Query", "Load", "Tree", "Submenu" );
}
- else if( m_state == TRACKS )
+ else
{
- SetHelp( "Add", "Filter", "Playlist", "Tree" );
- }
+ SetHelp( "t", "o", "d", "o" );
+ }
}
eOSState mgMainMenu::ProcessKey(eKeys key)
{
mgDebug( 1, "mgMainMenu::ProcessKey" );
eOSState state = cOsdMenu::ProcessKey(key);
-
- if( m_state == PLAYLIST )
- {
- mgDebug( 1, "mgMainMenu: in state PLAYLIST" );
- if( state == osUnknown )
- {
- switch( key )
- {
- case kOk:
- {
- mgDebug( 1, "mgMainMenu: Mark" );
- Mark(); // Mark (to move), moving done by VDR, calls Move
- state = osContinue;
- } break;
- case kRed:
- {
- mgDebug( 1, "mgMainMenu: " );
- // Shuffle?
- }
- case kYellow:
- {
- if( m_state == PLAYLIST )
- {
- mgDebug( 1, "mgMainMenu: switch to TrackInfo" );
- DisplayTrackInfo();
- }
- else if( m_state == PLAYLIST_TRACKINFO )
- {
- mgDebug( 1, "mgMainMenu: switch to AlbumInfo" );
- DisplayAlbumInfo();
- }
- else if( m_state == PLAYLIST_ALBUMINFO )
- {
- mgDebug( 1, "mgMainMenu: switch to Playlist" );
- DisplayPlaylist();
- }
- state = osContinue;
- } break;
- case kBlue:
- {
- mgDebug( 1, "mgMainMenu: switch to TreeView" );
- m_history.clear();
- DisplayTree( m_root );
- state = osContinue;
- } break;
- case kGreen:
- {
- mgDebug( 1, "mgMainMenu: switch to Filter" );
- DisplayFilter();
- state = osContinue;
- } break;
- default:
- {
- mgDebug( 1, "mgMainMenu: default" );
- state = osContinue;
- };
- }
- }
- }
- else if( m_state == FILTER )
- {
- mgDebug( 1, "mgMainMenu: in state FILTER" );
-
- if( state == osUnknown )
- {
- switch( key )
- {
- case kOk:
- {
- // OK: Create filter and selection tree and display
- mgDebug( 1, "mgMainMenu: create and apply filter" );
- // m_media->applyFilters();
- } break;
- case kRed: // ???
- {
- state = osContinue;
- } break;
- case kYellow:
- {
- // Yellow always goes to playlist view
- mgDebug( 1, "mgMainMenu: switch to playlist" );
- DisplayPlaylist();
- state = osContinue;
- } break;
- case kGreen:
- {
- mgDebug( 1, "mgMainMenu: switch filters" );
- // Green: select other filters
- DisplayFilterSelector();
- } break;
- case kBlue:
- {
- // Blue: treeview
- mgDebug( 1, "mgMainMenu: switch to treeview" );
- m_history.clear();
- DisplayTree( m_root );
- state = osContinue;
- }
- default:
- {
- state = osContinue;
- }
- }
- }
- else if( state == osBack )
- {
- // m_media->resetFilters();
- }
- }
- else if( m_state == TREE )
+
+ if( m_state == TREE )
{
mgDebug( 1, "mgMainMenu: in state TREE" );
// Navigate with up/dn, left/right (pgup, pgdn)
@@ -253,7 +145,7 @@ eOSState mgMainMenu::ProcessKey(eKeys key)
{
case kOk:
{
- mgDebug( 1, "mgMainMenu: switch to filter" );
+ mgDebug( 1, "mgMainMenu: expand and descend" );
m_history.push_back( Current() );
mgDebug( 1, "Remember current node #%i", Current() );
@@ -292,24 +184,24 @@ eOSState mgMainMenu::ProcessKey(eKeys key)
}
state = osContinue;
} break;
- case kYellow:
+ case kGreen:
{
- mgDebug( 1, "mgMainMenu: display playlist" );
- // Yellow always goes to playlist view
- DisplayPlaylist();
+ mgDebug( 1, "mgMainMenu: cycle treeviews (todo)" );
+
state = osContinue;
} break;
- case kGreen:
+ case kYellow:
{
- mgDebug( 1, "mgMainMenu: display filter" );
- DisplayFilter();
- state = osContinue;
+ mgDebug( 1, "mgMainMenu: cycle to playlist view" );
+
+ DisplayPlaylist();
} break;
case kBlue:
{
- mgDebug( 1, "mgMainMenu: select other tree view" );
- // Select other views -> Select other Media
- DisplayTreeViewSelector();
+ mgDebug( 1, "mgMainMenu: submenu (todo)" );
+
+ DisplayTreeSubmenu();
+
state = osContinue;
} break;
default:
@@ -342,110 +234,244 @@ eOSState mgMainMenu::ProcessKey(eKeys key)
state = osBack;
}
+ }
+ }
+ else if( m_state == TREE_SUBMENU )
+ {
+ if( state == osUnknown )
+ {
+ switch( key )
+ {
+ case k0 ... k9:
+ {
+ int n = key - k0;
+
+ TreeSubmenuAction( n );
+
+ state = osContinue;
+ }
+ case kOk:
+ {
+ TreeSubmenuAction( Current() );
+
+ state = osContinue;
+ } break;
+ default:
+ {
+ state = osContinue;
+ } break;
+ }
+ }
+ else if( state == osBack )
+ {
+ mgDebug( 1, "mgMainMenu: return from tree view submenu" );
+
+ // restore last selected entry
+ int last = m_history.back();
+
+ DisplayTree( m_node, last );
+
+ state = osContinue;
}
}
- else if( m_state == TRACKS )
+ else if( m_state == PLAYLIST )
{
- // Navigate with up/dn, left/right (pgup, pgdn)
+ mgDebug( 1, "mgMainMenu: in state PLAYLIST" );
if( state == osUnknown )
{
switch( key )
{
case kOk:
{
- // Show Song Info
+ mgDebug( 1, "mgMainMenu: playlist ok" );
state = osContinue;
} break;
case kRed:
{
- // Add item to Playlist
- if(Current() >= 0 && Current() < (int) m_tracklist->getNumItems())
+ mgDebug( 1, "mgMainMenu: edit playlist" );
+ Mark(); // Mark (to move), moving done by VDR, calls Move
+ }
+ case kGreen:
+ {
+ if( m_state == PLAYLIST )
+ {
+ mgDebug( 1, "mgMainMenu: switch to TrackInfo" );
+ DisplayTrackInfo();
+ }
+ else if( m_state == PLAYLIST_TRACKINFO )
{
- mgContentItem* item = m_tracklist->getItem( Current() );
- mgDebug(3, "Ading item %s to playlist",
- item->getTitle().c_str() );
-
- m_current_playlist->append( item );
+ mgDebug( 1, "mgMainMenu: switch to AlbumInfo" );
+ DisplayAlbumInfo();
+ }
+ else if( m_state == PLAYLIST_ALBUMINFO )
+ {
+ mgDebug( 1, "mgMainMenu: switch to Playlist" );
+ DisplayPlaylist();
}
state = osContinue;
} break;
- case kGreen:
+ case kYellow:
{
- // Green always goes to the filter view
+ mgDebug( 1, "mgMainMenu: cycle playlist to filter" );
DisplayFilter();
- state = osContinue;
+ state = osContinue;
} break;
- case kYellow:
+ case kBlue:
+ {
+ // Submenu
+ mgDebug( 1, "mgMainMenu: playlist submenu (todo)" );
+
+ state = osContinue;
+ } break;
+ default:
+ {
+ mgDebug( 1, "mgMainMenu: default" );
+ state = osContinue;
+ };
+ }
+ }
+ }
+ else if( m_state == FILTER )
+ {
+ mgDebug( 1, "mgMainMenu: in state FILTER" );
+
+ if( state == osUnknown )
+ {
+ switch( key )
+ {
+ case kOk:
+ {
+ // OK: Create filter and selection tree and display
+ mgDebug( 1, "mgMainMenu: create and apply filter" );
+ // m_media->applyFilters();
+ } break;
+ case kRed: // ???
{
- // Yellow always goes to playlist view
- DisplayPlaylist();
state = osContinue;
+ mgDebug( 1, "mgMainMenu: query and display results" );
} break;
- case kBlue:
+ case kGreen:
{
- m_history.clear();
- DisplayTree( m_root );
+ // cycle FILTER -> TREE
+ mgDebug( 1, "mgMainMenu: clear filters (todo)" );
+ DisplayFilterSelector();
state = osContinue;
} break;
+ case kYellow:
+ {
+ // Green: treeview
+ mgDebug( 1, "mgMainMenu: switch to treeview" );
+
+ DisplayTreeViewSelector();
+
+ state = osContinue;
+ } break;
+ case kBlue:
+ {
+ mgDebug( 1, "mgMainMenu: submenu" );
+ }
default:
{
state = osContinue;
- } break;
+ }
}
}
else if( state == osBack )
{
- // where to go on back?
- state = osContinue;
+ // m_media->resetFilters();?
}
}
else
{
mgDebug(1, "Process key: else");
+ mgDebug(1, "Process key: %d", (int) state);
+
}
return state;
}
-void mgMainMenu::Move( int from, int to )
+void mgMainMenu::DisplayTree( mgSelectionTreeNode* node, int select )
{
- // check current view, perform move in the content view
- if( m_state == PLAYLIST )
+ m_state = TREE;
+
+ if( node->expand( ) )
{
- // resort
+ Clear();
+
+ char buffer[256];
+ sprintf( buffer, "Muggle - %s", node->getLabel().c_str() );
+
+ SetTitle( buffer );
+ SetButtons();
+
+ m_node = node;
+ mgDebug( 1, "mgBrowseMenu::DisplaySelection: node %s received", node->getLabel().c_str() );
+ vector<mgSelectionTreeNode*> children = node->getChildren();
+
+ mgDebug( 1, "mgBrowseMenu::DisplaySelection: %d elements received", children.size() );
+
+ for( vector<mgSelectionTreeNode*>::iterator iter = children.begin();
+ iter != children.end();
+ iter ++ )
+ {
+ Add( new mgMenuTreeItem( *iter ) );
+ }
+
+ cOsdItem *item = Get( select );
+ SetCurrent( item );
+
+ RefreshCurrent();
+ DisplayCurrent(true);
}
+ Display();
}
-void mgMainMenu::DisplayTracklist()
+void mgMainMenu::DisplayTreeViewSelector()
{
- m_state = TRACKS;
- mgDebug( 1, "mgBrowseMenu::DisplayTracklist");
+ m_history.clear();
+ // collapse all!
+ DisplayTree( m_root );
+}
- Clear();
- SetButtons();
+void mgMainMenu::DisplayTreeSubmenu()
+{
+ m_state = TREE_SUBMENU;
- mgDebug( 1, "mgBrowseMenu::DisplayTracklist: %d elements received",
- m_tracklist->getNumItems() );
-
- static char titlestr[80];
- sprintf( titlestr, "Muggle Tracklist (%d items)", m_tracklist->getNumItems() );
- SetTitle( titlestr );
+ Clear();
+
+ mgDebug( 1, "Creating Muggle tree view submenu" );
+ SetButtons();
- // create tracklist with the current filters
- if( m_tracklist )
- {
- delete m_tracklist;
- }
-
- m_tracklist = m_media->getTracks();
+ SetTitle( "Muggle Tree View Commands" );
+
+ // Add items
+ Add( new cOsdItem( "1 - Test1" ) );
+ Add( new cOsdItem( "9 - Test9" ) );
+ Add( new cOsdItem( "0 - Test0" ) );
+
+ Display();
+}
- for( unsigned int i = 0; i < m_tracklist->getNumItems(); i++)
+void mgMainMenu::TreeSubmenuAction( int n )
+{
+ mgDebug( "mgMainMenu: TreeSubmenuAction( %d )", n );
+
+ switch( n )
+ {
+ case 0:
{
- string label = m_tracklist->getLabel( i, " " );
- Add( new cOsdItem( label.c_str() ) );
- }
-
- Display();
+ // action 0
+ } break;
+ case 1:
+ {
+ // action 0
+ } break;
+ default:
+ {
+ // undefined action
+ } break;
+ }
}
void mgMainMenu::DisplayPlaylist()
@@ -478,55 +504,28 @@ void mgMainMenu::DisplayPlaylist()
void mgMainMenu::DisplayTrackInfo()
{
m_state = PLAYLIST_TRACKINFO;
+ SetButtons();
+
// show info of the currently playing track
}
void mgMainMenu::DisplayAlbumInfo()
{
m_state = PLAYLIST_ALBUMINFO;
- // show info of the currently playing track
+ SetButtons();
+
+ // show info of the currently playing album
}
-void mgMainMenu::DisplayTree( mgSelectionTreeNode* node, int select )
+void mgMainMenu::Move( int from, int to )
{
- m_state = TREE;
-
- if( node->expand( ) )
+ // check current view, perform move in the content view
+ if( m_state == PLAYLIST )
{
- Clear();
-
- char buffer[256];
- sprintf( buffer, "Muggle - %s", node->getLabel().c_str() );
-
- SetTitle( buffer );
- SetButtons();
-
- m_node = node;
- mgDebug( 1, "mgBrowseMenu::DisplaySelection: node %s received", node->getLabel().c_str() );
- vector<mgSelectionTreeNode*> children = node->getChildren();
-
- mgDebug( 1, "mgBrowseMenu::DisplaySelection: %d elements received", children.size() );
-
- for( vector<mgSelectionTreeNode*>::iterator iter = children.begin();
- iter != children.end();
- iter ++ )
- {
- Add( new mgMenuTreeItem( *iter ) );
- }
-
- cOsdItem *item = Get( select );
- SetCurrent( item );
-
- RefreshCurrent();
- DisplayCurrent(true);
+ // resort
}
- Display();
-}
-void mgMainMenu::DisplayTreeViewSelector()
-{
- m_history.clear();
- DisplayTree( m_root );
+ // what now?
}
void mgMainMenu::DisplayFilter()
@@ -581,12 +580,15 @@ void mgMainMenu::DisplayFilter()
void mgMainMenu::DisplayFilterSelector()
{
-
+ // show available filters, load on OK?
}
/************************************************************
*
* $Log: vdr_menu.c,v $
+ * Revision 1.12 2004/02/08 10:48:44 LarsAC
+ * Made major revisions in OSD behavior
+ *
* Revision 1.11 2004/02/03 21:53:32 RaK
* beak = break in l 212
*
diff --git a/muggle-plugin/vdr_menu.h b/muggle-plugin/vdr_menu.h
index 1b318c0..76317bc 100644
--- a/muggle-plugin/vdr_menu.h
+++ b/muggle-plugin/vdr_menu.h
@@ -2,12 +2,12 @@
/*! \file vdr_menu.h
* \brief Implements menu handling for broswing media libraries within VDR
********************************************************************
- * \version $Revision: 1.7 $
- * \date $Date: 2004/02/03 19:28:46 $
+ * \version $Revision: 1.8 $
+ * \date $Date: 2004/02/08 10:48:44 $
* \author Ralf Klueber, Lars von Wedel, Andreas Kellner
* \author file owner: $Author: LarsAC $
*
- * $Id: vdr_menu.h,v 1.7 2004/02/03 19:28:46 LarsAC Exp $
+ * $Id: vdr_menu.h,v 1.8 2004/02/08 10:48:44 LarsAC Exp $
*
*/
/*******************************************************************/
@@ -63,21 +63,25 @@ class mgMainMenu : public cOsdMenu
enum MuggleStatus
{
- TREE, FILTER, TRACKS,
+ TREE, TREE_SUBMENU,
PLAYLIST, PLAYLIST_TRACKINFO, PLAYLIST_ALBUMINFO,
+ FILTER
};
- // To be rewritten mode dependent
void SetButtons();
+ // Tree view handling
void DisplayTree( mgSelectionTreeNode *node, int select = 0 );
void DisplayTreeViewSelector();
+ void DisplayTreeSubmenu();
+ void TreeSubmenuAction( int n );
+ // Filter view handling
void DisplayFilter();
void DisplayFilterSelector();
+ // Playlist view handling
void DisplayPlaylist();
- void DisplayTracklist();
void DisplayTrackInfo();
void DisplayAlbumInfo();
@@ -89,7 +93,7 @@ class mgMainMenu : public cOsdMenu
mgSelectionTreeNode *m_node;
mgPlaylist *m_current_playlist;
mgTracklist *m_tracklist;
-
+
// filter items
char *m_title, *m_interpret, *m_album, *m_playlist, *m_filtername;
int m_year_min, m_year_max, m_filter;
@@ -104,6 +108,9 @@ class mgMainMenu : public cOsdMenu
/************************************************************
*
* $Log: vdr_menu.h,v $
+ * Revision 1.8 2004/02/08 10:48:44 LarsAC
+ * Made major revisions in OSD behavior
+ *
* Revision 1.7 2004/02/03 19:28:46 LarsAC
* Playlist now created in plugin instead of in menu.
*