From kde-usability Mon Nov 15 14:11:19 2004 From: Andre Moreira Magalhaes Date: Mon, 15 Nov 2004 14:11:19 +0000 To: kde-usability Subject: Re: Logout Dialog Message-Id: <20041115141119.63751.qmail () web51905 ! mail ! yahoo ! com> X-MARC-Message: https://marc.info/?l=kde-usability&m=110052791826340 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--0-602612548-1100527879=:61012" --0-602612548-1100527879=:61012 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Content-Id: Content-Disposition: inline Hi all, I did some changes to the logout dialog in order to improve it's usability and eyecandy (at least in my opnion). I would like to know what you think about and what can be done to improve it (if that's case). The new dialog is based on the WinXP logout dialog (that i believe is very good in usability). Please don't start saying that this sucks just because it's similar to the Windows version, try this out and if you don't like it, tell me what can be improved and i will do it (if i agree of course). Attached there is a patch and some necessary files. The icons attached are the same found in crystalsvg CVS version. Any sugestion is wellcome. I hope you enjoy. cheers, Andrunko __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com --0-602612548-1100527879=:61012 Content-Type: text/x-patch; name="ksmserver.diff" Content-Description: ksmserver.diff Content-Disposition: inline; filename="ksmserver.diff" Index: ksmserver/Makefile.am =================================================================== RCS file: /home/kde/kdebase/ksmserver/Makefile.am,v retrieving revision 1.22 diff -u -p -r1.22 Makefile.am --- ksmserver/Makefile.am 14 Nov 2004 17:22:50 -0000 1.22 +++ ksmserver/Makefile.am 15 Nov 2004 14:07:36 -0000 @@ -22,17 +22,17 @@ INCLUDES= -I$(top_srcdir)/kdmlib $(all_i bin_PROGRAMS = lib_LTLIBRARIES = kdeinit_LTLIBRARIES = ksmserver.la -noinst_HEADERS = global.h server.h shutdown.h +noinst_HEADERS = global.h server.h shutdown.h urlbutton.h ksmserver_la_METASOURCES = AUTO # Order is important for --enable-final! -ksmserver_la_SOURCES = main.cpp server.cpp shutdown.cpp KSMServerInterface.skel +ksmserver_la_SOURCES = main.cpp server.cpp shutdown.cpp urlbutton.cpp KSMServerInterface.skel ksmserver_la_LDFLAGS = $(all_libraries) -avoid-version -module ksmserver_la_LIBADD = ../kdmlib/libdmctl.la $(LIB_KDEUI) picsdir = $(kde_datadir)/ksmserver/pics -pics_DATA = shutdownkonq.png +pics_DATA = end_session.png exit.png reboot.png update_DATA = ksmserver.upd update_SCRIPTS = move_session_config.sh Index: ksmserver/shutdown.cpp =================================================================== RCS file: /home/kde/kdebase/ksmserver/shutdown.cpp,v retrieving revision 1.51 diff -u -p -r1.51 shutdown.cpp --- ksmserver/shutdown.cpp 15 Aug 2004 13:54:23 -0000 1.51 +++ ksmserver/shutdown.cpp 15 Nov 2004 14:07:36 -0000 @@ -7,6 +7,8 @@ Copyright (C) 2000 Matthias Ettrich #include "shutdown.h" +#include "urlbutton.h" + #include #include #include @@ -29,7 +31,6 @@ Copyright (C) 2000 Matthias Ettrich #include #include -#include #include #include #include @@ -47,6 +48,7 @@ KSMShutdownFeedback * KSMShutdownFeedbac KSMShutdownFeedback::KSMShutdownFeedback() : QWidget( 0L, "feedbackwidget", WType_Popup ), + // m_fadeVal( 10 ) m_currentY( 0 ) { setBackgroundMode( QWidget::NoBackground ); @@ -54,9 +56,18 @@ KSMShutdownFeedback::KSMShutdownFeedback QTimer::singleShot( 10, this, SLOT( slotPaintEffect() ) ); } - void KSMShutdownFeedback::slotPaintEffect() { + // if ( m_fadeVal > 40 ) + // return; + // + // if ( m_pixmap.isNull() ) + // m_pixmap = QPixmap::grabWindow( qt_xrootwin(), 0, 0, width(), height() ); + // KPixmapEffect::fade( m_pixmap, m_fadeVal / 1000.0, Qt::black ); + // bitBlt( this, 0, m_currentY, &m_pixmap ); + // m_fadeVal += 2; + // QTimer::singleShot( 1, this, SLOT( slotPaintEffect() ) ); + if ( m_currentY >= height() ) return; @@ -77,76 +88,88 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget* // this is a WType_Popup on purpose. Do not change that! Not // having a popup here has severe side effects. { - QVBoxLayout* vbox = new QVBoxLayout( this ); - QFrame* frame = new QFrame( this ); - frame->setFrameStyle( QFrame::StyledPanel | QFrame::Raised ); + QVBoxLayout* vbox = new QVBoxLayout( this, 0, 1 ); + + QFrame *frame = new QFrame( this, "frame" ); frame->setLineWidth( style().pixelMetric( QStyle::PM_DefaultFrameWidth, frame ) ); - vbox->addWidget( frame ); - vbox = new QVBoxLayout( frame, 2 * KDialog::marginHint(), - 2 * KDialog::spacingHint() ); + frame->setFrameStyle( QFrame::StyledPanel | QFrame::Raised ); + + QVBoxLayout *framelay = new QVBoxLayout( frame, 1, 1, "frameLayout"); - QLabel* label = new QLabel( i18n("End Session for \"%1\"").arg(KUser().loginName()), frame ); + QFrame *tfrm = new QFrame( frame, "tfrm" ); + tfrm->setFrameStyle( QFrame::NoFrame | QFrame::Plain ); + tfrm->setPaletteBackgroundColor( colorGroup().background().dark(140) ); + QHBoxLayout *tfrmlay = new QHBoxLayout( tfrm, KDialog::marginHint(), 0, "tfrmlayout" ); + + QLabel* label = new QLabel( i18n("End Session for \"%1\"").arg(KUser().loginName()), tfrm, "label" ); + label->setPaletteForegroundColor( QColor( 255, 255, 255 ) ); QFont fnt = label->font(); fnt.setBold( true ); fnt.setPointSize( fnt.pointSize() * 3 / 2 ); label->setFont( fnt ); - vbox->addWidget( label, 0, AlignHCenter ); - - QHBoxLayout* hbox = new QHBoxLayout( vbox, 2 * KDialog::spacingHint() ); - // konqy - QFrame* lfrm = new QFrame( frame ); - lfrm->setFrameStyle( QFrame::Panel | QFrame::Sunken ); - lfrm->setPaletteBackgroundColor( lfrm->colorGroup().midlight() ); - hbox->addWidget( lfrm, AlignCenter ); - QVBoxLayout* iconlay = new QVBoxLayout( - lfrm, KDialog::marginHint(), KDialog::spacingHint() ); - QLabel* icon = new QLabel( lfrm ); - icon->setPixmap( UserIcon( "shutdownkonq" ) ); - iconlay->addWidget( icon ); - - // right column (buttons) - QVBoxLayout* buttonlay = new QVBoxLayout( hbox, 2 * KDialog::spacingHint() ); - buttonlay->setAlignment( Qt::AlignHCenter ); + tfrmlay->addWidget( label ); + framelay->addWidget( tfrm, 0 ); - buttonlay->addStretch( 1 ); + // (buttons) + QFrame *btnfrm = new QFrame( frame, "btnfrm" ); + btnfrm->setFrameStyle( QFrame::NoFrame | QFrame::Plain ); + + QHBoxLayout* buttonlay = new QHBoxLayout( btnfrm, 2 * KDialog::marginHint(), 3 * KDialog::spacingHint(), "buttonlay" ); + buttonlay->setAlignment( Qt::AlignVCenter ); // End session - KPushButton* btnLogout = new KPushButton( KGuiItem( i18n("&End Current Session"), "undo"), frame ); + URLButton* btnLogout = new URLButton( UserIcon( "end_session" ), i18n( "&End Current\nSession" ), btnfrm ); QFont btnFont = btnLogout->font(); + btnFont.setBold( TRUE ); + btnLogout->setFont( btnFont ); buttonlay->addWidget( btnLogout ); - connect(btnLogout, SIGNAL(clicked()), SLOT(slotLogout())); + connect( btnLogout, SIGNAL( clicked() ), SLOT( slotLogout() ) ); - if (maysd) { + // Shutdown + URLButton* btnHalt = new URLButton( UserIcon( "exit" ), i18n( "&Turn Off\nComputer" ), btnfrm ); + btnHalt->setFont( btnFont ); + buttonlay->addWidget( btnHalt ); + connect( btnHalt, SIGNAL( clicked() ), SLOT( slotHalt() ) ); + + // Reboot + URLButton* btnReboot = new URLButton( UserIcon( "reboot" ), i18n( "&Restart\nComputer" ), btnfrm ); + btnReboot->setFont( btnFont ); + buttonlay->addWidget( btnReboot ); + connect( btnReboot, SIGNAL( clicked() ), SLOT( slotReboot() ) ); - // Shutdown - KPushButton* btnHalt = new KPushButton( KGuiItem( i18n("&Turn Off Computer"), "exit"), frame ); - btnHalt->setFont( btnFont ); - buttonlay->addWidget( btnHalt ); - connect(btnHalt, SIGNAL(clicked()), SLOT(slotHalt())); + if ( maysd ) { if ( sdtype == KApplication::ShutdownTypeHalt ) btnHalt->setFocus(); - - // Reboot - KPushButton* btnReboot = new KPushButton( KGuiItem( i18n("&Restart Computer"), "reload"), frame ); - btnReboot->setFont( btnFont ); - buttonlay->addWidget( btnReboot ); - connect(btnReboot, SIGNAL(clicked()), SLOT(slotReboot())); - if ( sdtype == KApplication::ShutdownTypeReboot ) + else if ( sdtype == KApplication::ShutdownTypeReboot ) btnReboot->setFocus(); - } - - buttonlay->addStretch( 1 ); - - // Separator - buttonlay->addWidget( new KSeparator( frame ) ); - + else { + btnHalt->setEnabled( FALSE ); + btnReboot->setEnabled( FALSE ); + } + framelay->addWidget( btnfrm, 1 ); + + KPixmap pix; + pix.resize( btnfrm->sizeHint().width(), btnfrm->sizeHint().height() ); + btnfrm->setPaletteBackgroundPixmap( KPixmapEffect::gradient( pix, colorGroup().background().light( 150 ), colorGroup().background().dark( 150 ), KPixmapEffect::DiagonalGradient ) ); + // Back to Desktop - KPushButton* btnBack = new KPushButton( KStdGuiItem::cancel(), frame ); - buttonlay->addWidget( btnBack ); - connect(btnBack, SIGNAL(clicked()), SLOT(reject())); - + QFrame *bfrm = new QFrame( frame, "bfrm" ); + bfrm->setFrameStyle( QFrame::NoFrame | QFrame::Plain ); + bfrm->setPaletteBackgroundColor( colorGroup().background().dark(150) ); + + QHBoxLayout *bfrmlay = new QHBoxLayout( bfrm, KDialog::marginHint(), 0, "bfrmlay" ); + bfrmlay->addStretch( 1 ); + + KPushButton* btnBack = new KPushButton( KStdGuiItem::cancel(), bfrm ); + bfrmlay->addWidget( btnBack ); + connect( btnBack, SIGNAL( clicked() ), SLOT( reject() ) ); + + bfrmlay->addWidget( bfrm ); + framelay->addWidget( bfrm, 0 ); + + vbox->addWidget( frame ); } Index: ksmserver/shutdown.h =================================================================== RCS file: /home/kde/kdebase/ksmserver/shutdown.h,v retrieving revision 1.12 diff -u -p -r1.12 shutdown.h --- ksmserver/shutdown.h 15 Aug 2004 13:54:23 -0000 1.12 +++ ksmserver/shutdown.h 15 Nov 2004 14:07:36 -0000 @@ -13,6 +13,7 @@ class QPushButton; class QVButtonGroup; #include +// #include // The (singleton) widget that makes the desktop gray. class KSMShutdownFeedback : public QWidget @@ -33,6 +34,9 @@ private slots: private: static KSMShutdownFeedback * s_pSelf; KSMShutdownFeedback(); + + // KPixmap m_pixmap; + // short m_fadeVal; int m_currentY; }; Index: ksmserver/urlbutton.cpp =================================================================== RCS file: ksmserver/urlbutton.cpp diff -N ksmserver/urlbutton.cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ksmserver/urlbutton.cpp 15 Nov 2004 14:07:36 -0000 @@ -0,0 +1,245 @@ +/****************************************************************************** +** Copyright (c) 2004 Andre Moreira Magalhaes. +** +** Permission is hereby granted, free of charge, to any person obtaining a copy +** of this software and associated documentation files (the "Software"), to deal +** in the Software without restriction, including without limitation the rights +** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +** copies of the Software, and to permit persons to whom the Software is +** furnished to do so, subject to the following conditions: +** +** The above copyright notice and this permission notice shall be included in +** all copies or substantial portions of the Software. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +** AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +** AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +** CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +** +*******************************************************************************/ + +#include "urlbutton.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +URLButton::URLButton( const QPixmap &pix, const QString &textLabel, QWidget *parent, const char *name ) + : QWidget( parent, name ), + m_buttonDown( FALSE ), + m_mouseOver( FALSE ), + m_pressed( FALSE ), + m_force( FALSE ) +{ + setBackgroundOrigin( AncestorOrigin ); + setFocusPolicy( QLabel::TabFocus ); + + QVBoxLayout *hlay = new QVBoxLayout( this, 0, 2 ); + + m_pix = pix; + m_pixLabel = new QLabel( this ); + m_pixLabel->setBackgroundOrigin( AncestorOrigin ); + m_pixLabel->setPixmap( m_pix ); + m_pixLabel->setAlignment( QLabel::AlignCenter ); + hlay->addWidget( m_pixLabel ); + + m_label = new QLabel( textLabel, this ); + m_label->setText( textLabel ); + m_label->setBackgroundOrigin( AncestorOrigin ); + m_label->setAlignment( QLabel::AlignCenter | QLabel::WordBreak ); + m_label->setBuddy( this ); + hlay->addWidget( m_label ); + + // #FIXME use setCursor instead of QApplication::setOverrideCursor + // m_pixLabel->setCursor( KCursor::handCursor() ); + // m_label->setCursor( KCursor::handCursor() ); +} + +QPixmap *URLButton::pixmap() const +{ + return m_pixLabel->pixmap(); +} + +void URLButton::setPixmap( const QPixmap &pix ) +{ + m_pixLabel->setPixmap( pix ); m_force = TRUE; +} + +QString URLButton::text() const +{ + return m_label->text(); +} + +void URLButton::setText( const QString &textLabel ) +{ + m_label->setText( textLabel ); +} + +QFont URLButton::font() const +{ + return m_label->font(); +} + +void URLButton::setFont( const QFont &f ) +{ + m_label->setFont( f ); +} + +void URLButton::setEnabled( bool enabled ) +{ + if ( ( !enabled || m_force ) && isEnabled() ) + { + KPixmap gray = KPixmap( m_pix ); + m_pixLabel->setPixmap( KPixmapEffect::toGray( gray, true ) ); + m_label->setEnabled( FALSE ); + setFocusPolicy( QLabel::NoFocus ); + setWState( WState_Disabled ); + } + else if ( ( enabled || m_force ) && !isEnabled() ) + { + m_pixLabel->setPixmap( m_pix ); + m_label->setEnabled( TRUE ); + setFocusPolicy( QLabel::TabFocus ); + clearWState( WState_Disabled ); + } +} + +void URLButton::enterEvent( QEvent *e ) +{ + // #FIXME + QApplication::setOverrideCursor( KCursor::handCursor() ); + + m_mouseOver = TRUE; + if ( isEnabled() ) + { + if ( !hasFocus() ) + { + KPixmap desaturate = KPixmap( m_pix ); + m_pixLabel->setPixmap( KPixmapEffect::desaturate( desaturate, 0.6 ) ); + } + + QFont f = m_label->font(); + f.setUnderline( TRUE ); + m_label->setFont( f ); + } + QWidget::enterEvent( e ); +} + +void URLButton::leaveEvent( QEvent *e ) +{ + // #FIXME + QApplication::restoreOverrideCursor(); + + m_mouseOver = FALSE; + if ( isEnabled() ) + { + if ( !hasFocus() ) + m_pixLabel->setPixmap( m_pix ); + + QFont f = m_label->font(); + f.setUnderline( FALSE ); + m_label->setFont( f ); + } + QWidget::leaveEvent( e ); +} + +void URLButton::focusInEvent( QFocusEvent *e ) +{ + if ( isEnabled() ) + { + KPixmap desaturate = KPixmap( m_pix ); + m_pixLabel->setPixmap( KPixmapEffect::desaturate( desaturate, 0.6 ) ); + if ( e->reason() == QFocusEvent::Shortcut ) + QTimer::singleShot( 100, this, SIGNAL( clicked() ) ); + } + QWidget::focusInEvent( e ); +} + +void URLButton::focusOutEvent( QFocusEvent *e ) +{ + if ( isEnabled() ) + { + m_pixLabel->setPixmap( m_pix ); + } + QWidget::focusOutEvent( e ); +} + +void URLButton::mousePressEvent( QMouseEvent *e ) +{ + if ( e->button() != LeftButton ) { + e->ignore(); + return; + } + + m_pressed = TRUE; + emit pressed(); + QWidget::mousePressEvent( e ); +} + +void URLButton::mouseReleaseEvent( QMouseEvent *e ) +{ + if ( e->button() != LeftButton ) { + e->ignore(); + return; + } + + if ( isEnabled() && m_mouseOver && m_pressed ) + { + emit released(); + emit clicked(); + } + + m_pressed = FALSE; + QWidget::mouseReleaseEvent( e ); +} + +void URLButton::keyPressEvent( QKeyEvent *e ) +{ + switch ( e->key() ) + { + case Key_Enter: + case Key_Return: + emit clicked(); + break; + case Key_Space: + m_buttonDown = TRUE; + emit pressed(); + break; + case Key_Up: + case Key_Left: + case Key_Right: + case Key_Down: + QWidget::keyPressEvent( e ); + break; + default: + e->ignore(); + break; + } +} + +void URLButton::keyReleaseEvent( QKeyEvent *e ) +{ + switch ( e->key() ) + { + case Key_Space: + if ( m_buttonDown ) + { + m_buttonDown = FALSE; + emit released(); + emit clicked(); + } + break; + default: + e->ignore(); + } +} + Index: ksmserver/urlbutton.h =================================================================== RCS file: ksmserver/urlbutton.h diff -N ksmserver/urlbutton.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ksmserver/urlbutton.h 15 Nov 2004 14:07:36 -0000 @@ -0,0 +1,80 @@ +/****************************************************************************** +** Copyright (c) 2004 Andre Moreira Magalhaes. +** +** Permission is hereby granted, free of charge, to any person obtaining a copy +** of this software and associated documentation files (the "Software"), to deal +** in the Software without restriction, including without limitation the rights +** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +** copies of the Software, and to permit persons to whom the Software is +** furnished to do so, subject to the following conditions: +** +** The above copyright notice and this permission notice shall be included in +** all copies or substantial portions of the Software. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +** AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +** AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +** CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +** +*******************************************************************************/ + +#ifndef URLBUTTON_H +#define URLBUTTON_H + +#include +#include + +class QEvent; +class QLabel; +class QMouseEvent; +class QKeyEvent; + +class URLButton : public QWidget +{ + Q_OBJECT + + public: + URLButton( QWidget *parent = 0, const char *name = 0, WFlags f = 0 ); + URLButton( const QPixmap &pix, const QString &textLabel, QWidget *parent, const char *name = 0 ); + + QPixmap *pixmap() const; + void setPixmap( const QPixmap &pix ); + + QString text() const; + void setText( const QString &textLabel ); + + QFont font() const; + void setFont( const QFont &f ); + + public slots: + void setEnabled( bool enabled ); + + signals: + void clicked(); + void pressed(); + void released(); + + protected: + void enterEvent( QEvent * ); + void leaveEvent( QEvent * ); + void focusInEvent( QFocusEvent *e ); + void focusOutEvent( QFocusEvent *e ); + void mousePressEvent( QMouseEvent *e ); + void mouseReleaseEvent( QMouseEvent *e ); + void keyPressEvent( QKeyEvent *e ); + void keyReleaseEvent( QKeyEvent *e ); + + private: + QPixmap m_pix; + QLabel *m_pixLabel; + QLabel *m_label; + + bool m_buttonDown; + bool m_mouseOver; + bool m_pressed; + bool m_force; +}; + +#endif // URLBUTTON_H__ --0-602612548-1100527879=:61012 Content-Type: image/png; name="end_session.png" Content-Transfer-Encoding: base64 Content-Description: end_session.png Content-Disposition: inline; filename="end_session.png" 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 --0-602612548-1100527879=:61012 Content-Type: image/png; name="exit.png" Content-Transfer-Encoding: base64 Content-Description: exit.png Content-Disposition: inline; filename="exit.png" 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 --0-602612548-1100527879=:61012 Content-Type: image/png; name="reboot.png" Content-Transfer-Encoding: base64 Content-Description: reboot.png Content-Disposition: inline; filename="reboot.png" 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 --0-602612548-1100527879=:61012 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ kde-usability mailing list kde-usability@kde.org https://mail.kde.org/mailman/listinfo/kde-usability --0-602612548-1100527879=:61012--