diff --git a/CMakeLists.txt b/CMakeLists.txt index 47c19e178..75b5d4653 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -119,6 +119,7 @@ set(plasma_LIB_SRCS widgets/scrollwidget.cpp widgets/svgwidget.cpp widgets/tabbar.cpp + widgets/textbrowser.cpp widgets/treeview.cpp widgets/textedit.cpp widgets/webview.cpp @@ -254,6 +255,7 @@ install(FILES widgets/svgwidget.h widgets/scrollwidget.h widgets/tabbar.h + widgets/textbrowser.h widgets/treeview.h widgets/textedit.h widgets/webview.h diff --git a/widgets/textbrowser.cpp b/widgets/textbrowser.cpp new file mode 100644 index 000000000..c60b4db55 --- /dev/null +++ b/widgets/textbrowser.cpp @@ -0,0 +1,138 @@ +/* + * Copyright 2009 Marco Martin + * + * This program 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, 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 Library 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 "textbrowser.h" + +#include +#include + +#include +#include + +#include "plasma/theme.h" +#include "plasma/svg.h" +#include "private/style_p.h" + +namespace Plasma +{ + +class TextBrowserPrivate +{ +public: + TextBrowserPrivate(TextBrowser *browser) + : q(browser), + native(0) + { + } + + void setFixedHeight() + { + if (native && native->document() && + q->sizePolicy().verticalPolicy() == QSizePolicy::Fixed && + native->verticalScrollBarPolicy() == Qt::ScrollBarAlwaysOff) { + native->document()->setTextWidth(q->size().width()); + QSize s = native->document()->size().toSize(); + q->setMinimumHeight(s.height()); + q->setMaximumHeight(s.height()); + } else { + q->setMinimumHeight(0); + q->setMaximumHeight(QWIDGETSIZE_MAX); + } + } + + + TextBrowser *q; + KTextBrowser *native; + Plasma::Style::Ptr style; +}; + +TextBrowser::TextBrowser(QGraphicsWidget *parent) + : QGraphicsProxyWidget(parent), + d(new TextBrowserPrivate(this)) +{ + KTextBrowser *native = new KTextBrowser; + connect(native, SIGNAL(textChanged()), this, SIGNAL(textChanged())); + connect(native, SIGNAL(textChanged()), this, SLOT(setFixedHeight())); + setWidget(native); + d->native = native; + native->setAttribute(Qt::WA_NoSystemBackground); + native->setFrameShape(QFrame::NoFrame); + native->setTextBackgroundColor(Qt::transparent); + native->viewport()->setAutoFillBackground(false); + d->style = Plasma::Style::sharedStyle(); + native->verticalScrollBar()->setStyle(d->style.data()); + native->horizontalScrollBar()->setStyle(d->style.data()); +} + +TextBrowser::~TextBrowser() +{ + delete d; + Plasma::Style::doneWithSharedStyle(); +} + +void TextBrowser::setText(const QString &text) +{ + //FIXME I'm not certain about using only the html methods. look at this again later. + static_cast(widget())->setHtml(text); +} + +QString TextBrowser::text() const +{ + return static_cast(widget())->toHtml(); +} + +void TextBrowser::setStyleSheet(const QString &stylesheet) +{ + widget()->setStyleSheet(stylesheet); +} + +QString TextBrowser::styleSheet() +{ + return widget()->styleSheet(); +} + +KTextBrowser *TextBrowser::nativeWidget() const +{ + return static_cast(widget()); +} + +void TextBrowser::dataUpdated(const QString &sourceName, const Plasma::DataEngine::Data &data) +{ + Q_UNUSED(sourceName) + + KTextBrowser *te = nativeWidget(); + te->clear(); + + foreach (const QVariant &v, data) { + if (v.canConvert(QVariant::String)) { + te->append(v.toString() + '\n'); + } + } +} + +void TextBrowser::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + d->setFixedHeight(); + QGraphicsProxyWidget::resizeEvent(event); +} + +} // namespace Plasma + +#include + diff --git a/widgets/textbrowser.h b/widgets/textbrowser.h new file mode 100644 index 000000000..cb8dabbc4 --- /dev/null +++ b/widgets/textbrowser.h @@ -0,0 +1,99 @@ +/* + * Copyright 2009 Marco Martin + * + * This program 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, 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 Library 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. + */ + +#ifndef PLASMA_TEXTBROWSER_H +#define PLASMA_TEXTBROWSER_H + +#include + +class KTextBrowser; + +#include +#include + +namespace Plasma +{ + +class TextBrowserPrivate; + +/** + * @class TextBrowser plasma/widgets/TextBrowser.h + * + * @short Provides a plasma-themed KTextBrowser. + */ +class PLASMA_EXPORT TextBrowser : public QGraphicsProxyWidget +{ + Q_OBJECT + + Q_PROPERTY(QGraphicsWidget *parentWidget READ parentWidget) + Q_PROPERTY(QString text READ text WRITE setText) + Q_PROPERTY(QString stylesheet READ styleSheet WRITE setStyleSheet) + Q_PROPERTY(KTextBrowser *nativeWidget READ nativeWidget) + +public: + explicit TextBrowser(QGraphicsWidget *parent = 0); + ~TextBrowser(); + + /** + * Sets the display text for this TextBrowser + * + * @arg text the text to display; should be translated. + */ + void setText(const QString &text); + + /** + * @return the display text + */ + QString text() const; + + /** + * Sets the stylesheet used to control the visual display of this TextBrowser + * + * @arg stylesheet a CSS string + */ + void setStyleSheet(const QString &stylesheet); + + /** + * @return the stylesheet currently used with this widget + */ + QString styleSheet(); + + /** + * @return the native widget wrapped by this TextBrowser + */ + KTextBrowser *nativeWidget() const; + +public Q_SLOTS: + void dataUpdated(const QString &sourceName, const Plasma::DataEngine::Data &data); + +Q_SIGNALS: + void textChanged(); + +protected: + void resizeEvent(QGraphicsSceneResizeEvent *event); + +private: + TextBrowserPrivate * const d; + + Q_PRIVATE_SLOT(d, void setFixedHeight()) +}; + +} // namespace Plasma + +#endif // multiple inclusion guard