feat(menu): use shared context menu on desktop

main
reionwong 3 weeks ago
parent 1fb185563c
commit 835d5962d0

@ -1499,6 +1499,11 @@ void FolderModel::setWallpaperSelected()
iface.call("setWallpaper", url.toLocalFile());
}
void FolderModel::prepareContextMenu()
{
updateActions();
}
void FolderModel::openContextMenu(QQuickItem *visualParent, Qt::KeyboardModifiers modifiers)
{
Q_UNUSED(modifiers);

@ -217,6 +217,7 @@ public:
Q_INVOKABLE void setWallpaperSelected();
Q_INVOKABLE void prepareContextMenu();
Q_INVOKABLE void openContextMenu(QQuickItem *visualParent = nullptr, Qt::KeyboardModifiers modifiers = Qt::NoModifier);
Q_INVOKABLE void openPropertiesDialog();
Q_INVOKABLE void openInTerminal();

@ -2,6 +2,7 @@
<qresource prefix="/">
<file>qml/main.qml</file>
<file>qml/FolderPage.qml</file>
<file>qml/FolderContextMenu.qml</file>
<file>qml/ArchiveProgressDialog.qml</file>
<file>qml/SideBar.qml</file>
<file>qml/FolderListItem.qml</file>

@ -62,6 +62,11 @@ Item {
_folderView.contentWidth, _folderView.contentHeight)
}
FolderContextMenu {
id: desktopMenu
folderModel: dirModel
}
ArchiveProgressDialog {
id: archiveProgressDialog
archiveModel: dirModel
@ -97,6 +102,9 @@ Item {
flow: GridView.FlowTopToBottom
delegate: FolderGridItem {}
useCustomContextMenu: true
onContextMenuRequested: desktopMenu.popup()
onIconSizeChanged: {
globalSettings.desktopIconSize = _folderView.iconSize

@ -0,0 +1,248 @@
import QtQuick 2.12
import FishUI 1.0 as FishUI
FishUI.DesktopMenu {
id: control
property var folderModel: null
property bool hasSelection: folderModel ? folderModel.selectionCount > 0 : false
FishUI.MenuItem {
id: newFolderItem
property var modelAction: control.folderModel ? control.folderModel.action("newFolder") : null
text: modelAction ? modelAction.text : qsTr("New Folder")
visible: !control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuItem {
id: newDocumentsItem
text: qsTr("New Documents")
visible: !control.hasSelection && newTextFileItem.visible
childMenu: FishUI.DesktopMenu {
id: newDocumentsMenu
FishUI.MenuItem {
id: newTextFileItem
property var modelAction: control.folderModel ? control.folderModel.action("newTextFile") : null
text: modelAction ? modelAction.text : qsTr("New Text")
visible: modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
}
}
FishUI.MenuSeparator {
visible: !control.hasSelection &&
(newFolderItem.visible || newDocumentsItem.visible)
}
FishUI.MenuItem {
id: pasteItem
property var modelAction: control.folderModel ? control.folderModel.action("paste") : null
text: modelAction ? modelAction.text : qsTr("Paste")
visible: !control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuItem {
id: selectAllItem
text: qsTr("Select All")
visible: !control.hasSelection
onTriggered: control.folderModel.selectAll()
}
FishUI.MenuSeparator {
visible: !control.hasSelection &&
(terminalItem.visible || changeBackgroundItem.visible)
}
FishUI.MenuItem {
id: terminalItem
property var modelAction: control.folderModel ? control.folderModel.action("terminal") : null
text: modelAction ? modelAction.text : qsTr("Open in Terminal")
visible: !control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuItem {
id: changeBackgroundItem
property var modelAction: control.folderModel ? control.folderModel.action("changeBackground") : null
text: modelAction ? modelAction.text : qsTr("Change background")
visible: !control.hasSelection && control.folderModel && control.folderModel.isDesktop &&
modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuSeparator {
visible: !control.hasSelection && showHiddenItem.visible
}
FishUI.MenuItem {
id: showHiddenItem
property var modelAction: control.folderModel ? control.folderModel.action("showHidden") : null
text: modelAction ? modelAction.text : qsTr("Show hidden files")
visible: !control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
checkable: true
checked: modelAction ? modelAction.checked : false
onTriggered: modelAction.trigger()
}
FishUI.MenuSeparator {
visible: !control.hasSelection && emptyTrashItem.visible
}
FishUI.MenuItem {
id: emptyTrashItem
property var modelAction: control.folderModel ? control.folderModel.action("emptyTrash") : null
text: modelAction ? modelAction.text : qsTr("Empty Trash")
visible: !control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuItem {
id: restoreItem
property var modelAction: control.folderModel ? control.folderModel.action("restore") : null
text: modelAction ? modelAction.text : qsTr("Restore")
visible: control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuItem {
id: openItem
property var modelAction: control.folderModel ? control.folderModel.action("open") : null
text: modelAction ? modelAction.text : qsTr("Open")
visible: control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuItem {
id: openInNewWindowItem
property var modelAction: control.folderModel ? control.folderModel.action("openInNewWindow") : null
text: modelAction ? modelAction.text : qsTr("Open in new window")
visible: control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuItem {
id: openWithItem
property var modelAction: control.folderModel ? control.folderModel.action("openWith") : null
text: modelAction ? modelAction.text : qsTr("Open with")
visible: control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuItem {
id: compressItem
property var modelAction: control.folderModel ? control.folderModel.action("compress") : null
text: modelAction ? modelAction.text : qsTr("Compress")
visible: control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuSeparator {
visible: control.hasSelection &&
(cutItem.visible || copyItem.visible || trashItem.visible ||
deleteItem.visible || renameItem.visible)
}
FishUI.MenuItem {
id: cutItem
property var modelAction: control.folderModel ? control.folderModel.action("cut") : null
text: modelAction ? modelAction.text : qsTr("Cut")
visible: control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuItem {
id: copyItem
property var modelAction: control.folderModel ? control.folderModel.action("copy") : null
text: modelAction ? modelAction.text : qsTr("Copy")
visible: control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuItem {
id: trashItem
property var modelAction: control.folderModel ? control.folderModel.action("trash") : null
text: modelAction ? modelAction.text : qsTr("Move To Trash")
visible: control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuItem {
id: deleteItem
property var modelAction: control.folderModel ? control.folderModel.action("del") : null
text: modelAction ? modelAction.text : qsTr("Delete")
visible: control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuItem {
id: renameItem
property var modelAction: control.folderModel ? control.folderModel.action("rename") : null
text: modelAction ? modelAction.text : qsTr("Rename")
visible: control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuSeparator {
visible: control.hasSelection &&
(terminalSelectedItem.visible || wallpaperItem.visible)
}
FishUI.MenuItem {
id: terminalSelectedItem
property var modelAction: control.folderModel ? control.folderModel.action("terminal") : null
text: modelAction ? modelAction.text : qsTr("Open in Terminal")
visible: control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuItem {
id: wallpaperItem
property var modelAction: control.folderModel ? control.folderModel.action("wallpaper") : null
text: modelAction ? modelAction.text : qsTr("Set as Wallpaper")
visible: control.hasSelection && modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
FishUI.MenuSeparator {
visible: propertiesItem.visible
}
FishUI.MenuItem {
id: propertiesItem
property var modelAction: control.folderModel ? control.folderModel.action("properties") : null
text: modelAction ? modelAction.text : qsTr("Properties")
visible: modelAction && modelAction.visible
enabled: modelAction ? modelAction.enabled : false
onTriggered: modelAction.trigger()
}
onVisibleChanged: {
if (visible && folderModel)
folderModel.prepareContextMenu()
}
}

@ -30,6 +30,7 @@ GridView {
objectName: "FolderGridView"
property bool isDesktopView: false
property bool useCustomContextMenu: false
property Item rubberBand: null
property Item hoveredItem: null
@ -65,6 +66,7 @@ GridView {
property bool scrollDown: false
signal keyPress(var event)
signal contextMenuRequested()
cacheBuffer: Math.max(0, control.height * 1.5)
reuseItems: true
@ -142,6 +144,15 @@ GridView {
}
}
function openContextMenu(modifiers) {
if (control.useCustomContextMenu) {
dirModel.prepareContextMenu()
control.contextMenuRequested()
} else {
dirModel.openContextMenu(null, modifiers)
}
}
function reset() {
currentIndex = -1
anchorIndex = 0
@ -373,7 +384,7 @@ GridView {
// Item
if (mouse.buttons & Qt.RightButton) {
clearPressState()
dirModel.openContextMenu(null, mouse.modifiers)
control.openContextMenu(mouse.modifiers)
mouse.accepted = true
}
} else {
@ -386,7 +397,7 @@ GridView {
//
if (mouse.buttons & Qt.RightButton) {
clearPressState()
dirModel.openContextMenu(null, mouse.modifiers)
control.openContextMenu(mouse.modifiers)
mouse.accepted = true
}
}

@ -46,12 +46,14 @@ ListView {
property variant cPress: null
property Item editor: null
property int anchorIndex: 0
property bool useCustomContextMenu: false
property var itemHeight: FishUI.Units.fontMetrics.height * 2 + FishUI.Units.smallSpacing
property variant cachedRectangleSelection: null
signal keyPress(var event)
signal contextMenuRequested()
clip: true
cacheBuffer: width
@ -88,6 +90,15 @@ ListView {
}
}
function openContextMenu(modifiers) {
if (control.useCustomContextMenu) {
dirModel.prepareContextMenu()
control.contextMenuRequested()
} else {
dirModel.openContextMenu(null, modifiers)
}
}
function reset() {
currentIndex = -1
anchorIndex = 0
@ -264,7 +275,7 @@ ListView {
if (mouse.buttons & Qt.RightButton) {
clearPressState()
dirModel.openContextMenu(null, mouse.modifiers)
control.openContextMenu(mouse.modifiers)
mouse.accepted = true
}
} else {
@ -288,7 +299,7 @@ ListView {
if (mouse.buttons & Qt.RightButton) {
clearPressState()
dirModel.openContextMenu(null, mouse.modifiers)
control.openContextMenu(mouse.modifiers)
mouse.accepted = true
}
}

@ -193,18 +193,9 @@ Item {
_viewLoader.item.contentWidth, _viewLoader.item.contentHeight)
}
FishUI.DesktopMenu {
FolderContextMenu {
id: folderMenu
MenuItem {
text: qsTr("Open")
onTriggered: dirModel.openSelected()
}
MenuItem {
text: qsTr("Properties")
onTriggered: dirModel.openPropertiesDialog()
}
folderModel: dirModel
}
ColumnLayout {
@ -323,6 +314,9 @@ Item {
id: _gridView
model: dirModel
delegate: FolderGridItem {}
useCustomContextMenu: true
onContextMenuRequested: folderMenu.popup()
leftMargin: FishUI.Units.smallSpacing
rightMargin: FishUI.Units.largeSpacing
@ -346,6 +340,9 @@ Item {
FolderListView {
id: _folderListView
model: dirModel
useCustomContextMenu: true
onContextMenuRequested: folderMenu.popup()
topMargin: FishUI.Units.smallSpacing
leftMargin: FishUI.Units.largeSpacing

@ -25,7 +25,7 @@ import FishUI 1.0 as FishUI
FishUI.DesktopMenu {
id: control
MenuItem {
FishUI.MenuItem {
Layout.fillWidth: true
Image {
@ -63,7 +63,7 @@ FishUI.DesktopMenu {
onTriggered: settings.viewMethod = 1
}
MenuItem {
FishUI.MenuItem {
Layout.fillWidth: true
Image {
@ -101,11 +101,11 @@ FishUI.DesktopMenu {
onTriggered: settings.viewMethod = 0
}
MenuSeparator {
FishUI.MenuSeparator {
Layout.fillWidth: true
}
MenuItem {
FishUI.MenuItem {
Layout.fillWidth: true
// Image {
@ -143,7 +143,7 @@ FishUI.DesktopMenu {
onTriggered: settings.sortMode = 0
}
MenuItem {
FishUI.MenuItem {
Layout.fillWidth: true
// Image {
@ -181,7 +181,7 @@ FishUI.DesktopMenu {
onTriggered: settings.sortMode = 2
}
MenuItem {
FishUI.MenuItem {
Text {
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
@ -205,7 +205,7 @@ FishUI.DesktopMenu {
onTriggered: settings.sortMode = 6
}
MenuItem {
FishUI.MenuItem {
Layout.fillWidth: true
// Image {

@ -116,7 +116,7 @@ ListView {
FishUI.DesktopMenu {
id: _menu
MenuItem {
FishUI.MenuItem {
text: qsTr("Open")
onTriggered: {
@ -127,7 +127,7 @@ ListView {
}
}
MenuItem {
FishUI.MenuItem {
text: qsTr("Open in new window")
onTriggered: {
@ -135,12 +135,12 @@ ListView {
}
}
MenuSeparator {
FishUI.MenuSeparator {
Layout.fillWidth: true
visible: _ejectMenuItem.visible || _umountMenuItem.visible
}
MenuItem {
FishUI.MenuItem {
id: _ejectMenuItem
text: qsTr("Eject")
visible: model.isDevice &&
@ -153,7 +153,7 @@ ListView {
}
}
MenuItem {
FishUI.MenuItem {
id: _umountMenuItem
text: qsTr("Unmount")
visible: model.isDevice &&

Loading…
Cancel
Save