diff options
Diffstat (limited to 'src/commenteditwidget.cpp')
| -rw-r--r-- | src/commenteditwidget.cpp | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/src/commenteditwidget.cpp b/src/commenteditwidget.cpp new file mode 100644 index 000000000..3b98d44d7 --- /dev/null +++ b/src/commenteditwidget.cpp @@ -0,0 +1,241 @@ +/*************************************************************************** + * Copyright (C) 2008 by Sebastian Trueg <[email protected]> * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#include "commenteditwidget.h" + +#include <QtGui/QTextEdit> +#include <QtGui/QToolButton> +#include <QtGui/QVBoxLayout> +#include <QtCore/QEventLoop> +#include <QtCore/QPointer> +#include <QtGui/QApplication> +#include <QtGui/QDesktopWidget> +#include <QtGui/QMouseEvent> +#include <QtGui/QFont> + +#include <KIcon> +#include <KDialog> +#include <KLocale> +#include <KDebug> + + +class CommentEditWidget::Private +{ +public: + Private( CommentEditWidget* parent ) + : eventLoop( 0 ), + q( parent ) { + } + + QEventLoop* eventLoop; + bool success; + QTextEdit* textEdit; + QToolButton* buttonSave; + QToolButton* buttonCancel; + + QString comment; + + QRect geometryForPopupPos( const QPoint& p ) { + QSize size = q->sizeHint(); + + // we want a little margin + const int margin = KDialog::marginHint(); + size.setHeight( size.height() + margin*2 ); + size.setWidth( size.width() + margin*2 ); + + QRect screen = QApplication::desktop()->screenGeometry( QApplication::desktop()->screenNumber( p ) ); + + // calculate popup position + QPoint pos( p.x() - size.width()/2, p.y() - size.height()/2 ); + + // ensure we do not leave the desktop + if ( pos.x() + size.width() > screen.right() ) { + pos.setX( screen.right() - size.width() ); + } + else if ( pos.x() < screen.left() ) { + pos.setX( screen.left() ); + } + + if ( pos.y() + size.height() > screen.bottom() ) { + pos.setY( screen.bottom() - size.height() ); + } + else if ( pos.y() < screen.top() ) { + pos.setY( screen.top() ); + } + + return QRect( pos, size ); + } + + void _k_saveClicked(); + void _k_cancelClicked(); + +private: + CommentEditWidget* q; +}; + + +void CommentEditWidget::Private::_k_saveClicked() +{ + comment = textEdit->toPlainText(); + success = true; + q->hide(); +} + + +void CommentEditWidget::Private::_k_cancelClicked() +{ + success = false; + q->hide(); +} + + +CommentEditWidget::CommentEditWidget( QWidget* parent ) + : QFrame( parent ), + d( new Private( this ) ) +{ + setFrameStyle( QFrame::Box|QFrame::Plain ); + setWindowFlags( Qt::Popup ); + + d->textEdit = new QTextEdit( this ); + d->textEdit->installEventFilter( this ); + QVBoxLayout* layout = new QVBoxLayout( this ); + layout->setMargin( 0 ); + layout->addWidget( d->textEdit ); + + d->buttonSave = new QToolButton( d->textEdit ); + d->buttonCancel = new QToolButton( d->textEdit ); + d->buttonSave->setToolButtonStyle( Qt::ToolButtonTextBesideIcon ); + d->buttonCancel->setToolButtonStyle( Qt::ToolButtonTextBesideIcon ); + d->buttonSave->setAutoRaise( true ); + d->buttonCancel->setAutoRaise( true ); + d->buttonSave->setIcon( KIcon( "document-save" ) ); + d->buttonCancel->setIcon( KIcon( "edit-delete" ) ); + d->buttonSave->setText( i18n( "Save" ) ); + d->buttonCancel->setText( i18n( "Cancel" ) ); + + QFont fnt( font() ); + fnt.setPointSize( fnt.pointSize()-2 ); + d->buttonSave->setFont( fnt ); + d->buttonCancel->setFont( fnt ); + + connect( d->buttonSave, SIGNAL(clicked()), + this, SLOT( _k_saveClicked() ) ); + connect( d->buttonCancel, SIGNAL(clicked()), + this, SLOT( _k_cancelClicked() ) ); +} + + +CommentEditWidget::~CommentEditWidget() +{ + delete d; +} + + +void CommentEditWidget::setComment( const QString& s ) +{ + d->comment = s; +} + + +QString CommentEditWidget::comment() +{ + return d->comment; +} + + +bool CommentEditWidget::exec( const QPoint& pos ) +{ + d->success = false; + d->textEdit->setText( d->comment ); + d->textEdit->setFocus(); + d->textEdit->moveCursor( QTextCursor::End ); + QEventLoop eventLoop; + d->eventLoop = &eventLoop; + setGeometry( d->geometryForPopupPos( pos ) ); + show(); + + QPointer<QObject> guard = this; + (void) eventLoop.exec(); + if ( !guard.isNull() ) + d->eventLoop = 0; + return d->success; +} + + +void CommentEditWidget::mousePressEvent( QMouseEvent* e ) +{ + // clicking outside of the widget means cancel + if ( !rect().contains( e->pos() ) ) { + d->success = false; + hide(); + } + else { + QWidget::mousePressEvent( e ); + } +} + + +void CommentEditWidget::hideEvent( QHideEvent* e ) +{ + Q_UNUSED( e ); + if ( d->eventLoop ) { + d->eventLoop->exit(); + } +} + + +void CommentEditWidget::updateButtons() +{ + QSize sbs = d->buttonSave->sizeHint(); + QSize cbs = d->buttonCancel->sizeHint(); + + // FIXME: button order + d->buttonCancel->setGeometry( QRect( QPoint( d->textEdit->width() - cbs.width() - frameWidth(), + d->textEdit->height() - cbs.height() - frameWidth() ), + cbs ) ); + d->buttonSave->setGeometry( QRect( QPoint( d->textEdit->width() - cbs.width() - sbs.width() - frameWidth(), + d->textEdit->height() - sbs.height() - frameWidth() ), + sbs ) ); +} + + +void CommentEditWidget::resizeEvent( QResizeEvent* e ) +{ + QWidget::resizeEvent( e ); + updateButtons(); +} + + +bool CommentEditWidget::eventFilter( QObject* watched, QEvent* event ) +{ + if ( watched == d->textEdit && event->type() == QEvent::KeyPress ) { + QKeyEvent* ke = static_cast<QKeyEvent*>( event ); + kDebug() << "keypress:" << ke->key() << ke->modifiers(); + if ( ( ke->key() == Qt::Key_Enter || + ke->key() == Qt::Key_Return ) && + ke->modifiers() & Qt::ControlModifier ) { + d->_k_saveClicked(); + return true; + } + } + + return QFrame::eventFilter( watched, event ); +} + +#include "commenteditwidget.moc" |
