#include <KIO/Paste>
#include <KIO/PasteJob>
#include <KIO/RenameFileDialog>
+#include <KJob>
#include <KJobWidgets>
#include <KLocalizedString>
#include <KMessageBox>
applyModeToView();
KItemListController *controller = new KItemListController(m_model, m_view, this);
- const int delay = GeneralSettings::autoExpandFolders() ? 750 : -1;
- controller->setAutoActivationDelay(delay);
+ controller->setAutoActivationEnabled(GeneralSettings::autoExpandFolders());
connect(controller, &KItemListController::doubleClickViewBackground, this, &DolphinView::doubleClickViewBackground);
// The EnlargeSmallPreviews setting can only be changed after the model
return m_model->sortOrder();
}
+void DolphinView::setGroupRole(const QByteArray &role)
+{
+ if (role != groupRole()) {
+ ViewProperties props(viewPropertiesUrl());
+ props.setGroupRole(role);
+
+ KItemModelBase *model = m_container->controller()->model();
+ model->setGroupRole(role);
+
+ Q_EMIT groupRoleChanged(role);
+ }
+}
+
+QByteArray DolphinView::groupRole() const
+{
+ const KItemModelBase *model = m_container->controller()->model();
+ return model->groupRole();
+}
+
+void DolphinView::setGroupOrder(Qt::SortOrder order)
+{
+ if (groupOrder() != order) {
+ ViewProperties props(viewPropertiesUrl());
+ props.setGroupOrder(order);
+
+ m_model->setGroupOrder(order);
+
+ Q_EMIT groupOrderChanged(order);
+ }
+}
+
+Qt::SortOrder DolphinView::groupOrder() const
+{
+ return m_model->groupOrder();
+}
+
void DolphinView::setSortFoldersFirst(bool foldersFirst)
{
if (sortFoldersFirst() != foldersFirst) {
m_view->readSettings();
applyViewProperties();
- const int delay = GeneralSettings::autoExpandFolders() ? 750 : -1;
- m_container->controller()->setAutoActivationDelay(delay);
+ m_container->controller()->setAutoActivationEnabled(GeneralSettings::autoExpandFolders());
const int newZoomLevel = m_view->zoomLevel();
if (newZoomLevel != oldZoomLevel) {
using Iface = KIO::AskUserActionInterface;
auto *trashJob = new KIO::DeleteOrTrashJob(list, Iface::Delete, Iface::DefaultConfirmation, this);
- connect(trashJob, &KJob::result, this, &DolphinView::slotTrashFileFinished);
+ connect(trashJob, &KJob::result, this, &DolphinView::slotDeleteFileFinished);
m_selectNextItem = true;
trashJob->start();
}
connect(job, &KIO::CopyJob::result, this, &DolphinView::slotJobResult);
connect(job, &KIO::CopyJob::copying, this, &DolphinView::slotItemCreatedFromJob);
connect(job, &KIO::CopyJob::copyingDone, this, &DolphinView::slotItemCreatedFromJob);
+ connect(job, &KIO::CopyJob::warning, this, [this](KJob *job, const QString & /* warning */) {
+ Q_EMIT errorMessage(job->errorString(), job->error());
+ });
KIO::FileUndoManager::self()->recordCopyJob(job);
}
connect(job, &KIO::CopyJob::result, this, &DolphinView::slotJobResult);
connect(job, &KIO::CopyJob::moving, this, &DolphinView::slotItemCreatedFromJob);
connect(job, &KIO::CopyJob::copyingDone, this, &DolphinView::slotItemCreatedFromJob);
+ connect(job, &KIO::CopyJob::warning, this, [this](KJob *job, const QString & /*warning */) {
+ Q_EMIT errorMessage(job->errorString(), job->error());
+ });
KIO::FileUndoManager::self()->recordCopyJob(job);
}
connect(job, &KIO::CopyJob::result, this, &DolphinView::slotJobResult);
connect(job, &KIO::CopyJob::copyingDone, this, &DolphinView::slotItemCreatedFromJob);
connect(job, &KIO::CopyJob::copyingLinkDone, this, &DolphinView::slotItemLinkCreatedFromJob);
+ connect(job, &KIO::CopyJob::warning, this, [this](KJob *job, const QString & /*warning*/) {
+ Q_EMIT errorMessage(job->errorString(), job->error());
+ });
KIO::FileUndoManager::self()->recordCopyJob(job);
}
}
if (m_selectionChangedTimer->isActive()) {
emitSelectionChangedSignal();
}
+ if (m_twoClicksRenamingTimer->isActive()) {
+ abortTwoClicksRenaming();
+ }
const KFileItem item = m_model->fileItem(index);
Q_EMIT requestContextMenu(pos.toPoint(), item, selectedItems(), url());
connect(job, &KIO::DropJob::copyJobStarted, this, [this](const KIO::CopyJob *copyJob) {
connect(copyJob, &KIO::CopyJob::copying, this, &DolphinView::slotItemCreatedFromJob);
connect(copyJob, &KIO::CopyJob::moving, this, &DolphinView::slotItemCreatedFromJob);
+ connect(copyJob, &KIO::CopyJob::warning, this, [this](KJob *job, const QString & /*warning*/) {
+ Q_EMIT errorMessage(job->errorString(), job->error());
+ });
connect(copyJob, &KIO::CopyJob::linking, this, [this](KIO::Job *job, const QString &src, const QUrl &dest) {
Q_UNUSED(job)
Q_UNUSED(src)
if (!selectedItems.isEmpty()) {
selectionManager->beginAnchoredSelection(selectionManager->currentItem());
selectionManager->setSelectedItems(selectedItems);
- selectionManager->endAnchoredSelection();
if (shouldScrollToCurrentItem) {
m_view->scrollToItem(selectedItems.first());
}
Q_ASSERT_X(false, "DolphinView", "Selecting the next item failed.");
return;
}
- const auto lastSelectedIndex = m_model->index(selectedItems().last());
+ const auto lastSelectedIndex = m_model->index(selectedItems().constLast());
if (lastSelectedIndex < 0) {
Q_ASSERT_X(false, "DolphinView", "Selecting the next item failed.");
return;
Q_EMIT directoryLoadingCompleted();
+ applyDynamicView();
updatePlaceholderLabel();
updateWritableState();
}
Q_EMIT sortOrderChanged(sortOrder);
}
+ const QByteArray groupRole = props.groupRole();
+ if (groupRole != m_model->groupRole()) {
+ m_model->setGroupRole(groupRole);
+ Q_EMIT groupRoleChanged(groupRole);
+ }
+
+ const Qt::SortOrder groupOrder = props.groupOrder();
+ if (groupOrder != m_model->groupOrder()) {
+ m_model->setGroupOrder(groupOrder);
+ Q_EMIT groupOrderChanged(groupOrder);
+ }
+
const bool sortFoldersFirst = props.sortFoldersFirst();
if (sortFoldersFirst != m_model->sortDirectoriesFirst()) {
m_model->setSortDirectoriesFirst(sortFoldersFirst);
}
}
+void DolphinView::applyDynamicView()
+{
+ ViewProperties props(viewPropertiesUrl());
+ /* return early if:
+ * - dynamic view is not enabled
+ * - the current view mode is already Icon View
+ * - dynamic view has previously changed the view mode
+ */
+ if (!GeneralSettings::dynamicView() || m_mode == IconsView || props.dynamicViewPassed()) {
+ return;
+ }
+
+ uint imageAndVideoCount = 0;
+ uint checkedItems = 0;
+ const uint totalItems = itemsCount();
+ const KFileItemList itemList = items();
+ bool applyDynamicView = false;
+
+ for (const auto &file : itemList) {
+ ++checkedItems;
+ const QString type = file.mimetype().slice(0, 5);
+
+ if (type == "image" || type == "video") {
+ ++imageAndVideoCount;
+ // if 2/3 or more of the items are images/videos, dynamic view should be applied
+ applyDynamicView = imageAndVideoCount >= (totalItems * 2 / 3);
+ if (applyDynamicView) {
+ break;
+ }
+ } else if (checkedItems - imageAndVideoCount > totalItems / 3) {
+ // if more than a third of the checked files are not media files, return
+ return;
+ }
+ }
+
+ if (!applyDynamicView) {
+ return;
+ }
+
+ props.setAutoSaveEnabled(!GeneralSettings::globalViewProps());
+ props.setDynamicViewPassed(true);
+ props.setViewMode(IconsView);
+ applyViewProperties(props);
+}
+
void DolphinView::pasteToUrl(const QUrl &url)
{
KIO::PasteJob *job = KIO::paste(QApplication::clipboard()->mimeData(), url);
connect(job, &KIO::PasteJob::copyJobStarted, this, [this](const KIO::CopyJob *copyJob) {
connect(copyJob, &KIO::CopyJob::copying, this, &DolphinView::slotItemCreatedFromJob);
connect(copyJob, &KIO::CopyJob::moving, this, &DolphinView::slotItemCreatedFromJob);
+ connect(copyJob, &KIO::CopyJob::warning, this, [this](KJob *job, const QString & /*warning*/) {
+ Q_EMIT errorMessage(job->errorString(), job->error());
+ });
connect(copyJob, &KIO::CopyJob::linking, this, [this](KIO::Job *job, const QString &src, const QUrl &dest) {
Q_UNUSED(job)
Q_UNUSED(src)
const KFileItem item = m_model->fileItem(index.value());
const QString text = item.text();
const QPoint pos = mapToGlobal(event->pos());
- QToolTip::showText(pos, text);
+ QToolTip::showText(pos, text, this);
return true;
}
}