]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinview.cpp
Cleanup of signal/slot handling between the dolphin view and the main window: now...
[dolphin.git] / src / dolphinview.cpp
index e7fb31909f6b5746ac7a61d8ba2f63b56de7ba89..9a647af4daa0019bcbe9af9b6935b419607cf17c 100644 (file)
  *   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.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
  ***************************************************************************/
 
 #include "dolphinview.h"
 
-#include <kdirmodel.h>
-
-
-#include <qlayout.h>
-//Added by qt3to4:
+#include <QItemSelectionModel>
 #include <Q3ValueList>
 #include <QDropEvent>
 #include <QMouseEvent>
-#include <Q3VBoxLayout>
+#include <QVBoxLayout>
+
+#include <kdirmodel.h>
+#include <kfileitemdelegate.h>
 #include <kurl.h>
 #include <klocale.h>
 #include <kio/netaccess.h>
 #include <kio/renamedlg.h>
+#include <kmimetyperesolver.h>
 #include <assert.h>
 
 #include "urlnavigator.h"
 #include "dolphinstatusbar.h"
-#include "dolphin.h"
+#include "dolphinmainwindow.h"
 #include "dolphindirlister.h"
 #include "viewproperties.h"
 #include "dolphindetailsview.h"
 #include "undomanager.h"
 #include "renamedialog.h"
 #include "progressindicator.h"
-
 #include "filterbar.h"
 
-DolphinView::DolphinView(QWidget *parent,
+DolphinView::DolphinView(DolphinMainWindow *mainWindow,
+                         QWidget *parent,
                          const KUrl& url,
                          Mode mode,
                          bool showHiddenFiles) :
@@ -57,33 +57,22 @@ DolphinView::DolphinView(QWidget *parent,
     m_refreshing(false),
     m_showProgress(false),
     m_mode(mode),
+    m_mainWindow(mainWindow),
     m_statusBar(0),
     m_iconSize(0),
     m_folderCount(0),
     m_fileCount(0),
     m_filterBar(0)
 {
+    hide();
     setFocusPolicy(Qt::StrongFocus);
-    m_topLayout = new Q3VBoxLayout(this);
-
-    Dolphin& dolphin = Dolphin::mainWin();
-
-    connect(this, SIGNAL(signalModeChanged()),
-            &dolphin, SLOT(slotViewModeChanged()));
-    connect(this, SIGNAL(signalShowHiddenFilesChanged()),
-            &dolphin, SLOT(slotShowHiddenFilesChanged()));
-    connect(this, SIGNAL(signalSortingChanged(DolphinView::Sorting)),
-            &dolphin, SLOT(slotSortingChanged(DolphinView::Sorting)));
-    connect(this, SIGNAL(signalSortOrderChanged(Qt::SortOrder)),
-            &dolphin, SLOT(slotSortOrderChanged(Qt::SortOrder)));
+    m_topLayout = new QVBoxLayout(this);
+    m_topLayout->setSpacing(0);
+    m_topLayout->setMargin(0);
 
     m_urlNavigator = new UrlNavigator(url, this);
     connect(m_urlNavigator, SIGNAL(urlChanged(const KUrl&)),
-            this, SLOT(slotUrlChanged(const KUrl&)));
-    connect(m_urlNavigator, SIGNAL(urlChanged(const KUrl&)),
-            &dolphin, SLOT(slotUrlChanged(const KUrl&)));
-    connect(m_urlNavigator, SIGNAL(historyChanged()),
-            &dolphin, SLOT(slotHistoryChanged()));
+            this, SLOT(loadDirectory(const KUrl&)));
 
     m_statusBar = new DolphinStatusBar(this);
 
@@ -105,26 +94,37 @@ DolphinView::DolphinView(QWidget *parent,
             this, SLOT(slotErrorMessage(const QString&)));
 
     m_iconsView = new DolphinIconsView(this);
-    connect(m_iconsView, SIGNAL(clicked(const QModelIndex&)),
-            this, SLOT(triggerItem(const QModelIndex&)));
     applyModeToView();
 
     KDirModel* model = new KDirModel();
     model->setDirLister(m_dirLister);
     m_iconsView->setModel(model);
 
+    KFileItemDelegate* delegate = new KFileItemDelegate(this);
+    m_iconsView->setItemDelegate(delegate);
+
+    m_dirLister->setDelayedMimeTypes(true);
+    new KMimeTypeResolver(m_iconsView, model);
+
     m_iconSize = K3Icon::SizeMedium;
 
     m_filterBar = new FilterBar(this);
     m_filterBar->hide();
-    connect(m_filterBar, SIGNAL(signalFilterChanged(const QString&)),
+    connect(m_filterBar, SIGNAL(filterChanged(const QString&)),
            this, SLOT(slotChangeNameFilter(const QString&)));
+    connect(m_filterBar, SIGNAL(closed()),
+            this, SLOT(closeFilterBar()));
 
     m_topLayout->addWidget(m_urlNavigator);
     m_topLayout->addWidget(m_iconsView);
     m_topLayout->addWidget(m_filterBar);
     m_topLayout->addWidget(m_statusBar);
 
+    connect(m_iconsView, SIGNAL(clicked(const QModelIndex&)),
+            this, SLOT(triggerItem(const QModelIndex&)));
+    connect(m_iconsView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
+            this, SLOT(emitSelectionChangedSignal()));
+
     startDirLister(m_urlNavigator->url());
 }
 
@@ -146,12 +146,12 @@ const KUrl& DolphinView::url() const
 
 void DolphinView::requestActivation()
 {
-    Dolphin::mainWin().setActiveView(this);
+    mainWindow()->setActiveView(this);
 }
 
 bool DolphinView::isActive() const
 {
-    return (Dolphin::mainWin().activeView() == this);
+    return (mainWindow()->activeView() == this);
 }
 
 void DolphinView::setMode(Mode mode)
@@ -168,7 +168,7 @@ void DolphinView::setMode(Mode mode)
     applyModeToView();
     startDirLister(m_urlNavigator->url());
 
-    emit signalModeChanged();
+    emit modeChanged();
 }
 
 DolphinView::Mode DolphinView::mode() const
@@ -188,7 +188,7 @@ void DolphinView::setShowHiddenFilesEnabled(bool show)
 
     m_dirLister->setShowingDotFiles(show);
 
-    emit signalShowHiddenFilesChanged();
+    emit showHiddenFilesChanged();
 
     reload();
 }
