]> cloud.milkyroute.net Git - dolphin.git/blob - src/views/dolphinviewcontroller.cpp
Disallow renaming to names containing '/', names being equal to "." or "..".
[dolphin.git] / src / views / dolphinviewcontroller.cpp
1 /***************************************************************************
2 * Copyright (C) 2010 by Peter Penz <peter.penz19@gmail.com> *
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>
24 #include <KFileItemActions>
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) {
57 disconnect(m_itemView, SIGNAL(pressed(const QModelIndex&)),
58 this, SLOT(updateMouseButtonState()));
59 }
60
61 m_itemView = view;
62
63 if (m_itemView) {
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, QDropEvent* event)
88 {
89 emit urlsDropped(destItem, m_dolphinView->url(), event);
90 }
91
92
93 void DolphinViewController::indicateSortingChange(DolphinView::Sorting sorting)
94 {
95 emit sortingChanged(sorting);
96 }
97
98 void DolphinViewController::indicateSortOrderChange(Qt::SortOrder order)
99 {
100 emit sortOrderChanged(order);
101 }
102
103 void DolphinViewController::indicateSortFoldersFirstChange(bool foldersFirst)
104 {
105 emit sortFoldersFirstChanged(foldersFirst);
106 }
107
108 void DolphinViewController::indicateAdditionalInfoChange(const KFileItemDelegate::InformationList& info)
109 {
110 emit additionalInfoChanged(info);
111 }
112
113 void DolphinViewController::setVersionControlActions(QList<QAction*> actions)
114 {
115 m_versionControlActions = actions;
116 }
117
118 QList<QAction*> DolphinViewController::versionControlActions(const KFileItemList& items)
119 {
120 emit requestVersionControlActions(items);
121 // All view implementations are connected with the signal requestVersionControlActions()
122 // (see ViewExtensionFactory) and will invoke DolphinViewController::setVersionControlActions(),
123 // so that the context dependent actions can be returned.
124 return m_versionControlActions;
125 }
126
127 void DolphinViewController::handleKeyPressEvent(QKeyEvent* event)
128 {
129 if (!m_itemView) {
130 return;
131 }
132
133 const QItemSelectionModel* selModel = m_itemView->selectionModel();
134 const QModelIndex currentIndex = selModel->currentIndex();
135 const bool trigger = currentIndex.isValid()
136 && ((event->key() == Qt::Key_Return) || (event->key() == Qt::Key_Enter))
137 && !selModel->selectedIndexes().isEmpty();
138 if (!trigger) {
139 return;
140 }
141
142 // Collect selected files and selected directories
143 // as two separate lists.
144 QModelIndexList dirQueue;
145 const QModelIndexList indexList = selModel->selectedIndexes();
146 KFileItemList fileOpenList;
147 foreach (const QModelIndex& index, indexList) {
148 if (itemForIndex(index).isDir()) {
149 dirQueue << index;
150 } else {
151 fileOpenList << itemForIndex(index);
152 }
153 }
154
155 // Handle selected files
156 if (fileOpenList.count() == 1) {
157 emit itemTriggered(fileOpenList.first());
158 } else {
159 KFileItemActions fileItemActions;
160 fileItemActions.runPreferredApplications(fileOpenList, "DesktopEntryName != 'dolphin'");
161 }
162
163 // Handle selected directories
164 if (dirQueue.count() == 1) {
165 // Open directory in the view
166 emit itemTriggered(itemForIndex(dirQueue[0]));
167 } else {
168 // Open directories in separate tabs
169 foreach(const QModelIndex& dir, dirQueue) {
170 emit tabRequested(itemForIndex(dir).url());
171 }
172 }
173 }
174
175 void DolphinViewController::replaceUrlByClipboard()
176 {
177 const QClipboard* clipboard = QApplication::clipboard();
178 QString text;
179 if (clipboard->mimeData(QClipboard::Selection)->hasText()) {
180 text = clipboard->mimeData(QClipboard::Selection)->text();
181 } else if (clipboard->mimeData(QClipboard::Clipboard)->hasText()) {
182 text = clipboard->mimeData(QClipboard::Clipboard)->text();
183 }
184 if (!text.isEmpty() && QDir::isAbsolutePath(text)) {
185 m_dolphinView->setUrl(KUrl(text));
186 }
187 }
188
189 void DolphinViewController::requestToolTipHiding()
190 {
191 emit hideToolTip();
192 }
193
194 void DolphinViewController::emitItemTriggered(const KFileItem& item)
195 {
196 emit itemTriggered(item);
197 }
198
199 KFileItem DolphinViewController::itemForIndex(const QModelIndex& index) const
200 {
201 if (m_itemView) {
202 QAbstractProxyModel* proxyModel = static_cast<QAbstractProxyModel*>(m_itemView->model());
203 if (proxyModel) {
204 KDirModel* dirModel = static_cast<KDirModel*>(proxyModel->sourceModel());
205 const QModelIndex dirIndex = proxyModel->mapToSource(index);
206 return dirModel->itemForIndex(dirIndex);
207 }
208 }
209
210 return KFileItem();
211 }
212
213 void DolphinViewController::triggerItem(const QModelIndex& index)
214 {
215 if (m_mouseButtons & Qt::LeftButton) {
216 const KFileItem item = itemForIndex(index);
217 if (index.isValid() && (index.column() == KDirModel::Name)) {
218 emit itemTriggered(item);
219 } else if (m_itemView) {
220 m_itemView->clearSelection();
221 emit itemEntered(KFileItem());
222 }
223 }
224 }
225
226 void DolphinViewController::requestTab(const QModelIndex& index)
227 {
228 if (m_mouseButtons & Qt::MidButton) {
229 const KFileItem item = itemForIndex(index);
230 const bool validRequest = index.isValid() &&
231 (index.column() == KDirModel::Name) &&
232 (item.isDir() || m_dolphinView->isTabsForFilesEnabled());
233 if (validRequest) {
234 emit tabRequested(item.url());
235 }
236 }
237 }
238
239 void DolphinViewController::emitItemEntered(const QModelIndex& index)
240 {
241 KFileItem item = itemForIndex(index);
242 if (!item.isNull()) {
243 emit itemEntered(item);
244 }
245 }
246
247 void DolphinViewController::emitViewportEntered()
248 {
249 emit viewportEntered();
250 }
251
252 void DolphinViewController::updateMouseButtonState()
253 {
254 m_mouseButtons = QApplication::mouseButtons();
255 }
256
257 #include "dolphinviewcontroller.moc"