summaryrefslogtreecommitdiff
authorzecke <zecke>2004-09-12 20:31:20 (UTC)
committer zecke <zecke>2004-09-12 20:31:20 (UTC)
commitb52e2e46ec535a5307276b8fdf1e578aa5d29283 (patch) (side-by-side diff)
treef30d0fd2faaf89c2bc982e3f8a645645bf74edd8
parent90aaa298cc69522e88e1f81ade7d5259131b1544 (diff)
downloadopie-b52e2e46ec535a5307276b8fdf1e578aa5d29283.zip
opie-b52e2e46ec535a5307276b8fdf1e578aa5d29283.tar.gz
opie-b52e2e46ec535a5307276b8fdf1e578aa5d29283.tar.bz2
-Only create configWidgets once per config dialog, properly delete them
-Delete the Widgets before we remove the plugin from our address space some random clean ups
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--core/pim/today/today.cpp30
-rw-r--r--core/pim/today/today.h1
-rw-r--r--core/pim/today/todayconfig.cpp28
-rw-r--r--core/pim/today/todayconfig.h4
4 files changed, 37 insertions, 26 deletions
diff --git a/core/pim/today/today.cpp b/core/pim/today/today.cpp
index a8c8651..be7cbce 100644
--- a/core/pim/today/today.cpp
+++ b/core/pim/today/today.cpp
@@ -15,89 +15,87 @@
***************************************************************************/
#include "today.h"
#include <opie2/odebug.h>
#include <opie2/opluginloader.h>
#include <opie2/oconfig.h>
#include <qpe/qcopenvelope_qws.h>
#include <qpe/resource.h>
#include <qpe/qpeapplication.h>
#include <qpe/contact.h>
#include <qdir.h>
#include <qtimer.h>
#include <qwhatsthis.h>
+#include <qmessagebox.h>
using namespace Opie::Ui;
using Opie::Core::OPluginItem;
using Opie::Core::OPluginLoader;
using Opie::Core::OPluginManager;
using Opie::Core::OConfig;
struct TodayPlugin {
TodayPlugin() : iface( 0 ), guiPart( 0 ), guiBox( 0 ) {}
QInterfacePtr<TodayPluginInterface> iface;
TodayPluginObject *guiPart;
OPluginItem oplugin;
QWidget *guiBox;
QString name;
bool excludeRefresh;
};
static QMap<QString, TodayPlugin> pluginList;
Today::Today( QWidget* parent, const char* name, WFlags fl )
: TodayBase( parent, name, fl ) {
QObject::connect( (QObject*)ConfigButton, SIGNAL( clicked() ), this, SLOT( startConfig() ) );
QObject::connect( (QObject*)OwnerField, SIGNAL( clicked() ), this, SLOT( editCard() ) );
- #if defined(Q_WS_QWS)
#if !defined(QT_NO_COP)
QCopChannel *todayChannel = new QCopChannel( "QPE/Today" , this );
connect ( todayChannel, SIGNAL( received(const QCString&,const QByteArray&) ),
this, SLOT ( channelReceived(const QCString&,const QByteArray&) ) );
#endif
- #endif
setOwnerField();
m_big_box = 0L;
layout = new QVBoxLayout( this );
layout->addWidget( Frame );
layout->addWidget( OwnerField );
m_sv = new QScrollView( this );
m_sv->setResizePolicy( QScrollView::AutoOneFit );
m_sv->setHScrollBarMode( QScrollView::AlwaysOff );
m_sv->setFrameShape( QFrame::NoFrame );
layout->addWidget( m_sv );
layout->setStretchFactor( m_sv,4 );
m_refreshTimer = new QTimer( this );
connect( m_refreshTimer, SIGNAL( timeout() ), this, SLOT( refresh() ) );
init();
loadPlugins();
initialize();
- QPEApplication::showWidget( this );
}
/**
* Qcop receive method.
*/
void Today::channelReceived( const QCString &msg, const QByteArray & data ) {
QDataStream stream( data, IO_ReadOnly );
if ( msg == "message(QString)" ) {
QString message;
stream >> message;
setOwnerField( message );
}
}
void Today::setRefreshTimer( int interval ) {
@@ -166,37 +164,50 @@ void Today::init() {
}
m_big_box = new QWidget( m_sv->viewport() );
m_sv->addChild( m_big_box );
m_bblayout = new QVBoxLayout ( m_big_box );
}
/**
* Load the plugins
*/
void Today::loadPlugins() {
m_pluginLoader = new OPluginLoader( "today", true );
m_pluginLoader->setAutoDelete( true );
- OPluginItem::List lst = m_pluginLoader->allAvailable( true );
-
m_manager = new OPluginManager( m_pluginLoader );
m_manager->load();
+ /*
+ * check if loading of Plugins crashed
+ */
+ if( m_pluginLoader->isInSafeMode() ) {
+ QMessageBox::information(this, tr("Today Error"),
+ tr("<qt>The plugin '%1' caused Today to crash."
+ " It could be that the plugin is not properly"
+ " installed.<br>Today tries to continue loading"
+ " plugins.</qt>")
+ .arg( m_manager->crashedPlugin().name()));
+ }
+
+ OPluginItem::List lst = m_pluginLoader->filtered( true );
+
+
for ( OPluginItem::List::Iterator it = lst.begin(); it != lst.end(); ++it ) {
TodayPluginInterface* iface = m_pluginLoader->load<TodayPluginInterface>( *it, IID_TodayPluginInterface );
TodayPlugin plugin;
plugin.iface = iface;
plugin.name = (*it).name();
plugin.oplugin = (*it);
plugin.guiPart = plugin.iface->guiPart();
plugin.excludeRefresh = plugin.guiPart->excludeFromRefresh();
// package the whole thing into a qwidget so it can be shown and hidden
plugin.guiBox = new QWidget( m_big_box );
QHBoxLayout *boxLayout = new QHBoxLayout( plugin.guiBox );
QPixmap plugPix;
plugPix.convertFromImage( Resource::loadImage( plugin.guiPart->pixmapNameWidget() ).smoothScale( m_iconSize, m_iconSize ), 0 );
@@ -220,33 +231,33 @@ void Today::loadPlugins() {
m_bblayout->addStretch( 1 );
}
/**
* The method for the configuration dialog.
*/
void Today::startConfig() {
// disconnect timer to prevent problems while being on config dialog
disconnect( m_refreshTimer, SIGNAL( timeout() ), this, SLOT( refresh() ) );
m_refreshTimer->stop( );
TodayConfig conf( this, "dialog", true );
conf.setUpPlugins( m_manager, m_pluginLoader );
- if ( conf.exec() == QDialog::Accepted ) {
+ if ( QPEApplication::execDialog(&conf) == QDialog::Accepted ) {
conf.writeConfig();
initialize();
} else {
// since reinitialize is not called in that case , reconnect the signal
m_refreshTimer->start( 15000 ); // get the config value in here later
connect( m_refreshTimer, SIGNAL( timeout() ), this, SLOT( refresh() ) );
}
}
void Today::initialize() {
Config cfg( "today" );
cfg.setGroup( "Plugins" );
@@ -331,24 +342,23 @@ void Today::refresh() {
void Today::startApplication() {
QCopEnvelope e( "QPE/System", "execute(QString)" );
e << QString( sender()->name() );
}
/**
* launch addressbook (personal card)
*/
void Today::editCard() {
QCopEnvelope env( "QPE/Application/addressbook", "editPersonalAndClose()" );
}
Today::~Today() {
- if (m_pluginLoader) {
+ for(QMap<QString, TodayPlugin>::Iterator it = pluginList.begin(); it != pluginList.end(); ++it )
+ delete it.data().guiBox;
+
delete m_pluginLoader;
- }
- if (m_manager) {
delete m_manager;
}
-}
diff --git a/core/pim/today/today.h b/core/pim/today/today.h
index c947ae1..dfc819d 100644
--- a/core/pim/today/today.h
+++ b/core/pim/today/today.h
@@ -27,33 +27,32 @@
#include <qpe/qlibrary.h>
#include <qscrollview.h>
#include <qvbox.h>
class QVBoxLayout;
namespace Opie {
namespace Core {
class OPluginManager;
class OPluginLoader;
}
}
class Today : public TodayBase {
-
Q_OBJECT
public:
Today( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
~Today();
static QString appName() {
return QString::fromLatin1("today");
}
private slots:
void startConfig();
void startApplication();
void editCard();
void refresh();
private:
diff --git a/core/pim/today/todayconfig.cpp b/core/pim/today/todayconfig.cpp
index c9823d4..dacce8b 100644
--- a/core/pim/today/todayconfig.cpp
+++ b/core/pim/today/todayconfig.cpp
@@ -83,60 +83,61 @@ TodayConfig::TodayConfig( QWidget* parent, const char* name, bool modal )
new ToolButton( vbox1, tr( "Move Down" ), "down", this , SLOT( moveSelectedDown() ) );
tab2Layout->addWidget( hbox1 );
TabWidget3->addTab( tab_2, "pass", tr( "active/order" ) );
// Misc tab
tab_3 = new QWidget( TabWidget3, "tab_3" );
QVBoxLayout *tab3Layout = new QVBoxLayout( tab_3 );
m_guiMisc = new TodayConfigMiscBase( tab_3 );
tab3Layout->addWidget( m_guiMisc );
TabWidget3->addTab( tab_3, "SettingsIcon", tr( "Misc" ) );
connect ( m_appletListView , SIGNAL( clicked(QListViewItem*) ), this, SLOT( appletChanged() ) );
previousItem = 0l;
readConfig();
- QPEApplication::showDialog( this );
}
void TodayConfig::setUpPlugins( OPluginManager * plugManager, OPluginLoader *plugLoader ) {
-
+ m_configMap.clear();
m_pluginManager = plugManager;
m_pluginLoader = plugLoader;
OPluginItem::List inLst = m_pluginLoader->allAvailable( true );
OPluginItem::List lst;
for ( OPluginItem::List::Iterator it = inLst.begin(); it != inLst.end(); ++it ) {
lst.prepend((*it));
TodayPluginInterface* iface = m_pluginLoader->load<TodayPluginInterface>( *it, IID_TodayPluginInterface );
-
- if ( iface->guiPart()->configWidget(this) != 0l ) {
TodayConfigWidget* widget = iface->guiPart()->configWidget( TabWidget3 );
+
+ if (!widget )
+ continue;
+
+ m_configMap.insert( iface, widget );
TabWidget3->addTab( widget, iface->guiPart()->pixmapNameConfig()
, iface->guiPart()->appName() );
}
- }
- for ( OPluginItem::List::Iterator it = lst.begin(); it != lst.end(); ++it ) {
+ for ( OPluginItem::List::Iterator it = lst.begin(); it != lst.end(); ++it )
pluginManagement( (*it) );
- }
+
TabWidget3->setCurrentTab( tab_2 );
}
/**
* Autostart, uses the new (opie only) autostart method in the launcher code.
* If registered against that today ist started on each resume.
*/
void TodayConfig::setAutoStart() {
OConfig cfg( "today" );
cfg.setGroup( "Autostart" );
if ( m_autoStart ) {
QCopEnvelope e( "QPE/System", "autoStart(QString,QString,QString)" );
e << QString( "add" );
e << QString( "today" );
e << QString( "%1" ).arg( m_autoStartTimer );
@@ -161,67 +162,66 @@ void TodayConfig::readConfig() {
cfg.setGroup( "General" );
m_iconSize = cfg.readNumEntry( "IconSize", 18 );
m_guiMisc->SpinBoxIconSize->setValue( m_iconSize );
m_guiMisc->SpinRefresh->setValue( cfg.readNumEntry( "checkinterval", 15000 ) / 1000 );
m_guiMisc->CheckBoxHide->setChecked( cfg.readNumEntry( "HideBanner", 0 ) );
}
/**
* Write the config part
*/
void TodayConfig::writeConfig() {
OConfig cfg( "today" );
int position = m_appletListView->childCount();
QListViewItemIterator list_it( m_appletListView );
- //
+ OPluginItem::List lst = m_pluginLoader->allAvailable( true );
+
// this makes sure the names get saved in the order selected
for ( ; list_it.current(); ++list_it ) {
- OPluginItem::List lst = m_pluginLoader->allAvailable( true );
for ( OPluginItem::List::Iterator it = lst.begin(); it != lst.end(); ++it ) {
if ( QString::compare( (*it).name() , list_it.current()->text(0) ) == 0 ) {
(*it).setPosition(position--);
m_pluginManager->setEnabled( (*it),((QCheckListItem*)list_it.current())->isOn() );
}
}
}
m_pluginManager->save();
cfg.setGroup( "Autostart" );
m_autoStart = m_guiMisc->CheckBoxAuto->isChecked();
cfg.writeEntry( "autostart", m_autoStart );
m_autoStartTimer = m_guiMisc->SpinBoxTime->value();
cfg.writeEntry( "autostartdelay", m_autoStartTimer );
m_iconSize = m_guiMisc->SpinBoxIconSize->value();
cfg.setGroup( "General" );
cfg.writeEntry( "IconSize", m_iconSize );
cfg.writeEntry( "HideBanner", m_guiMisc->CheckBoxHide->isChecked() );
cfg.writeEntry( "checkinterval", m_guiMisc->SpinRefresh->value()*1000 );
// set autostart settings
setAutoStart();
- OPluginItem::List lst = m_pluginManager->managedPlugins();
- for ( OPluginItem::List::Iterator it = lst.begin(); it != lst.end(); ++it ) {
+ OPluginItem::List managedLst = m_pluginManager->managedPlugins();
+ for ( OPluginItem::List::Iterator it = managedLst.begin(); it != managedLst.end(); ++it ) {
TodayPluginInterface* iface = m_pluginLoader->load<TodayPluginInterface>( *it, IID_TodayPluginInterface );
- if ( iface->guiPart()->configWidget(this) != 0l ) {
- iface->guiPart()->configWidget(this)->writeConfig();
- }
+ if ( m_configMap.contains( iface ) )
+ m_configMap[iface]->writeConfig();
}
}
void TodayConfig::moveSelectedUp() {
QListViewItem *item = m_appletListView->selectedItem();
if ( item && item->itemAbove() ) {
item->itemAbove()->moveItem( item );
}
}
void TodayConfig::moveSelectedDown() {
QListViewItem *item = m_appletListView->selectedItem();
if ( item && item->itemBelow() ) {
item->moveItem( item->itemBelow() );
diff --git a/core/pim/today/todayconfig.h b/core/pim/today/todayconfig.h
index ab79f31..81120d3 100644
--- a/core/pim/today/todayconfig.h
+++ b/core/pim/today/todayconfig.h
@@ -17,66 +17,68 @@
#ifndef TODAYCONFIG_H
#define TODAYCONFIG_H
#include "todayconfigmiscbase.h"
#include <opie2/otabwidget.h>
#include <opie2/opluginloader.h>
#include <qvariant.h>
#include <qdialog.h>
#include <qlistview.h>
class QCheckBox;
class QLabel;
class QSpinBox;
class QTabWidget;
+class TodayConfigWidget;
+class TodayPluginInterface;
namespace Opie {
namespace Core {
class OPluginManager;
class OPluginLoader;
class OPluginItem;
}
}
class TodayConfig : public QDialog {
-
Q_OBJECT
public:
TodayConfig( QWidget* parent = 0, const char* name = 0, bool modal = FALSE );
~TodayConfig();
Opie::Ui::OTabWidget* TabWidget3;
void writeConfig();
void setUpPlugins( Opie::Core::OPluginManager * plugManager, Opie::Core::OPluginLoader * plugLoader );
protected slots:
void moveSelectedUp();
void moveSelectedDown();
private:
void setAutoStart();
void readConfig();
void pluginManagement( Opie::Core::OPluginItem plugItem);
QListView* m_appletListView;
QMap<QString,QCheckListItem*> m_applets;
+ QMap<TodayPluginInterface*,TodayConfigWidget*> m_configMap;
int m_autoStart;
int m_autoStartTimer;
int m_iconSize;
QStringList m_excludeApplets;
bool m_applets_changed;
QWidget* tab_2;
QWidget* tab_3;
QLabel* TextLabel1, *TextLabel4;
QSpinBox* SpinBox7;
Opie::Core::OPluginManager *m_pluginManager;
Opie::Core::OPluginLoader *m_pluginLoader;
QCheckListItem *previousItem;