1
/***************************************************************************
2
* Copyright (C) 2009 by Peter Penz <peter.penz19@gmail.com> *
4
* This program is free software; you can redistribute it and/or modify *
5
* it under the terms of the GNU General Public License as published by *
6
* the Free Software Foundation; either version 2 of the License, or *
7
* (at your option) any later version. *
9
* This program is distributed in the hope that it will be useful, *
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12
* GNU General Public License for more details. *
14
* You should have received a copy of the GNU General Public License *
15
* along with this program; if not, write to the *
16
* Free Software Foundation, Inc., *
17
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
18
***************************************************************************/
20
#include "viewextensionsfactory.h"
22
#include "dolphinfileitemdelegate.h"
23
#include "dolphinsortfilterproxymodel.h"
24
#include "dolphinview.h"
25
#include "dolphinviewcontroller.h"
26
#include "dolphinviewautoscroller.h"
27
#include "folderexpander.h"
28
#include "selectionmanager.h"
29
#include "settings/dolphinsettings.h"
30
#include "tooltips/tooltipmanager.h"
31
#include "versioncontrol/versioncontrolobserver.h"
32
#include "viewmodecontroller.h"
34
#include "dolphin_generalsettings.h"
38
#include <KFilePreviewGenerator>
39
#include <QAbstractItemView>
40
#include <QApplication>
42
ViewExtensionsFactory::ViewExtensionsFactory(QAbstractItemView* view,
43
DolphinViewController* dolphinViewController,
44
const ViewModeController* viewModeController) :
47
m_dolphinViewController(dolphinViewController),
49
m_previewGenerator(0),
50
m_selectionManager(0),
52
m_fileItemDelegate(0),
53
m_versionControlObserver(0)
55
view->setSelectionMode(QAbstractItemView::ExtendedSelection);
57
GeneralSettings* settings = DolphinSettings::instance().generalSettings();
59
// initialize tooltips
60
if (settings->showToolTips()) {
61
DolphinSortFilterProxyModel* proxyModel = static_cast<DolphinSortFilterProxyModel*>(view->model());
62
m_toolTipManager = new ToolTipManager(view, proxyModel);
64
connect(dolphinViewController, SIGNAL(hideToolTip()),
65
m_toolTipManager, SLOT(hideToolTip()));
68
// initialize preview generator
69
Q_ASSERT(view->iconSize().isValid());
70
m_previewGenerator = new KFilePreviewGenerator(view);
71
m_previewGenerator->setPreviewShown(dolphinViewController->view()->showPreview());
72
connect(viewModeController, SIGNAL(zoomLevelChanged(int)),
73
this, SLOT(slotZoomLevelChanged()));
74
connect(viewModeController, SIGNAL(cancelPreviews()),
75
this, SLOT(cancelPreviews()));
77
// slotPreviewChanged() is connected as Qt::QueuedConnection to prevent performance
78
// issues when the directory lister changes its URL after the preview-changes have
79
// been applied. Usecase: Switch from directory A having no previews to
80
// directory B with previews (see sequence in DolphinView::setUrl()).
81
connect(dolphinViewController->view(), SIGNAL(showPreviewChanged()),
82
this, SLOT(slotShowPreviewChanged()),
83
Qt::QueuedConnection);
85
// initialize selection manager
86
m_selectionManager = new SelectionManager(view);
87
connect(m_selectionManager, SIGNAL(selectionChanged()),
88
this, SLOT(requestActivation()));
89
connect(viewModeController, SIGNAL(urlChanged(const KUrl&)),
90
m_selectionManager, SLOT(reset()));
92
// initialize auto scroller
93
m_autoScroller = new DolphinViewAutoScroller(view);
95
// initialize file item delegate
96
m_fileItemDelegate = new DolphinFileItemDelegate(view);
97
m_fileItemDelegate->setShowToolTipWhenElided(false);
98
view->setItemDelegate(m_fileItemDelegate);
100
// initialize version control observer
101
const DolphinView* dolphinView = dolphinViewController->view();
102
m_versionControlObserver = new VersionControlObserver(view);
103
connect(m_versionControlObserver, SIGNAL(infoMessage(const QString&)),
104
dolphinView, SIGNAL(infoMessage(const QString&)));
105
connect(m_versionControlObserver, SIGNAL(errorMessage(const QString&)),
106
dolphinView, SIGNAL(errorMessage(const QString&)));
107
connect(m_versionControlObserver, SIGNAL(operationCompletedMessage(const QString&)),
108
dolphinView, SIGNAL(operationCompletedMessage(const QString&)));
109
connect(dolphinViewController, SIGNAL(requestVersionControlActions(const KFileItemList&)),
110
this, SLOT(slotRequestVersionControlActions(const KFileItemList&)));
112
// react on view property changes
113
connect(dolphinView, SIGNAL(showHiddenFilesChanged()),
114
this, SLOT(slotShowHiddenFilesChanged()));
115
connect(dolphinView, SIGNAL(sortingChanged(DolphinView::Sorting)),
116
this, SLOT(slotSortingChanged(DolphinView::Sorting)));
117
connect(dolphinView, SIGNAL(sortOrderChanged(Qt::SortOrder)),
118
this, SLOT(slotSortOrderChanged(Qt::SortOrder)));
119
connect(dolphinView, SIGNAL(sortFoldersFirstChanged(bool)),
120
this, SLOT(slotSortFoldersFirstChanged(bool)));
122
// Give the view the ability to auto-expand its directories on hovering
123
// (the column view takes care about this itself). If the details view
124
// uses expandable folders, the auto-expanding should be used always.
125
m_folderExpander = new FolderExpander(view, proxyModel());
126
m_folderExpander->setEnabled(settings->autoExpandFolders());
127
connect(m_folderExpander, SIGNAL(enterDir(const QModelIndex&)),
128
dolphinViewController, SLOT(triggerItem(const QModelIndex&)));
130
// react on namefilter changes
131
connect(viewModeController, SIGNAL(nameFilterChanged(const QString&)),
132
this, SLOT(slotNameFilterChanged(const QString&)));
134
view->viewport()->installEventFilter(this);
137
ViewExtensionsFactory::~ViewExtensionsFactory()
141
void ViewExtensionsFactory::handleCurrentIndexChange(const QModelIndex& current, const QModelIndex& previous)
143
m_autoScroller->handleCurrentIndexChange(current, previous);
146
DolphinFileItemDelegate* ViewExtensionsFactory::fileItemDelegate() const
148
return m_fileItemDelegate;
151
void ViewExtensionsFactory::setAutoFolderExpandingEnabled(bool enabled)
153
m_folderExpander->setEnabled(enabled);
156
bool ViewExtensionsFactory::autoFolderExpandingEnabled() const
158
return m_folderExpander->enabled();
161
bool ViewExtensionsFactory::eventFilter(QObject* watched, QEvent* event)
164
if ((event->type() == QEvent::Wheel) && m_selectionManager) {
165
m_selectionManager->reset();
170
void ViewExtensionsFactory::slotZoomLevelChanged()
172
m_previewGenerator->updateIcons();
173
if (m_selectionManager) {
174
m_selectionManager->reset();
178
void ViewExtensionsFactory::cancelPreviews()
180
m_previewGenerator->cancelPreviews();
183
void ViewExtensionsFactory::slotShowPreviewChanged()
185
const bool show = m_dolphinViewController->view()->showPreview();
186
m_previewGenerator->setPreviewShown(show);
189
void ViewExtensionsFactory::slotShowHiddenFilesChanged()
191
KDirModel* dirModel = static_cast<KDirModel*>(proxyModel()->sourceModel());
192
KDirLister* dirLister = dirModel->dirLister();
196
const bool show = m_dolphinViewController->view()->showHiddenFiles();
197
dirLister->setShowingDotFiles(show);
199
const KUrl url = dirLister->url();
201
dirLister->openUrl(url, KDirLister::NoFlags);
205
void ViewExtensionsFactory::slotSortingChanged(DolphinView::Sorting sorting)
207
proxyModel()->setSorting(sorting);
210
void ViewExtensionsFactory::slotSortOrderChanged(Qt::SortOrder order)
212
proxyModel()->setSortOrder(order);
215
void ViewExtensionsFactory::slotSortFoldersFirstChanged(bool foldersFirst)
217
proxyModel()->setSortFoldersFirst(foldersFirst);
220
void ViewExtensionsFactory::slotNameFilterChanged(const QString& nameFilter)
222
proxyModel()->setFilterFixedString(nameFilter);
225
void ViewExtensionsFactory::slotRequestVersionControlActions(const KFileItemList& items)
227
QList<QAction*> actions;
228
if (items.isEmpty()) {
229
const KDirModel* dirModel = static_cast<const KDirModel*>(proxyModel()->sourceModel());
230
const KUrl url = dirModel->dirLister()->url();
231
actions = m_versionControlObserver->contextMenuActions(url.path(KUrl::AddTrailingSlash));
233
actions = m_versionControlObserver->contextMenuActions(items);
235
m_dolphinViewController->setVersionControlActions(actions);
238
void ViewExtensionsFactory::requestActivation()
240
m_dolphinViewController->requestActivation();
243
DolphinSortFilterProxyModel* ViewExtensionsFactory::proxyModel() const
245
return static_cast<DolphinSortFilterProxyModel*>(m_view->model());
248
#include "viewextensionsfactory.moc"