summaryrefslogtreecommitdiff
path: root/core/launcher/startmenu.cpp
Side-by-side diff
Diffstat (limited to 'core/launcher/startmenu.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/startmenu.cpp171
1 files changed, 171 insertions, 0 deletions
diff --git a/core/launcher/startmenu.cpp b/core/launcher/startmenu.cpp
new file mode 100644
index 0000000..54bdfcc
--- a/dev/null
+++ b/core/launcher/startmenu.cpp
@@ -0,0 +1,171 @@
+/**********************************************************************
+** Copyright (C) 2000 Trolltech AS. All rights reserved.
+**
+** This file is part of Qtopia Environment.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "startmenu.h"
+#include "sidething.h"
+#include "mrulist.h"
+#include "info.h"
+
+#include <qpe/qpeapplication.h>
+#include <qpe/config.h>
+#include <qpe/applnk.h>
+#include <qpe/global.h>
+#include <qpe/resource.h>
+
+#include <qdict.h>
+
+#include <stdlib.h>
+
+
+// #define USE_CONFIG_FILE
+
+
+StartMenu::StartMenu(QWidget *parent) : QLabel( parent )
+{
+ loadOptions();
+
+ setPixmap( Resource::loadPixmap( startButtonPixmap ) );
+ setFocusPolicy( NoFocus );
+ //setFlat( startButtonIsFlat );
+
+ apps = new AppLnkSet( QPEApplication::qpeDir() + "apps" );
+
+ createMenu();
+}
+
+
+void StartMenu::mousePressEvent( QMouseEvent * )
+{
+ launch();
+ if (desktopInfo)
+ desktopInfo->menuClicked();
+}
+
+
+StartMenu::~StartMenu()
+{
+ delete apps;
+}
+
+
+void StartMenu::loadOptions()
+{
+#ifdef USE_CONFIG_FILE
+ // Read configuration file
+ Config config("StartMenu");
+ config.setGroup( "StartMenu" );
+ QString tmpBoolString1 = config.readEntry( "UseWidePopupMenu", "FALSE" );
+ useWidePopupMenu = ( tmpBoolString1 == "TRUE" ) ? TRUE : FALSE;
+ QString tmpBoolString2 = config.readEntry( "StartButtonIsFlat", "TRUE" );
+ startButtonIsFlat = ( tmpBoolString2 == "TRUE" ) ? TRUE : FALSE;
+ QString tmpBoolString3 = config.readEntry( "UseMRUList", "TRUE" );
+ popupMenuSidePixmap = config.readEntry( "PopupMenuSidePixmap", "sidebar" );
+ startButtonPixmap = config.readEntry( "StartButtonPixmap", "go" );
+#else
+ // Basically just #include the .qpe_menu.conf file settings
+ useWidePopupMenu = FALSE;
+ popupMenuSidePixmap = "sidebar";
+ startButtonIsFlat = TRUE;
+ startButtonPixmap = "go";
+#endif
+}
+
+
+void StartMenu::createMenu()
+{
+ if ( useWidePopupMenu )
+ launchMenu = new PopupWithLaunchSideThing( this, &popupMenuSidePixmap );
+ else
+ launchMenu = new StartPopupMenu( this );
+
+ loadMenu( apps, launchMenu );
+
+}
+
+void StartMenu::itemSelected( int id )
+{
+ const AppLnk *app = apps->find( id );
+ if ( app )
+ app->execute();
+}
+
+bool StartMenu::loadMenu( AppLnkSet *folder, QPopupMenu *menu )
+{
+ bool result = FALSE;
+
+ QStringList typs = folder->types();
+ QDict<QPopupMenu> typpop;
+ for (QStringList::Iterator tit=typs.begin(); tit!=typs.end(); ++tit) {
+ if ( !(*tit).isEmpty() ) {
+ QPopupMenu *new_menu = new StartPopupMenu( menu );
+ typpop.insert(*tit, new_menu);
+ connect( new_menu, SIGNAL(activated(int)), SLOT(itemSelected(int)) );
+ menu->insertItem( folder->typePixmap(*tit), *tit, new_menu );
+ }
+ }
+
+ QListIterator<AppLnk> it( folder->children() );
+ for ( ; it.current(); ++it ) {
+ AppLnk *app = it.current();
+ if ( app->type() == "Separator" ) {
+ menu->insertSeparator();
+ } else {
+ QString t = app->type();
+ QPopupMenu* pmenu = typpop.find(t);
+ if ( !pmenu )
+ pmenu = menu;
+ pmenu->insertItem( app->pixmap(), app->name(), app->id() );
+ result=TRUE;
+ }
+ }
+
+ if ( result )
+ connect( menu, SIGNAL(activated(int)), SLOT(itemSelected(int)) );
+
+ return result;
+}
+
+
+void StartMenu::launch()
+{
+ int y = mapToGlobal( QPoint() ).y() - launchMenu->sizeHint().height();
+
+ if ( launchMenu->isVisible() )
+ launchMenu->hide();
+ else
+ launchMenu->popup( QPoint( 1, y ) );
+}
+
+const AppLnk* StartMenu::execToLink(const QString& appname)
+{
+ const AppLnk* a = apps->findExec( appname );
+ return a;
+}
+
+void StartPopupMenu::keyPressEvent( QKeyEvent *e )
+{
+ if ( e->key() == Key_F33 || e->key() == Key_Space ) {
+ // "OK" button, little hacky
+ QKeyEvent ke(QEvent::KeyPress, Key_Enter, 13, 0);
+ QPopupMenu::keyPressEvent( &ke );
+ } else {
+ QPopupMenu::keyPressEvent( e );
+ }
+}