author | sandman <sandman> | 2002-10-02 22:06:33 (UTC) |
---|---|---|
committer | sandman <sandman> | 2002-10-02 22:06:33 (UTC) |
commit | b757807635fddb4824eabd87f72c96a0929c5cb1 (patch) (side-by-side diff) | |
tree | 831e4870fe1562507540b386cbcbd1ea93ecb9a8 | |
parent | 2682a282dc87074bdc61d241d5b2d76e8533982c (diff) | |
download | opie-b757807635fddb4824eabd87f72c96a0929c5cb1.zip opie-b757807635fddb4824eabd87f72c96a0929c5cb1.tar.gz opie-b757807635fddb4824eabd87f72c96a0929c5cb1.tar.bz2 |
- Qtopia 1.6 launcher merge (again - should be finished soon)
- Support for O-Menu applets (similiar to Taskbar applets)
-rw-r--r-- | core/launcher/desktop.cpp | 18 | ||||
-rw-r--r-- | core/launcher/desktop.h | 2 | ||||
-rw-r--r-- | core/launcher/startmenu.cpp | 252 | ||||
-rw-r--r-- | core/launcher/startmenu.h | 31 | ||||
-rw-r--r-- | core/launcher/systray.cpp | 2 | ||||
-rw-r--r-- | core/launcher/taskbar.cpp | 11 |
6 files changed, 288 insertions, 28 deletions
diff --git a/core/launcher/desktop.cpp b/core/launcher/desktop.cpp index 68949e6..1a33b36 100644 --- a/core/launcher/desktop.cpp +++ b/core/launcher/desktop.cpp @@ -380,6 +380,9 @@ void DesktopApplication::desktopMessage( const QCString &msg, const QByteArray & else if ( msg == "suspend()" ) { emit power(); } + else if ( msg == "home()" ) { + qpedesktop-> home ( ); + } #endif } @@ -717,10 +720,7 @@ void Desktop::raiseLauncher() QString tempItem; tempItem = cfg.readEntry( "Middle", "Home" ); if ( tempItem == "Home" || tempItem.isEmpty() ) { - if ( isVisibleWindow( launcher->winId() ) ) - launcher->nextView(); - else - launcher->raise(); + home ( ); } else { QCopEnvelope e( "QPE/System", "execute(QString)" ); @@ -728,6 +728,14 @@ void Desktop::raiseLauncher() } } +void Desktop::home ( ) +{ + if ( isVisibleWindow( launcher->winId() ) ) + launcher->nextView(); + else + launcher->raise(); +} + void Desktop::executeOrModify( const QString& appLnkFile ) { AppLnk lnk( MimeType::appsFolderName() + "/" + appLnkFile ); @@ -837,6 +845,8 @@ void Desktop::togglePower() { static bool excllock = false; + qDebug ( "togglePower (locked == %d)", excllock ? 1 : 0 ); + if ( excllock ) return ; diff --git a/core/launcher/desktop.h b/core/launcher/desktop.h index f7c3e3f..09ffe1c 100644 --- a/core/launcher/desktop.h +++ b/core/launcher/desktop.h @@ -118,6 +118,8 @@ public slots: void terminateServers(); void rereadVolumes(); + void home ( ); + protected: void executeOrModify( const QString& appLnkFile ); void styleChange( QStyle & ); diff --git a/core/launcher/startmenu.cpp b/core/launcher/startmenu.cpp index b008a30..647d0f2 100644 --- a/core/launcher/startmenu.cpp +++ b/core/launcher/startmenu.cpp @@ -1,7 +1,7 @@ /********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** 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 @@ -18,6 +18,8 @@ ** **********************************************************************/ +#define INCLUDE_MENUITEM_DEF + #include "startmenu.h" #include "sidething.h" //#include "mrulist.h" @@ -28,8 +30,10 @@ #include <qpe/applnk.h> #include <qpe/global.h> #include <qpe/resource.h> +#include <qpe/qlibrary.h> -#include <qdict.h> +#include <qintdict.h> +#include <qdir.h> #include <stdlib.h> @@ -41,13 +45,20 @@ StartMenu::StartMenu(QWidget *parent) : QLabel( parent ) { loadOptions(); - setPixmap( Resource::loadPixmap( startButtonPixmap ) ); + int sz = AppLnk::smallIconSize()+3; + QPixmap pm; + pm.convertFromImage(Resource::loadImage(startButtonPixmap).smoothScale(sz,sz)); + setPixmap(pm); setFocusPolicy( NoFocus ); //setFlat( startButtonIsFlat ); - apps = new AppLnkSet( QPEApplication::qpeDir() + "apps" ); + apps = 0; + launchMenu = 0; + applets. setAutoDelete ( true ); + sepId = 0; - createMenu(); + reloadApps ( ); + reloadApplets ( ); } @@ -75,28 +86,69 @@ void StartMenu::loadOptions() useWidePopupMenu = ( tmpBoolString1 == "TRUE" ) ? TRUE : FALSE; QString tmpBoolString2 = config.readEntry( "StartButtonIsFlat", "TRUE" ); startButtonIsFlat = ( tmpBoolString2 == "TRUE" ) ? TRUE : FALSE; -// QString tmpBoolString3 = config.readEntry( "UseMRUList", "TRUE" ); + QString tmpBoolString3 = config.readEntry( "UseMRUList", "TRUE" ); popupMenuSidePixmap = config.readEntry( "PopupMenuSidePixmap", "launcher/sidebar" ); - startButtonPixmap = config.readEntry( "StartButtonPixmap", "go" ); + startButtonPixmap = config.readEntry( "StartButtonPixmap", "launcher/start_button" ); #else // Basically just #include the .qpe_menu.conf file settings useWidePopupMenu = FALSE; popupMenuSidePixmap = "launcher/sidebar"; startButtonIsFlat = TRUE; - startButtonPixmap = "launcher/start_button"; + startButtonPixmap = "launcher/start_button"; // No tr #endif } void StartMenu::createMenu() { + delete launchMenu; if ( useWidePopupMenu ) launchMenu = new PopupWithLaunchSideThing( this, &popupMenuSidePixmap ); else launchMenu = new StartPopupMenu( this ); loadMenu( apps, launchMenu ); + loadApplets ( ); + + connect( launchMenu, SIGNAL(activated(int)), SLOT(itemSelected(int)) ); +} +void StartMenu::reloadApps() +{ + Config cfg("StartMenu"); + cfg.setGroup("Menu"); + bool ltabs = cfg.readBoolEntry("LauncherTabs",TRUE); + bool lot = cfg.readBoolEntry("LauncherOther",TRUE); + bool lt = ltabs || lot; + if ( launchMenu && apps && !lt ) + return; // nothing to do + + if ( lt ) { + delete apps; + apps = new AppLnkSet( QPEApplication::qpeDir() + "apps" ); + } + if ( launchMenu ) { + launchMenu-> hide ( ); + + for ( QIntDictIterator<QPopupMenu> it ( tabdict ); it. current ( ); ++it ) { + launchMenu-> removeItem ( it. currentKey ( )); + delete it.current ( ); + } + tabdict. clear ( ); + loadMenu(apps,launchMenu); + } else { + createMenu(); + } +} + +void StartMenu::reloadApplets() +{ + if ( launchMenu ) { + clearApplets ( ); + loadApplets ( ); + } + else + createMenu ( ); } void StartMenu::itemSelected( int id ) @@ -104,40 +156,86 @@ void StartMenu::itemSelected( int id ) const AppLnk *app = apps->find( id ); if ( app ) app->execute(); + else { + MenuApplet *applet = applets. find ( id ); + + if ( applet ) + applet-> iface-> activated ( ); + } } bool StartMenu::loadMenu( AppLnkSet *folder, QPopupMenu *menu ) { bool result = FALSE; - QStringList typs = folder->types(); + Config cfg("StartMenu"); + cfg.setGroup("Menu"); + + bool ltabs = cfg.readBoolEntry("LauncherTabs",TRUE); + bool lot = cfg.readBoolEntry("LauncherOther",TRUE); + + tabdict. clear ( ); + + if ( sepId ) + menu-> removeItem ( sepId ); + sepId = ( menu-> count ( )) ? menu-> insertSeparator ( 0 ) : 0; + + if ( ltabs || lot ) { QDict<QPopupMenu> typpop; - for (QStringList::Iterator tit=typs.begin(); tit!=typs.end(); ++tit) { + QStringList typs = folder->types(); + for (QStringList::Iterator tit=typs.fromLast(); ; --tit) { if ( !(*tit).isEmpty() ) { - QPopupMenu *new_menu = new StartPopupMenu( menu ); - typpop.insert(*tit, new_menu); + QPopupMenu *new_menu; + if ( ltabs ) { + new_menu = new StartPopupMenu( menu ); connect( new_menu, SIGNAL(activated(int)), SLOT(itemSelected(int)) ); - menu->insertItem( folder->typePixmap(*tit), folder->typeName(*tit), new_menu ); + int id = menu->insertItem( folder->typePixmap(*tit), folder->typeName(*tit), new_menu, -1, 0 ); + tabdict. insert ( id, new_menu ); + } else { + new_menu = (QPopupMenu*)1; } + typpop.insert(*tit, new_menu); + } + if ( tit == typs. begin ( )) + break; } - QListIterator<AppLnk> it( folder->children() ); + bool f=TRUE; for ( ; it.current(); ++it ) { AppLnk *app = it.current(); - if ( app->type() == "Separator" ) { + if ( app->type() == "Separator" ) { // No tr + if ( lot ) { menu->insertSeparator(); + } } else { + f = FALSE; QString t = app->type(); QPopupMenu* pmenu = typpop.find(t); + if ( ltabs ) { + if ( !pmenu && lot ) + pmenu = menu; + } else { if ( !pmenu ) pmenu = menu; - pmenu->insertItem( app->pixmap(), app->name(), app->id() ); + else + pmenu = 0; + } + if ( pmenu ) { + QString t = app->name(); + t.replace(QRegExp("&"),"&&"); // escape shortcut character + pmenu->insertItem( app->pixmap(), t, app->id() ); + } result=TRUE; } } + } - if ( result ) - connect( menu, SIGNAL(activated(int)), SLOT(itemSelected(int)) ); + if ( sepId && ( menu-> idAt ( 0 ) == sepId )) { // no tabs entries + menu-> removeItem ( sepId ); + sepId = 0; + } + if ( !menu-> count ( )) // if we don't do this QPopupMenu will insert a dummy Separator, which won't go away later + sepId = menu-> insertSeparator ( ); return result; } @@ -169,3 +267,119 @@ void StartPopupMenu::keyPressEvent( QKeyEvent *e ) QPopupMenu::keyPressEvent( e ); } } + +static int compareAppletPositions(const void *a, const void *b) +{ + const MenuApplet* aa = *(const MenuApplet**)a; + const MenuApplet* ab = *(const MenuApplet**)b; + int d = ab->iface->position() - aa->iface->position(); + if ( d ) return d; + return QString::compare(ab->library->library(),aa->library->library()); +} + +void StartMenu::clearApplets() +{ + launchMenu-> hide(); + + for ( QIntDictIterator<MenuApplet> it ( 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; + } + 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 + + bool safe = false; //cfg.readBoolEntry("SafeMode",FALSE); + if ( safe && !safety_tid ) + return; + cfg.writeEntry("SafeMode",TRUE); + cfg.write(); + QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' ); + + 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; + } else { + exclude += *it; + delete lib; + } + } + cfg.writeEntry( "ExcludeApplets", exclude, ',' ); + qsort(xapplets,napplets,sizeof(applets[0]),compareAppletPositions); + + if ( sepId ) + launchMenu-> removeItem ( sepId ); + sepId = ( launchMenu-> count ( )) ? launchMenu-> insertSeparator ( ) : 0; + + while (napplets--) { + MenuApplet *applet = xapplets[napplets]; + QString lang = getenv( "LANG" ); + 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; + + 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 ( ) ); + applets.insert ( applet-> id, new MenuApplet(*applet)); + } + delete xapplets; + + if ( sepId && ( launchMenu-> idAt ( launchMenu-> count ( ) - 1 ) == sepId )) { // no applets + launchMenu-> removeItem ( sepId ); + sepId = 0; + } + if ( !launchMenu-> count ( )) // if we don't do this QPopupMenu will insert a dummy Separator, which won't go away later + sepId = launchMenu-> insertSeparator ( ); + + if ( !safety_tid ) + safety_tid = startTimer(2000); // TT has 5000, but this is a PITA for a developer ;) (sandman) +} + +void StartMenu::timerEvent(QTimerEvent* e) +{ + if ( e->timerId() == safety_tid ) { + Config cfg( "StartMenu" ); + cfg.setGroup( "Applets" ); + cfg.writeEntry( "SafeMode", FALSE ); + killTimer(safety_tid); + safety_tid = 0; + } +} + diff --git a/core/launcher/startmenu.h b/core/launcher/startmenu.h index a02f39e..0a91bb8 100644 --- a/core/launcher/startmenu.h +++ b/core/launcher/startmenu.h @@ -1,7 +1,7 @@ /********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** 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 @@ -23,9 +23,11 @@ #include <qstring.h> #include <qlist.h> +#include <qintdict.h> #include <qlabel.h> #include <qpopupmenu.h> +#include <qpe/menuappletinterface.h> class AppLnkSet; class AppLnk; @@ -38,6 +40,19 @@ protected: void keyPressEvent( QKeyEvent *e ); }; +class QLibrary; + +struct MenuApplet +{ +#ifndef QT_NO_COMPONENT + QLibrary *library; +#endif + MenuAppletInterface *iface; + int id; + QPopupMenu *popup; +}; + + class StartMenu : public QLabel { Q_OBJECT public: @@ -53,15 +68,20 @@ public slots: void launch( ); void loadOptions( ); void createMenu( ); + void reloadApps( ); + void reloadApplets( ); protected slots: void itemSelected( int id ); protected: virtual void mousePressEvent( QMouseEvent * ); + virtual void timerEvent ( QTimerEvent * ); private: bool loadMenu( AppLnkSet *folder, QPopupMenu *menu ); + void loadApplets( ); + void clearApplets( ); private: bool useWidePopupMenu; @@ -71,6 +91,13 @@ private: QString startButtonPixmap; AppLnkSet *apps; + + QIntDict<MenuApplet> applets; + QIntDict<QPopupMenu> tabdict; + +// QValueList<MenuApplet> appletList; + int safety_tid; + int sepId; }; #endif // __START_MENU_H__ diff --git a/core/launcher/systray.cpp b/core/launcher/systray.cpp index 697971d..406c662 100644 --- a/core/launcher/systray.cpp +++ b/core/launcher/systray.cpp @@ -102,7 +102,7 @@ void SysTray::addApplets() continue; TaskbarAppletInterface *iface = 0; QLibrary *lib = new QLibrary( path + "/" + *it ); - if ( lib->queryInterface( IID_TaskbarApplet, (QUnknownInterface**)&iface ) == QS_OK ) { + if (( lib->queryInterface( IID_TaskbarApplet, (QUnknownInterface**)&iface ) == QS_OK ) && iface ) { TaskbarApplet *applet = new TaskbarApplet; applets[napplets++] = applet; applet->library = lib; diff --git a/core/launcher/taskbar.cpp b/core/launcher/taskbar.cpp index 46bcdb3..7d1aaf1 100644 --- a/core/launcher/taskbar.cpp +++ b/core/launcher/taskbar.cpp @@ -191,11 +191,15 @@ TaskBar::TaskBar() : QHBox(0, 0, WStyle_Customize | WStyle_Tool | WStyle_StaysOn void TaskBar::setStatusMessage( const QString &text ) { + if ( !text.isEmpty() ) { label->setText( text ); stack->raiseWidget( label ); if ( sysTray && ( label->fontMetrics().width( text ) > label->width() ) ) sysTray->hide(); - clearer->start( 3000 ); + clearer->start( 3000, TRUE ); + } else { + clearStatusBar(); + } } void TaskBar::clearStatusBar() @@ -212,7 +216,7 @@ void TaskBar::startWait() waitTimer->start( 10 * 1000, true ); } -void TaskBar::stopWait(const QString& app) +void TaskBar::stopWait(const QString& /*app*/) { waitTimer->stop(); //mru->addTask(sm->execToLink(app)); @@ -273,9 +277,12 @@ void TaskBar::receive( const QCString &msg, const QByteArray &data ) inputMethods->showInputMethod(); } else if ( msg == "reloadInputMethods()" ) { inputMethods->loadInputMethods(); + } else if ( msg == "reloadApps()" ) { + sm->reloadApps(); } else if ( msg == "reloadApplets()" ) { sysTray->clearApplets(); sysTray->addApplets(); + sm->reloadApplets(); } else if ( msg == "soundAlarm()" ) { Desktop::soundAlarm(); } |