• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • applications API Reference
  • KDE Home
  • Contact Us
 

libkonq

  • sources
  • kde-4.12
  • applications
  • kde-baseapps
  • lib
  • konq
konq_copytomenu.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE project
2 
3  Copyright 2008, 2009 David Faure <faure@kde.org>
4 
5  This library is free software; you can redistribute it and/or modify
6  it under the terms of the GNU Library General Public License as published
7  by the Free Software Foundation; either version 2 of the License or
8  ( at your option ) version 3 or, at the discretion of KDE e.V.
9  ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version.
10 
11  This library is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  Library General Public License for more details.
15 
16  You should have received a copy of the GNU Library General Public License
17  along with this library; see the file COPYING.LIB. If not, write to
18  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  Boston, MA 02110-1301, USA.
20 */
21 
22 #include "konq_copytomenu.h"
23 #include "konq_copytomenu_p.h"
24 #include "konq_operations.h"
25 #include <kaction.h>
26 #include <kdebug.h>
27 #include <kicon.h>
28 #include <kfiledialog.h>
29 #include <klocale.h>
30 #include <kmenu.h>
31 #include <kstringhandler.h>
32 #include <QDir>
33 
34 #ifdef Q_OS_WIN
35 #include "Windows.h"
36 #endif
37 
38 KonqCopyToMenuPrivate::KonqCopyToMenuPrivate(QWidget* parentWidget)
39  : m_urls(), m_readOnly(false), m_parentWidget(parentWidget)
40 {
41 }
42 
44 
45 KonqCopyToMenu::KonqCopyToMenu()
46  : d(new KonqCopyToMenuPrivate())
47 {
48 }
49 
50 KonqCopyToMenu::KonqCopyToMenu(QWidget* parentWidget)
51  : d(new KonqCopyToMenuPrivate(parentWidget))
52 {
53 }
54 
55 KonqCopyToMenu::~KonqCopyToMenu()
56 {
57  delete d;
58 }
59 
60 void KonqCopyToMenu::setItems(const KFileItemList& items)
61 {
62  // For now we lose all the information except for the urls
63  // But this API is useful in case KIO can make use of this information later
64  // (e.g. to avoid stat'ing the source urls)
65  Q_FOREACH(const KFileItem& item, items)
66  d->m_urls.append(item.url());
67 }
68 
69 void KonqCopyToMenu::setUrls(const KUrl::List& urls)
70 {
71  d->m_urls = urls;
72 }
73 
74 void KonqCopyToMenu::setReadOnly(bool ro)
75 {
76  d->m_readOnly = ro;
77 }
78 
79 void KonqCopyToMenu::addActionsTo(QMenu* menu)
80 {
81  KMenu* mainCopyMenu = new KonqCopyToMainMenu(menu, d, Copy);
82  mainCopyMenu->setTitle(i18nc("@title:menu", "Copy To"));
83  mainCopyMenu->menuAction()->setObjectName( QLatin1String("copyTo_submenu" )); // for the unittest
84  menu->addMenu(mainCopyMenu);
85 
86  if (!d->m_readOnly) {
87  KMenu* mainMoveMenu = new KonqCopyToMainMenu(menu, d, Move);
88  mainMoveMenu->setTitle(i18nc("@title:menu", "Move To"));
89  mainMoveMenu->menuAction()->setObjectName( QLatin1String("moveTo_submenu" )); // for the unittest
90  menu->addMenu(mainMoveMenu);
91  }
92 }
93 
95 
96 KonqCopyToMainMenu::KonqCopyToMainMenu(QMenu* parent, KonqCopyToMenuPrivate* _d, MenuType menuType)
97  : KMenu(parent), m_menuType(menuType),
98  m_actionGroup(static_cast<QWidget *>(0)),
99  d(_d),
100  m_recentDirsGroup(KGlobal::config(), m_menuType == Copy ? "kuick-copy" : "kuick-move")
101 {
102  connect(this, SIGNAL(aboutToShow()), SLOT(slotAboutToShow()));
103  connect(&m_actionGroup, SIGNAL(triggered(QAction*)), SLOT(slotTriggered(QAction*)));
104 }
105 
106 void KonqCopyToMainMenu::slotAboutToShow()
107 {
108  clear();
109  KonqCopyToDirectoryMenu* subMenu;
110  // Home Folder
111  subMenu = new KonqCopyToDirectoryMenu(this, this, QDir::homePath());
112  subMenu->setTitle(i18nc("@title:menu", "Home Folder"));
113  subMenu->setIcon(KIcon("go-home"));
114  addMenu(subMenu);
115 
116  // Root Folder
117 #ifndef Q_OS_WIN
118  subMenu = new KonqCopyToDirectoryMenu(this, this, QDir::rootPath());
119  subMenu->setTitle(i18nc("@title:menu", "Root Folder"));
120  subMenu->setIcon(KIcon("folder-red"));
121  addMenu(subMenu);
122 #else
123  foreach ( const QFileInfo& info, QDir::drives() ) {
124  uint type = DRIVE_UNKNOWN;
125  QString driveIcon = "drive-harddisk";
126  QT_WA({ type = GetDriveTypeW((wchar_t *)info.absoluteFilePath().utf16()); },
127  { type = GetDriveTypeA(info.absoluteFilePath().toLocal8Bit()); });
128  switch (type) {
129  case DRIVE_REMOVABLE:
130  driveIcon = "drive-removable-media";
131  break;
132  case DRIVE_FIXED:
133  driveIcon = "drive-harddisk";
134  break;
135  case DRIVE_REMOTE:
136  driveIcon = "network-server";
137  break;
138  case DRIVE_CDROM:
139  driveIcon = "drive-optical";
140  break;
141  case DRIVE_RAMDISK:
142  case DRIVE_UNKNOWN:
143  case DRIVE_NO_ROOT_DIR:
144  default:
145  driveIcon = "drive-harddisk";
146  }
147  subMenu = new KonqCopyToDirectoryMenu(this, this, info.absoluteFilePath());
148  subMenu->setTitle(info.absoluteFilePath());
149  subMenu->setIcon(KIcon(driveIcon));
150  addMenu(subMenu);
151  }
152 #endif
153 
154  // Browse... action, shows a KFileDialog
155  KAction* browseAction = new KAction(i18nc("@title:menu in Copy To or Move To submenu", "Browse..."), this);
156  connect(browseAction, SIGNAL(triggered()), this, SLOT(slotBrowse()));
157  addAction(browseAction);
158 
159  addSeparator(); // looks like Qt4 handles removing it automatically if it's last in the menu, nice.
160 
161  // Recent Destinations
162  const QStringList recentDirs = m_recentDirsGroup.readPathEntry("Paths", QStringList());
163  Q_FOREACH(const QString& recentDir, recentDirs) {
164  const KUrl url(recentDir);
165  const QString text = KStringHandler::csqueeze(url.pathOrUrl(), 60); // shorten very long paths (#61386)
166  KAction* act = new KAction(text, this);
167  act->setData(url);
168  m_actionGroup.addAction(act);
169  addAction(act);
170  }
171 }
172 
173 void KonqCopyToMainMenu::slotBrowse()
174 {
175  const KUrl dest = KFileDialog::getExistingDirectoryUrl(KUrl("kfiledialog:///copyto"),
176  d->m_parentWidget ? d->m_parentWidget : this);
177  if (!dest.isEmpty()) {
178  copyOrMoveTo(dest);
179  }
180 }
181 
182 void KonqCopyToMainMenu::slotTriggered(QAction* action)
183 {
184  const KUrl url = action->data().value<KUrl>();
185  Q_ASSERT(!url.isEmpty());
186  copyOrMoveTo(url);
187 }
188 
189 void KonqCopyToMainMenu::copyOrMoveTo(const KUrl& dest)
190 {
191  // Insert into the recent destinations list
192  QStringList recentDirs = m_recentDirsGroup.readPathEntry("Paths", QStringList());
193  const QString niceDest = dest.pathOrUrl();
194  if (!recentDirs.contains(niceDest)) { // don't change position if already there, moving stuff is bad usability
195  recentDirs.prepend(niceDest);
196  while (recentDirs.size() > 10) { // hardcoded max size
197  recentDirs.removeLast();
198  }
199  m_recentDirsGroup.writePathEntry("Paths", recentDirs);
200  }
201 
202  // #199549: add a trailing slash to avoid unexpected results when the
203  // dest doesn't exist anymore: it was creating a file with the name of
204  // the now non-existing dest.
205  KUrl dirDest = dest;
206  dirDest.adjustPath(KUrl::AddTrailingSlash);
207 
208  // And now let's do the copy or move -- with undo/redo support.
209  KonqOperations::copy(d->m_parentWidget ? d->m_parentWidget : this,
210  m_menuType == Copy ? KonqOperations::COPY : KonqOperations::MOVE,
211  d->m_urls, dirDest);
212 }
213 
215 
216 KonqCopyToDirectoryMenu::KonqCopyToDirectoryMenu(QMenu* parent, KonqCopyToMainMenu* mainMenu, const QString& path)
217  : KMenu(parent), m_mainMenu(mainMenu), m_path(path)
218 {
219  connect(this, SIGNAL(aboutToShow()), SLOT(slotAboutToShow()));
220 }
221 
222 void KonqCopyToDirectoryMenu::slotAboutToShow()
223 {
224  clear();
225  KAction* act = new KAction(m_mainMenu->menuType() == Copy
226  ? i18nc("@title:menu", "Copy Here")
227  : i18nc("@title:menu", "Move Here"), this);
228  act->setData(KUrl(m_path));
229  act->setEnabled(QFileInfo(m_path).isWritable());
230  m_mainMenu->actionGroup().addAction(act);
231  addAction(act);
232 
233  addSeparator(); // looks like Qt4 handles removing it automatically if it's last in the menu, nice.
234 
235  // List directory
236  // All we need is sub folder names, their permissions, their icon.
237  // KDirLister or KIO::listDir would fetch much more info, and would be async,
238  // and we only care about local directories so we use QDir directly.
239  QDir dir(m_path);
240  const QStringList entries = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::LocaleAware);
241  KMimeType::Ptr dirMime = KMimeType::mimeType("inode/directory");
242  Q_FOREACH(const QString& subDir, entries) {
243  QString subPath = m_path;
244  if (!subPath.endsWith('/'))
245  subPath.append('/');
246  subPath += subDir;
247  KonqCopyToDirectoryMenu* subMenu = new KonqCopyToDirectoryMenu(this, m_mainMenu, subPath);
248  QString menuTitle(subDir);
249  // Replace '&' by "&&" to make sure that '&' inside the directory name is displayed
250  // correctly and not misinterpreted as an indicator for a keyboard shortcut
251  subMenu->setTitle(menuTitle.replace('&', "&&"));
252  const QString iconName = dirMime->iconName(KUrl(subPath));
253  subMenu->setIcon(KIcon(iconName));
254  if (QFileInfo(subPath).isSymLink()) { // I hope this isn't too slow...
255  QFont font = subMenu->menuAction()->font();
256  font.setItalic(true);
257  subMenu->menuAction()->setFont(font);
258  }
259  addMenu(subMenu);
260  }
261 }
KonqCopyToMenu::setReadOnly
void setReadOnly(bool ro)
If setReadOnly(true) is called, the "Move To" submenu will not appear.
Definition: konq_copytomenu.cpp:74
KonqCopyToMenu::~KonqCopyToMenu
~KonqCopyToMenu()
Destructor.
Definition: konq_copytomenu.cpp:55
KonqCopyToMainMenu::actionGroup
QActionGroup & actionGroup()
Definition: konq_copytomenu_p.h:48
KonqOperations::MOVE
Definition: konq_operations.h:56
KonqCopyToMainMenu::KonqCopyToMainMenu
KonqCopyToMainMenu(QMenu *parent, KonqCopyToMenuPrivate *d, MenuType menuType)
Definition: konq_copytomenu.cpp:96
KonqCopyToMainMenu
Definition: konq_copytomenu_p.h:42
KonqOperations::copy
static void copy(QWidget *parent, Operation method, const KUrl::List &selectedUrls, const KUrl &destUrl)
Copy the selectedUrls to the destination destUrl.
Definition: konq_operations.cpp:171
KMenu
QWidget
KonqCopyToMenuPrivate::m_readOnly
bool m_readOnly
Definition: konq_copytomenu_p.h:34
KonqCopyToMenuPrivate
Definition: konq_copytomenu_p.h:28
KonqCopyToMenuPrivate::m_urls
KUrl::List m_urls
Definition: konq_copytomenu_p.h:33
KonqCopyToMenuPrivate::KonqCopyToMenuPrivate
KonqCopyToMenuPrivate(QWidget *parentWidget=0)
Definition: konq_copytomenu.cpp:38
konq_operations.h
Copy
Definition: konq_copytomenu_p.h:38
KonqCopyToMenu::addActionsTo
void addActionsTo(QMenu *menu)
Generate the actions and submenus, and adds them to the menu.
Definition: konq_copytomenu.cpp:79
konq_copytomenu.h
KonqCopyToMenuPrivate::m_parentWidget
QWidget * m_parentWidget
Definition: konq_copytomenu_p.h:35
KonqCopyToMainMenu::menuType
MenuType menuType() const
Definition: konq_copytomenu_p.h:49
KonqCopyToDirectoryMenu::KonqCopyToDirectoryMenu
KonqCopyToDirectoryMenu(QMenu *parent, KonqCopyToMainMenu *mainMenu, const QString &path)
Definition: konq_copytomenu.cpp:216
konq_copytomenu_p.h
QMenu
MenuType
MenuType
Definition: konq_copytomenu_p.h:38
KonqCopyToMenu::setUrls
void setUrls(const KUrl::List &urls)
Sets the URLs which the actions apply to.
Definition: konq_copytomenu.cpp:69
Move
Definition: konq_copytomenu_p.h:38
KonqCopyToMenu::KonqCopyToMenu
KonqCopyToMenu()
Creates a KonqCopyToMenu instance.
Definition: konq_copytomenu.cpp:45
KonqCopyToDirectoryMenu
Definition: konq_copytomenu_p.h:67
KonqOperations::COPY
Definition: konq_operations.h:56
KonqCopyToMenu::setItems
void setItems(const KFileItemList &items)
Sets the list of fileitems which the actions apply to.
Definition: konq_copytomenu.cpp:60
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:31:18 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

libkonq

Skip menu "libkonq"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

applications API Reference

Skip menu "applications API Reference"
  •   kate
  •       kate
  •   KTextEditor
  •   Kate
  • Applications
  •   Libraries
  •     libkonq
  • Konsole

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal