From a7e786be4f9545a881015de8ba8a124a62f0f891 Mon Sep 17 00:00:00 2001 From: harlekin Date: Sun, 30 Nov 2003 17:58:02 +0000 Subject: startmenu was further developed in branch --- (limited to 'core') diff --git a/core/launcher/startmenu.cpp b/core/launcher/startmenu.cpp index 08ae885..f17c7f8 100644 --- a/core/launcher/startmenu.cpp +++ b/core/launcher/startmenu.cpp @@ -1,337 +1,392 @@ -/********************************************************************** -** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. -** -** This file is part of the 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. -** -**********************************************************************/ - -#define INCLUDE_MENUITEM_DEF - -#include "startmenu.h" - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - - -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 ); - } -} - -//--------------------------------------------------------------------------- - -StartMenu::StartMenu(QWidget *parent) : QLabel( parent ) -{ - startButtonPixmap = "go"; // No tr - - int sz = AppLnk::smallIconSize()+3; - QPixmap pm; - pm.convertFromImage(Resource::loadImage(startButtonPixmap).smoothScale(sz,sz)); - setPixmap(pm); - setFocusPolicy( NoFocus ); - - launchMenu = 0; - refreshMenu(); -} - - -void StartMenu::mousePressEvent( QMouseEvent * ) -{ - launch(); -} - - -StartMenu::~StartMenu() -{ - clearApplets(); -} - -void StartMenu::createMenu() -{ - clearApplets(); - delete launchMenu; - - launchMenu = new StartPopupMenu( this ); - loadMenu( launchMenu ); - loadApplets(); - - bool result = nother || ntabs || m_applets.count(); - if ( result ) - connect( launchMenu, SIGNAL(activated(int)), SLOT(itemSelected(int)) ); - -} - -void StartMenu::refreshMenu() -{ - Config cfg("Taskbar"); - cfg.setGroup("Menu"); - bool ltabs = cfg.readBoolEntry("LauncherTabs",TRUE); - bool lot = cfg.readBoolEntry("LauncherOther",TRUE); - bool lt = ltabs || lot; - if ( launchMenu && !lt ) - return; // nothing to do - - if ( launchMenu ) { - int i; - /* find the first entry we want to remove */ - for (i=0; i<(int)launchMenu->count(); i++) { - QMenuItem* item = launchMenu->findItem(launchMenu->idAt(i)); - if ( item && item->id() >= 0 && item->id() < ntabs ) { - break; - } - if ( item && item->isSeparator() ) { - i++; - break; - } - } - /* remove them */ - while (i<(int)launchMenu->count()) - launchMenu->removeItemAt(i); - loadMenu(launchMenu); - addApplets(launchMenu); - } else { - createMenu(); - } -} - -void StartMenu::itemSelected( int id ) -{ - if ( id >= 0 && id < ntabs ) { - emit tabSelected(tabs[id]); - } else if ( id >= 20 && id < 20+nother ) { - other.at(id-20)->execute(); - }else { - MenuApplet *applet = m_applets.find ( id ); - if ( applet ) { - qWarning("activated"); - applet-> iface-> activated(); - } - } -} - -bool StartMenu::loadMenu( QPopupMenu *menu ) -{ - Config cfg("Taskbar"); - cfg.setGroup("Menu"); - - bool ltabs = cfg.readBoolEntry("LauncherTabs",TRUE); - bool lot = cfg.readBoolEntry("LauncherOther",TRUE); - bool sepfirst = !ltabs && !lot; - - tabs.clear(); - other.setAutoDelete(TRUE); - other.clear(); - ntabs = 0; - nother = 0; - - bool f=TRUE; - if ( ltabs || lot ) { - QDir dir( MimeType::appsFolderName(), QString::null, QDir::Name ); - for (int i=0; i<(int)dir.count(); i++) { - QString d = dir[i]; - Config cfg(dir.path()+"/"+d+"/.directory",Config::File); - if ( cfg.isValid() ) { - QString nm = cfg.readEntry("Name"); - QString ic = cfg.readEntry("Icon"); - if ( !!nm && !!ic ) { - tabs.append(d); - menu->insertItem( Resource::loadIconSet(ic), nm, ntabs++ ); - } - } else if ( lot && d.right(8)==".desktop") { - AppLnk* applnk = new AppLnk(dir.path()+"/"+d); - if ( applnk->isValid() ) { - if ( applnk->type() == "Separator" ) { // No tr - if ( lot ) { - menu->insertSeparator(); - sepfirst = f && !ltabs; - } - delete applnk; - } else { - f = FALSE; - other.append(applnk); - menu->insertItem( Resource::loadIconSet(applnk->icon()), - applnk->name(), 20+nother++ ); - } - } else { - delete applnk; - } - } - } - - if ( !menu->count() ) - sepfirst = TRUE; - } - - launchMenu->setName(sepfirst ? "accessories" : "accessories_need_sep"); // No tr - - return (nother || ntabs ); -} - - -void StartMenu::launch() -{ - int y = mapToGlobal( QPoint() ).y() - launchMenu->sizeHint().height(); - - if ( launchMenu->isVisible() ) - launchMenu->hide(); - else - launchMenu->popup( QPoint( 1, y ) ); -} - - - - -static int compareAppletPositions(const void *a, const void *b) -{ - const MenuApplet* aa = *(const MenuApplet**)a; - const MenuApplet* ab = *(const MenuApplet**)b; - int d = aa->iface->position() - ab->iface->position(); - if ( d ) return d; - return QString::compare(aa->library->library(),ab->library->library()); -} - -void StartMenu::clearApplets() -{ - if (launchMenu ) - launchMenu-> hide(); - - for ( QIntDictIterator it ( m_applets ); it. current ( ); ++it ) { - MenuApplet *applet = it. current ( ); - if ( launchMenu ) { - launchMenu-> removeItem ( applet-> id ); - delete applet-> popup; - } - - applet-> iface-> release(); - applet-> library-> unload(); - delete applet-> library; - } - m_applets.clear(); -} - - - - -void StartMenu::loadApplets() -{ - Config cfg( "StartMenu" ); - cfg.setGroup( "Applets" ); - - // SafeMode causes too much problems, so we disable it for now -- - // maybe we should reenable it for OPIE 1.0 - sandman 26.09.02 - // removed in the remerge PluginManager could handle it - // we don't currently use it -zecke - - QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' ); - - QString lang = getenv( "LANG" ); - QString path = QPEApplication::qpeDir() + "/plugins/applets"; -#ifdef Q_OS_MACX - QDir dir( path, "lib*.dylib" ); -#else - QDir dir( path, "lib*.so" ); -#endif /* Q_OS_MACX */ - QStringList list = dir.entryList(); - QStringList::Iterator it; - int napplets=0; - MenuApplet* *xapplets = new MenuApplet*[list.count()]; - for ( it = list.begin(); it != list.end(); ++it ) { - if ( exclude.find( *it ) != exclude.end() ) - continue; - MenuAppletInterface *iface = 0; - QLibrary *lib = new QLibrary( path + "/" + *it ); - if (( lib->queryInterface( IID_MenuApplet, (QUnknownInterface**)&iface ) == QS_OK ) && iface ) { - MenuApplet *applet = new MenuApplet; - xapplets[napplets++] = applet; - applet->library = lib; - applet->iface = iface; - - QTranslator *trans = new QTranslator(qApp); - QString type = (*it).left( (*it).find(".") ); - QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm"; - if ( trans->load( tfn )) - qApp->installTranslator( trans ); - else - delete trans; - } else { - exclude += *it; - delete lib; - } - } - cfg.writeEntry( "ExcludeApplets", exclude, ',' ); - qsort(xapplets,napplets,sizeof(m_applets[0]),compareAppletPositions); - - - int foo = ( launchMenu-> count ( )) ? launchMenu-> insertSeparator ( ) : 0; - - while (napplets--) { - MenuApplet *applet = xapplets[napplets]; - - applet-> popup = applet-> iface-> popup ( this ); - - if ( applet-> popup ) - applet-> id = launchMenu-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ), applet-> popup ); - else - applet-> id = launchMenu-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ) ); - - - m_applets.insert ( applet-> id, new MenuApplet(*applet)); - } - delete [] xapplets; - -} - - -/* - * Launcher calls loadMenu too often fix that - */ -void StartMenu::addApplets(QPopupMenu* pop) { - QIntDict dict; - if( pop-> count ( )) - pop-> insertSeparator ( ); - - for ( QIntDictIterator it ( m_applets ); it. current ( ); ++it ) { - MenuApplet *applet = it. current ( ); - if ( applet-> popup ) - applet-> id = pop-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ), applet-> popup ); - else - applet-> id = pop-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ) ); - - dict.insert( applet->id, new MenuApplet(*applet) ); - } - /* need to update the key */ - m_applets.setAutoDelete( true ); - m_applets.clear(); - m_applets.setAutoDelete( false ); - m_applets = dict; -} +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of the 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. +** +**********************************************************************/ + +// TODO. During startup +// Launcher::typeAdded +// is called for each new tab and calls then each time the refresh of startmenu +// suboptimal + +#define INCLUDE_MENUITEM_DEF + +#include "startmenu.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +//#include + +//#include + + +#define APPLNK_ID_OFFSET 250 +#define NO_ID -1 + + +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 ); + } +} + +//--------------------------------------------------------------------------- + +StartMenu::StartMenu(QWidget *parent) : QLabel( parent ) +{ + startButtonPixmap = "go"; // No tr + + int sz = AppLnk::smallIconSize()+3; + QPixmap pm; + pm.convertFromImage(Resource::loadImage( startButtonPixmap).smoothScale( sz,sz) ); + setPixmap(pm); + setFocusPolicy( NoFocus ); + + useWidePopupMenu = true; + launchMenu = 0; + refreshMenu(); +} + + +void StartMenu::mousePressEvent( QMouseEvent * ) +{ + launch(); +} + + +StartMenu::~StartMenu() +{ + clearApplets(); +} + +void StartMenu::createMenu() +{ + clearApplets(); + delete launchMenu; + + launchMenu = new StartPopupMenu( this ); + loadMenu( launchMenu ); + loadApplets(); + + bool result = currentItem || menuApplets.count(); + if ( result ) + connect( launchMenu, SIGNAL(activated(int)), SLOT(itemSelected(int)) ); +} + +void StartMenu::refreshMenu() +{ + Config cfg( "StartMenu" ); + cfg.setGroup( "Menu" ); + bool ltabs = cfg.readBoolEntry( "LauncherTabs", TRUE ); + bool lot = cfg.readBoolEntry( "LauncherOther", TRUE ); + useWidePopupMenu = cfg.readBoolEntry( "LauncherSubPopup", TRUE ); + + if ( launchMenu && !(ltabs || lot) ) return; // nothing to do + + createMenu(); +} + +void StartMenu::itemSelected( int id ) +{ + if ( id == NO_ID ) return; + + if ( id < 0 ) { + MenuApplet *applet = menuApplets.find( id ); + if ( applet ) { + applet->iface->activated(); + } + } else if ( id >= APPLNK_ID_OFFSET ) { + AppLnk * appLnk = appLnks.find( id ); + if ( appLnk ) { + appLnk->execute(); + } + } else { + QString *tabName = tabNames.find( id ); + if ( tabName ) { + emit tabSelected( *tabName ); + } + } +} + +void StartMenu::createAppEntry( QPopupMenu *menu, QDir dir, QString file ) +{ + if ( file.right(8) == ".desktop" ) { + AppLnk* applnk = new AppLnk( dir.path() + "/" + file ); + if ( !applnk->isValid() ) { + delete applnk; + return; + } + + if ( applnk->type() == "Separator" ) { // No tr + menu->insertSeparator(); + delete applnk; + } else { + QPixmap test; + test.convertFromImage( + Resource::loadImage( applnk->icon() ).smoothScale( + AppLnk::smallIconSize(), AppLnk::smallIconSize() ), 0 ); + + menu->insertItem( test, applnk->name(), + currentItem + APPLNK_ID_OFFSET ); + appLnks.insert( currentItem + APPLNK_ID_OFFSET, applnk ); + currentItem++; + } + } + +} + +void StartMenu::createDirEntry( QPopupMenu *menu, QDir dir, QString file, bool lot ) +{ + // do some sanity checks and collect information + + if ( file == "." || file == ".." ) return; + + Config cfg( dir.path() + "/" + file + "/.directory", Config::File ); + if ( !cfg.isValid() ) return; + + QString name = cfg.readEntry( "Name" ); + QString icon = cfg.readEntry( "Icon" ); + if ( !name || !icon ) return; + + QDir subdir = QDir( dir ); + subdir.cd( file ); + subdir.setFilter( QDir::Files ); + subdir.setNameFilter( "*.desktop" ); + // we don' t show the menu if there are no entries + // perhaps one should check if there exist subsubdirs with entries... + if ( subdir.entryList().isEmpty() ) return; + + // checks were ok + + QPixmap test; + test.convertFromImage( Resource::loadImage( icon ).smoothScale( + AppLnk::smallIconSize(), AppLnk::smallIconSize() ), 0 ); + + if ( useWidePopupMenu ) { + // generate submenu + QPopupMenu *submenu = new QPopupMenu( menu ); + connect( submenu, SIGNAL(activated(int)), SLOT(itemSelected(int)) ); + menu->insertItem( test, name, submenu, NO_ID ); + + // ltabs is true cause else we wouldn't stuck around.. + createMenuEntries( submenu, subdir, true, lot ); + } else { + // no submenus - just bring corresponding tab to front + menu->insertItem( test, name, currentItem ); + tabNames.insert( currentItem, new QString( file ) ); + currentItem++; + } +} + +void StartMenu::createMenuEntries( QPopupMenu *menu, QDir dir, bool ltabs, bool lot ) +{ + if ( lot ) { + dir.setFilter( QDir::Files ); + dir.setNameFilter( "*.desktop" ); + QStringList files = dir.entryList(); + files.sort(); + + for ( QStringList::Iterator it = files.begin(); it != files.end(); it++ ) { + createAppEntry( menu, dir, *it ); + } + } + if ( ltabs ) { + dir.setNameFilter( "*" ); + dir.setFilter( QDir::Dirs ); + QStringList dirs = dir.entryList(); + dirs.sort(); + + for ( QStringList::Iterator it = dirs.begin(); it != dirs.end(); it++ ) { + createDirEntry( menu, dir, *it, lot ); + } + } +} + +bool StartMenu::loadMenu( QPopupMenu *menu ) +{ + Config cfg("StartMenu"); + cfg.setGroup("Menu"); + + bool ltabs = cfg.readBoolEntry("LauncherTabs", TRUE); + bool lot = cfg.readBoolEntry("LauncherOther", TRUE); + useWidePopupMenu = cfg.readBoolEntry( "LauncherSubPopup", TRUE ); + bool sepfirst = !ltabs && !lot; + + currentItem = 0; + launchMenu->clear(); + + appLnks.setAutoDelete( true ); + tabNames.setAutoDelete( true ); + appLnks.clear(); + tabNames.clear(); + appLnks.setAutoDelete( false ); + tabNames.setAutoDelete( false ); + + QDir dir( MimeType::appsFolderName(), QString::null, QDir::Name ); + createMenuEntries( menu, dir, ltabs, lot ); + + if ( !menu->count() ) sepfirst = TRUE; + + launchMenu->setName( sepfirst ? "accessories" : "accessories_need_sep" ); // No tr + + return currentItem; +} + + +void StartMenu::launch() +{ + int y = mapToGlobal( QPoint() ).y() - launchMenu->sizeHint().height(); + + if ( launchMenu->isVisible() ) + launchMenu->hide(); + else + launchMenu->popup( QPoint( 1, y ) ); +} + + + + +static int compareAppletPositions(const void *b, const void *a) +{ + const MenuApplet* aa = *(const MenuApplet**)a; + const MenuApplet* ab = *(const MenuApplet**)b; + int d = aa->iface->position() - ab->iface->position(); + if ( d ) return d; + return QString::compare(aa->library->library(),ab->library->library()); +} + +void StartMenu::clearApplets() +{ + if ( launchMenu ) + launchMenu-> hide(); + + for ( QIntDictIterator it( menuApplets ); it.current(); ++it ) { + MenuApplet *applet = it.current(); + if ( launchMenu ) { + launchMenu->removeItem( applet-> id ); + delete applet->popup; + } + + applet->iface->release(); + applet->library->unload(); + delete applet-> library; + } + menuApplets.clear(); +} + + + + +void StartMenu::loadApplets() +{ + Config cfg( "StartMenu" ); + cfg.setGroup( "Applets" ); + + // SafeMode causes too much problems, so we disable it for now -- + // maybe we should reenable it for OPIE 1.0 - sandman 26.09.02 + // removed in the remerge PluginManager could handle it + // we don't currently use it -zecke + + QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' ); + + QString lang = getenv( "LANG" ); + QString path = QPEApplication::qpeDir() + "/plugins/applets"; + QDir dir( path, "lib*.so" ); + QStringList list = dir.entryList(); + QStringList::Iterator it; + int napplets = 0; + MenuApplet* *xapplets = new MenuApplet*[list.count()]; + for ( it = list.begin(); it != list.end(); ++it ) { + if ( exclude.find( *it ) != exclude.end() ) + continue; + MenuAppletInterface *iface = 0; + QLibrary *lib = new QLibrary( path + "/" + *it ); + if (( lib->queryInterface( IID_MenuApplet, (QUnknownInterface**)&iface ) == QS_OK ) && iface ) { + MenuApplet *applet = new MenuApplet; + xapplets[napplets++] = applet; + applet->library = lib; + applet->iface = iface; + + QTranslator *trans = new QTranslator(qApp); + QString type = (*it).left( (*it).find(".") ); + QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm"; + if ( trans->load( tfn )) + qApp->installTranslator( trans ); + else + delete trans; + } else { + exclude += *it; + delete lib; + } + } + cfg.writeEntry( "ExcludeApplets", exclude, ',' ); + qsort(xapplets, napplets, sizeof(menuApplets[0]), compareAppletPositions); + + + while ( napplets-- ) { + MenuApplet *applet = xapplets[napplets]; + + applet->popup = applet->iface->popup( this ); + + // menuApplets got an id < -1 + menuApplets.insert( -( currentItem + 2 ), new MenuApplet( *applet ) ); + currentItem++; + } + delete [] xapplets; + + addApplets( launchMenu ); +} + + +/* + * Launcher calls loadMenu too often fix that + */ +void StartMenu::addApplets(QPopupMenu* pop) { + QIntDict dict; + if( pop-> count ( )) + pop-> insertSeparator ( ); + + for ( QIntDictIterator it( menuApplets ); it.current(); ++it ) { + MenuApplet *applet = it.current(); + if ( applet->popup ) + applet->id = pop->insertItem( applet->iface->icon(), + applet->iface->text(), applet->popup ); + else + applet->id = pop->insertItem( applet->iface->icon(), + applet->iface->text() ); + + dict.insert( applet->id, new MenuApplet( *applet ) ); + } + /* need to update the key */ + menuApplets.setAutoDelete( true ); + menuApplets.clear(); + menuApplets.setAutoDelete( false ); + menuApplets = dict; +} diff --git a/core/launcher/startmenu.h b/core/launcher/startmenu.h index 99df0f0..7218035 100644 --- a/core/launcher/startmenu.h +++ b/core/launcher/startmenu.h @@ -1,95 +1,106 @@ -/********************************************************************** -** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. -** -** This file is part of the 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. -** -**********************************************************************/ - -#ifndef __START_MENU_H__ -#define __START_MENU_H__ - -#include -#include -#include -#include -#include -#include - -#include - -class StartPopupMenu : public QPopupMenu -{ -public: - StartPopupMenu( QWidget *parent ) : QPopupMenu( parent ) {} -protected: - void keyPressEvent( QKeyEvent *e ); -}; - -class QLibrary; - - -struct MenuApplet { - QLibrary *library; - MenuAppletInterface *iface; - int id; - QPopupMenu *popup; -}; - -class StartMenu : public QLabel { - Q_OBJECT -public: - StartMenu( QWidget * ); - ~StartMenu(); - - void refreshMenu(); - -public: - StartPopupMenu *launchMenu; - -signals: - void tabSelected(const QString&); - -public slots: - void launch( ); - void createMenu( ); - -protected slots: - void itemSelected( int id ); - -protected: - virtual void mousePressEvent( QMouseEvent * ); - -private: - void loadApplets(); - void clearApplets(); - void addApplets( QPopupMenu* menu ); - bool loadMenu( QPopupMenu *menu ); - -private: - bool useWidePopupMenu; - QString popupMenuSidePixmap; - - bool startButtonIsFlat; - QString startButtonPixmap; - - QStringList tabs; - QList other; - QIntDict m_applets; - int ntabs; - int nother; -}; - -#endif // __START_MENU_H__ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of the 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. +** +**********************************************************************/ + +#ifndef __START_MENU_H__ +#define __START_MENU_H__ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +class StartPopupMenu : public QPopupMenu +{ + +public: + StartPopupMenu( QWidget *parent ) : QPopupMenu( parent ) {} + +protected: + void keyPressEvent( QKeyEvent *e ); + +}; + +class QLibrary; + + +struct MenuApplet { + QLibrary *library; + MenuAppletInterface *iface; + int id; + QPopupMenu *popup; +}; + +class StartMenu : public QLabel { + + Q_OBJECT + +public: + StartMenu( QWidget * ); + ~StartMenu(); + + void refreshMenu(); + +public: + StartPopupMenu *launchMenu; + +signals: + void tabSelected(const QString&); + +public slots: + void launch( ); + void createMenu( ); + +protected slots: + void itemSelected( int id ); + +protected: + virtual void mousePressEvent( QMouseEvent * ); + +private: + void loadApplets(); + void clearApplets(); + void addApplets( QPopupMenu* menu ); + bool loadMenu( QPopupMenu *menu ); + void createMenuEntries( QPopupMenu *menu, QDir dir, bool ltabs, bool lot ); + void createDirEntry( QPopupMenu *menu, QDir dir, QString file, bool lot ); + void createAppEntry( QPopupMenu *menu, QDir dir, QString file ); + +private: + bool useWidePopupMenu; + QString popupMenuSidePixmap; + + bool startButtonIsFlat; + QString startButtonPixmap; + + int currentItem; + + QIntDict appLnks; + QIntDict tabNames; + QIntDict menuApplets; + +}; + +#endif // __START_MENU_H__ -- cgit v0.9.0.2