diff options
author | iroul <iroul@iroul-VirtualBox.(none)> | 2014-04-04 07:35:14 -0700 |
---|---|---|
committer | iroul <iroul@iroul-VirtualBox.(none)> | 2014-04-04 07:35:14 -0700 |
commit | afd34f2893a06a3aecf17e8e83b1df6ed2ae91a2 (patch) | |
tree | 851102abc55d91a1b76e63e9e89f9a7733da95b5 /src/ui/osdmessage.cpp | |
parent | c4b028ad53f7b362a864de24828d7cc39ff67b0a (diff) | |
download | fqterm-afd34f2893a06a3aecf17e8e83b1df6ed2ae91a2.tar.xz |
move to my github.
Diffstat (limited to 'src/ui/osdmessage.cpp')
-rw-r--r-- | src/ui/osdmessage.cpp | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/src/ui/osdmessage.cpp b/src/ui/osdmessage.cpp new file mode 100644 index 0000000..1b0883f --- /dev/null +++ b/src/ui/osdmessage.cpp @@ -0,0 +1,210 @@ +/*************************************************************************** + * fqterm, a terminal emulator for both BBS and *nix. * + * Copyright (C) 2008 fqterm development group. * + * * + * 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 St, Fifth Floor, Boston, MA 02110-1301 USA. * + ***************************************************************************/ + +#include <QPaintEvent> +#include <QCursor> +#include <QTimer> +#include <QApplication> +#include <QPainter> +#include <QBitmap> +#include <QPalette> + +#include "fqterm_trace.h" +#include "fqterm_path.h" + +#include "osdmessage.h" + +namespace FQTerm { + +PageViewMessage::PageViewMessage(QWidget *parent_) + : QWidget(parent_), + timer_(0), + message_() { + setFocusPolicy(Qt::NoFocus); + //setBackgroundMode( Qt::NoBackground ); + QPalette palette; + palette.setColor(backgroundRole(), qApp->palette().color(QPalette::Active, + QPalette::Background)); + setPalette(palette); + // setPaletteBackgroundColor(qApp->palette().color(QPalette::Active, QPalette::Background)); + setCursor(QCursor(Qt::ArrowCursor)); + move(10, 10); + resize(0, 0); + hide(); +} + +// give to Caesar what Caesar owns: code taken from Amarok's osd.h/.cpp +// "redde (reddite, pl.) cesari quae sunt cesaris", just btw. ;) +void PageViewMessage::display(const QString &message, Icon icon, int durationMs, QPoint pos, PageViewMessage::Alignment ali) +{ + displayImpl(message, icon, false, durationMs, pos, ali); +} + +void PageViewMessage::display(const QString &message, QPoint pos, Icon icon) +{ + displayImpl(message, icon, false, 4000, pos, TopLeft); +} + +QRect PageViewMessage::displayCheck(const QString &message, Icon icon) +{ + return displayImpl(message, icon, true); +} + +QRect PageViewMessage::displayImpl(const QString &message, Icon icon, bool check, int durationMs, QPoint pos, Alignment ali) +{ + //FIXME: add a option in fqterm too. + /* + if ( !KpdfSettings::showOSD() ) + { + hide(); + return; + } + */ + // determine text rectangle + + if (!isHidden() && message == message_) { + timer_->setSingleShot(true); + timer_->start(durationMs); + return QRect(QPoint(0, 0), size()); + } + message_ = message; + QRect textRect = fontMetrics().boundingRect(message); + textRect.translate(-textRect.left(), -textRect.top()); + textRect.adjust(0, 0, 2, 2); + int width = textRect.width(), height = textRect.height(), textXOffset = 0, + shadowOffset = message.isRightToLeft() ? -1: 1; + + // load icon (if set) and update geometry + // [FQTerm], we don't have a icon at this time. + + QPixmap symbol; + if (icon != None) { + switch (icon) { + //case Find: + //symbol = SmallIcon( "viewmag" ); + //break; + case Error: + symbol = QPixmap(getPath(RESOURCE) + "pic/messagebox_critical.png"); + break; + case Warning: + symbol = QPixmap(getPath(RESOURCE) + "pic/messagebox_warning.png"); + break; + default: + symbol = QPixmap(getPath(RESOURCE) + "pic/messagebox_info.png"); + break; + } + textXOffset = 2+symbol.width(); + width += textXOffset; + height = qMax(height, symbol.height()); + } + + QRect geometry(0, 0, width + 10, height + 8); + + if (check) + return geometry; + + // resize pixmap, mask and widget + static QPixmap mask; + mask = QPixmap(geometry.size()); + pixmap_ = QPixmap(geometry.size()); + resize(geometry.size()); + + switch(ali) + { + case TopLeft: + move(pos); + break; + case TopRight: + move(pos - geometry.topRight()); + break; + case BottomLeft: + move(pos - geometry.bottomLeft()); + break; + case BottomRight: + move(pos - geometry.bottomRight()); + break; + } + + // create and set transparency mask + QPainter maskPainter(&mask); + mask.fill(Qt::black); + maskPainter.setBrush(Qt::white); + maskPainter.drawRoundRect(geometry, 1600 / geometry.width(), 1600 / + geometry.height()); + setMask(mask.createHeuristicMask()); + + // draw background + QPainter bufferPainter(&pixmap_); + bufferPainter.setPen(Qt::black); + bufferPainter.setBrush(palette().brush(QPalette::Window)); + bufferPainter.drawRoundRect(geometry, 1600 / geometry.width(), 1600 / + geometry.height()); + + // draw icon if present + if (!symbol.isNull()) { + bufferPainter.drawPixmap(5, 4, symbol, 0, 0, symbol.width(), symbol.height()); + } + + // draw shadow and text + int yText = geometry.height() - height / 2; + bufferPainter.setPen(palette().color(QPalette::Window).dark(115)); + bufferPainter.drawText(5+textXOffset + shadowOffset, yText + 1, message); + bufferPainter.setPen(palette().color(QPalette::WindowText)); + bufferPainter.drawText(5+textXOffset, yText, message); + + // show widget and schedule a repaint + show(); + update(); + + // close the message window after given mS + if (durationMs > 0) { + if (!timer_) { + timer_ = new QTimer(this); + timer_->setSingleShot(true); + FQ_VERIFY(connect(timer_, SIGNAL(timeout()), SLOT(hide()))); + } + timer_->start(durationMs); + } else if (timer_) { + timer_->stop(); + } + + return QRect(QPoint(0, 0), size()); +} + +void PageViewMessage::paintEvent(QPaintEvent *e) { + QPainter p(this); + p.drawPixmap(e->rect().topLeft(), pixmap_, e->rect()); +} + +void PageViewMessage::mousePressEvent(QMouseEvent * /*e*/) { + if (timer_) { + timer_->stop(); + } + hide(); +} + +void PageViewMessage::hideEvent( QHideEvent * event ) { + emit hideAt(geometry ()); + QWidget::hideEvent(event); +} + +} // namespace FQTerm + +#include "osdmessage.moc" |