X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/ec9841397ff92b872df5c3853a232cedae82dfde..cc60dc2b458eca32dfb50ef060db1019f1d2970d:/src/dolphinview.cpp diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index e49690a04..04b949a7d 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -39,6 +39,7 @@ #include #include +#include "dolphincolumnview.h" #include "dolphincontroller.h" #include "dolphinstatusbar.h" #include "dolphinmainwindow.h" @@ -51,6 +52,7 @@ #include "renamedialog.h" #include "urlnavigator.h" #include "viewproperties.h" +#include "dolphinsettings.h" DolphinView::DolphinView(DolphinMainWindow* mainWindow, QWidget* parent, @@ -70,6 +72,7 @@ DolphinView::DolphinView(DolphinMainWindow* mainWindow, m_controller(0), m_iconsView(0), m_detailsView(0), + m_columnView(0), m_fileItemDelegate(0), m_filterBar(0), m_statusBar(0), @@ -86,7 +89,11 @@ DolphinView::DolphinView(DolphinMainWindow* mainWindow, connect(m_mainWindow, SIGNAL(activeViewChanged()), this, SLOT(updateActivationState())); - m_urlNavigator = new UrlNavigator(url, this); + QClipboard* clipboard = QApplication::clipboard(); + connect(clipboard, SIGNAL(dataChanged()), + this, SLOT(updateCutItems())); + + m_urlNavigator = new UrlNavigator(DolphinSettings::instance().bookmarkManager(), url, this); m_urlNavigator->setShowHiddenFiles(showHiddenFiles); connect(m_urlNavigator, SIGNAL(urlChanged(const KUrl&)), this, SLOT(loadDirectory(const KUrl&))); @@ -160,8 +167,6 @@ DolphinView::DolphinView(DolphinMainWindow* mainWindow, m_topLayout->addWidget(itemView()); m_topLayout->addWidget(m_filterBar); m_topLayout->addWidget(m_statusBar); - - loadDirectory(m_urlNavigator->url()); } DolphinView::~DolphinView() @@ -451,11 +456,6 @@ void DolphinView::setUrlEditable(bool editable) m_urlNavigator->editUrl(editable); } -const QLinkedList DolphinView::urlHistory(int& index) const -{ - return m_urlNavigator->history(index); -} - bool DolphinView::hasSelection() const { return itemView()->selectionModel()->hasSelection(); @@ -592,10 +592,23 @@ DolphinMainWindow* DolphinView::mainWindow() const void DolphinView::loadDirectory(const KUrl& url) { + if(!isActive()) { + requestActivation(); + } + const ViewProperties props(url); const Mode mode = props.viewMode(); - if (m_mode != mode) { + bool changeMode = (m_mode != mode); + if (changeMode && isColumnViewActive()) { + // The column view is active. Only change the + // mode if the current URL is no child of the column view. + if (m_dirLister->url().isParentOf(url)) { + changeMode = false; + } + } + + if (changeMode) { m_mode = mode; createView(); emit modeChanged(); @@ -764,16 +777,12 @@ void DolphinView::showPreview(const KFileItem* item, const QPixmap& pixmap) void DolphinView::restoreContentsPos() { - int index = 0; - const QLinkedList history = urlHistory(index); - if (!history.isEmpty()) { + UrlNavigator::HistoryElem historyItem = m_urlNavigator->currentHistoryItem(); + if (!historyItem.url().isEmpty()) { QAbstractItemView* view = itemView(); - // TODO: view->setCurrentItem(history[index].currentFileName()); - - QLinkedList::const_iterator it = history.begin(); - it += index; - view->horizontalScrollBar()->setValue((*it).contentsX()); - view->verticalScrollBar()->setValue((*it).contentsY()); + // TODO: view->setCurrentItem(historyItem.currentFileName()); + view->horizontalScrollBar()->setValue(historyItem.contentsX()); + view->verticalScrollBar()->setValue(historyItem.contentsY()); } } @@ -789,7 +798,7 @@ void DolphinView::showErrorMessage(const QString& msg) void DolphinView::emitSelectionChangedSignal() { - emit selectionChanged(); + emit selectionChanged(DolphinView::selectedItems()); } void DolphinView::closeFilterBar() @@ -823,9 +832,18 @@ void DolphinView::startDirLister(const KUrl& url, bool reload) m_statusBar->setProgress(0); } + m_cutItemsCache.clear(); m_blockContentsMovedSignal = true; m_dirLister->stop(); - m_dirLister->openUrl(url, false, reload); + + bool keepOldDirs = isColumnViewActive(); + if (keepOldDirs && !m_dirLister->url().isParentOf(url)) { + // The current URL is not a child of the dir lister + // URL. This may happen when e. g. a bookmark has been selected + // and hence the view must be reset. + keepOldDirs = false; + } + m_dirLister->openUrl(url, keepOldDirs, reload); } QString DolphinView::defaultStatusBarText() const @@ -917,32 +935,25 @@ void DolphinView::requestActivation() 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)) { - const QModelIndex idx = m_dirModel->indexForItem(*item); - const QVariant value = m_dirModel->data(idx, Qt::DecorationRole); - if (value.type() == QVariant::Icon) { - const QIcon icon(qvariant_cast(value)); - KIconEffect iconEffect; - const QPixmap pixmap = iconEffect.apply(icon.pixmap(128, 128), - K3Icon::Desktop, - K3Icon::DisabledState); - m_dirModel->setData(idx, QIcon(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) @@ -1005,7 +1016,6 @@ void DolphinView::dropUrls(const KUrl::List& urls, const KUrl& destination = (directory == 0) ? url() : directory->url(); - dropUrls(urls, destination); } @@ -1015,7 +1025,6 @@ void DolphinView::dropUrls(const KUrl::List& urls, m_mainWindow->dropUrls(urls, destination); } - void DolphinView::updateSorting(DolphinView::Sorting sorting) { ViewProperties props(url()); @@ -1046,6 +1055,29 @@ void DolphinView::emitContentsMoved() 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::const_iterator it = m_cutItemsCache.begin(); + QList::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() @@ -1059,11 +1091,13 @@ void DolphinView::createView() view = 0; m_iconsView = 0; m_detailsView = 0; + m_columnView = 0; m_fileItemDelegate = 0; } Q_ASSERT(m_iconsView == 0); Q_ASSERT(m_detailsView == 0); + Q_ASSERT(m_columnView == 0); // ... and recreate it representing the current mode switch (m_mode) { @@ -1076,6 +1110,11 @@ void DolphinView::createView() m_detailsView = new DolphinDetailsView(this, m_controller); view = m_detailsView; break; + + case ColumnView: + m_columnView = new DolphinColumnView(this, m_controller); + view = m_columnView; + break; } Q_ASSERT(view != 0); @@ -1112,10 +1151,13 @@ void DolphinView::selectAll(QItemSelectionModel::SelectionFlags flags) QAbstractItemView* DolphinView::itemView() const { - Q_ASSERT((m_iconsView == 0) || (m_detailsView == 0)); if (m_detailsView != 0) { return m_detailsView; } + else if (m_columnView != 0) { + return m_columnView; + } + return m_iconsView; } @@ -1142,4 +1184,41 @@ bool DolphinView::isCutItem(const KFileItem& item) const 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(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"