@@ -217,7 +217,7 @@ void DolphinView::renameSelectedItems()
             return;
         }
 
-        DolphinView* view = Dolphin::mainWin().activeView();
+        DolphinView* view = mainWindow()->activeView();
         const QString& newName = dialog.newName();
         if (newName.isEmpty()) {
             view->statusBar()->setMessage(i18n("The new item name is invalid."),
@@ -231,12 +231,13 @@ void DolphinView::renameSelectedItems()
 
             const int urlsCount = urls.count();
             ProgressIndicator* progressIndicator =
-                new  ProgressIndicator(i18n("Renaming items..."),
+                new  ProgressIndicator(mainWindow(),
+                                       i18n("Renaming items..."),
                                        i18n("Renaming finished."),
                                        urlsCount);
 
             // iterate through all selected items and rename them...
-            const int replaceIndex = newName.find('#');
+            const int replaceIndex = newName.indexOf('#');
             assert(replaceIndex >= 0);
             for (int i = 0; i < urlsCount; ++i) {
                 const KUrl& source = urls[i];
@@ -353,9 +354,14 @@ void DolphinView::updateStatusBar()
     }
 }
 
-void DolphinView::requestItemInfo(const KUrl& url)
+void DolphinView::emitRequestItemInfo(const KUrl& url)
 {
-    emit signalRequestItemInfo(url);
+    emit requestItemInfo(url);
+}
+
+bool DolphinView::isFilterBarVisible() const
+{
+  return m_filterBar->isVisible();
 }
 
 bool DolphinView::isUrlEditable() const
@@ -475,29 +481,42 @@ const Q3ValueList<UrlNavigator::HistoryElem> DolphinView::urlHistory(int& index)
 
 bool DolphinView::hasSelection() const
 {
-    const KFileItemList* list = selectedItems();
-    return (list != 0) && !list->isEmpty();
+    return m_iconsView->selectionModel()->hasSelection();
 }
 
-const KFileItemList* DolphinView::selectedItems() const
+KFileItemList DolphinView::selectedItems() const
 {
-    return 0; //fileView()->selectedItems();
+    QItemSelectionModel* selModel = m_iconsView->selectionModel();
+    assert(selModel != 0);
+
+    KFileItemList itemList;
+    if (selModel->hasSelection()) {
+       KDirModel* dirModel = static_cast<KDirModel*>(m_iconsView->model());
+       const QModelIndexList indexList = selModel->selectedIndexes();
+
+        QModelIndexList::const_iterator end = indexList.end();
+        for (QModelIndexList::const_iterator it = indexList.begin(); it != end; ++it) {
+           KFileItem* item = dirModel->itemForIndex(*it);
+           if (item != 0) {
+               itemList.append(item);
+           }
+        }
+    }
+    return itemList;
 }
 
 KUrl::List DolphinView::selectedUrls() const
 {
     KUrl::List urls;
 
-    /*const KFileItemList* list = fileView()->selectedItems();
-    if (list != 0) {
-        KFileItemList::const_iterator it = list->begin();
-        const KFileItemList::const_iterator end = list->end();
-        while (it != end) {
-            KFileItem* item = *it;
-            urls.append(item->url());
-            ++it;
-        }
-    }*/
+    const KFileItemList list = selectedItems();
+    KFileItemList::const_iterator it = list.begin();
+    const KFileItemList::const_iterator end = list.end();
+    while (it != end) {
+        KFileItem* item = *it;
+        urls.append(item->url());
+        ++it;
+    }
 
     return urls;
 }
@@ -526,7 +545,7 @@ void DolphinView::rename(const KUrl& source, const QString& newName)
 
     const bool destExists = KIO::NetAccess::exists(dest,
                                                    false,
-                                                   Dolphin::mainWin().activeView());
+                                                   mainWindow()->activeView());
     if (destExists) {
         // the destination already exists, hence ask the user
         // how to proceed...
@@ -597,16 +616,21 @@ void DolphinView::slotUrlListDropped(QDropEvent* /* event */,
         }
     }
 
-    Dolphin::mainWin().dropUrls(urls, destination);
+    mainWindow()->dropUrls(urls, destination);
 }
 
 void DolphinView::mouseReleaseEvent(QMouseEvent* event)
 {
     QWidget::mouseReleaseEvent(event);
-    Dolphin::mainWin().setActiveView(this);
+    mainWindow()->setActiveView(this);
+}
+
+DolphinMainWindow* DolphinView::mainWindow() const
+{
+    return m_mainWindow;
 }
 
