21 #include <QStyleOptionToolButton>
22 #include <QStylePainter>
24 #include <QtGui/QDrag>
25 #include <QtGui/QActionEvent>
26 #include <QtGui/QMenu>
27 #include <QtCore/QPointer>
28 #include <QtGui/QStyle>
29 #include <QtCore/QTimer>
44 class KPushButton::KPushButtonPrivate
56 QTimer * delayedMenuTimer;
63 void slotSettingsChanged(
int );
64 void slotPressedInternal();
65 void slotClickedInternal();
66 void authStatusChanged(
int status);
67 void slotDelayedMenuTimeout();
71 void KPushButton::KPushButtonPrivate::slotSettingsChanged(
int )
74 parent->setIcon( item.icon() );
77 void KPushButton::KPushButtonPrivate::slotPressedInternal()
79 if (!delayedMenu.isNull()) {
80 if (delayedMenuTimer==0) {
81 delayedMenuTimer=
new QTimer(parent);
82 delayedMenuTimer->setSingleShot(
true);
83 connect(delayedMenuTimer,SIGNAL(
timeout()),parent,SLOT(slotDelayedMenuTimeout()));
85 const int delay=parent->style()->styleHint(QStyle::SH_ToolButton_PopupDelay, 0, parent);
86 delayedMenuTimer->start((delay<=0) ? 150:delay);
90 void KPushButton::KPushButtonPrivate::slotClickedInternal()
93 delayedMenuTimer->stop();
99 parent->setEnabled(
false);
102 emit parent->authorized(authAction);
110 void KPushButton::KPushButtonPrivate::slotDelayedMenuTimeout() {
111 delayedMenuTimer->stop();
112 if (!delayedMenu.isNull()) {
113 parent->setMenu(delayedMenu);
119 void KPushButton::KPushButtonPrivate::authStatusChanged(
int status)
125 parent->setEnabled(
true);
126 if(!oldIcon.isNull()) {
127 parent->setIcon(oldIcon);
132 parent->setEnabled(
true);
133 oldIcon =
KIcon(parent->icon());
134 parent->setIcon(
KIcon(
"dialog-password"));
137 parent->setEnabled(
false);
138 if(!oldIcon.isNull()) {
139 parent->setIcon(oldIcon);
145 void KPushButton::KPushButtonPrivate::readSettings()
153 :
QPushButton( parent ), d( new KPushButtonPrivate(this) )
159 :
QPushButton( parent ), d( new KPushButtonPrivate(this) )
166 :
QPushButton( text, parent ), d( new KPushButtonPrivate(this) )
172 :
QPushButton( parent ), d( new KPushButtonPrivate(this) )
182 void KPushButton::init(
const KGuiItem &item )
186 d->delayedMenuTimer=0;
188 connect(
this,SIGNAL(pressed()),
this, SLOT(slotPressedInternal()));
189 connect(
this,SIGNAL(clicked()),
this, SLOT(slotClickedInternal()));
192 QPushButton::setText( d->item.text() );
194 static bool initialized =
false;
195 if ( !initialized ) {
207 SLOT(slotSettingsChanged(
int)) );
212 return d->m_dragEnabled;
221 QPushButton::setText( d->item.text() );
223 setToolTip( d->item.toolTip() );
224 setEnabled( d->item.isEnabled() );
225 setWhatsThis( d->item.whatsThis() );
241 QPushButton::setText(text);
245 if (text.isEmpty() != d->item.text().isEmpty())
248 d->item.setText(text);
253 d->item.setIcon(icon);
255 if ( s_useIcons || text().isEmpty() )
256 QPushButton::setIcon( icon );
258 QPushButton::setIcon( QIcon() );
268 d->m_dragEnabled = enable;
273 if ( d->m_dragEnabled )
274 d->startPos = e->pos();
275 QPushButton::mousePressEvent( e );
280 if ( !d->m_dragEnabled )
282 QPushButton::mouseMoveEvent( e );
286 if ( (e->buttons() & Qt::LeftButton) &&
287 (e->pos() - d->startPos).manhattanLength() >
314 return d->delayedMenu;
319 return d->authAction;
324 if (actionName.isEmpty()) {
333 if (d->authAction == action) {
338 disconnect(d->authAction->watcher(), SIGNAL(statusChanged(
int)),
339 this, SLOT(authStatusChanged(
int)));
342 if (!d->oldIcon.isNull()) {
344 d->oldIcon =
KIcon();
349 d->authAction = action;
352 d->authAction->setParentWidget(
this);
354 connect(d->authAction->watcher(), SIGNAL(statusChanged(
int)),
355 this, SLOT(authStatusChanged(
int)));
356 d->authStatusChanged(d->authAction->status());
362 const bool tempSetMenu = !menu() && d->delayedMenu;
364 const_cast<KPushButton *
>(
this)->setMenu(d->delayedMenu);
365 const QSize sz = QPushButton::sizeHint();
373 QStylePainter p(
this);
374 QStyleOptionButton option;
375 initStyleOption(&option);
378 option.features |= QStyleOptionButton::HasMenu;
380 p.drawControl(QStyle::CE_PushButton, option);
383 #include "kpushbutton.moc"