mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-19 08:21:22 +00:00
Don't recreate and destroy the tooltip widget on each show/hide operation, just use set the widget visible/invisible and update the content instead
svn path=/trunk/KDE/kdebase/apps/; revision=1107992
This commit is contained in:
parent
dd743f9d98
commit
47e80ef6b9
|
@ -43,8 +43,7 @@ set(dolphinprivate_LIB_SRCS
|
||||||
settings/filemetadataconfigurationdialog.cpp
|
settings/filemetadataconfigurationdialog.cpp
|
||||||
settings/viewpropertiesdialog.cpp
|
settings/viewpropertiesdialog.cpp
|
||||||
settings/viewpropsprogressinfo.cpp
|
settings/viewpropsprogressinfo.cpp
|
||||||
tooltips/ktooltip.cpp
|
tooltips/filemetadatatooltip.cpp
|
||||||
tooltips/ktooltipwindow.cpp
|
|
||||||
tooltips/tooltipmanager.cpp
|
tooltips/tooltipmanager.cpp
|
||||||
versioncontrol/pendingthreadsmaintainer.cpp
|
versioncontrol/pendingthreadsmaintainer.cpp
|
||||||
versioncontrol/updateitemstatesthread.cpp
|
versioncontrol/updateitemstatesthread.cpp
|
||||||
|
|
161
src/tooltips/filemetadatatooltip.cpp
Normal file
161
src/tooltips/filemetadatatooltip.cpp
Normal file
|
@ -0,0 +1,161 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* Copyright (C) 2010 by Peter Penz <peter.penz@gmx.at> *
|
||||||
|
* Copyright (C) 2008 by Fredrik Höglund <fredrik@kde.org> *
|
||||||
|
* *
|
||||||
|
* 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 "filemetadatatooltip.h"
|
||||||
|
|
||||||
|
#include <kcolorscheme.h>
|
||||||
|
#include <kfilemetadatawidget.h>
|
||||||
|
#include <kseparator.h>
|
||||||
|
#include <kwindowsystem.h>
|
||||||
|
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
|
FileMetaDataToolTip::FileMetaDataToolTip(QWidget* parent) :
|
||||||
|
QWidget(parent),
|
||||||
|
m_preview(0),
|
||||||
|
m_name(0),
|
||||||
|
m_fileMetaDataWidget(0)
|
||||||
|
|
||||||
|
{
|
||||||
|
setAttribute(Qt::WA_TranslucentBackground);
|
||||||
|
setWindowFlags(Qt::ToolTip | Qt::FramelessWindowHint);
|
||||||
|
|
||||||
|
// Create widget for file preview
|
||||||
|
m_preview = new QLabel(this);
|
||||||
|
|
||||||
|
// Create widget for file name
|
||||||
|
m_name = new QLabel(this);
|
||||||
|
m_name->setWordWrap(true);
|
||||||
|
QFont font = m_name->font();
|
||||||
|
font.setBold(true);
|
||||||
|
m_name->setFont(font);
|
||||||
|
m_name->setAlignment(Qt::AlignHCenter);
|
||||||
|
m_name->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
|
||||||
|
|
||||||
|
// Create widget for the meta data
|
||||||
|
m_fileMetaDataWidget = new KFileMetaDataWidget();
|
||||||
|
m_fileMetaDataWidget->setForegroundRole(QPalette::ToolTipText);
|
||||||
|
m_fileMetaDataWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
||||||
|
m_fileMetaDataWidget->setReadOnly(true);
|
||||||
|
|
||||||
|
// The stretchwidget allows the metadata widget to be top aligned and fills
|
||||||
|
// the remaining vertical space
|
||||||
|
QWidget* stretchWidget = new QWidget(this);
|
||||||
|
stretchWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
|
||||||
|
|
||||||
|
QWidget* textContainer = new QWidget(this);
|
||||||
|
QVBoxLayout* textLayout = new QVBoxLayout(textContainer);
|
||||||
|
textLayout->addWidget(m_name);
|
||||||
|
textLayout->addWidget(new KSeparator());
|
||||||
|
textLayout->addWidget(m_fileMetaDataWidget);
|
||||||
|
textLayout->addWidget(stretchWidget);
|
||||||
|
|
||||||
|
QHBoxLayout* tipLayout = new QHBoxLayout(this);
|
||||||
|
tipLayout->addWidget(m_preview);
|
||||||
|
tipLayout->addWidget(textContainer);
|
||||||
|
}
|
||||||
|
|
||||||
|
FileMetaDataToolTip::~FileMetaDataToolTip()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileMetaDataToolTip::setPreview(const QPixmap& pixmap)
|
||||||
|
{
|
||||||
|
m_preview->setPixmap(pixmap);
|
||||||
|
m_preview->setFixedSize(pixmap.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
const QPixmap* FileMetaDataToolTip::preview() const
|
||||||
|
{
|
||||||
|
return m_preview->pixmap();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileMetaDataToolTip::setName(const QString& name)
|
||||||
|
{
|
||||||
|
m_name->setText(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FileMetaDataToolTip::name() const
|
||||||
|
{
|
||||||
|
return m_name->text();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileMetaDataToolTip::setItems(const KFileItemList& items)
|
||||||
|
{
|
||||||
|
m_fileMetaDataWidget->setItems(items);
|
||||||
|
}
|
||||||
|
|
||||||
|
KFileItemList FileMetaDataToolTip::items() const
|
||||||
|
{
|
||||||
|
return m_fileMetaDataWidget->items();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileMetaDataToolTip::paintEvent(QPaintEvent* event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(event);
|
||||||
|
|
||||||
|
QPainter painter(this);
|
||||||
|
|
||||||
|
QColor toColor = palette().brush(QPalette::ToolTipBase).color();
|
||||||
|
QColor fromColor = KColorScheme::shade(toColor, KColorScheme::LightShade, 0.2);
|
||||||
|
|
||||||
|
const bool haveAlphaChannel = KWindowSystem::compositingActive();
|
||||||
|
if (haveAlphaChannel) {
|
||||||
|
painter.setRenderHint(QPainter::Antialiasing);
|
||||||
|
painter.translate(0.5, 0.5);
|
||||||
|
toColor.setAlpha(220);
|
||||||
|
fromColor.setAlpha(220);
|
||||||
|
}
|
||||||
|
|
||||||
|
QLinearGradient gradient(QPointF(0.0, 0.0), QPointF(0.0, height()));
|
||||||
|
gradient.setColorAt(0.0, fromColor);
|
||||||
|
gradient.setColorAt(1.0, toColor);
|
||||||
|
painter.setPen(Qt::NoPen);
|
||||||
|
painter.setBrush(gradient);
|
||||||
|
|
||||||
|
const QRect rect(0, 0, width(), height());
|
||||||
|
if (haveAlphaChannel) {
|
||||||
|
const qreal radius = 5.0;
|
||||||
|
|
||||||
|
QPainterPath path;
|
||||||
|
path.moveTo(rect.left(), rect.top() + radius);
|
||||||
|
arc(path, rect.left() + radius, rect.top() + radius, radius, 180, -90);
|
||||||
|
arc(path, rect.right() - radius, rect.top() + radius, radius, 90, -90);
|
||||||
|
arc(path, rect.right() - radius, rect.bottom() - radius, radius, 0, -90);
|
||||||
|
arc(path, rect.left() + radius, rect.bottom() - radius, radius, 270, -90);
|
||||||
|
path.closeSubpath();
|
||||||
|
|
||||||
|
painter.drawPath(path);
|
||||||
|
} else {
|
||||||
|
painter.drawRect(rect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileMetaDataToolTip::arc(QPainterPath& path,
|
||||||
|
qreal cx, qreal cy,
|
||||||
|
qreal radius, qreal angle,
|
||||||
|
qreal sweepLength)
|
||||||
|
{
|
||||||
|
path.arcTo(cx-radius, cy-radius, radius * 2, radius * 2, angle, sweepLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "filemetadatatooltip.moc"
|
|
@ -1,5 +1,6 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Copyright (C) 2009 by Peter Penz <peter.penz@gmx.at> *
|
* Copyright (C) 2010 by Peter Penz <peter.penz@gmx.at> *
|
||||||
|
* Copyright (C) 2008 by Fredrik Höglund <fredrik@kde.org> *
|
||||||
* *
|
* *
|
||||||
* This program is free software; you can redistribute it and/or modify *
|
* 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 *
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
@ -17,29 +18,53 @@
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#ifndef KTOOLTIPWINDOW_H
|
#ifndef DOLPHINCONTROLLER_H
|
||||||
#define KTOOLTIPWINDOW_H
|
#define DOLPHINCONTROLLER_H
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
class QPaintEvent;
|
|
||||||
|
|
||||||
class KToolTipWindow : public QWidget
|
class KFileItemList;
|
||||||
|
class KFileMetaDataWidget;
|
||||||
|
class QLabel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Tooltip, that shows the meta information and a preview of one
|
||||||
|
* or more files.
|
||||||
|
*/
|
||||||
|
class FileMetaDataToolTip : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit KToolTipWindow(QWidget* content);
|
FileMetaDataToolTip(QWidget* parent = 0);
|
||||||
virtual ~KToolTipWindow();
|
virtual ~FileMetaDataToolTip();
|
||||||
|
|
||||||
|
void setPreview(const QPixmap& pixmap);
|
||||||
|
const QPixmap* preview() const;
|
||||||
|
|
||||||
|
void setName(const QString& name);
|
||||||
|
QString name() const;
|
||||||
|
|
||||||
|
void setItems(const KFileItemList& items);
|
||||||
|
KFileItemList items() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void paintEvent(QPaintEvent* event);
|
virtual void paintEvent(QPaintEvent* event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* Helper method for KToolTipWindow::paintEvent() to adjust the painter path \p path
|
* Helper method for FileMetaDataToolTip::paintEvent() to adjust the painter path \p path
|
||||||
* by rounded corners.
|
* by rounded corners.
|
||||||
*/
|
*/
|
||||||
static void arc(QPainterPath& path, qreal cx, qreal cy, qreal radius, qreal angle, qreal sweeplength);
|
static void arc(QPainterPath& path,
|
||||||
|
qreal cx, qreal cy,
|
||||||
|
qreal radius, qreal angle,
|
||||||
|
qreal sweepLength);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QLabel* m_preview;
|
||||||
|
QLabel* m_name;
|
||||||
|
KFileMetaDataWidget* m_fileMetaDataWidget;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -1,102 +0,0 @@
|
||||||
/***************************************************************************
|
|
||||||
* Copyright (C) 2008 by Fredrik Höglund <fredrik@kde.org> *
|
|
||||||
* *
|
|
||||||
* 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 "ktooltip.h"
|
|
||||||
#include "ktooltipwindow_p.h"
|
|
||||||
#include <QLabel>
|
|
||||||
#include <QPoint>
|
|
||||||
#include <QWidget>
|
|
||||||
|
|
||||||
class KToolTipManager
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
~KToolTipManager();
|
|
||||||
|
|
||||||
static KToolTipManager* instance();
|
|
||||||
|
|
||||||
void showTip(const QPoint& pos, QWidget* content);
|
|
||||||
void hideTip();
|
|
||||||
|
|
||||||
private:
|
|
||||||
KToolTipManager();
|
|
||||||
|
|
||||||
KToolTipWindow* m_window;
|
|
||||||
static KToolTipManager *s_instance;
|
|
||||||
};
|
|
||||||
|
|
||||||
KToolTipManager *KToolTipManager::s_instance = 0;
|
|
||||||
|
|
||||||
KToolTipManager::KToolTipManager() :
|
|
||||||
m_window(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
KToolTipManager::~KToolTipManager()
|
|
||||||
{
|
|
||||||
delete m_window;
|
|
||||||
m_window = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
KToolTipManager* KToolTipManager::instance()
|
|
||||||
{
|
|
||||||
if (s_instance == 0) {
|
|
||||||
s_instance = new KToolTipManager();
|
|
||||||
}
|
|
||||||
|
|
||||||
return s_instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
void KToolTipManager::showTip(const QPoint& pos, QWidget* content)
|
|
||||||
{
|
|
||||||
hideTip();
|
|
||||||
Q_ASSERT(m_window == 0);
|
|
||||||
m_window = new KToolTipWindow(content);
|
|
||||||
m_window->move(pos);
|
|
||||||
m_window->show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void KToolTipManager::hideTip()
|
|
||||||
{
|
|
||||||
if (m_window != 0) {
|
|
||||||
m_window->hide();
|
|
||||||
m_window->deleteLater();
|
|
||||||
m_window = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace KToolTip
|
|
||||||
{
|
|
||||||
void showText(const QPoint& pos, const QString& text)
|
|
||||||
{
|
|
||||||
QLabel* label = new QLabel(text);
|
|
||||||
label->setForegroundRole(QPalette::ToolTipText);
|
|
||||||
showTip(pos, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
void showTip(const QPoint& pos, QWidget* content)
|
|
||||||
{
|
|
||||||
KToolTipManager::instance()->showTip(pos, content);
|
|
||||||
}
|
|
||||||
|
|
||||||
void hideTip()
|
|
||||||
{
|
|
||||||
KToolTipManager::instance()->hideTip();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,46 +0,0 @@
|
||||||
/***************************************************************************
|
|
||||||
* Copyright (C) 2008 by Fredrik Höglund <fredrik@kde.org> *
|
|
||||||
* *
|
|
||||||
* 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 *
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef KTOOLTIP_H
|
|
||||||
#define KTOOLTIP_H
|
|
||||||
|
|
||||||
class QPoint;
|
|
||||||
class QString;
|
|
||||||
class QWidget;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allows to show tooltips having a widget as content.
|
|
||||||
*/
|
|
||||||
namespace KToolTip
|
|
||||||
{
|
|
||||||
void showText(const QPoint& pos, const QString& text);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shows the tip @p content at the global position indicated by @p pos.
|
|
||||||
*
|
|
||||||
* Ownership of the content widget is transferred to KToolTip. The widget will be deleted
|
|
||||||
* automatically when it is hidden.
|
|
||||||
*
|
|
||||||
* The tip is shown immediately when this function is called.
|
|
||||||
*/
|
|
||||||
void showTip(const QPoint& pos, QWidget* content);
|
|
||||||
void hideTip();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,90 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2008 by Fredrik Höglund <fredrik@kde.org> *
|
|
||||||
* Copyright (C) 2008 by Konstantin Heil <konst.heil@stud.uni-heidelberg.de> *
|
|
||||||
* Copyright (C) 2009 by Peter Penz <peter.penz@gmx.at> *
|
|
||||||
* *
|
|
||||||
* 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 "ktooltipwindow_p.h"
|
|
||||||
|
|
||||||
#include <kcolorscheme.h>
|
|
||||||
#include <kwindowsystem.h>
|
|
||||||
|
|
||||||
#include <QPainter>
|
|
||||||
#include <QVBoxLayout>
|
|
||||||
|
|
||||||
KToolTipWindow::KToolTipWindow(QWidget* content) :
|
|
||||||
QWidget(0)
|
|
||||||
{
|
|
||||||
setAttribute(Qt::WA_TranslucentBackground);
|
|
||||||
setWindowFlags(Qt::ToolTip | Qt::FramelessWindowHint);
|
|
||||||
|
|
||||||
QVBoxLayout* layout = new QVBoxLayout(this);
|
|
||||||
layout->addWidget(content);
|
|
||||||
}
|
|
||||||
|
|
||||||
KToolTipWindow::~KToolTipWindow()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void KToolTipWindow::paintEvent(QPaintEvent* event)
|
|
||||||
{
|
|
||||||
Q_UNUSED(event);
|
|
||||||
|
|
||||||
QPainter painter(this);
|
|
||||||
|
|
||||||
QColor toColor = palette().brush(QPalette::ToolTipBase).color();
|
|
||||||
QColor fromColor = KColorScheme::shade(toColor, KColorScheme::LightShade, 0.2);
|
|
||||||
|
|
||||||
const bool haveAlphaChannel = KWindowSystem::compositingActive();
|
|
||||||
if (haveAlphaChannel) {
|
|
||||||
painter.setRenderHint(QPainter::Antialiasing);
|
|
||||||
painter.translate(0.5, 0.5);
|
|
||||||
toColor.setAlpha(220);
|
|
||||||
fromColor.setAlpha(220);
|
|
||||||
}
|
|
||||||
|
|
||||||
QLinearGradient gradient(QPointF(0.0, 0.0), QPointF(0.0, height()));
|
|
||||||
gradient.setColorAt(0.0, fromColor);
|
|
||||||
gradient.setColorAt(1.0, toColor);
|
|
||||||
painter.setPen(Qt::NoPen);
|
|
||||||
painter.setBrush(gradient);
|
|
||||||
|
|
||||||
const QRect rect(0, 0, width(), height());
|
|
||||||
if (haveAlphaChannel) {
|
|
||||||
const qreal radius = 5.0;
|
|
||||||
|
|
||||||
QPainterPath path;
|
|
||||||
path.moveTo(rect.left(), rect.top() + radius);
|
|
||||||
arc(path, rect.left() + radius, rect.top() + radius, radius, 180, -90);
|
|
||||||
arc(path, rect.right() - radius, rect.top() + radius, radius, 90, -90);
|
|
||||||
arc(path, rect.right() - radius, rect.bottom() - radius, radius, 0, -90);
|
|
||||||
arc(path, rect.left() + radius, rect.bottom() - radius, radius, 270, -90);
|
|
||||||
path.closeSubpath();
|
|
||||||
|
|
||||||
painter.drawPath(path);
|
|
||||||
} else {
|
|
||||||
painter.drawRect(rect);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void KToolTipWindow::arc(QPainterPath& path, qreal cx, qreal cy, qreal radius, qreal angle, qreal sweeplength)
|
|
||||||
{
|
|
||||||
path.arcTo(cx-radius, cy-radius, radius * 2, radius * 2, angle, sweeplength);
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "ktooltipwindow_p.moc"
|
|
|
@ -22,21 +22,15 @@
|
||||||
#include "dolphinmodel.h"
|
#include "dolphinmodel.h"
|
||||||
#include "dolphinsortfilterproxymodel.h"
|
#include "dolphinsortfilterproxymodel.h"
|
||||||
|
|
||||||
#include <kfilemetadatawidget.h>
|
#include "filemetadatatooltip.h"
|
||||||
#include <kicon.h>
|
#include <kicon.h>
|
||||||
#include <kio/previewjob.h>
|
#include <kio/previewjob.h>
|
||||||
#include <kseparator.h>
|
|
||||||
|
|
||||||
#include "tooltips/ktooltip.h"
|
|
||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QDesktopWidget>
|
#include <QDesktopWidget>
|
||||||
#include <QHBoxLayout>
|
|
||||||
#include <QLabel>
|
|
||||||
#include <QScrollArea>
|
#include <QScrollArea>
|
||||||
#include <QScrollBar>
|
#include <QScrollBar>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QVBoxLayout>
|
|
||||||
|
|
||||||
ToolTipManager::ToolTipManager(QAbstractItemView* parent,
|
ToolTipManager::ToolTipManager(QAbstractItemView* parent,
|
||||||
DolphinSortFilterProxyModel* model) :
|
DolphinSortFilterProxyModel* model) :
|
||||||
|
@ -47,6 +41,7 @@ ToolTipManager::ToolTipManager(QAbstractItemView* parent,
|
||||||
m_timer(0),
|
m_timer(0),
|
||||||
m_previewTimer(0),
|
m_previewTimer(0),
|
||||||
m_waitOnPreviewTimer(0),
|
m_waitOnPreviewTimer(0),
|
||||||
|
m_fileMetaDataToolTip(0),
|
||||||
m_item(),
|
m_item(),
|
||||||
m_itemRect(),
|
m_itemRect(),
|
||||||
m_generatingPreview(false),
|
m_generatingPreview(false),
|
||||||
|
@ -84,6 +79,8 @@ ToolTipManager::ToolTipManager(QAbstractItemView* parent,
|
||||||
|
|
||||||
m_view->viewport()->installEventFilter(this);
|
m_view->viewport()->installEventFilter(this);
|
||||||
m_view->installEventFilter(this);
|
m_view->installEventFilter(this);
|
||||||
|
|
||||||
|
m_fileMetaDataToolTip = new FileMetaDataToolTip(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
ToolTipManager::~ToolTipManager()
|
ToolTipManager::~ToolTipManager()
|
||||||
|
@ -115,11 +112,11 @@ bool ToolTipManager::eventFilter(QObject* watched, QEvent* event)
|
||||||
|
|
||||||
void ToolTipManager::requestToolTip(const QModelIndex& index)
|
void ToolTipManager::requestToolTip(const QModelIndex& index)
|
||||||
{
|
{
|
||||||
// only request a tooltip for the name column and when no selection or
|
// Only request a tooltip for the name column and when no selection or
|
||||||
// drag & drop operation is done (indicated by the left mouse button)
|
// drag & drop operation is done (indicated by the left mouse button)
|
||||||
if ((index.column() == DolphinModel::Name) && !(QApplication::mouseButtons() & Qt::LeftButton)) {
|
if ((index.column() == DolphinModel::Name) && !(QApplication::mouseButtons() & Qt::LeftButton)) {
|
||||||
m_waitOnPreviewTimer->stop();
|
m_waitOnPreviewTimer->stop();
|
||||||
KToolTip::hideTip();
|
m_fileMetaDataToolTip->hide();
|
||||||
|
|
||||||
m_itemRect = m_view->visualRect(index);
|
m_itemRect = m_view->visualRect(index);
|
||||||
const QPoint pos = m_view->viewport()->mapToGlobal(m_itemRect.topLeft());
|
const QPoint pos = m_view->viewport()->mapToGlobal(m_itemRect.topLeft());
|
||||||
|
@ -128,8 +125,8 @@ void ToolTipManager::requestToolTip(const QModelIndex& index)
|
||||||
const QModelIndex dirIndex = m_proxyModel->mapToSource(index);
|
const QModelIndex dirIndex = m_proxyModel->mapToSource(index);
|
||||||
m_item = m_dolphinModel->itemForIndex(dirIndex);
|
m_item = m_dolphinModel->itemForIndex(dirIndex);
|
||||||
|
|
||||||
// only start the previewJob when the mouse has been over this item for 200 milliseconds,
|
// Only start the previewJob when the mouse has been over this item for 200 milliseconds.
|
||||||
// this prevents a lot of useless preview jobs when passing rapidly over a lot of items
|
// This prevents a lot of useless preview jobs when passing rapidly over a lot of items.
|
||||||
m_previewTimer->start(200);
|
m_previewTimer->start(200);
|
||||||
m_previewPixmap = QPixmap();
|
m_previewPixmap = QPixmap();
|
||||||
m_hasDefaultIcon = false;
|
m_hasDefaultIcon = false;
|
||||||
|
@ -145,7 +142,8 @@ void ToolTipManager::hideToolTip()
|
||||||
m_timer->stop();
|
m_timer->stop();
|
||||||
m_previewTimer->stop();
|
m_previewTimer->stop();
|
||||||
m_waitOnPreviewTimer->stop();
|
m_waitOnPreviewTimer->stop();
|
||||||
KToolTip::hideTip();
|
|
||||||
|
m_fileMetaDataToolTip->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToolTipManager::prepareToolTip()
|
void ToolTipManager::prepareToolTip()
|
||||||
|
@ -179,7 +177,7 @@ void ToolTipManager::setPreviewPix(const KFileItem& item,
|
||||||
const QPixmap& pixmap)
|
const QPixmap& pixmap)
|
||||||
{
|
{
|
||||||
if ((m_item.url() != item.url()) || pixmap.isNull()) {
|
if ((m_item.url() != item.url()) || pixmap.isNull()) {
|
||||||
// an old preview or an invalid preview has been received
|
// An old preview or an invalid preview has been received
|
||||||
previewFailed();
|
previewFailed();
|
||||||
} else {
|
} else {
|
||||||
m_previewPixmap = pixmap;
|
m_previewPixmap = pixmap;
|
||||||
|
@ -199,10 +197,12 @@ void ToolTipManager::showToolTip(const QPixmap& pixmap)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QWidget* tip = createTipContent(pixmap);
|
m_fileMetaDataToolTip->setPreview(pixmap);
|
||||||
|
m_fileMetaDataToolTip->setName(m_item.text());
|
||||||
|
m_fileMetaDataToolTip->setItems(KFileItemList() << m_item);
|
||||||
|
|
||||||
// calculate the x- and y-position of the tooltip
|
// Calculate the x- and y-position of the tooltip
|
||||||
const QSize size = tip->sizeHint();
|
const QSize size = m_fileMetaDataToolTip->sizeHint();
|
||||||
const QRect desktop = QApplication::desktop()->screenGeometry(m_itemRect.bottomRight());
|
const QRect desktop = QApplication::desktop()->screenGeometry(m_itemRect.bottomRight());
|
||||||
|
|
||||||
// m_itemRect defines the area of the item, where the tooltip should be
|
// m_itemRect defines the area of the item, where the tooltip should be
|
||||||
|
@ -215,8 +215,6 @@ void ToolTipManager::showToolTip(const QPixmap& pixmap)
|
||||||
const bool hasRoomAbove = (m_itemRect.top() - size.height() >= desktop.top());
|
const bool hasRoomAbove = (m_itemRect.top() - size.height() >= desktop.top());
|
||||||
const bool hasRoomBelow = (m_itemRect.bottom() + size.height() <= desktop.bottom());
|
const bool hasRoomBelow = (m_itemRect.bottom() + size.height() <= desktop.bottom());
|
||||||
if (!hasRoomAbove && !hasRoomBelow && !hasRoomToLeft && !hasRoomToRight) {
|
if (!hasRoomAbove && !hasRoomBelow && !hasRoomToLeft && !hasRoomToRight) {
|
||||||
delete tip;
|
|
||||||
tip = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,54 +235,8 @@ void ToolTipManager::showToolTip(const QPixmap& pixmap)
|
||||||
y = desktop.bottom() - size.height();
|
y = desktop.bottom() - size.height();
|
||||||
}
|
}
|
||||||
|
|
||||||
// the ownership of tip is transferred to KToolTip
|
m_fileMetaDataToolTip->move(x, y);
|
||||||
KToolTip::showTip(QPoint(x, y), tip);
|
m_fileMetaDataToolTip->show();
|
||||||
}
|
|
||||||
|
|
||||||
QWidget* ToolTipManager::createTipContent(const QPixmap& pixmap) const
|
|
||||||
{
|
|
||||||
QWidget* tipContent = new QWidget();
|
|
||||||
|
|
||||||
// add pixmap
|
|
||||||
QLabel* pixmapLabel = new QLabel(tipContent);
|
|
||||||
pixmapLabel->setPixmap(pixmap);
|
|
||||||
pixmapLabel->setFixedSize(pixmap.size());
|
|
||||||
|
|
||||||
// add item name
|
|
||||||
QLabel* nameLabel = new QLabel(tipContent);
|
|
||||||
nameLabel->setText(m_item.text());
|
|
||||||
nameLabel->setWordWrap(true);
|
|
||||||
QFont font = nameLabel->font();
|
|
||||||
font.setBold(true);
|
|
||||||
nameLabel->setFont(font);
|
|
||||||
nameLabel->setAlignment(Qt::AlignHCenter);
|
|
||||||
nameLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
|
|
||||||
|
|
||||||
// add meta data
|
|
||||||
KFileMetaDataWidget* metaDataWidget = new KFileMetaDataWidget(tipContent);
|
|
||||||
metaDataWidget->setForegroundRole(QPalette::ToolTipText);
|
|
||||||
metaDataWidget->setItems(KFileItemList() << m_item);
|
|
||||||
metaDataWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
|
||||||
metaDataWidget->setReadOnly(true);
|
|
||||||
|
|
||||||
// the stretchwidget allows the metadata widget to be top aligned and fills
|
|
||||||
// the remaining vertical space
|
|
||||||
QWidget* stretchWidget = new QWidget(tipContent);
|
|
||||||
stretchWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
|
|
||||||
|
|
||||||
QWidget* textContainer = new QWidget(tipContent);
|
|
||||||
QVBoxLayout* textLayout = new QVBoxLayout(textContainer);
|
|
||||||
textLayout->addWidget(nameLabel);
|
|
||||||
textLayout->addWidget(new KSeparator());
|
|
||||||
textLayout->addWidget(metaDataWidget);
|
|
||||||
textLayout->addWidget(stretchWidget);
|
|
||||||
|
|
||||||
QHBoxLayout* tipLayout = new QHBoxLayout(tipContent);
|
|
||||||
tipLayout->setMargin(0);
|
|
||||||
tipLayout->addWidget(pixmapLabel);
|
|
||||||
tipLayout->addWidget(textContainer);
|
|
||||||
|
|
||||||
return tipContent;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "tooltipmanager.moc"
|
#include "tooltipmanager.moc"
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
class DolphinModel;
|
class DolphinModel;
|
||||||
class DolphinSortFilterProxyModel;
|
class DolphinSortFilterProxyModel;
|
||||||
|
class FileMetaDataToolTip;
|
||||||
class QAbstractItemView;
|
class QAbstractItemView;
|
||||||
class QModelIndex;
|
class QModelIndex;
|
||||||
class QTimer;
|
class QTimer;
|
||||||
|
@ -69,12 +70,7 @@ private slots:
|
||||||
private:
|
private:
|
||||||
void showToolTip(const QPixmap& pixmap);
|
void showToolTip(const QPixmap& pixmap);
|
||||||
|
|
||||||
/**
|
private:
|
||||||
* Creates widget that represents the tip content having
|
|
||||||
* an icon and the meta data information.
|
|
||||||
*/
|
|
||||||
QWidget* createTipContent(const QPixmap& pixmap) const;
|
|
||||||
|
|
||||||
QAbstractItemView* m_view;
|
QAbstractItemView* m_view;
|
||||||
DolphinModel* m_dolphinModel;
|
DolphinModel* m_dolphinModel;
|
||||||
DolphinSortFilterProxyModel* m_proxyModel;
|
DolphinSortFilterProxyModel* m_proxyModel;
|
||||||
|
@ -82,6 +78,9 @@ private:
|
||||||
QTimer* m_timer;
|
QTimer* m_timer;
|
||||||
QTimer* m_previewTimer;
|
QTimer* m_previewTimer;
|
||||||
QTimer* m_waitOnPreviewTimer;
|
QTimer* m_waitOnPreviewTimer;
|
||||||
|
|
||||||
|
FileMetaDataToolTip* m_fileMetaDataToolTip;
|
||||||
|
|
||||||
KFileItem m_item;
|
KFileItem m_item;
|
||||||
QRect m_itemRect;
|
QRect m_itemRect;
|
||||||
bool m_generatingPreview;
|
bool m_generatingPreview;
|
||||||
|
|
Loading…
Reference in a new issue