diff --git a/kcmkwin/kwincompositing/CMakeLists.txt b/kcmkwin/kwincompositing/CMakeLists.txt index e333ca54e5..a224ef7c7f 100644 --- a/kcmkwin/kwincompositing/CMakeLists.txt +++ b/kcmkwin/kwincompositing/CMakeLists.txt @@ -5,6 +5,7 @@ include_directories( ${KDEBASE_WORKSPACE_SOURCE_DIR}/kwin ) set(kcm_kwincompositing_PART_SRCS advanced.cpp main.cpp + ktimerdialog.cpp ${KDEBASE_WORKSPACE_SOURCE_DIR}/kwin/compositingprefs.cpp ${KDEBASE_WORKSPACE_SOURCE_DIR}/kwin/lib/kwinglobals.cpp ) diff --git a/kcmkwin/kwincompositing/advanced.cpp b/kcmkwin/kwincompositing/advanced.cpp index 1c2e69af79..8fead18e59 100644 --- a/kcmkwin/kwincompositing/advanced.cpp +++ b/kcmkwin/kwincompositing/advanced.cpp @@ -68,8 +68,7 @@ void KWinAdvancedCompositingOptions::compositingModeChanged() void KWinAdvancedCompositingOptions::showConfirmDialog() { ConfirmDialog confirm; - int result = confirm.exec(); - if(result != KDialog::Yes) + if(!confirm.exec()) { // Revert settings KConfigGroup config(mKWinConfig, "Compositing"); diff --git a/kcmkwin/kwincompositing/ktimerdialog.cpp b/kcmkwin/kwincompositing/ktimerdialog.cpp new file mode 100644 index 0000000000..a7397d07c7 --- /dev/null +++ b/kcmkwin/kwincompositing/ktimerdialog.cpp @@ -0,0 +1,220 @@ +/* + * This file is part of the KDE Libraries + * Copyright (C) 2002 Hamish Rodda + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + + +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include + +#include "ktimerdialog.h" +#include "ktimerdialog.moc" + +KTimerDialog::KTimerDialog( int msec, TimerStyle style, QWidget *parent, + const char *name, bool modal, + const QString &caption, + int buttonMask, ButtonCode defaultButton, + bool separator, + const KGuiItem &user1, + const KGuiItem &user2, + const KGuiItem &user3 ) + : KDialog( parent ) +{ + setObjectName( name ); + setModal( modal ); + setCaption( caption ); + setButtons( (ButtonCodes)buttonMask ); + setDefaultButton( defaultButton ); + showButtonSeparator( separator ); + setButtonGuiItem( User1, user1 ); + setButtonGuiItem( User2, user2 ); + setButtonGuiItem( User3, user3 ); + + totalTimer = new QTimer( this ); + totalTimer->setSingleShot( true ); + updateTimer = new QTimer( this ); + updateTimer->setSingleShot( false ); + msecTotal = msecRemaining = msec; + updateInterval = 1000; + tStyle = style; + KWindowSystem::setIcons( winId(), DesktopIcon("randr"), SmallIcon("randr") ); + // default to canceling the dialog on timeout + if ( buttonMask & Cancel ) + buttonOnTimeout = Cancel; + + connect( totalTimer, SIGNAL( timeout() ), SLOT( slotInternalTimeout() ) ); + connect( updateTimer, SIGNAL( timeout() ), SLOT( slotUpdateTime() ) ); + + // create the widgets + mainWidget = new KVBox( this ); + timerWidget = new KHBox( mainWidget ); + timerLabel = new QLabel( timerWidget ); + timerProgress = new QProgressBar( timerWidget ); + timerProgress->setRange( 0, msecTotal ); + timerProgress->setTextVisible( false ); + + KDialog::setMainWidget( mainWidget ); + + slotUpdateTime( false ); +} + +KTimerDialog::~KTimerDialog() +{ +} + +void KTimerDialog::setVisible( bool visible ) +{ + KDialog::setVisible( visible ); + + if ( visible ) { + totalTimer->start( msecTotal ); + updateTimer->start( updateInterval ); + } +} + +int KTimerDialog::exec() +{ + totalTimer->start( msecTotal ); + updateTimer->start( updateInterval ); + return KDialog::exec(); +} + +void KTimerDialog::setMainWidget( QWidget *widget ) +{ + // yuck, here goes. + KVBox *newWidget = new KVBox( this ); + + if ( widget->parentWidget() != mainWidget ) { + widget->setParent( newWidget); + } + timerWidget->setParent( newWidget); + + delete mainWidget; + mainWidget = newWidget; + KDialog::setMainWidget( mainWidget ); +} + +void KTimerDialog::setRefreshInterval( int msec ) +{ + updateInterval = msec; + if ( updateTimer->isActive() ) + updateTimer->start( updateInterval ); +} + +int KTimerDialog::timeoutButton() const +{ + return buttonOnTimeout; +} + +void KTimerDialog::setTimeoutButton( const ButtonCode newButton ) +{ + buttonOnTimeout = newButton; +} + +int KTimerDialog::timerStyle() const +{ + return tStyle; +} + +void KTimerDialog::setTimerStyle( const TimerStyle newStyle ) +{ + tStyle = newStyle; +} + +void KTimerDialog::slotUpdateTime( bool update ) +{ + if ( update ) + switch ( tStyle ) { + case CountDown: + msecRemaining -= updateInterval; + break; + case CountUp: + msecRemaining += updateInterval; + break; + case Manual: + break; + } + + timerProgress->setValue( msecRemaining ); + + timerLabel->setText( i18np("1 second remaining:","%1 seconds remaining:",msecRemaining/1000) ); +} + +void KTimerDialog::slotInternalTimeout() +{ + emit timerTimeout(); + switch ( buttonOnTimeout ) { + case Help: + slotButtonClicked(KDialog::Help); + break; + case Default: + slotButtonClicked(KDialog::Default); + break; + case Ok: + slotButtonClicked(KDialog::Ok); + break; + case Apply: + slotButtonClicked(KDialog::Apply); + break; + case Try: + slotButtonClicked(KDialog::Try); + break; + case Cancel: + slotButtonClicked(KDialog::Cancel); + break; + case Close: + slotButtonClicked(KDialog::Close); + break; + case User1: + slotButtonClicked(KDialog::User1); + break; + case User2: + slotButtonClicked(KDialog::User2); + break; + case User3: + slotButtonClicked(KDialog::User3); + break; + case No: + slotButtonClicked(KDialog::No); + break; + case Yes: + slotButtonClicked(KDialog::Cancel); + break; + case Details: + slotButtonClicked(KDialog::Details); + break; + case None: + slotButtonClicked(KDialog::None); + break; + case NoDefault: + slotButtonClicked(KDialog::NoDefault); + break; + } +} diff --git a/kcmkwin/kwincompositing/ktimerdialog.h b/kcmkwin/kwincompositing/ktimerdialog.h new file mode 100644 index 0000000000..bfbbf1c7fc --- /dev/null +++ b/kcmkwin/kwincompositing/ktimerdialog.h @@ -0,0 +1,173 @@ +/* + * This file is part of the KDE Libraries + * Copyright (C) 2002 Hamish Rodda + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ +#ifndef _KTIMERDIALOG_H_ +#define _KTIMERDIALOG_H_ + +#include + +#include +#include + +class QTimer; +class KHBox; +class QProgressBar; +class QLabel; + +/** + * Provides a dialog that is only available for a specified amount + * of time, and reports the time remaining to the user. + * + * The timer is capable of counting up or down, for any number of milliseconds. + * + * The button which is activated upon timeout can be specified, as can the + * update interval for the dialog box. + * + * In addition, this class retains all of the functionality of @see KDialog. + * + * @short A dialog with a time limit and corresponding UI features. + * @author Hamish Rodda + */ +class KTimerDialog : public KDialog +{ + Q_OBJECT + + public: + + /** + * @li @p CountDown - The timer counts downwards from the seconds given. + * @li @p CountUp - The timer counts up to the number of seconds given. + * @li @p Manual - The timer is not invoked; the caller must update the + * progress. + */ + enum TimerStyle + { + CountDown, + CountUp, + Manual + }; + + /** + * Constructor for the standard mode where you must specify the main + * widget with @ref setMainWidget() . See @see KDialog for further details. + * + * For the rest of the arguments, See @see KDialog . + */ + explicit KTimerDialog( int msec, TimerStyle style=CountDown, QWidget *parent=0, + const char *name=0, bool modal=true, + const QString &caption=QString(), + int buttonMask=Ok|Apply|Cancel, ButtonCode defaultButton=Ok, + bool separator=false, + const KGuiItem &user1=KGuiItem(), + const KGuiItem &user2=KGuiItem(), + const KGuiItem &user3=KGuiItem() ); + + /** + * Destructor. + */ + ~KTimerDialog(); + + /** + * Execute the dialog modelessly - see @see QDialog . + */ + virtual void setVisible( bool visible ); + + /** + * Set the refresh interval for the timer progress. Defaults to one second. + */ + void setRefreshInterval( int msec ); + + /** + * Retrieves the @ref ButtonCode which will be activated once the timer + * times out. @see setTimeoutButton + */ + int timeoutButton() const; + + /** + * Sets the @ref ButtonCode to determine which button will be activated + * once the timer times out. @see timeoutButton + */ + void setTimeoutButton( ButtonCode newButton ); + + /** + * Retrieves the current @ref TimerStyle. @see setTimerStyle + */ + int timerStyle() const; + + /** + * Sets the @ref TimerStyle. @see timerStyle + */ + void setTimerStyle( TimerStyle newStyle ); + + /** + * Overridden function which is used to set the main widget of the dialog. + * @see KDialog::setMainWidget. + */ + void setMainWidget( QWidget *widget ); + + Q_SIGNALS: + /** + * Signal which is emitted once the timer has timed out. + */ + void timerTimeout(); + + public Q_SLOTS: + /** + * Execute the dialog modally - see @see QDialog . + */ + int exec(); + + private Q_SLOTS: + /** + * Updates the dialog with the current progress levels. + */ + void slotUpdateTime( bool update = true ); + + /** + * The internal + */ + void slotInternalTimeout(); + + private: + /** + * Prepares the layout that manages the widgets of the dialog + */ + void setupLayout(); + + QTimer *totalTimer; + QTimer *updateTimer; + int msecRemaining, updateInterval, msecTotal; + + ButtonCode buttonOnTimeout; + TimerStyle tStyle; + + KHBox *timerWidget; + QProgressBar *timerProgress; + QLabel *timerLabel; + KVBox *mainWidget; + + class KTimerDialogPrivate; + KTimerDialogPrivate *d; +}; + +#endif + + + diff --git a/kcmkwin/kwincompositing/main.cpp b/kcmkwin/kwincompositing/main.cpp index 56c36d7065..aab4259ebf 100644 --- a/kcmkwin/kwincompositing/main.cpp +++ b/kcmkwin/kwincompositing/main.cpp @@ -38,37 +38,20 @@ namespace KWin ConfirmDialog::ConfirmDialog() : - KDialog() + KTimerDialog(10000, KTimerDialog::CountDown, 0, "mainKTimerDialog", true, + i18n("Confirm Desktop Effects Change"), KTimerDialog::Ok|KTimerDialog::Cancel, + KTimerDialog::Cancel) { - setCaption( i18n( "Desktop effects settings changed" )); - setButtons( KDialog::Yes | KDialog::No ); - setDefaultButton(KDialog::No); - setButtonFocus(KDialog::No); + setButtonGuiItem( KDialog::Ok, KGuiItem( i18n( "&Accept Configuration" ), "dialog-ok" )); + setButtonGuiItem( KDialog::Cancel, KGuiItem( i18n( "&Return to Previous Configuration" ), "dialog-cancel" )); - mTextLabel = new QLabel(this); - setMainWidget(mTextLabel); - - mSecondsToLive = 10+1; - advanceTimer(); + QLabel *label = new QLabel( i18n( "Desktop effects settings have changed.\n" + "Do you want to keep the new settings?\n" + "They will be automatically reverted in 10 seconds." ), this ); + label->setWordWrap( true ); + setMainWidget( label ); } -void ConfirmDialog::advanceTimer() - { - mSecondsToLive--; - if(mSecondsToLive > 0) - { - QString text = i18n("Desktop effects settings have changed.\n" - "Do you want to keep the new settings?\n" - "They will be automatically reverted in %1 seconds", mSecondsToLive); - mTextLabel->setText(text); - QTimer::singleShot(1000, this, SLOT(advanceTimer())); - } - else - { - slotButtonClicked(KDialog::No); - } -} - KWinCompositingConfig::KWinCompositingConfig(QWidget *parent, const QVariantList &) : KCModule( KWinCompositingConfigFactory::componentData(), parent), @@ -150,8 +133,7 @@ void KWinCompositingConfig::showAdvancedOptions() void KWinCompositingConfig::showConfirmDialog() { ConfirmDialog confirm; - int result = confirm.exec(); - if(result != KDialog::Yes) + if(!confirm.exec()) { // Revert settings KConfigGroup config(mKWinConfig, "Compositing"); diff --git a/kcmkwin/kwincompositing/main.h b/kcmkwin/kwincompositing/main.h index d01deb92b3..88cea4e2a5 100644 --- a/kcmkwin/kwincompositing/main.h +++ b/kcmkwin/kwincompositing/main.h @@ -16,10 +16,10 @@ License. See the file "COPYING" for the exact licensing terms. #include #include -#include #include "ui_main.h" #include "compositingprefs.h" +#include "ktimerdialog.h" class KPluginSelector; class QLabel; @@ -27,18 +27,11 @@ class QLabel; namespace KWin { -class ConfirmDialog : public KDialog +class ConfirmDialog : public KTimerDialog { Q_OBJECT public: ConfirmDialog(); - -protected slots: - void advanceTimer(); - -private: - int mSecondsToLive; - QLabel* mTextLabel; }; class KWinCompositingConfig : public KCModule