[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: playground/base/plasma/applets/previewer
From: Alessandro Diaferia <alediaferia () gmail ! com>
Date: 2008-08-26 17:07:27
Message-ID: 1219770447.205610.11238.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 852806 by adiaferia:
added hover support
M +94 -32 plasma-previewer.cpp
M +9 -1 plasma-previewer.h
--- trunk/playground/base/plasma/applets/previewer/plasma-previewer.cpp \
#852805:852806 @@ -78,8 +78,11 @@
\
currentService(QString()),
currFile(QString()),
\
m_selectedRegion(QRect()), + \
m_hoveredRegion(QRect()),
previewReady(false),
- previewJob(0)
+ previewJob(0),
+ layout_valid(false),
+ panel(0)
{
kDebug()<<"ctor";
@@ -121,6 +124,13 @@
kDebug()<<"setting dialog up";
setupPreviewDialog();
setupOptionViewItem();
+ setAcceptHoverEvents(true);
+
+ panel = new Plasma::PanelSvg();
+
+ // let's draw the top border of the applet
+ panel->setImagePath("dialogs/background");
+
// setupApplet();
//connect(m_icon, SIGNAL(clicked()), this, SLOT(showHide()));
@@ -161,10 +171,6 @@
painter->setRenderHint(QPainter::Antialiasing);
- Plasma::PanelSvg *panel = new Plasma::PanelSvg();
-
- // let's draw the top border of the applet
- panel->setImagePath("dialogs/background");
panel->setEnabledBorders(Plasma::PanelSvg::TopBorder | \
Plasma::PanelSvg::LeftBorder | Plasma::PanelSvg::RightBorder); \
panel->resizePanel(QSize(screenRect().width(), topBorder)); \
panel->paintPanel(painter); @@ -202,7 +208,8 @@
//painter->drawRect(itemsRect);
// let's draw items..
- layoutItems();
+ if(!layout_valid)
+ layoutItems();
painter->save();
painter->setClipping(true);
painter->setClipRect(itemsRect);
@@ -212,7 +219,7 @@
KFileItemDelegate *m_delegate = new KFileItemDelegate(this);
m_delegate->setShadowColor(Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor));
- KUrl selectedItem = KUrl();
+ KUrl hoveredItem = KUrl();
for(int i = 0; i < m_items.count(); i++){
//painter->drawRect(m_items[i]);
@@ -220,7 +227,6 @@
KIconLoader::States state = KIconLoader::DefaultState;
if(m_selectedRegion.intersects(m_items[i])){
- selectedItem = KUrl(files[i]);
state = KIconLoader::ActiveState;
QColor hilight = \
Plasma::Theme::defaultTheme()->color(Plasma::Theme::BackgroundColor); \
hilight.setAlphaF(0.7); @@ -263,8 +269,12 @@
// // let's draw the file name
// painter->drawText(r_text, Qt::AlignHCenter | Qt::TextWordWrap | \
Qt::TextWrapAnywhere, // \
KUrl(files[i]).fileName()); + if(m_hoveredRegion.intersects(m_items[i])){
+ hoveredItem = KUrl(files[i]);
+ option.state |= QStyle::State_MouseOver;
+ }else
+ option.state = QStyle::State_HasFocus | QStyle::State_Enabled;
-
// painting test using KFileItemDelegate
option.rect = m_items[i];
option.palette.setColor(QPalette::All, QPalette::Text, \
Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor)); @@ -289,14 +299,13 \
@@ panel->paintPanel(painter, previewRect.topLeft());
kDebug()<<"drawing selection rect";
- if (previewReady && !selectedItem.isEmpty()){
+ if (previewReady && !hoveredItem.isEmpty()){
QPixmap pmap;
+ kDebug()<<hoveredItem;
+ if( m_previews.contains(hoveredItem) )
+ pmap = m_previews[hoveredItem];
- if( m_previews.contains(selectedItem) )
- pmap = m_previews[selectedItem];
-
- //TODO: use a QMap to cache last used previews..
if ( previewRect.width() >= pmap.width() ){
QRect p_rect = QRect(previewRect.x() + abs(previewRect.width() - \
pmap.width())/2,
previewRect.y() + abs(previewRect.height() - \
pmap.height())/2, @@ -312,7 +321,7 @@
panel->resizePanel(QSize(screenRect().width(), bottomBorder));
panel->paintPanel(painter, QPoint(0,screenRect().height()-bottomBorder));
- delete panel;
+ //delete panel;
// del->paint(painter, QStyleOptionViewItem(), mod->index(0,0));
}
@@ -320,6 +329,7 @@
void Previewer::scrolled( int value )
{
Q_UNUSED( value );
+ layout_valid = false;
update();
}
@@ -330,6 +340,8 @@
m_scrollBar->geometry().width(), screenRect().height() - 30 - \
25); m_scrollBar->setGeometry(r);
}
+
+ layout_valid = false;
}
@@ -388,6 +400,8 @@
m_scrollBar->show();
else
m_scrollBar->hide();
+
+ layout_valid = true;
}
void Previewer::setupActions()
@@ -439,6 +453,7 @@
void Previewer::openFile(KUrl u)
{
+ kDebug()<<"opening file";
if(!u.isValid())
u = KFileDialog::getOpenUrl();
@@ -450,7 +465,6 @@
//kDebug()<<u;
KMimeType::Ptr mimeType = KMimeType::findByUrl(u, 0, true);
- // mime_icon->setPixmap(KIconLoader::global()->loadIcon(mimeType->iconName(), \
KIconLoader::Toolbar)); \
m_dialog->setMimeIcon(KIconLoader::global()->loadIcon(mimeType->iconName(), \
KIconLoader::Toolbar));
delete m_part;
@@ -460,7 +474,6 @@
if(!m_part)
return;
-
// this informs globally about the service used to make the part
KService::Ptr service = \
KMimeTypeTrader::self()->preferredService(mimeType->name()); currentService = \
service->desktopEntryName(); @@ -658,21 +671,7 @@
Q_UNUSED(event);
if((clicked - scenePos().toPoint()).manhattanLength() < \
KGlobalSettings::dndEventDelay()){
- for (int i = 0; i < m_items.count(); i++){
- if(m_items[i].contains(event->pos().toPoint())){
- QRect previous = m_selectedRegion;
- m_selectedRegion = QRect(m_items[i]);
- update(m_items[i]);
- update(previous);
- //lookForPreview();
- openFile(KUrl(previewHistory()[i]));
- break;
- }else{
- QRect previous = m_selectedRegion;
- m_selectedRegion = QRect();
- update(previous);
- }
- }
+ updateSelectedItems(event->pos().toPoint());
}
// if(m_part)
// m_dialog->setVisible(!m_dialog->isVisible());
@@ -691,6 +690,69 @@
}
+void Previewer::updateSelectedItems(const QPoint &point)
+{
+ QRect previous;
+ for (int i = 0; i < m_items.count(); i++){
+ if(m_items[i].contains(point)){
+ previous = m_selectedRegion;
+ m_selectedRegion = QRect(m_items[i]);
+ openFile(KUrl(previewHistory()[i]));
+ break;
+ }else{
+ previous = m_selectedRegion;
+ m_selectedRegion = QRect();
+ }
+ }
+ update(m_selectedRegion);
+ update(previous);
+}
+
+void Previewer::updateHoveredItems(const QPoint &point)
+{
+ QRect previous = m_hoveredRegion;
+ int i = 0;
+ if( itemsRect.contains(point) )
+ for (; i < m_items.count(); i++){
+ if(m_items[i].contains(point)){
+ m_hoveredRegion = m_items[i];
+ break;
+ }else{
+ m_hoveredRegion = QRect();
+ }
+ }
+ else
+ m_hoveredRegion = QRect();
+
+ if(!m_hoveredRegion.isEmpty())
+ update(m_hoveredRegion);
+
+ if(m_hoveredRegion != previous && !previous.isEmpty())
+ update(previous);
+
+ QList<QUrl> files = previewHistory();
+ if(i < files.count())
+ if(m_previews.contains(KUrl(previewHistory()[i])))
+ update(previewRect);
+}
+
+void Previewer::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
+{
+ updateHoveredItems(event->pos().toPoint());
+}
+
+void Previewer::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
+{
+ QRect previous = m_hoveredRegion;
+ m_hoveredRegion = QRect();
+ update(previous);
+}
+
+void Previewer::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
+{
+ updateHoveredItems(event->pos().toPoint());
+}
+
void Previewer::openUrls(KUrl::List list)
{
for(int i = 0; i < list.count(); i++){
--- trunk/playground/base/plasma/applets/previewer/plasma-previewer.h #852805:852806
@@ -33,6 +33,7 @@
class Label;
class Widget;
class ScrollBar;
+ class PanelSvg;
}
namespace KParts{
class ReadOnlyPart;
@@ -94,11 +95,13 @@
int m_size;
Plasma::ScrollBar *m_scrollBar;
QRect m_selectedRegion;
- QRegion m_hoveredRegion;
+ QRect m_hoveredRegion;
bool previewReady;
QStyleOptionViewItem option;
KIO::PreviewJob *previewJob;
QRect previewRect;
+ bool layout_valid;
+ Plasma::PanelSvg *panel;
protected:
void dropEvent(QGraphicsSceneDragDropEvent *);
@@ -116,6 +119,11 @@
void layoutItems();
void lookForPreview();
void setupOptionViewItem();
+ void updateSelectedItems(const QPoint &);
+ void updateHoveredItems(const QPoint &);
+ void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
+ void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
+ void hoverMoveEvent(QGraphicsSceneHoverEvent *event);
protected slots:
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic