#include "dolphinview.h"
-#include <assert.h>
-
#include <QApplication>
#include <QClipboard>
#include <QDropEvent>
bool showHiddenFiles) :
QWidget(parent),
m_showProgress(false),
+ m_blockContentsMovedSignal(false),
m_mode(mode),
m_iconSize(0),
m_folderCount(0),
connect(m_mainWindow, SIGNAL(activeViewChanged()),
this, SLOT(updateActivationState()));
+ QClipboard* clipboard = QApplication::clipboard();
+ connect(clipboard, SIGNAL(dataChanged()),
+ this, SLOT(updateCutItems()));
+
m_urlNavigator = new UrlNavigator(url, this);
m_urlNavigator->setShowHiddenFiles(showHiddenFiles);
connect(m_urlNavigator, SIGNAL(urlChanged(const KUrl&)),
m_topLayout->addWidget(itemView());
m_topLayout->addWidget(m_filterBar);
m_topLayout->addWidget(m_statusBar);
-
- loadDirectory(m_urlNavigator->url());
}
DolphinView::~DolphinView()
void DolphinView::renameSelectedItems()
{
+ DolphinView* view = mainWindow()->activeView();
const KUrl::List urls = selectedUrls();
if (urls.count() > 1) {
// More than one item has been selected for renaming. Open
return;
}
- DolphinView* view = mainWindow()->activeView();
const QString& newName = dialog.newName();
if (newName.isEmpty()) {
- view->statusBar()->setMessage(i18n("The new item name is invalid."),
+ view->statusBar()->setMessage(dialog.errorString(),
DolphinStatusBar::Error);
}
else {
// TODO: check how this can be integrated into KonqUndoManager/KonqOperations
-
- //UndoManager& undoMan = UndoManager::instance();
- //undoMan.beginMacro();
-
- assert(newName.contains('#'));
-
- const int urlsCount = urls.count();
+ // as one operation instead of n rename operations like it is done now...
+ Q_ASSERT(newName.contains('#'));
// iterate through all selected items and rename them...
const int replaceIndex = newName.indexOf('#');
- assert(replaceIndex >= 0);
- for (int i = 0; i < urlsCount; ++i) {
- const KUrl& source = urls[i];
+ Q_ASSERT(replaceIndex >= 0);
+ int index = 1;
+
+ KUrl::List::const_iterator it = urls.begin();
+ KUrl::List::const_iterator end = urls.end();
+ while (it != end) {
+ const KUrl& oldUrl = *it;
QString number;
- number.setNum(i + 1);
+ number.setNum(index++);
QString name(newName);
name.replace(replaceIndex, 1, number);
- if (source.fileName() != name) {
- KUrl dest(source.upUrl());
- dest.addPath(name);
-
- const bool destExists = KIO::NetAccess::exists(dest, false, view);
- if (destExists) {
- view->statusBar()->setMessage(i18n("Renaming failed (item '%1' already exists).",name),
- DolphinStatusBar::Error);
- break;
- }
- else if (KIO::NetAccess::file_move(source, dest)) {
- // TODO: From the users point of view he executed one 'rename n files' operation,
- // but internally we store it as n 'rename 1 file' operations for the undo mechanism.
- //DolphinCommand command(DolphinCommand::Rename, source, dest);
- //undoMan.addCommand(command);
- }
+ if (oldUrl.fileName() != name) {
+ KUrl newUrl(oldUrl.upUrl());
+ newUrl.addPath(name);
+ m_mainWindow->rename(oldUrl, newUrl);
}
+ ++it;
}
-
- //undoMan.endMacro();
}
}
else {
// Only one item has been selected for renaming. Use the custom
// renaming mechanism from the views.
- assert(urls.count() == 1);
- // TODO:
- /*if (m_mode == DetailsView) {
- Q3ListViewItem* item = m_iconsView->firstChild();
- while (item != 0) {
- if (item->isSelected()) {
- m_iconsView->rename(item, DolphinDetailsView::NameColumn);
- break;
- }
- item = item->nextSibling();
- }
+ Q_ASSERT(urls.count() == 1);
+
+ // TODO: Think about using KFileItemDelegate as soon as it supports editing.
+ // Currently the RenameDialog is used, but I'm not sure whether inline renaming
+ // is a benefit for the user at all -> let's wait for some input first...
+ RenameDialog dialog(urls);
+ if (dialog.exec() == QDialog::Rejected) {
+ return;
+ }
+
+ const QString& newName = dialog.newName();
+ if (newName.isEmpty()) {
+ view->statusBar()->setMessage(dialog.errorString(),
+ DolphinStatusBar::Error);
}
else {
- KFileIconViewItem* item = static_cast<KFileIconViewItem*>(m_iconsView->firstItem());
- while (item != 0) {
- if (item->isSelected()) {
- item->rename();
- break;
- }
- item = static_cast<KFileIconViewItem*>(item->nextItem());
- }
- }*/
+ const KUrl& oldUrl = urls.first();
+ KUrl newUrl = oldUrl.upUrl();
+ newUrl.addPath(newName);
+ m_mainWindow->rename(oldUrl, newUrl);
+ }
}
}
return itemView()->selectionModel()->hasSelection();
}
+void DolphinView::clearSelection()
+{
+ itemView()->selectionModel()->clear();
+}
+
KFileItemList DolphinView::selectedItems() const
{
const QAbstractItemView* view = itemView();
void DolphinView::loadDirectory(const KUrl& url)
{
+ if(!isActive()) {
+ requestActivation();
+ }
+
const ViewProperties props(url);
const Mode mode = props.viewMode();
else if (item->isFile()) {
// allow to browse through ZIP and tar files
KMimeType::Ptr mime = item->mimeTypePtr();
- if (mime->is("application/x-zip")) {
+ if (mime->is("application/zip")) {
url.setProtocol("zip");
setUrl(url);
}
else if (mime->is("application/x-tar") ||
mime->is("application/x-tarz") ||
- mime->is("application/x-tbz") ||
- mime->is("application/x-tgz") ||
+ mime->is("application/x-bzip-compressed-tar") ||
+ mime->is("application/x-compressed-tar") ||
mime->is("application/x-tzo")) {
url.setProtocol("tar");
setUrl(url);
updateStatusBar();
+ m_blockContentsMovedSignal = false;
QTimer::singleShot(0, this, SLOT(restoreContentsPos()));
}
connect(job, SIGNAL(gotPreview(const KFileItem*, const QPixmap&)),
this, SLOT(showPreview(const KFileItem*, const QPixmap&)));
}
-
- const QMimeData* mimeData = QApplication::clipboard()->mimeData();
- if (KonqMimeData::decodeIsCutSelection(mimeData)) {
- QTimer::singleShot(0, this, SLOT(applyCutEffect()));
- }
}
void DolphinView::showPreview(const KFileItem* item, const QPixmap& pixmap)
const QMimeData* mimeData = QApplication::clipboard()->mimeData();
if (KonqMimeData::decodeIsCutSelection(mimeData) && isCutItem(*item)) {
KIconEffect iconEffect;
- QPixmap cutPixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState);
- m_dirModel->setData(idx, cutPixmap, Qt::DecorationRole);
+ const QPixmap cutPixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState);
+ m_dirModel->setData(idx, QIcon(cutPixmap), Qt::DecorationRole);
}
else {
- m_dirModel->setData(idx, pixmap, Qt::DecorationRole);
+ m_dirModel->setData(idx, QIcon(pixmap), Qt::DecorationRole);
}
}
}
void DolphinView::emitSelectionChangedSignal()
{
- emit selectionChanged();
+ emit selectionChanged(DolphinView::selectedItems());
}
void DolphinView::closeFilterBar()
m_statusBar->setProgress(0);
}
+ m_cutItemsCache.clear();
+ m_blockContentsMovedSignal = true;
m_dirLister->stop();
m_dirLister->openUrl(url, false, reload);
}
void DolphinView::showFilterBar(bool show)
{
- assert(m_filterBar != 0);
+ Q_ASSERT(m_filterBar != 0);
if (show) {
m_filterBar->show();
}
m_mainWindow->setActiveView(this);
}
-void DolphinView::updateCutItems()
+void DolphinView::changeSelection(const KFileItemList& selection)
{
- const QMimeData* mimeData = QApplication::clipboard()->mimeData();
- if (!KonqMimeData::decodeIsCutSelection(mimeData)) {
+ clearSelection();
+ if (selection.isEmpty()) {
return;
}
-
- KFileItemList items(m_dirLister->items());
- KFileItemList::const_iterator it = items.begin();
- const KFileItemList::const_iterator end = items.end();
- while (it != end) {
- KFileItem* item = *it;
- if (isCutItem(*item)) {
- QPixmap pixmap = item->pixmap(0);
- KIconEffect iconEffect;
- pixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState);
- const QModelIndex idx = m_dirModel->indexForItem(*item);
- if (idx.isValid()) {
- m_dirModel->setData(idx, pixmap, Qt::DecorationRole);
- }
+ KUrl baseUrl = url();
+ KUrl url;
+ QItemSelection new_selection;
+ foreach (KFileItem* item, selection) {
+ url = item->url().upUrl();
+ if (baseUrl.equals(url, KUrl::CompareWithoutTrailingSlash)) {
+ QModelIndex index = m_proxyModel->mapFromSource(m_dirModel->indexForItem(*item));
+ new_selection.select(index, index);
}
- ++it;
}
+ itemView()->selectionModel()->select(new_selection,
+ QItemSelectionModel::ClearAndSelect
+ | QItemSelectionModel::Current);
}
void DolphinView::changeNameFilter(const QString& nameFilter)
item = fileItem(index);
}
- DolphinContextMenu contextMenu(this, item);
+ DolphinContextMenu contextMenu(m_mainWindow, item, url());
contextMenu.open();
}
KFileItem* directory = 0;
if (isValidNameIndex(index)) {
KFileItem* item = fileItem(index);
- assert(item != 0);
+ Q_ASSERT(item != 0);
if (item->isDir()) {
// the URLs are dropped above a directory
directory = item;
const KUrl& destination = (directory == 0) ? url() :
directory->url();
-
- kDebug() << "DolphinView::dropUrls() - destination: " << destination.prettyUrl() << endl;
-
dropUrls(urls, destination);
}
m_mainWindow->dropUrls(urls, destination);
}
-
void DolphinView::updateSorting(DolphinView::Sorting sorting)
{
ViewProperties props(url());
void DolphinView::emitContentsMoved()
{
- emit contentsMoved(contentsX(), contentsY());
+ if (!m_blockContentsMovedSignal) {
+ emit contentsMoved(contentsX(), contentsY());
+ }
}
void DolphinView::updateActivationState()
{
m_urlNavigator->setActive(isActive());
+ if(isActive()) {
+ emit urlChanged(url());
+ emit selectionChanged(selectedItems());
+ }
+}
+
+void DolphinView::updateCutItems()
+{
+ // restore the icons of all previously selected items to the
+ // original state...
+ QList<CutItem>::const_iterator it = m_cutItemsCache.begin();
+ QList<CutItem>::const_iterator end = m_cutItemsCache.end();
+ while (it != end) {
+ const QModelIndex index = m_dirModel->indexForUrl((*it).url);
+ if (index.isValid()) {
+ m_dirModel->setData(index, QIcon((*it).pixmap), Qt::DecorationRole);
+ }
+ ++it;
+ }
+ m_cutItemsCache.clear();
+
+ // ... and apply an item effect to all currently cut items
+ applyCutItemEffect();
}
void DolphinView::createView()
m_fileItemDelegate = 0;
}
- assert(m_iconsView == 0);
- assert(m_detailsView == 0);
+ Q_ASSERT(m_iconsView == 0);
+ Q_ASSERT(m_detailsView == 0);
// ... and recreate it representing the current mode
switch (m_mode) {
break;
}
- assert(view != 0);
+ Q_ASSERT(view != 0);
m_fileItemDelegate = new KFileItemDelegate(view);
view->setItemDelegate(m_fileItemDelegate);
return false;
}
+void DolphinView::applyCutItemEffect()
+{
+ const QMimeData* mimeData = QApplication::clipboard()->mimeData();
+ if (!KonqMimeData::decodeIsCutSelection(mimeData)) {
+ return;
+ }
+
+ KFileItemList items(m_dirLister->items());
+ KFileItemList::const_iterator it = items.begin();
+ const KFileItemList::const_iterator end = items.end();
+ while (it != end) {
+ KFileItem* item = *it;
+ if (isCutItem(*item)) {
+ const QModelIndex index = m_dirModel->indexForItem(*item);
+ const KFileItem* item = m_dirModel->itemForIndex(index);
+ const QVariant value = m_dirModel->data(index, Qt::DecorationRole);
+ if ((value.type() == QVariant::Icon) && (item != 0)) {
+ const QIcon icon(qvariant_cast<QIcon>(value));
+ QPixmap pixmap = icon.pixmap(128, 128);
+
+ // remember current pixmap for the item to be able
+ // to restore it when other items get cut
+ CutItem cutItem;
+ cutItem.url = item->url();
+ cutItem.pixmap = pixmap;
+ m_cutItemsCache.append(cutItem);
+
+ // apply icon effect to the cut item
+ KIconEffect iconEffect;
+ pixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState);
+ m_dirModel->setData(index, QIcon(pixmap), Qt::DecorationRole);
+ }
+ }
+ ++it;
+ }
+}
+
#include "dolphinview.moc"