sidepane.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <qptrlist.h>
00021 #include <qwidgetstack.h>
00022 #include <qsignal.h>
00023 #include <qobjectlist.h>
00024 #include <qlabel.h>
00025 #include <qpainter.h>
00026 #include <qbitmap.h>
00027 #include <qfontmetrics.h>
00028 #include <qstyle.h>
00029
00030 #include <kapplication.h>
00031 #include <kconfig.h>
00032 #include <klocale.h>
00033 #include <kiconloader.h>
00034 #include <sidebarextension.h>
00035
00036 #include <kdebug.h>
00037
00038 #include "mainwindow.h"
00039
00040 #include "plugin.h"
00041
00042 #include "sidepane.h"
00043
00044 using namespace Kontact;
00045
00047
00049
00050 PanelButton::PanelButton( Kontact::Plugin *plugin, int id, QWidget *parent, const char* name)
00051 : QPushButton(parent, name)
00052 {
00053
00054 setPixmap( BarIcon( plugin->icon() ) );
00055 setText( plugin->title() );
00056
00057 mActive = false;
00058 mId = id;
00059 mPlugin = plugin;
00060
00061 QFont fnt(font());
00062 fnt.setBold(true);
00063 setFont(fnt);
00064
00065 if (style().inherits("KStyle"))
00066 setFlat(true);
00067
00068 connect(this, SIGNAL(clicked()), SLOT(slotClicked()));
00069 }
00070
00071 void PanelButton::slotClicked()
00072 {
00073 emit clicked( this );
00074 emit showPart( mPlugin );
00075
00076 setActive();
00077 }
00078
00079 void PanelButton::setActive()
00080 {
00081 QColorGroup cga(palette().active());
00082 cga.setColor(QColorGroup::Button, cga.highlight());
00083 cga.setColor(QColorGroup::ButtonText, cga.highlightedText());
00084
00085 QColorGroup cgi(palette().inactive());
00086 cgi.setColor(QColorGroup::Button, cgi.highlight());
00087 cgi.setColor(QColorGroup::ButtonText, cgi.highlightedText());
00088
00089 QPalette pal = palette();
00090 pal.setActive(cga);
00091 pal.setInactive(cgi);
00092 setPalette(pal);
00093
00094 mActive = true;
00095
00096 kdDebug(5600) << "PanelButton::setActive()" << endl;
00097 }
00098
00099 void PanelButton::setInactive()
00100 {
00101
00102 setPalette(parentWidget()->palette());
00103
00104 mActive = false;
00105 }
00106
00107 void PanelButton::setPixmap(const QPixmap& pix)
00108 {
00109 mPix = pix;
00110 QPushButton::setPixmap(pix);
00111 }
00112
00113 void PanelButton::setText(const QString& text)
00114 {
00115 mText = text;
00116 QPushButton::setText(text);
00117 }
00118
00119 void PanelButton::composeLabel(QPainter *p)
00120 {
00121 QRect rect = style().subRect(QStyle::SR_PushButtonContents, this);
00122 QRect pixRect = mPix.rect();
00123 pixRect.moveCenter(rect.center());
00124
00125 if (kapp->reverseLayout())
00126 pixRect.setLeft(rect.right()-pixRect.width());
00127 else
00128 pixRect.setLeft(rect.left());
00129
00130 pixRect.setWidth(mPix.width());
00131
00132 p->drawPixmap(pixRect, mPix);
00133 QPen tmp = p->pen();
00134 p->setPen(colorGroup().buttonText());
00135 if (kapp->reverseLayout())
00136 {
00137 rect.setRight(rect.right()-(mPix.width()+2));
00138 p->drawText(rect, AlignVCenter|AlignRight, mText);
00139 }
00140 else
00141 {
00142 rect.setLeft(mPix.width()+2);
00143 p->drawText(rect, AlignVCenter, mText);
00144 }
00145 p->setPen(tmp);
00146
00147 }
00148
00149 void PanelButton::drawButtonLabel(QPainter *p)
00150 {
00151 composeLabel(p);
00152 }
00153
00155
00156 SidePane::SidePane( Core* core, QWidget *parent, const char* name )
00157 : SidePaneBase( core, parent, name ),
00158 mContentStack( 0 ),
00159 mHeaderWidget( 0 )
00160 {
00161
00162 setSpacing(0);
00163
00164 mHeaderWidget = new QLabel(this, "header");
00165 mHeaderWidget->setAlignment( AlignVCenter );
00166 mHeaderWidget->setPaletteBackgroundColor( colorGroup().dark() );
00167 mHeaderWidget->setPaletteForegroundColor( colorGroup().light() );
00168 mHeaderWidget->setFixedHeight(22);
00169
00170 QFont fnt(font());
00171 fnt.setBold(true);
00172 fnt.setPointSize(font().pointSize()+3);
00173 mHeaderWidget->setFont(fnt);
00174
00175 mContentStack = new QWidgetStack(this);
00176 mContentStack->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
00177 mContentStack->addWidget(new QWidget(mContentStack));
00178 }
00179
00180 SidePane::~SidePane()
00181 {
00182 QValueList<QGuardedPtr<QWidget> >::Iterator it;
00183 for ( it = mContentList.begin(); it != mContentList.end(); ++it ) {
00184 if ( (*it) )
00185 (*it)->reparent( 0, 0, QPoint( 0, 0 ) );
00186 }
00187 }
00188
00189 void SidePane::switchSidePaneWidget( Kontact::Plugin *plugin )
00190 {
00191 KParts::Part *part = plugin->part();
00192
00193 Q_ASSERT(part);
00194
00195 QObjectList *l = part->queryList( "KParts::SideBarExtension" );
00196 KParts::SideBarExtension *sbe = 0;
00197 if ( l )
00198 sbe = static_cast<KParts::SideBarExtension*>(l->first());
00199 delete l;
00200
00201 if (!sbe) {
00202 mContentStack->raiseWidget(0);
00203 return;
00204 }
00205
00206 if (mContentStack->id(sbe->widget()) == -1) {
00207 mContentStack->addWidget(sbe->widget());
00208 QGuardedPtr<QWidget> ptr = sbe->widget();
00209 mContentList.append( ptr );
00210 }
00211
00212 mContentStack->raiseWidget(sbe->widget());
00213 }
00214
00215 void SidePane::switchItems(PanelButton* pb)
00216 {
00217 QPtrListIterator<PanelButton> it( mButtonList );
00218 for (; it.current(); ++it)
00219 {
00220 if (it.current()->isActive())
00221 it.current()->setInactive();
00222 }
00223
00224 mContentStack->raiseWidget( pb->id() );
00225 mHeaderWidget->setText( pb->text() );
00226 }
00227
00228 void SidePane::updatePlugins()
00229 {
00230
00231 mButtonList.setAutoDelete( true );
00232 mButtonList.clear();
00233 mButtonList.setAutoDelete( false );
00234
00235 QValueList<Plugin*> plugins = core()->pluginList();
00236 QValueList<Plugin*>::ConstIterator end = plugins.end();
00237 QValueList<Plugin*>::ConstIterator it = plugins.begin();
00238 for ( ; it != end; ++it ) {
00239 Plugin *plugin = *it;
00240 if ( !plugin->showInSideBar() )
00241 continue;
00242
00243 PanelButton* pb = new PanelButton( plugin, 0, this, "PanelButton" );
00244 mButtonList.append( pb );
00245 connect( pb, SIGNAL( clicked( PanelButton* ) ),
00246 SLOT( switchItems( PanelButton* ) ) );
00247 connect( pb, SIGNAL( showPart( Kontact::Plugin* ) ),
00248 SIGNAL( pluginSelected( Kontact::Plugin* ) ) );
00249 connect( pb, SIGNAL( showPart( Kontact::Plugin* ) ),
00250 SLOT( switchSidePaneWidget( Kontact::Plugin* ) ) );
00251
00252 pb->show();
00253 }
00254 }
00255
00256 void SidePane::selectPlugin( Kontact::Plugin *plugin )
00257 {
00258 bool blocked = signalsBlocked();
00259 blockSignals( true );
00260
00261 QPtrListIterator<PanelButton> it( mButtonList );
00262
00263 PanelButton *btn;
00264 while ( ( btn = it.current() ) != 0 ) {
00265 ++it;
00266 if ( btn->plugin() == plugin ) {
00267 btn->slotClicked();
00268 blockSignals( blocked );
00269 return;
00270 }
00271 }
00272
00273 btn = mButtonList.first();
00274
00275
00276 Q_ASSERT( btn );
00277 if ( btn )
00278 btn->slotClicked();
00279
00280 blockSignals( blocked );
00281 }
00282
00283 void SidePane::selectPlugin( const QString &pluginName )
00284 {
00285 bool blocked = signalsBlocked();
00286 blockSignals( true );
00287
00288 QPtrListIterator<PanelButton> it( mButtonList );
00289
00290 PanelButton *btn;
00291 while ( ( btn = it.current() ) != 0 ) {
00292 ++it;
00293 Kontact::Plugin *plugin = btn->plugin();
00294 if ( plugin->identifier() == pluginName ) {
00295 btn->slotClicked();
00296 blockSignals( blocked );
00297 return;
00298 }
00299 }
00300
00301 btn = mButtonList.first();
00302
00303
00304 Q_ASSERT( btn );
00305 if ( btn )
00306 btn->slotClicked();
00307
00308 blockSignals( blocked );
00309 }
00310
00311 #include "sidepane.moc"
00312
00313
This file is part of the documentation for kontact Library Version 3.2.2.