]> cloud.milkyroute.net Git - dolphin.git/blob - src/views/dolphinviewcontroller.cpp
Show an undetermined progress indication within one second after changing an URL.
[dolphin.git] / src / views / dolphinviewcontroller.cpp
1 /***************************************************************************
2 * Copyright (C) 2010 by Peter Penz <peter.penz@gmx.at> *
3 * *
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. *
8 * *
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. *
13 * *
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 ***************************************************************************/
19
20 #include "dolphinviewcontroller.h"
21 #include "zoomlevelinfo.h"
22
23 #include <kdirmodel.h>
24 #include <kfileitemactions.h>
25 #include <QAbstractProxyModel>
26 #include <QApplication>
27 #include <QClipboard>
28 #include <QDir>
29
30 Qt::MouseButtons DolphinViewController::m_mouseButtons = Qt::NoButton;
31
32 DolphinViewController::DolphinViewController(DolphinView* dolphinView) :
33 QObject(dolphinView),
34 m_dolphinView(dolphinView),
35 m_itemView(0),
36 m_versionControlActions()
37 {
38 }
39
40 DolphinViewController::~DolphinViewController()
41 {
42 }
43
44 const DolphinView* DolphinViewController::view() const
45 {
46 return m_dolphinView;
47 }
48
49 void DolphinViewController::requestUrlChange(const KUrl& url)
50 {
51 emit urlChangeRequested(url);
52 }
53
54 void DolphinViewController::setItemView(QAbstractItemView* view)
55 {
56 if (m_itemView != 0) {
57 disconnect(m_itemView, SIGNAL(pressed(const QModelIndex&)),
58 this, SLOT(updateMouseButtonState()));
59 }
60
61 m_itemView = view;
62
63 if (m_itemView != 0) {
64 // TODO: this is a workaround until Qt-issue 176832 has been fixed
65 connect(m_itemView, SIGNAL(pressed(const QModelIndex&)),
66 this, SLOT(updateMouseButtonState()));
67 }
68 }
69
70 QAbstractItemView* DolphinViewController::itemView() const
71 {
72 return m_itemView;
73 }
74
75 void DolphinViewController::triggerContextMenuRequest(const QPoint& pos,
76 const QList<QAction*>& customActions)
77 {
78 emit activated();
79 emit requestContextMenu(pos, customActions);
80 }
81
82 void DolphinViewController::requestActivation()
83 {
84 emit activated();
85 }
86
87 void DolphinViewController::indicateDroppedUrls(const KFileItem& destItem,
88 const KUrl& destPath,
89 QDropEvent* event)
90 {
91 emit urlsDropped(destItem, destPath, event);
92 }
93
94
95 void DolphinViewController::indicateSortingChange(DolphinView::Sorting sorting)
96 {
97 emit sortingChanged(sorting);
98 }
99
100 void DolphinViewController::indicateSortOrderChange(Qt::SortOrder order)
101 {
102 emit sortOrderChanged(order);
103 }
104
105 void DolphinViewController::indicateSortFoldersFirstChange(bool foldersFirst)
106 {
107 emit sortFoldersFirstChanged(foldersFirst);
108 }
109
110 void DolphinViewController::indicateAdditionalInfoChange(const KFileItemDelegate::InformationList& info)
111 {
112 emit additionalInfoChanged(info);
113 }
114
115 void DolphinViewController::setVersionControlActions(QList<QAction*> actions)
116 {
117 m_versionControlActions = actions;
118 }
119
120 QList<QAction*> DolphinViewController::versionControlActions(const KFileItemList& items)
121 {
122 emit requestVersionControlActions(items);
123 // All view implementations are connected with the signal requestVersionControlActions()
124 // (see ViewExtensionFactory) and will invoke DolphinViewController::setVersionControlActions(),
125 // so that the context dependent actions can be returned.
126 return m_versionControlActions;
127 }
128
129 void DolphinViewController::handleKeyPressEvent(QKeyEvent* event)
130 {
131 if (m_itemView == 0) {
132 return;
133 }
134
135 const QItemSelectionModel* selModel = m_itemView->selectionModel();
136 const QModelIndex currentIndex = selModel->currentIndex();
137 const bool trigger = currentIndex.isValid()
138 && ((event->key() == Qt::Key_Return) || (event->key() == Qt::Key_Enter))
139 && !selModel->selectedIndexes().isEmpty();
140 if (!trigger) {
141 return;
142 }
143
144 // Collect the non-directory files into a list and
145 // call runPreferredApplications for that list.
146 // Several selected directories are opened in separate tabs,
147 // one selected directory will get opened in the view.
148 QModelIndexList dirQueue;
149 const QModelIndexList indexList = selModel->selectedIndexes();
150 KFileItemList fileOpenList;
151 foreach (const QModelIndex& index, indexList) {
152 if (itemForIndex(index).isDir()) {
153 dirQueue << index;
154 } else {
155 fileOpenList << itemForIndex(index);
156 }
157 }
158
159 KFileItemActions fileItemActions;
160 fileItemActions.runPreferredApplications(fileOpenList, "DesktopEntryName != 'dolphin'");
161
162 if (dirQueue.length() == 1) {
163 // open directory in the view
164 emit itemTriggered(itemForIndex(dirQueue[0]));
165 } else {
166 // open directories in separate tabs
167 foreach(const QModelIndex& dir, dirQueue) {
168 emit tabRequested(itemForIndex(dir).url());
169 }
170 }
171 }
172
173 void DolphinViewController::replaceUrlByClipboard()
174 {
175 const QClipboard* clipboard = QApplication::clipboard();
176 QString text;
177 if (clipboard->mimeData(QClipboard::Selection)->hasText()) {
178 text = clipboard->mimeData(QClipboard::Selection)->text();
179 } else if (clipboard->mimeData(QClipboard::Clipboard)->hasText()) {
180 text = clipboard->mimeData(QClipboard::Clipboard)->text();
181 }
182 if (!text.isEmpty() && QDir::isAbsolutePath(text)) {
183 m_dolphinView->setUrl(KUrl(text));
184 }
185 }
186
187 void DolphinViewController::requestToolTipHiding()
188 {
189 emit hideToolTip();
190 }
191
192 void DolphinViewController::emitItemTriggered(const KFileItem& item)
193 {
194 emit itemTriggered(item);
195 }
196
197 KFileItem DolphinViewController::itemForIndex(const QModelIndex& index) const
198 {
199 if (m_itemView != 0) {
200 QAbstractProxyModel* proxyModel = static_cast<QAbstractProxyModel*>(m_itemView->model());
201 if (proxyModel != 0) {
202 KDirModel* dirModel = static_cast<KDirModel*>(proxyModel->sourceModel());
203 const QModelIndex dirIndex = proxyModel->mapToSource(index);
204 return dirModel->itemForIndex(dirIndex);
205 }
206 }
207
208 return KFileItem();
209 }
210
211 void DolphinViewController::triggerItem(const QModelIndex& index)
212 {
213 if (m_mouseButtons & Qt::LeftButton) {
214 const KFileItem item = itemForIndex(index);
215 if (index.isValid() && (index.column() == KDirModel::Name)) {
216 emit itemTriggered(item);
217 } else if (m_itemView != 0) {
218 m_itemView->clearSelection();
219 emit itemEntered(KFileItem());
220 }
221 }
222 }
223
224 void DolphinViewController::requestTab(const QModelIndex& index)
225 {
226 if (m_mouseButtons & Qt::MidButton) {
227 const KFileItem item = itemForIndex(index);
228 const bool validRequest = index.isValid() &&
229 (index.column() == KDirModel::Name) &&
230 (item.isDir() || m_dolphinView->isTabsForFilesEnabled());
231 if (validRequest) {
232 emit tabRequested(item.url());
233 }
234 }
235 }
236
237 void DolphinViewController::emitItemEntered(const QModelIndex& index)
238 {
239 KFileItem item = itemForIndex(index);
240 if (!item.isNull()) {
241 emit itemEntered(item);
242 }
243 }
244
245 void DolphinViewController::emitViewportEntered()
246 {
247 emit viewportEntered();
248 }
249
250 void DolphinViewController::updateMouseButtonState()
251 {
252 m_mouseButtons = QApplication::mouseButtons();
253 }
254
255 #include "dolphinviewcontroller.moc"