┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/commenteditwidget.cpp
diff options
context:
space:
mode:
authorSebastian Trueg <[email protected]>2008-03-21 21:05:05 +0000
committerSebastian Trueg <[email protected]>2008-03-21 21:05:05 +0000
commitd3a04321886e8ca39ab91a647a9547ebe4d52154 (patch)
treeff4e8237ba07cc2201316c32c07f09e6e311eb33 /src/commenteditwidget.cpp
parent9ceab694e2454d283987d596f5f69e43adc6579e (diff)
This is the first step towards a better looking and more usable metadata GUI.
- A nicer comment widget shows a popup to edit the comment. - A tag cloud replaces the ugly tagwidget from libnepomuk. The plan is to use Dolphin as a testbed to optimize the look and then move at least the tagcloud to libnepomuk to make it available for all apps since this is a common feature. So please test it and provide feedback. The layout is still cluttered. So we also need feedback on that. And of course on the usability. Apart from the GUI Dolphin now uses the mass metadata update job to perform metadata updates on many files in an async KJob without blocking the GUI. This is another candidate for public API at some point. svn path=/trunk/KDE/kdebase/apps/; revision=788565
Diffstat (limited to 'src/commenteditwidget.cpp')
-rw-r--r--src/commenteditwidget.cpp241
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"