X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/ad0a321b7dfd57d7d666ac87ef44813f8e16129e..f2aae09edd023bb0bb4e56e6662bc0afc9550e54:/src/tooltipmanager.cpp diff --git a/src/tooltipmanager.cpp b/src/tooltipmanager.cpp index e2d2688df..c8632daf6 100644 --- a/src/tooltipmanager.cpp +++ b/src/tooltipmanager.cpp @@ -51,11 +51,11 @@ ToolTipManager::ToolTipManager(QAbstractItemView* parent, m_waitOnPreviewTimer(0), m_item(), m_itemRect(), - m_preview(), - m_generatingPreview(), - m_previewIsLate(), - m_previewPass(), - m_emptyRenderedKToolTipItem(), + m_preview(false), + m_generatingPreview(false), + m_previewIsLate(false), + m_previewPass(0), + m_emptyRenderedKToolTipItem(0), m_pix() { KToolTip::setToolTipDelegate(g_delegate); @@ -82,12 +82,6 @@ ToolTipManager::ToolTipManager(QAbstractItemView* parent, this, SLOT(prepareToolTip())); m_view->viewport()->installEventFilter(this); - - m_preview = false; - m_generatingPreview = false; - m_previewIsLate = false; - m_previewPass = 0; - m_pix = QPixmap(); } ToolTipManager::~ToolTipManager() @@ -111,6 +105,7 @@ bool ToolTipManager::eventFilter(QObject* watched, QEvent* event) void ToolTipManager::requestToolTip(const QModelIndex& index) { if (index.column() == DolphinModel::Name) { + m_waitOnPreviewTimer->stop(); KToolTip::hideTip(); m_itemRect = m_view->visualRect(index); @@ -138,6 +133,8 @@ void ToolTipManager::hideToolTip() { m_timer->stop(); m_previewTimer->stop(); + m_waitOnPreviewTimer->stop(); + m_previewIsLate = false; KToolTip::hideTip(); } @@ -164,7 +161,9 @@ void ToolTipManager::prepareToolTip() if (m_preview && m_previewIsLate) { // We got a preview, but it is late, the tooltip has already been shown. // So update the tooltip directly. - m_emptyRenderedKToolTipItem->setData(Qt::DecorationRole, KIcon(m_pix)); + if (m_emptyRenderedKToolTipItem != 0) { + m_emptyRenderedKToolTipItem->setData(Qt::DecorationRole, KIcon(m_pix)); + } return; } @@ -185,6 +184,14 @@ void ToolTipManager::prepareToolTip() void ToolTipManager::showToolTip(KToolTipItem* tip) { + if (QApplication::mouseButtons() & Qt::LeftButton) { + delete tip; + tip = 0; + // m_emptyRenderedKToolTipItem is an alias for tip. + m_emptyRenderedKToolTipItem = 0; + return; + } + KStyleOptionToolTip option; // TODO: get option content from KToolTip or add KToolTip::sizeHint() method option.direction = QApplication::layoutDirection(); @@ -224,20 +231,18 @@ void ToolTipManager::showToolTip(KToolTipItem* tip) return; } - int x = 0; - if (hasRoomToLeft || hasRoomToRight) { - x = hasRoomToRight ? m_itemRect.right() : m_itemRect.left() - size.width(); - } else { - // Put the tooltip at the far right of the screen. The item will be overlapped - // horizontally, but the y-coordinate will be adjusted afterwards so that no overlapping - // occurs vertically. - x = desktop.right() - size.width(); - } - + int x = 0; int y = 0; if (hasRoomBelow || hasRoomAbove) { + x = QCursor::pos().x() + 16; // TODO: use mouse pointer width instead of the magic value of 16 + if (x + size.width() >= desktop.right()) { + x = desktop.right() - size.width(); + } y = hasRoomBelow ? m_itemRect.bottom() : m_itemRect.top() - size.height(); } else { + Q_ASSERT(hasRoomToLeft || hasRoomToRight); + x = hasRoomToRight ? m_itemRect.right() : m_itemRect.left() - size.width(); + // Put the tooltip at the bottom of the screen. The x-coordinate has already // been adjusted, so that no overlapping with m_itemRect occurs. y = desktop.bottom() - size.height(); @@ -266,67 +271,23 @@ void ToolTipManager::startPreviewJob() void ToolTipManager::setPreviewPix(const KFileItem& item, const QPixmap& pixmap) { - // If the url has changed, don't do anything. - if ( m_item.url().url() == item.url().url() ) - { - QPixmap icon = pixmap; - // only paint borders if the pixmap is opaque - if (!icon.hasAlphaChannel()) - { - // border painter (adapted from dolphin/src/iconmanager.cpp) - // the frame is painted on top of the pixmap, this is needed to keep - // the text preview visually nice (the previewer adds ugly borders) - QPainter painter; - // make a buffer pixmap, tends to crash when 'icon' is directly painted ... - QPixmap framedIcon(icon.size().width(), pixmap.size().height()); - framedIcon.fill(); - const int width = framedIcon.width() - 1; - const int height = framedIcon.height() - 1; - - // draw the pixmap - painter.begin(&framedIcon); - painter.drawPixmap(0,0, icon); - - // draw the frame - painter.setRenderHint(QPainter::Antialiasing, false); - painter.setPen(QColor(0, 0, 0)); - painter.drawRect(0, 0, width-0, height-1); - painter.drawRect(1, 1, width-2, height-2); - painter.setPen(QColor(255, 255, 255)); - painter.drawRect(2, 2, width-4, height-4); - - painter.end(); - icon = framedIcon; - - // provide an alpha channel for the frame - QPixmap alphaChannel(icon.size()); - alphaChannel.fill(); - - QPainter alphaPainter(&alphaChannel); - alphaPainter.setBrush(Qt::NoBrush); - alphaPainter.setRenderHint(QPainter::Antialiasing, false); - alphaPainter.setPen(QColor(32, 32, 32)); - alphaPainter.drawRect(0, 0, width, height); - alphaPainter.setPen(QColor(64, 64, 64)); - alphaPainter.drawRect(1, 1, width-2, height-2); - - icon.setAlphaChannel(alphaChannel); - } - - if (m_previewIsLate) { - // always use the maximal width - QPixmap paddedImage(QSize(PREVIEW_WIDTH, icon.height())); - paddedImage.fill(Qt::transparent); - QPainter painter(&paddedImage); - painter.drawPixmap((PREVIEW_WIDTH - icon.width()) / 2, 0, icon); - m_pix = paddedImage; - } - else { - m_pix = icon; - } - m_preview = true; + if (m_item.url() != item.url()) { m_generatingPreview = false; - } + return; + } + + if (m_previewIsLate) { + // always use the maximal width + QPixmap paddedImage(QSize(PREVIEW_WIDTH, pixmap.height())); + paddedImage.fill(Qt::transparent); + QPainter painter(&paddedImage); + painter.drawPixmap((PREVIEW_WIDTH - pixmap.width()) / 2, 0, pixmap); + m_pix = paddedImage; + } else { + m_pix = pixmap; + } + m_preview = true; + m_generatingPreview = false; } void ToolTipManager::previewFailed(const KFileItem& item)