[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