- QMenu menu(this);
-
- QAction* addAction = menu.addAction(QIcon::fromTheme(QStringLiteral("document-new")), i18nc("@item:inmenu", "Add Entry..."));
-
- QAction* showAllAction = menu.addAction(i18nc("@item:inmenu", "Show Hidden Places"));
- showAllAction->setCheckable(true);
- showAllAction->setChecked(m_model->hiddenItemsShown());
- showAllAction->setIcon(QIcon::fromTheme(m_model->hiddenItemsShown() ? QStringLiteral("view-visible") : QStringLiteral("view-hidden")));
- showAllAction->setEnabled(m_model->hiddenCount());
-
- buildGroupContextMenu(&menu, m_controller->indexCloseToMousePressedPosition());
-
- QMenu* iconSizeSubMenu = new QMenu(i18nc("@item:inmenu", "Icon Size"), &menu);
-
- struct IconSizeInfo
- {
- int size;
- const char* context;
- const char* text;
- };
-
- const int iconSizeCount = 4;
- static const IconSizeInfo iconSizes[iconSizeCount] = {
- {KIconLoader::SizeSmall, I18NC_NOOP("Small icon size", "Small (%1x%2)")},
- {KIconLoader::SizeSmallMedium, I18NC_NOOP("Medium icon size", "Medium (%1x%2)")},
- {KIconLoader::SizeMedium, I18NC_NOOP("Large icon size", "Large (%1x%2)")},
- {KIconLoader::SizeLarge, I18NC_NOOP("Huge icon size", "Huge (%1x%2)")}
- };
-
- QHash<QAction*, int> iconSizeActionMap;
- QActionGroup* iconSizeGroup = new QActionGroup(iconSizeSubMenu);
-
- for (int i = 0; i < iconSizeCount; ++i) {
- const int size = iconSizes[i].size;
- const QString text = i18nc(iconSizes[i].context, iconSizes[i].text,
- size, size);
-
- QAction* action = iconSizeSubMenu->addAction(text);
- iconSizeActionMap.insert(action, size);
- action->setActionGroup(iconSizeGroup);
- action->setCheckable(true);
- action->setChecked(m_view->iconSize() == size);
- }
-
- menu.addMenu(iconSizeSubMenu);
-
- menu.addSeparator();
- foreach (QAction* action, customContextMenuActions()) {
- menu.addAction(action);
- }
-
- QAction* action = menu.exec(pos.toPoint());
- if (action) {
- if (action == addAction) {
- addEntry();
- } else if (action == showAllAction) {
- showHiddenEntries(showAllAction->isChecked());
- } else if (iconSizeActionMap.contains(action)) {
- m_view->setIconSize(iconSizeActionMap.value(action));
+ const QModelIndex index = indexAt(event->position().toPoint());
+ if (index.isValid()) {
+ auto *placesModel = static_cast<KFilePlacesModel *>(model());
+
+ // Reject drag ontop of a non-writable protocol
+ // We don't know whether we're dropping inbetween or ontop of a place
+ // so still allow internal drag events so that re-arranging still works.
+ const QUrl url = placesModel->url(index);
+ if (url.isValid() && !isInternalDrag(event->mimeData()) && !KProtocolManager::supportsWriting(url)) {
+ event->setDropAction(Qt::IgnoreAction);