X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/d9f9e69ce1bdd6f898ee21cb2f14607bd90fa07b..3c77ffe832a00f405e474f11da7b39d37a410a5b:/src/views/dolphinview.cpp diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index a82008d25..9bb1d03db 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -64,7 +64,6 @@ #include "dolphinitemlistcontainer.h" #include "draganddrophelper.h" #include "renamedialog.h" -#include "settings/dolphinsettings.h" #include "versioncontrol/versioncontrolobserver.h" #include "viewmodecontroller.h" #include "viewproperties.h" @@ -164,13 +163,16 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) : m_container = new DolphinItemListContainer(m_dirLister, this); m_container->setVisibleRoles(QList() << "name"); + m_container->installEventFilter(this); KItemListController* controller = m_container->controller(); controller->setSelectionBehavior(KItemListController::MultiSelection); 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(itemContextMenuRequested(int,QPointF)), this, SLOT(slotItemContextMenuRequested(int,QPointF))); + connect(controller, SIGNAL(viewContextMenuRequested(QPointF)), this, SLOT(slotViewContextMenuRequested(QPointF))); + connect(controller, SIGNAL(headerContextMenuRequested(QPointF)), this, SLOT(slotHeaderContextMenuRequested(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))); @@ -264,19 +266,65 @@ DolphinView::Mode DolphinView::mode() const return m_mode; } +void DolphinView::setPreviewsShown(bool show) +{ + if (previewsShown() == show) { + return; + } + + ViewProperties props(url()); + props.setPreviewsShown(show); + + m_container->setPreviewsShown(show); + emit previewsShownChanged(show); +} + bool DolphinView::previewsShown() const { return m_container->previewsShown(); } +void DolphinView::setHiddenFilesShown(bool show) +{ + if (m_dirLister->showingDotFiles() == show) { + return; + } + + const KFileItemList itemList = selectedItems(); + m_selectedUrls.clear(); + m_selectedUrls = itemList.urlList(); + + ViewProperties props(url()); + props.setHiddenFilesShown(show); + + m_dirLister->setShowingDotFiles(show); + m_dirLister->emitChanges(); + emit hiddenFilesShownChanged(show); +} + bool DolphinView::hiddenFilesShown() const { return m_dirLister->showingDotFiles(); } -bool DolphinView::categorizedSorting() const +void DolphinView::setGroupedSorting(bool grouped) { - return false; //m_storedCategorizedSorting; + if (grouped == groupedSorting()) { + return; + } + + ViewProperties props(url()); + props.setGroupedSorting(grouped); + props.save(); + + m_container->controller()->model()->setGroupedSorting(grouped); + + emit groupedSortingChanged(grouped); +} + +bool DolphinView::groupedSorting() const +{ + return fileItemModel()->groupedSorting(); } KFileItemList DolphinView::items() const @@ -290,8 +338,11 @@ KFileItemList DolphinView::selectedItems() const const KItemListSelectionManager* selectionManager = m_container->controller()->selectionManager(); const QSet selectedIndexes = selectionManager->selectedItems(); + QList sortedIndexes = selectedIndexes.toList(); + qSort(sortedIndexes); + KFileItemList selectedItems; - QSetIterator it(selectedIndexes); + QListIterator it(sortedIndexes); while (it.hasNext()) { const int index = it.next(); selectedItems.append(model->fileItem(index)); @@ -310,6 +361,11 @@ void DolphinView::markUrlsAsSelected(const QList& urls) m_selectedUrls = urls; } +void DolphinView::markUrlAsCurrent(const KUrl& url) +{ + m_currentItemUrl = url; +} + void DolphinView::setItemSelectionEnabled(const QRegExp& pattern, bool enabled) { const KItemListSelectionManager::SelectionMode mode = enabled @@ -463,61 +519,50 @@ void DolphinView::calculateItemCount(int& fileCount, QString DolphinView::statusBarText() const { - QString text; + QString summary; + QString foldersText; + QString filesText; + int folderCount = 0; int fileCount = 0; KIO::filesize_t totalFileSize = 0; if (hasSelection()) { - // give a summary of the status of the selected files + // Give a summary of the status of the selected files const KFileItemList list = selectedItems(); - if (list.isEmpty()) { - // when an item is triggered, it is temporary selected but selectedItems() - // will return an empty list - return text; - } - - KFileItemList::const_iterator it = list.begin(); - const KFileItemList::const_iterator end = list.end(); - while (it != end) { - const KFileItem& item = *it; + foreach (const KFileItem& item, list) { if (item.isDir()) { ++folderCount; } else { ++fileCount; totalFileSize += item.size(); } - ++it; } if (folderCount + fileCount == 1) { - // if only one item is selected, show the filename - const QString name = list.first().text(); - text = (folderCount == 1) ? i18nc("@info:status", "%1 selected", name) : - i18nc("@info:status", "%1 selected (%2)", - name, KIO::convertSize(totalFileSize)); + // If only one item is selected, show the filename + filesText = i18nc("@info:status", "%1 selected", list.first().text()); } else { - // at least 2 items are selected - const QString foldersText = i18ncp("@info:status", "1 Folder selected", "%1 Folders selected", folderCount); - const QString filesText = i18ncp("@info:status", "1 File selected", "%1 Files selected", fileCount); - if ((folderCount > 0) && (fileCount > 0)) { - text = i18nc("@info:status folders, files (size)", "%1, %2 (%3)", - foldersText, filesText, KIO::convertSize(totalFileSize)); - } else if (fileCount > 0) { - text = i18nc("@info:status files (size)", "%1 (%2)", filesText, KIO::convertSize(totalFileSize)); - } else { - Q_ASSERT(folderCount > 0); - text = foldersText; - } + // At least 2 items are selected + foldersText = i18ncp("@info:status", "1 Folder selected", "%1 Folders selected", folderCount); + filesText = i18ncp("@info:status", "1 File selected", "%1 Files selected", fileCount); } } else { calculateItemCount(fileCount, folderCount, totalFileSize); - text = KIO::itemsSummaryString(fileCount + folderCount, - fileCount, folderCount, - totalFileSize, true); + foldersText = i18ncp("@info:status", "1 Folder", "%1 Folders", folderCount); + filesText = i18ncp("@info:status", "1 File", "%1 Files", fileCount); } - return text; + if (fileCount > 0 && folderCount > 0) { + summary = i18nc("@info:status folders, files (size)", "%1, %2 (%3)", + foldersText, filesText, fileSizeText(totalFileSize)); + } else if (fileCount > 0) { + summary = i18nc("@info:status files (size)", "%1 (%2)", filesText, fileSizeText(totalFileSize)); + } else if (folderCount > 0) { + summary = foldersText; + } + + return summary; } QList DolphinView::versionControlActions(const KFileItemList& items) const @@ -647,69 +692,20 @@ void DolphinView::pasteIntoFolder() } } -void DolphinView::setPreviewsShown(bool show) +bool DolphinView::eventFilter(QObject* watched, QEvent* event) { - if (previewsShown() == show) { - return; - } - - ViewProperties props(url()); - props.setPreviewsShown(show); - - m_container->setPreviewsShown(show); - emit previewsShownChanged(show); -} - -void DolphinView::setHiddenFilesShown(bool show) -{ - if (m_dirLister->showingDotFiles() == show) { - return; - } - - const KFileItemList itemList = selectedItems(); - m_selectedUrls.clear(); - m_selectedUrls = itemList.urlList(); - - ViewProperties props(url()); - props.setHiddenFilesShown(show); - - m_dirLister->setShowingDotFiles(show); - m_dirLister->emitChanges(); - emit hiddenFilesShownChanged(show); -} + switch (event->type()) { + case QEvent::FocusIn: + if (watched == m_container) { + setActive(true); + } + break; -void DolphinView::setCategorizedSorting(bool categorized) -{ - if (categorized == categorizedSorting()) { - return; + default: + break; } - ViewProperties props(url()); - props.setCategorizedSorting(categorized); - props.save(); - - //m_viewAccessor.proxyModel()->setCategorizedModel(categorized); - - emit categorizedSortingChanged(categorized); -} - -void DolphinView::mouseReleaseEvent(QMouseEvent* event) -{ - QWidget::mouseReleaseEvent(event); - setActive(true); -} - -void DolphinView::contextMenuEvent(QContextMenuEvent* event) -{ - Q_UNUSED(event); - - const QPoint pos = m_container->mapFromGlobal(QCursor::pos()); - 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 slotContextMenuRequested()) - requestContextMenu(KFileItem(), url(), QList()); - } + return QWidget::eventFilter(watched, event); } void DolphinView::wheelEvent(QWheelEvent* event) @@ -760,14 +756,71 @@ void DolphinView::slotItemMiddleClicked(int index) } } -void DolphinView::slotContextMenuRequested(int index, const QPointF& pos) +void DolphinView::slotItemContextMenuRequested(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()); + emit requestContextMenu(pos.toPoint(), item, url(), QList()); +} + +void DolphinView::slotViewContextMenuRequested(const QPointF& pos) +{ + if (GeneralSettings::showToolTips()) { + m_toolTipManager->hideToolTip(); + } + emit requestContextMenu(pos.toPoint(), KFileItem(), url(), QList()); +} + +void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos) +{ + QWeakPointer menu = new KMenu(QApplication::activeWindow()); + + KItemListView* view = m_container->controller()->view(); + const QSet visibleRolesSet = view->visibleRoles().toSet(); + + // Add all roles to the menu that can be shown or hidden by the user + const AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance(); + const QList keys = infoAccessor.keys(); + foreach (const DolphinView::AdditionalInfo info, keys) { + const QByteArray& role = infoAccessor.role(info); + if (role != "name") { + const QString text = fileItemModel()->roleDescription(role); + + QAction* action = menu.data()->addAction(text); + action->setCheckable(true); + action->setChecked(visibleRolesSet.contains(role)); + action->setData(info); + } + } + + QAction* action = menu.data()->exec(pos.toPoint()); + if (action) { + // Show or hide the selected role + const DolphinView::AdditionalInfo info = + static_cast(action->data().toInt()); + + ViewProperties props(url()); + QList infoList = props.additionalInfoList(); + + const QByteArray selectedRole = infoAccessor.role(info); + QList visibleRoles = view->visibleRoles(); + + if (action->isChecked()) { + const int index = keys.indexOf(info) + 1; + visibleRoles.insert(index, selectedRole); + infoList.insert(index, info); + } else { + visibleRoles.removeOne(selectedRole); + infoList.removeOne(info); + } + + view->setVisibleRoles(visibleRoles); + props.setAdditionalInfoList(infoList); + } + + delete menu.data(); } void DolphinView::slotItemExpansionToggleClicked(int index) @@ -786,7 +839,7 @@ void DolphinView::slotItemHovered(int index) const KFileItem item = fileItemModel()->fileItem(index); if (GeneralSettings::showToolTips()) { - QRectF itemRect = m_container->controller()->view()->itemBoundingRect(index); + QRectF itemRect = m_container->controller()->view()->itemRect(index); const QPoint pos = m_container->mapToGlobal(itemRect.topLeft().toPoint()); itemRect.moveTo(pos); @@ -851,18 +904,6 @@ void DolphinView::emitSelectionChangedSignal() emit selectionChanged(selectedItems()); } -void DolphinView::openContextMenu(const QPoint& pos, - const QList& customActions) -{ - KFileItem item; - const int index = m_container->controller()->view()->itemAt(pos); - if (index >= 0) { - item = fileItemModel()->fileItem(index); - } - - emit requestContextMenu(item, url(), customActions); -} - void DolphinView::dropUrls(const KFileItem& destItem, const KUrl& destPath, QDropEvent* event) @@ -1153,15 +1194,15 @@ void DolphinView::applyViewProperties() emit hiddenFilesShownChanged(hiddenFilesShown); } -/* m_storedCategorizedSorting = props.categorizedSorting(); - const bool categorized = m_storedCategorizedSorting && supportsCategorizedSorting(); - if (categorized != m_viewAccessor.proxyModel()->isCategorizedModel()) { - m_viewAccessor.proxyModel()->setCategorizedModel(categorized); - emit categorizedSortingChanged(); - }*/ + KFileItemModel* model = fileItemModel(); + + const bool groupedSorting = props.groupedSorting(); + if (groupedSorting != model->groupedSorting()) { + model->setGroupedSorting(groupedSorting); + emit groupedSortingChanged(groupedSorting); + } const DolphinView::Sorting sorting = props.sorting(); - KFileItemModel* model = fileItemModel(); const QByteArray newSortRole = sortRoleForSorting(sorting); if (newSortRole != model->sortRole()) { model->setSortRole(newSortRole); @@ -1317,9 +1358,27 @@ DolphinView::Sorting DolphinView::sortingForSortRole(const QByteArray& sortRole) return sortHash.value(sortRole); } -void DolphinView::markUrlAsCurrent(const KUrl& url) +QString DolphinView::fileSizeText(KIO::filesize_t fileSize) { - m_currentItemUrl = url; + const KLocale* locale = KGlobal::locale(); + const unsigned int multiplier = (locale->binaryUnitDialect() == KLocale::MetricBinaryDialect) + ? 1000 : 1024; + + QString text; + if (fileSize < multiplier) { + // Show the size in bytes + text = locale->formatByteSize(fileSize, 0, KLocale::DefaultBinaryDialect, KLocale::UnitByte); + } else if (fileSize < multiplier * multiplier) { + // Show the size in kilobytes and always round up. This is done + // for consistency with the values shown e.g. in the "Size" column + // of the details-view. + fileSize += (multiplier / 2) - 1; + text = locale->formatByteSize(fileSize, 0, KLocale::DefaultBinaryDialect, KLocale::UnitKiloByte); + } else { + // Show the size in the best fitting unit having one decimal + text = locale->formatByteSize(fileSize, 1); + } + return text; } #include "dolphinview.moc"