X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/7b911df33ec83bb978985d50342ce1c27afb6425..d9f9e69ce1bdd6f898ee21cb2f14607bd90fa07b:/src/views/dolphinview.cpp diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index de54b9bb6..a82008d25 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -22,16 +22,19 @@ #include #include +#include #include +#include +#include #include #include -#include #include #include #include #include #include +#include #include #include #include @@ -59,8 +62,10 @@ #include "dolphin_detailsmodesettings.h" #include "dolphin_generalsettings.h" #include "dolphinitemlistcontainer.h" +#include "draganddrophelper.h" #include "renamedialog.h" #include "settings/dolphinsettings.h" +#include "versioncontrol/versioncontrolobserver.h" #include "viewmodecontroller.h" #include "viewproperties.h" #include "views/tooltips/tooltipmanager.h" @@ -85,10 +90,11 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) : m_container(0), m_toolTipManager(0), m_selectionChangedTimer(0), - m_currentItemIndex(-1), + m_currentItemUrl(), m_restoredContentsPosition(), m_createdItemUrl(), - m_selectedItems() + m_selectedUrls(), + m_versionControlObserver(0) { m_topLayout = new QVBoxLayout(this); m_topLayout->setSpacing(0); @@ -114,7 +120,7 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) : this, SLOT(updateSortFoldersFirst(bool))); connect(m_dolphinViewController, SIGNAL(additionalInfoChanged(QList)), this, SLOT(updateAdditionalInfo(QList)));*/ - //connect(m_dolphinViewController, SIGNAL(itemTriggered(KFileItem)), + //connect(m_dolphinViewController, SIGNAL(itemActivated(KFileItem)), // this, SLOT(triggerItem(KFileItem))); //connect(m_dolphinViewController, SIGNAL(tabRequested(KUrl)), // this, SIGNAL(tabRequested(KUrl))); @@ -145,7 +151,6 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) : connect(m_dirLister, SIGNAL(redirection(KUrl,KUrl)), this, SLOT(slotRedirection(KUrl,KUrl))); connect(m_dirLister, SIGNAL(started(KUrl)), this, SLOT(slotDirListerStarted(KUrl))); - connect(m_dirLister, SIGNAL(completed()), this, SLOT(slotDirListerCompleted())); connect(m_dirLister, SIGNAL(refreshItems(QList >)), this, SLOT(slotRefreshItems())); @@ -158,17 +163,24 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) : connect(m_dirLister, SIGNAL(itemsDeleted(KFileItemList)), this, SIGNAL(itemCountChanged())); m_container = new DolphinItemListContainer(m_dirLister, this); - QHash visibleRoles; - visibleRoles.insert("name", 0); - m_container->setVisibleRoles(visibleRoles); + m_container->setVisibleRoles(QList() << "name"); KItemListController* controller = m_container->controller(); controller->setSelectionBehavior(KItemListController::MultiSelection); - connect(controller, SIGNAL(itemClicked(int,Qt::MouseButton)), - this, SLOT(slotItemClicked(int,Qt::MouseButton))); + connect(controller, SIGNAL(itemActivated(int)), + this, SLOT(slotItemActivated(int))); + connect(controller, SIGNAL(itemMiddleClicked(int)), this, SLOT(slotItemMiddleClicked(int))); + connect(controller, SIGNAL(contextMenuRequested(int,QPointF)), this, SLOT(slotContextMenuRequested(int,QPointF))); connect(controller, SIGNAL(itemExpansionToggleClicked(int)), this, SLOT(slotItemExpansionToggleClicked(int))); connect(controller, SIGNAL(itemHovered(int)), this, SLOT(slotItemHovered(int))); connect(controller, SIGNAL(itemUnhovered(int)), this, SLOT(slotItemUnhovered(int))); + connect(controller, SIGNAL(itemDropEvent(int,QGraphicsSceneDragDropEvent*)), this, SLOT(slotItemDropEvent(int,QGraphicsSceneDragDropEvent*))); + connect(controller, SIGNAL(modelChanged(KItemModelBase*,KItemModelBase*)), this, SLOT(slotModelChanged(KItemModelBase*,KItemModelBase*))); + + KFileItemModel* model = fileItemModel(); + if (model) { + connect(model, SIGNAL(loadingCompleted()), this, SLOT(slotLoadingCompleted())); + } KItemListSelectionManager* selectionManager = controller->selectionManager(); connect(selectionManager, SIGNAL(selectionChanged(QSet,QSet)), @@ -176,6 +188,12 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) : m_toolTipManager = new ToolTipManager(this); + m_versionControlObserver = new VersionControlObserver(this); + m_versionControlObserver->setModel(model); + connect(m_versionControlObserver, SIGNAL(infoMessage(QString)), this, SIGNAL(infoMessage(QString))); + connect(m_versionControlObserver, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); + connect(m_versionControlObserver, SIGNAL(operationCompletedMessage(QString)), this, SIGNAL(operationCompletedMessage(QString))); + applyViewProperties(); m_topLayout->addWidget(m_container); @@ -289,21 +307,27 @@ int DolphinView::selectedItemsCount() const void DolphinView::markUrlsAsSelected(const QList& urls) { - foreach (const KUrl& url, urls) { - KFileItem item(KFileItem::Unknown, KFileItem::Unknown, url); - m_selectedItems.append(item); - } + m_selectedUrls = urls; } void DolphinView::setItemSelectionEnabled(const QRegExp& pattern, bool enabled) { - Q_UNUSED(pattern); - Q_UNUSED(enabled); - /*const QItemSelection matchingIndexes = childrenMatchingPattern(QModelIndex(), pattern); - const QItemSelectionModel::SelectionFlags command = enabled - ? QItemSelectionModel::Select - : QItemSelectionModel::Deselect; - m_viewAccessor.itemView()->selectionModel()->select(matchingIndexes, command);*/ + const KItemListSelectionManager::SelectionMode mode = enabled + ? KItemListSelectionManager::Select + : KItemListSelectionManager::Deselect; + const KFileItemModel* model = fileItemModel(); + KItemListSelectionManager* selectionManager = m_container->controller()->selectionManager(); + + for (int index = 0; index < model->count(); index++) { + const KFileItem item = model->fileItem(index); + if (pattern.exactMatch(item.name())) { + // An alternative approach would be to store the matching items in a QSet and + // select them in one go after the loop, but we'd need a new function + // KItemListSelectionManager::setSelected(QSet, SelectionMode mode) + // for that. + selectionManager->setSelected(index, 1, mode); + } + } } void DolphinView::setZoomLevel(int level) @@ -329,8 +353,8 @@ void DolphinView::setSorting(Sorting sorting) DolphinView::Sorting DolphinView::sorting() const { - return DolphinView::SortByName; - //return m_viewAccessor.proxyModel()->sorting(); + KItemModelBase* model = m_container->controller()->model(); + return sortingForSortRole(model->sortRole()); } void DolphinView::setSortOrder(Qt::SortOrder order) @@ -342,7 +366,8 @@ void DolphinView::setSortOrder(Qt::SortOrder order) Qt::SortOrder DolphinView::sortOrder() const { - return Qt::AscendingOrder; // m_viewAccessor.proxyModel()->sortOrder(); + KItemModelBase* model = fileItemModel(); + return model->sortOrder(); } void DolphinView::setSortFoldersFirst(bool foldersFirst) @@ -354,7 +379,8 @@ void DolphinView::setSortFoldersFirst(bool foldersFirst) bool DolphinView::sortFoldersFirst() const { - return true; // m_viewAccessor.proxyModel()->sortFoldersFirst(); + KFileItemModel* model = fileItemModel(); + return model->sortFoldersFirst(); } void DolphinView::setAdditionalInfoList(const QList& info) @@ -380,7 +406,10 @@ void DolphinView::reload() QByteArray viewState; QDataStream saveStream(&viewState, QIODevice::WriteOnly); saveState(saveStream); - m_selectedItems= selectedItems(); + + const KFileItemList itemList = selectedItems(); + m_selectedUrls.clear(); + m_selectedUrls = itemList.urlList(); setUrl(url()); loadDirectory(url(), true); @@ -493,8 +522,16 @@ QString DolphinView::statusBarText() const QList DolphinView::versionControlActions(const KFileItemList& items) const { - Q_UNUSED(items); - return QList(); //m_dolphinViewController->versionControlActions(items); + QList actions; + + if (items.isEmpty()) { + const KFileItem item = fileItemModel()->rootItem(); + actions = m_versionControlObserver->actions(KFileItemList() << item); + } else { + actions = m_versionControlObserver->actions(items); + } + + return actions; } void DolphinView::setUrl(const KUrl& url) @@ -629,7 +666,9 @@ void DolphinView::setHiddenFilesShown(bool show) return; } - m_selectedItems = selectedItems(); + const KFileItemList itemList = selectedItems(); + m_selectedUrls.clear(); + m_selectedUrls = itemList.urlList(); ViewProperties props(url()); props.setHiddenFilesShown(show); @@ -668,34 +707,69 @@ void DolphinView::contextMenuEvent(QContextMenuEvent* event) const KItemListView* view = m_container->controller()->view(); if (view->itemAt(pos) < 0) { // Only open the context-menu if the cursor is above the viewport - // (the context-menu for items is handled in slotItemClicked()) + // (the context-menu for items is handled in slotContextMenuRequested()) requestContextMenu(KFileItem(), url(), QList()); } } +void DolphinView::wheelEvent(QWheelEvent* event) +{ + if (event->modifiers().testFlag(Qt::ControlModifier)) { + const int numDegrees = event->delta() / 8; + const int numSteps = numDegrees / 15; + + setZoomLevel(zoomLevel() + numSteps); + event->accept(); + } else { + event->ignore(); + } +} + void DolphinView::activate() { setActive(true); } -void DolphinView::slotItemClicked(int index, Qt::MouseButton button) +void DolphinView::slotItemActivated(int index) { - const KFileItem item = fileItemModel()->fileItem(index); + Q_UNUSED(index); - if (button & Qt::LeftButton) { - emit itemTriggered(item); // caught by DolphinViewContainer or DolphinPart - } else if (button & Qt::MidButton) { - if (item.isDir() || isTabsForFilesEnabled()) { - emit tabRequested(item.url()); - } - } else if (button & Qt::RightButton) { - if (GeneralSettings::showToolTips()) { - m_toolTipManager->hideToolTip(); + const KFileItemList items = selectedItems(); + if (items.isEmpty()) { + return; + } + + if (items.count() == 1) { + emit itemActivated(items.at(0)); // caught by DolphinViewContainer or DolphinPart + } else { + foreach (const KFileItem& item, items) { + if (item.isDir()) { + emit tabRequested(item.url()); + } else { + emit itemActivated(item); + } } - emit requestContextMenu(item, url(), QList()); } } +void DolphinView::slotItemMiddleClicked(int index) +{ + const KFileItem item = fileItemModel()->fileItem(index); + if (item.isDir() || isTabsForFilesEnabled()) { + emit tabRequested(item.url()); + } +} + +void DolphinView::slotContextMenuRequested(int index, const QPointF& pos) +{ + Q_UNUSED(pos); + if (GeneralSettings::showToolTips()) { + m_toolTipManager->hideToolTip(); + } + const KFileItem item = fileItemModel()->fileItem(index); + emit requestContextMenu(item, url(), QList()); +} + void DolphinView::slotItemExpansionToggleClicked(int index) { // TODO: When doing a model->setExpanded(false) it should @@ -731,6 +805,32 @@ void DolphinView::slotItemUnhovered(int index) emit requestItemInfo(KFileItem()); } +void DolphinView::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* event) +{ + const KFileItem destItem = fileItemModel()->fileItem(index); + + QDropEvent dropEvent(event->pos().toPoint(), + event->possibleActions(), + event->mimeData(), + event->buttons(), + event->modifiers()); + + DragAndDropHelper::dropUrls(destItem, url(), &dropEvent, this); +} + +void DolphinView::slotModelChanged(KItemModelBase* current, KItemModelBase* previous) +{ + if (previous != 0) { + disconnect(previous, SIGNAL(loadingCompleted()), this, SLOT(slotLoadingCompleted())); + } + + Q_ASSERT(qobject_cast(current)); + connect(current, SIGNAL(loadingCompleted()), this, SLOT(slotLoadingCompleted())); + + KFileItemModel* fileItemModel = static_cast(current); + m_versionControlObserver->setModel(fileItemModel); +} + void DolphinView::slotSelectionChanged(const QSet& current, const QSet& previous) { const int currentCount = current.count(); @@ -789,7 +889,8 @@ void DolphinView::updateSortOrder(Qt::SortOrder order) ViewProperties props(url()); props.setSortOrder(order); - //m_viewAccessor.proxyModel()->setSortOrder(order); + KItemModelBase* model = fileItemModel(); + model->setSortOrder(order); emit sortOrderChanged(order); } @@ -799,7 +900,8 @@ void DolphinView::updateSortFoldersFirst(bool foldersFirst) ViewProperties props(url()); props.setSortFoldersFirst(foldersFirst); - //m_viewAccessor.proxyModel()->setSortFoldersFirst(foldersFirst); + KFileItemModel* model = fileItemModel(); + model->setSortFoldersFirst(foldersFirst); emit sortFoldersFirstChanged(foldersFirst); } @@ -821,34 +923,34 @@ bool DolphinView::isTabsForFilesEnabled() const bool DolphinView::itemsExpandable() const { - return false; //m_viewAccessor.itemsExpandable(); + return m_mode == DetailsView; } void DolphinView::restoreState(QDataStream& stream) { // Restore the current item that had the keyboard focus - stream >> m_currentItemIndex; + stream >> m_currentItemUrl; // Restore the view position stream >> m_restoredContentsPosition; // Restore expanded folders (only relevant for the details view - will be ignored by the view in other view modes) - QSet urlsToExpand; - stream >> urlsToExpand; - /*const DolphinDetailsViewExpander* expander = m_viewAccessor.setExpandedUrls(urlsToExpand); - if (expander) { - m_expanderActive = true; - connect (expander, SIGNAL(completed()), this, SLOT(slotLoadingCompleted())); - } - else { - m_expanderActive = false; - }*/ + QSet urls; + stream >> urls; + fileItemModel()->restoreExpandedUrls(urls); } void DolphinView::saveState(QDataStream& stream) { // Save the current item that has the keyboard focus - stream << m_container->controller()->selectionManager()->currentItem(); + const int currentIndex = m_container->controller()->selectionManager()->currentItem(); + if (currentIndex != -1) { + KFileItem item = fileItemModel()->fileItem(currentIndex); + KUrl currentItemUrl = item.url(); + stream << currentItemUrl; + } else { + stream << KUrl(); + } // Save view position const qreal x = m_container->horizontalScrollBar()->value(); @@ -856,7 +958,7 @@ void DolphinView::saveState(QDataStream& stream) stream << QPoint(x, y); // Save expanded folders (only relevant for the details view - the set will be empty in other view modes) - //stream << m_viewAccessor.expandedUrls(); + stream << fileItemModel()->expandedUrls(); } bool DolphinView::hasSelection() const @@ -902,10 +1004,15 @@ void DolphinView::slotRedirection(const KUrl& oldUrl, const KUrl& newUrl) void DolphinView::updateViewState() { - if (m_currentItemIndex >= 0) { + if (m_currentItemUrl != KUrl()) { KItemListSelectionManager* selectionManager = m_container->controller()->selectionManager(); - selectionManager->setCurrentItem(m_currentItemIndex); - m_currentItemIndex =-1; + const int currentIndex = fileItemModel()->index(m_currentItemUrl); + if (currentIndex != -1) { + selectionManager->setCurrentItem(currentIndex); + } else { + selectionManager->setCurrentItem(0); + } + m_currentItemUrl = KUrl(); } if (!m_restoredContentsPosition.isNull()) { @@ -917,20 +1024,20 @@ void DolphinView::updateViewState() m_container->verticalScrollBar()->setValue(y); } - if (!m_selectedItems.isEmpty()) { + if (!m_selectedUrls.isEmpty()) { KItemListSelectionManager* selectionManager = m_container->controller()->selectionManager(); QSet selectedItems = selectionManager->selectedItems(); const KFileItemModel* model = fileItemModel(); - foreach (const KFileItem& selectedItem, m_selectedItems) { - const int index = model->index(selectedItem); + foreach (const KUrl& url, m_selectedUrls) { + const int index = model->index(url); if (index >= 0) { selectedItems.insert(index); } } selectionManager->setSelectedItems(selectedItems); - m_selectedItems.clear(); + m_selectedUrls.clear(); } } @@ -956,7 +1063,7 @@ void DolphinView::slotDeleteFileFinished(KJob* job) void DolphinView::slotDirListerStarted(const KUrl& url) { // Disable the writestate temporary until it can be determined in a fast way - // in DolphinView::slotDirListerCompleted() + // in DolphinView::slotLoadingCompleted() if (m_isFolderWritable) { m_isFolderWritable = false; emit writeStateChanged(m_isFolderWritable); @@ -965,7 +1072,7 @@ void DolphinView::slotDirListerStarted(const KUrl& url) emit startedPathLoading(url); } -void DolphinView::slotDirListerCompleted() +void DolphinView::slotLoadingCompleted() { // Update the view-state. This has to be done using a Qt::QueuedConnection // because the view might not be in its final state yet (the view also @@ -1054,25 +1161,25 @@ void DolphinView::applyViewProperties() }*/ const DolphinView::Sorting sorting = props.sorting(); - KItemModelBase* model = m_container->controller()->model(); + KFileItemModel* model = fileItemModel(); const QByteArray newSortRole = sortRoleForSorting(sorting); if (newSortRole != model->sortRole()) { model->setSortRole(newSortRole); emit sortingChanged(sorting); } -/* + const Qt::SortOrder sortOrder = props.sortOrder(); - if (sortOrder != m_viewAccessor.proxyModel()->sortOrder()) { - m_viewAccessor.proxyModel()->setSortOrder(sortOrder); + if (sortOrder != model->sortOrder()) { + model->setSortOrder(sortOrder); emit sortOrderChanged(sortOrder); } const bool sortFoldersFirst = props.sortFoldersFirst(); - if (sortFoldersFirst != m_viewAccessor.proxyModel()->sortFoldersFirst()) { - m_viewAccessor.proxyModel()->setSortFoldersFirst(sortFoldersFirst); + if (sortFoldersFirst != model->sortFoldersFirst()) { + model->setSortFoldersFirst(sortFoldersFirst); emit sortFoldersFirstChanged(sortFoldersFirst); } -*/ + const QList infoList = props.additionalInfoList(); if (infoList != m_additionalInfoList) { const QList previousList = m_additionalInfoList; @@ -1101,13 +1208,12 @@ void DolphinView::applyAdditionalInfoListToView() { const AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance(); - QHash visibleRoles; - visibleRoles.insert("name", 0); + QList visibleRoles; + visibleRoles.reserve(m_additionalInfoList.count() + 1); + visibleRoles.append("name"); - int index = 1; foreach (AdditionalInfo info, m_additionalInfoList) { - visibleRoles.insert(infoAccessor.role(info), index); - ++index; + visibleRoles.append(infoAccessor.role(info)); } m_container->setVisibleRoles(visibleRoles); @@ -1131,29 +1237,28 @@ void DolphinView::updateZoomLevel(int oldZoomLevel) KUrl::List DolphinView::simplifiedSelectedUrls() const { - Q_ASSERT(false); // TODO KUrl::List urls; -/* + const KFileItemList items = selectedItems(); foreach (const KFileItem &item, items) { urls.append(item.url()); } - if (itemsExpandable()) { + // TODO: Check if we still need KDirModel for this in KDE 5.0 urls = KDirModel::simplifiedUrlList(urls); - }*/ + } return urls; } QMimeData* DolphinView::selectionMimeData() const { - /*const QAbstractItemView* view = m_viewAccessor.itemView(); - Q_ASSERT((view) && (view->selectionModel())); - const QItemSelection selection = m_viewAccessor.proxyModel()->mapSelectionToSource(view->selectionModel()->selection()); - return m_viewAccessor.dirModel()->mimeData(selection.indexes());*/ - return 0; + const KFileItemModel* model = fileItemModel(); + const KItemListSelectionManager* selectionManager = m_container->controller()->selectionManager(); + const QSet selectedIndexes = selectionManager->selectedItems(); + + return model->createMimeData(selectedIndexes); } void DolphinView::markPastedUrlsAsSelected(const QMimeData* mimeData) @@ -1162,32 +1267,6 @@ void DolphinView::markPastedUrlsAsSelected(const QMimeData* mimeData) markUrlsAsSelected(urls); } -QItemSelection DolphinView::childrenMatchingPattern(const QModelIndex& parent, const QRegExp& pattern) const -{ - Q_UNUSED(parent); - Q_UNUSED(pattern); - QItemSelection matchingIndexes; - /*const DolphinSortFilterProxyModel* proxyModel = m_viewAccessor.proxyModel(); - const DolphinModel* dolphinModel = m_viewAccessor.dirModel(); - - const int rowCount = proxyModel->rowCount(parent); - - for (int row = 0; row < rowCount; ++row) { - QModelIndex index = proxyModel->index(row, 0, parent); - QModelIndex sourceIndex = proxyModel->mapToSource(index); - - if (sourceIndex.isValid() && pattern.exactMatch(dolphinModel->data(sourceIndex).toString())) { - matchingIndexes += QItemSelectionRange(index); - } - - if (proxyModel->hasChildren(index)) { - matchingIndexes += childrenMatchingPattern(index, pattern); - } - }*/ - - return matchingIndexes; -} - void DolphinView::updateWritableState() { const bool wasFolderWritable = m_isFolderWritable; @@ -1221,4 +1300,26 @@ QByteArray DolphinView::sortRoleForSorting(Sorting sorting) const return QByteArray(); } +DolphinView::Sorting DolphinView::sortingForSortRole(const QByteArray& sortRole) const +{ + static QHash sortHash; + if (sortHash.isEmpty()) { + sortHash.insert("name", SortByName); + sortHash.insert("size", SortBySize); + sortHash.insert("date", SortByDate); + sortHash.insert("permissions", SortByPermissions); + sortHash.insert("owner", SortByOwner); + sortHash.insert("group", SortByGroup); + sortHash.insert("type", SortByType); + sortHash.insert("destination", SortByDestination); + sortHash.insert("path", SortByPath); + } + return sortHash.value(sortRole); +} + +void DolphinView::markUrlAsCurrent(const KUrl& url) +{ + m_currentItemUrl = url; +} + #include "dolphinview.moc"