diff options
author | Maximilian Güntner <maximilian.guentner@gmail.com> | 2013-11-02 02:20:02 +0100 |
---|---|---|
committer | Maximilian Güntner <maximilian.guentner@gmail.com> | 2013-11-02 03:37:31 +0100 |
commit | 04cdfce782f2a104ab5d0ee92de67c7b6271835b (patch) | |
tree | f937c8c8a005ef00f880bbcd3d7c56fd043ddfeb /qt-ui/groupedlineedit.cpp | |
parent | 6fe8cb652191728586f3731dcf6688b5a5b3efbb (diff) | |
download | subsurface-04cdfce782f2a104ab5d0ee92de67c7b6271835b.tar.gz |
Added a custom widget for tagging dives
A custom tag widget has been added to MainTab.
Tags are seperated by a comma ",". The implementation
supports escaping a comma by using "\,".
While typing, the widget supports the user by suggesting
tags using a QCompleter.
Signed-off-by: Maximilian Güntner <maximilian.guentner@gmail.com>
Diffstat (limited to 'qt-ui/groupedlineedit.cpp')
-rw-r--r-- | qt-ui/groupedlineedit.cpp | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/qt-ui/groupedlineedit.cpp b/qt-ui/groupedlineedit.cpp new file mode 100644 index 000000000..7502db5ce --- /dev/null +++ b/qt-ui/groupedlineedit.cpp @@ -0,0 +1,204 @@ +/* + * This file is part of the Nepomuk widgets collection + * Copyright (c) 2013 Denis Steckelmacher <steckdenis@yahoo.fr> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License version 2.1 as published by the Free Software Foundation, + * or 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 "groupedlineedit.h" + +#include <QtGui/QStyleOptionFrameV3> +#include <QtGui/QFontMetrics> +#include <QtGui/QApplication> +#include <QtGui/QScrollBar> +#include <QtGui/QTextDocument> +#include <QtGui/QTextBlock> +#include <QtGui/QTextLayout> +#include <QtGui/QTextLine> +#include <QtGui/QPainter> +#include <QtGui/QPainterPath> +#include <QtGui/QBrush> +#include <QtGui/QColor> +#include <QtGui/QPalette> + +struct GroupedLineEdit::Private +{ + struct Block { + int start; + int end; + QString text; + }; + QVector<Block> blocks; + QVector<QColor> colors; +}; + +GroupedLineEdit::GroupedLineEdit(QWidget* parent) +: QPlainTextEdit(parent), + d(new Private) +{ + setWordWrapMode(QTextOption::NoWrap); + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + document()->setMaximumBlockCount(1); +} + + +GroupedLineEdit::~GroupedLineEdit() +{ + delete d; +} + +QString GroupedLineEdit::text() const +{ + // Remove the block crosses from the text + return toPlainText(); +} + +int GroupedLineEdit::cursorPosition() const +{ + return textCursor().positionInBlock(); +} + +void GroupedLineEdit::addBlock(int start, int end) +{ + Private::Block block; + + block.start = start; + block.end = end; + block.text = text().mid(start, end-start+1).trimmed(); + d->blocks.append(block); + viewport()->update(); +} + +void GroupedLineEdit::addColor(QColor color) +{ + d->colors.append(color); +} + +void GroupedLineEdit::removeAllColors() +{ + d->colors.clear(); +} + +QStringList GroupedLineEdit::getBlockStringList() +{ + QStringList retList; + Private::Block block; + foreach(block, d->blocks) + retList.append(block.text); + return retList; +} + +void GroupedLineEdit::setCursorPosition(int position) +{ + QTextCursor c = textCursor(); + + c.setPosition(position, QTextCursor::MoveAnchor); + + setTextCursor(c); +} + +void GroupedLineEdit::setText(const QString &text) +{ + setPlainText(text); +} + +void GroupedLineEdit::clear() +{ + QPlainTextEdit::clear(); + removeAllBlocks(); +} + +void GroupedLineEdit::selectAll() +{ + QTextCursor c = textCursor(); + + c.select(QTextCursor::LineUnderCursor); + + setTextCursor(c); +} + +void GroupedLineEdit::removeAllBlocks() +{ + d->blocks.clear(); + viewport()->update(); +} + +QSize GroupedLineEdit::sizeHint() const +{ + QSize rs( + 40, + document()->findBlock(0).layout()->lineAt(0).height() + + document()->documentMargin() * 2 + + frameWidth() * 2 + ); + + return rs; +} + +QSize GroupedLineEdit::minimumSizeHint() const +{ + return sizeHint(); +} + +void GroupedLineEdit::keyPressEvent(QKeyEvent *e) +{ + switch (e->key()) { + case Qt::Key_Return: + case Qt::Key_Enter: + emit editingFinished(); + return; + } + + QPlainTextEdit::keyPressEvent(e); +} + +void GroupedLineEdit::paintEvent(QPaintEvent *e) +{ + + QTextLine line = document()->findBlock(0).layout()->lineAt(0); + QPainter painter(viewport()); + + painter.setRenderHint(QPainter::Antialiasing, true); + painter.setRenderHint(QPainter::HighQualityAntialiasing, true); + + painter.fillRect(0, 0, viewport()->width(), viewport()->height(), palette().base()); + + QVectorIterator<QColor> i(d->colors); + i.toFront(); + foreach (const Private::Block &block, d->blocks) { + qreal start_x = line.cursorToX(block.start, QTextLine::Trailing); + qreal end_x = line.cursorToX(block.end + 1, QTextLine::Leading); + QPainterPath path; + QRectF rectangle( + start_x - 1.0 - double(horizontalScrollBar()->value()), + 1.0, + end_x - start_x + 2.0, + double(viewport()->height() - 2) + ); + if (! i.hasNext()) + i.toFront(); + path.addRoundedRect(rectangle, 5.0, 5.0); + painter.setPen(i.peekNext()); + painter.setBrush(i.next().lighter(180)); + painter.drawPath(path); + } + + QPlainTextEdit::paintEvent(e); +} |