-void DolphinView::slotUrlChanged(const KUrl& url)
+void DolphinView::loadDirectory(const KUrl& url)
 {
     const ViewProperties props(url);
     setMode(props.viewMode());
@@ -619,14 +643,7 @@ void DolphinView::slotUrlChanged(const KUrl& url)
     setSortOrder(props.sortOrder());
 
     startDirLister(url);
-
-    // The selectionChanged signal is not emitted when a new view object is
-    // created. The application does not care whether a view is represented by a
-    // different instance, hence inform the application that the selection might have
-    // changed so that it can update it's actions.
-    Dolphin::mainWin().slotSelectionChanged();
-
-    emit signalUrlChanged(url);
+    emit urlChanged(url);
 }
 
 void DolphinView::triggerIconsViewItem(Q3IconViewItem* item)
@@ -640,7 +657,7 @@ void DolphinView::triggerIconsViewItem(Q3IconViewItem* item)
         // Updating the Url must be done outside the scope of this slot,
         // as iconview items will get deleted.
         QTimer::singleShot(0, this, SLOT(updateUrl()));
-        Dolphin::mainWin().setActiveView(this);
+        mainWindow()->setActiveView(this);
     }
 }
 
@@ -791,7 +808,18 @@ void DolphinView::slotErrorMessage(const QString& msg)
 
 void DolphinView::slotGrabActivation()
 {
-    Dolphin::mainWin().setActiveView(this);
+    mainWindow()->setActiveView(this);
+}
+
+void DolphinView::emitSelectionChangedSignal()
+{
+    emit selectionChanged();
+}
+
+void DolphinView::closeFilterBar()
+{
+    m_filterBar->hide();
+    emit showFilterBarChanged(false);
 }
 
 void DolphinView::slotContentsMoving(int x, int y)
@@ -893,14 +921,18 @@ QString DolphinView::selectionStatusBarText() const
     // TODO: the following code is not suitable for languages where multiple forms
     // of plurals are given (e. g. in Poland three forms of plurals exist).
     QString text;
-    const KFileItemList* list = selectedItems();
-    assert((list != 0) && !list->isEmpty());
+    const KFileItemList list = selectedItems();
+    if (list.isEmpty()) {
+        // TODO: assert(!list.isEmpty()) should be used, as this method is only invoked if
+        // DolphinView::hasSelection() is true. Inconsistent behavior?
+        return QString();
+    }
 
     int fileCount = 0;
     int folderCount = 0;
     KIO::filesize_t byteSize = 0;
-    KFileItemList::const_iterator it = list->begin();
-    const KFileItemList::const_iterator end = list->end();
+    KFileItemList::const_iterator it = list.begin();
+    const KFileItemList::const_iterator end = list.end();
     while (it != end){
         KFileItem* item = *it;
         if (item->isDir()) {
@@ -965,6 +997,11 @@ void DolphinView::slotShowFilterBar(bool show)
     }
 }
 
+void DolphinView::declareViewActive()
+{
+    mainWindow()->setActiveView( this );
+}
+
 void DolphinView::slotChangeNameFilter(const QString& nameFilter)
 {
     // The name filter of KDirLister does a 'hard' filtering, which
@@ -993,13 +1030,11 @@ void DolphinView::slotChangeNameFilter(const QString& nameFilter)
     }*/
 }
 
-bool DolphinView::isFilterBarVisible()
-{
-  return m_filterBar->isVisible();
-}
-
 void DolphinView::applyModeToView()
 {
+    //m_iconsView->setAlternatingRowColors(true);
+    m_iconsView->setSelectionMode(QAbstractItemView::ExtendedSelection);
+
     // TODO: the following code just tries to test some QListView capabilities
     switch (m_mode) {
         case IconsView: