]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Merge remote-tracking branch 'origin/KDE/4.9'
authorFrank Reininghaus <frank78ac@googlemail.com>
Mon, 5 Nov 2012 21:12:45 +0000 (22:12 +0100)
committerFrank Reininghaus <frank78ac@googlemail.com>
Mon, 5 Nov 2012 21:12:45 +0000 (22:12 +0100)
1  2 
src/kitemviews/kitemlistview.cpp
src/kitemviews/kitemlistview.h
src/kitemviews/kstandarditemlistwidget.cpp
src/views/dolphinview.cpp

index 3c60b8e437c843a4cbfa5211b8796b21dfc438fc,ef6dfc833ab7edfbe14391d385a90474b72b0ed8..6a68ae79899e18c1f3127f992ab8b9276221b3ff
@@@ -23,7 -23,6 +23,7 @@@
  #include "kitemlistview.h"
  
  #include <KDebug>
 +#include "kitemlistcontainer.h"
  #include "kitemlistcontroller.h"
  #include "kitemlistheader.h"
  #include "kitemlistselectionmanager.h"
@@@ -44,8 -43,6 +44,8 @@@
  #include <QStyleOptionRubberBand>
  #include <QTimer>
  
 +#include "kitemlistviewaccessible.h"
 +
  namespace {
      // Time in ms until reaching the autoscroll margin triggers
      // an initial autoscrolling
      const int RepeatingAutoScrollDelay = 1000 / 60;
  }
  
 +#ifndef QT_NO_ACCESSIBILITY
 +QAccessibleInterface* accessibleInterfaceFactory(const QString &key, QObject *object)
 +{
 +    Q_UNUSED(key)
 +
 +    if (KItemListContainer* container = qobject_cast<KItemListContainer*>(object)) {
 +        return new KItemListContainerAccessible(container);
 +    } else if (KItemListView* view = qobject_cast<KItemListView*>(object)) {
 +        return new KItemListViewAccessible(view);
 +    }
 +
 +    return 0;
 +}
 +#endif
 +
  KItemListView::KItemListView(QGraphicsWidget* parent) :
      QGraphicsWidget(parent),
      m_enabledSelectionToggles(false),
      m_headerWidget->setVisible(false);
  
      m_header = new KItemListHeader(this);
 +
 +#ifndef QT_NO_ACCESSIBILITY
 +    QAccessible::installFactory(accessibleInterfaceFactory);
 +#endif
 +
  }
  
  KItemListView::~KItemListView()
@@@ -1212,7 -1189,6 +1212,7 @@@ void KItemListView::slotItemsChanged(co
              doLayout(NoAnimation);
          }
      }
 +    QAccessible::updateAccessibility(this, 0, QAccessible::TableModelChanged);
  }
  
  void KItemListView::slotGroupedSortingChanged(bool current)
@@@ -1275,7 -1251,6 +1275,7 @@@ void KItemListView::slotCurrentChanged(
      if (currentWidget) {
          currentWidget->setCurrent(true);
      }
 +    QAccessible::updateAccessibility(this, current+1, QAccessible::Focus);
  }
  
  void KItemListView::slotSelectionChanged(const QSet<int>& current, const QSet<int>& previous)
@@@ -1438,9 -1413,9 +1438,9 @@@ void KItemListView::triggerAutoScrollin
      const qreal newScrollOffset = qMin(scrollOffset() + m_autoScrollIncrement, maxVisibleOffset);
      setScrollOffset(newScrollOffset);
  
 -   // Trigger the autoscroll timer which will periodically call
 -   // triggerAutoScrolling()
 -   m_autoScrollTimer->start(RepeatingAutoScrollDelay);
 +    // Trigger the autoscroll timer which will periodically call
 +    // triggerAutoScrolling()
 +    m_autoScrollTimer->start(RepeatingAutoScrollDelay);
  }
  
  void KItemListView::slotGeometryOfGroupHeaderParentChanged()
  
  void KItemListView::slotRoleEditingCanceled(int index, const QByteArray& role, const QVariant& value)
  {
+     disconnectRoleEditingSignals(index);
      emit roleEditingCanceled(index, role, value);
      m_editingRole = false;
  }
  
  void KItemListView::slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value)
  {
+     disconnectRoleEditingSignals(index);
      emit roleEditingFinished(index, role, value);
      m_editingRole = false;
  }
@@@ -2530,6 -2509,17 +2534,17 @@@ bool KItemListView::hasSiblingSuccessor
      return hasSuccessor;
  }
  
+ void KItemListView::disconnectRoleEditingSignals(int index)
+ {
+     KItemListWidget* widget = m_visibleItems.value(index);
+     if (!widget) {
+         return;
+     }
+     widget->disconnect(SIGNAL(roleEditingCanceled(int,QByteArray,QVariant)), this);
+     widget->disconnect(SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), this);
+ }
  int KItemListView::calculateAutoScrollingIncrement(int pos, int range, int oldInc)
  {
      int inc = 0;
index ca17053a3bfe4cae0e14f34ff497eeb1c3dd9fe4,9847815692e410328039297754760bdf7042fabd..2baf20c94079bd7934a313f7f294d2323d6a39ad
@@@ -662,6 -662,13 +662,13 @@@ private
       */
      bool hasSiblingSuccessor(int index) const;
  
+     /**
+      * Helper method for slotRoleEditingCanceled() and slotRoleEditingFinished().
+      * Disconnects the two Signals "roleEditingCanceled" and
+      * "roleEditingFinished"
+      */
+     void disconnectRoleEditingSignals(int index);
      /**
       * Helper function for triggerAutoScrolling().
       * @param pos    Logical position of the mouse relative to the range.
@@@ -742,8 -749,6 +749,8 @@@ private
      friend class KItemListHeader;    // Accesses m_headerWidget
      friend class KItemListController;
      friend class KItemListControllerTest;
 +    friend class KItemListViewAccessible;
 +    friend class KItemListAccessibleCell;
  };
  
  /**
index 3dccfcc7dd52ac738581f9c3b65975709ba14067,f92cab50f1be2274b55cba109b44608c2fcad55e..4d1031943f6e682c129f1484940008171b7579bb
@@@ -42,7 -42,6 +42,7 @@@
  #include <QStyleOption>
  #include <QTextLayout>
  #include <QTextLine>
 +#include <QPixmapCache>
  
  // #define KSTANDARDITEMLISTWIDGET_DEBUG
  
@@@ -601,8 -600,8 +601,8 @@@ void KStandardItemListWidget::editedRol
  {
      Q_UNUSED(previous);
  
 -   QGraphicsView* parent = scene()->views()[0];
 -   if (current.isEmpty() || !parent || current != "text") {
 +    QGraphicsView* parent = scene()->views()[0];
 +    if (current.isEmpty() || !parent || current != "text") {
          if (m_roleEditor) {
              emit roleEditingCanceled(index(), current, data().value(current));
  
                         this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant)));
              disconnect(m_roleEditor, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)),
                         this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant)));
-             m_roleEditor->deleteLater();
+             // Do not delete the role editor using deleteLater() because we might be
+             // inside a nested event loop which has been started by one of its event
+             // handlers (contextMenuEvent() or drag&drop inside mouseMoveEvent()).
+             m_roleEditor->deleteWhenIdle();
              m_roleEditor = 0;
          }
          return;
@@@ -1275,43 -1277,40 +1278,47 @@@ void KStandardItemListWidget::closeRole
                 this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant)));
      disconnect(m_roleEditor, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)),
                 this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant)));
-     m_roleEditor->deleteLater();
+     // Do not delete the role editor using deleteLater() because we might be
+     // inside a nested event loop which has been started by one of its event
+     // handlers (contextMenuEvent() or drag&drop inside mouseMoveEvent()).
+     m_roleEditor->deleteWhenIdle();
      m_roleEditor = 0;
  }
  
  QPixmap KStandardItemListWidget::pixmapForIcon(const QString& name, int size)
  {
 -    const KIcon icon(name);
 -
 -    int requestedSize;
 -    if (size <= KIconLoader::SizeSmall) {
 -        requestedSize = KIconLoader::SizeSmall;
 -    } else if (size <= KIconLoader::SizeSmallMedium) {
 -        requestedSize = KIconLoader::SizeSmallMedium;
 -    } else if (size <= KIconLoader::SizeMedium) {
 -        requestedSize = KIconLoader::SizeMedium;
 -    } else if (size <= KIconLoader::SizeLarge) {
 -        requestedSize = KIconLoader::SizeLarge;
 -    } else if (size <= KIconLoader::SizeHuge) {
 -        requestedSize = KIconLoader::SizeHuge;
 -    } else if (size <= KIconLoader::SizeEnormous) {
 -        requestedSize = KIconLoader::SizeEnormous;
 -    } else if (size <= KIconLoader::SizeEnormous * 2) {
 -        requestedSize = KIconLoader::SizeEnormous * 2;
 -    } else {
 -        requestedSize = size;
 -    }
 +    const QString key = "KStandardItemListWidget:" % name  % ":" % QString::number(size);
 +    QPixmap pixmap;
 +
 +    if (!QPixmapCache::find(key, pixmap)) {
 +        const KIcon icon(name);
 +
 +        int requestedSize;
 +        if (size <= KIconLoader::SizeSmall) {
 +            requestedSize = KIconLoader::SizeSmall;
 +        } else if (size <= KIconLoader::SizeSmallMedium) {
 +            requestedSize = KIconLoader::SizeSmallMedium;
 +        } else if (size <= KIconLoader::SizeMedium) {
 +            requestedSize = KIconLoader::SizeMedium;
 +        } else if (size <= KIconLoader::SizeLarge) {
 +            requestedSize = KIconLoader::SizeLarge;
 +        } else if (size <= KIconLoader::SizeHuge) {
 +            requestedSize = KIconLoader::SizeHuge;
 +        } else if (size <= KIconLoader::SizeEnormous) {
 +            requestedSize = KIconLoader::SizeEnormous;
 +        } else if (size <= KIconLoader::SizeEnormous * 2) {
 +            requestedSize = KIconLoader::SizeEnormous * 2;
 +        } else {
 +            requestedSize = size;
 +        }
 +
 +        pixmap = icon.pixmap(requestedSize, requestedSize);
 +        if (requestedSize != size) {
 +            KPixmapModifier::scale(pixmap, QSize(size, size));
 +        }
  
 -    QPixmap pixmap = icon.pixmap(requestedSize, requestedSize);
 -    if (requestedSize != size) {
 -        KPixmapModifier::scale(pixmap, QSize(size, size));
 +        QPixmapCache::insert(key, pixmap);
      }
  
      return pixmap;
index 5b3d074c98a400de31962f0483c44e9d52190064,8e1a191082dece7997388f05469b434a589fcded..e2ccc7ff1477cf6bcc6810beb4f6c8947e555470
@@@ -73,7 -73,7 +73,7 @@@
  #include "zoomlevelinfo.h"
  
  #ifdef HAVE_NEPOMUK
 -    #include <Nepomuk/ResourceManager>
 +    #include <Nepomuk2/ResourceManager>
  #endif
  
  namespace {
@@@ -154,7 -154,6 +154,7 @@@ DolphinView::DolphinView(const KUrl& ur
  
      connect(m_model, SIGNAL(directoryLoadingStarted()),       this, SLOT(slotDirectoryLoadingStarted()));
      connect(m_model, SIGNAL(directoryLoadingCompleted()),     this, SLOT(slotDirectoryLoadingCompleted()));
 +    connect(m_model, SIGNAL(directoryLoadingCanceled()),      this, SIGNAL(directoryLoadingCanceled()));
      connect(m_model, SIGNAL(directoryLoadingProgress(int)),   this, SIGNAL(directoryLoadingProgress(int)));
      connect(m_model, SIGNAL(directorySortingProgress(int)),   this, SIGNAL(directorySortingProgress(int)));
      connect(m_model, SIGNAL(itemsChanged(KItemRangeList,QSet<QByteArray>)),
@@@ -635,25 -634,25 +635,25 @@@ void DolphinView::clearSelection(
  void DolphinView::renameSelectedItems()
  {
      const KFileItemList items = selectedItems();
 -     if (items.isEmpty()) {
 -         return;
 -     }
 -
 -     if (items.count() == 1 && GeneralSettings::renameInline()) {
 -         const int index = m_model->index(items.first());
 -         m_view->editRole(index, "text");
 -     } else {
 -         RenameDialog* dialog = new RenameDialog(this, items);
 -         dialog->setAttribute(Qt::WA_DeleteOnClose);
 -         dialog->show();
 -         dialog->raise();
 -         dialog->activateWindow();
 -     }
 -
 -     // Assure that the current index remains visible when KFileItemModel
 -     // will notify the view about changed items (which might result in
 -     // a changed sorting).
 -     m_assureVisibleCurrentIndex = true;
 +    if (items.isEmpty()) {
 +        return;
 +    }
 +
 +    if (items.count() == 1 && GeneralSettings::renameInline()) {
 +        const int index = m_model->index(items.first());
 +        m_view->editRole(index, "text");
 +    } else {
 +        RenameDialog* dialog = new RenameDialog(this, items);
 +        dialog->setAttribute(Qt::WA_DeleteOnClose);
 +        dialog->show();
 +        dialog->raise();
 +        dialog->activateWindow();
 +    }
 +
 +    // Assure that the current index remains visible when KFileItemModel
 +    // will notify the view about changed items (which might result in
 +    // a changed sorting).
 +    m_assureVisibleCurrentIndex = true;
  }
  
  void DolphinView::trashSelectedItems()
@@@ -796,14 -795,6 +796,14 @@@ void DolphinView::slotItemsActivated(co
          items.append(m_model->fileItem(index));
      }
  
 +    if (items.count() > 5) {
 +        QString question = QString("Are you sure you want to open %1 items?").arg(items.count());
 +        const int answer = KMessageBox::warningYesNo(this, question);
 +        if (answer != KMessageBox::Yes) {
 +            return;
 +        }
 +    }
 +
      foreach (const KFileItem& item, items) {
          if (item.isDir()) {
              emit tabRequested(item.url());
@@@ -844,7 -835,7 +844,7 @@@ void DolphinView::slotHeaderContextMenu
      bool nepomukRunning = false;
      bool indexingEnabled = false;
  #ifdef HAVE_NEPOMUK
 -    nepomukRunning = (Nepomuk::ResourceManager::instance()->initialized());
 +    nepomukRunning = (Nepomuk2::ResourceManager::instance()->initialized());
      if (nepomukRunning) {
          KConfig config("nepomukserverrc");
          indexingEnabled = config.group("Service-nepomukfileindexer").readEntry("autostart", false);
@@@ -1357,9 -1348,18 +1357,18 @@@ void DolphinView::slotRoleEditingFinish
          if (!newName.isEmpty() && newName != oldItem.text() && newName != QLatin1String(".") && newName != QLatin1String("..")) {
              const KUrl oldUrl = oldItem.url();
  
-             QHash<QByteArray, QVariant> data;
-             data.insert(role, value);
-             m_model->setData(index, data);
+             const KUrl newUrl(url().path(KUrl::AddTrailingSlash) + newName);
+             const bool newNameExistsAlready = (m_model->index(newUrl) >= 0);
+             if (!newNameExistsAlready) {
+                 // Only change the data in the model if no item with the new name
+                 // is in the model yet. If there is an item with the new name
+                 // already, calling KonqOperations::rename() will open a dialog
+                 // asking for a new name, and KFileItemModel will update the
+                 // data when the dir lister signals that the file name has changed.
+                 QHash<QByteArray, QVariant> data;
+                 data.insert(role, value);
+                 m_model->setData(index, data);
+             }
  
              KonqOperations::rename(this, oldUrl, newName);
          }