// Copyright (c) 2021 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.

pragma Singleton

import QtQuick 2.10
import QtQuick.Controls 1.1
import QtQuick.Controls 2.3 as Controls2
import UM 1.1 as UM
import Cura 1.0 as Cura

Item
{
    property alias newProject: newProjectAction;
    property alias open: openAction;
    property alias quit: quitAction;

    property alias undo: undoAction;
    property alias redo: redoAction;

    property alias view3DCamera: view3DCameraAction;
    property alias viewFrontCamera: viewFrontCameraAction;
    property alias viewTopCamera: viewTopCameraAction;
    property alias viewBottomCamera: viewBottomCameraAction;
    property alias viewLeftSideCamera: viewLeftSideCameraAction;
    property alias viewRightSideCamera: viewRightSideCameraAction;

    property alias deleteSelection: deleteSelectionAction;
    property alias centerSelection: centerSelectionAction;
    property alias multiplySelection: multiplySelectionAction;

    property alias deleteObject: deleteObjectAction;
    property alias centerObject: centerObjectAction;
    property alias groupObjects: groupObjectsAction;
    property alias unGroupObjects:unGroupObjectsAction;
    property alias mergeObjects: mergeObjectsAction;
    //property alias unMergeObjects: unMergeObjectsAction;

    property alias multiplyObject: multiplyObjectAction;

    property alias selectAll: selectAllAction;
    property alias deleteAll: deleteAllAction;
    property alias reloadAll: reloadAllAction;
    property alias arrangeAllBuildPlates: arrangeAllBuildPlatesAction;
    property alias arrangeAll: arrangeAllAction;
    property alias arrangeSelection: arrangeSelectionAction;
    property alias resetAllTranslation: resetAllTranslationAction;
    property alias resetAll: resetAllAction;

    property alias addMachine: addMachineAction;
    property alias configureMachines: settingsAction;
    property alias addProfile: addProfileAction;
    property alias updateProfile: updateProfileAction;
    property alias resetProfile: resetProfileAction;
    property alias manageProfiles: manageProfilesAction;

    property alias manageMaterials: manageMaterialsAction;
    property alias marketplaceMaterials: marketplaceMaterialsAction;

    property alias preferences: preferencesAction;

    property alias showProfileFolder: showProfileFolderAction;
    property alias documentation: documentationAction;
    property alias showTroubleshooting: showTroubleShootingAction
    property alias reportBug: reportBugAction;
    property alias whatsNew: whatsNewAction
    property alias about: aboutAction;

    property alias toggleFullScreen: toggleFullScreenAction;
    property alias exitFullScreen: exitFullScreenAction

    property alias configureSettingVisibility: configureSettingVisibilityAction

    property alias browsePackages: browsePackagesAction

    UM.I18nCatalog{id: catalog; name: "cura"}


    Action
    {
        id: showTroubleShootingAction
        onTriggered: Qt.openUrlExternally("https://ultimaker.com/en/troubleshooting?utm_source=cura&utm_medium=software&utm_campaign=dropdown-troubleshooting")
        text: catalog.i18nc("@action:inmenu", "Show Online Troubleshooting Guide");
    }

    Action
    {
        id: toggleFullScreenAction
        shortcut: StandardKey.FullScreen
        text: catalog.i18nc("@action:inmenu", "Toggle Full Screen")
        iconName: "view-fullscreen"
    }

    Action
    {
        id: exitFullScreenAction
        shortcut: StandardKey.Cancel
        text: catalog.i18nc("@action:inmenu", "Exit Full Screen")
        iconName: "view-fullscreen"
    }

    Action
    {
        id: undoAction;
        text: catalog.i18nc("@action:inmenu menubar:edit", "&Undo");
        iconName: "edit-undo";
        shortcut: StandardKey.Undo;
        onTriggered: UM.OperationStack.undo();
        enabled: UM.OperationStack.canUndo;
    }

    Action
    {
        id: redoAction;
        text: catalog.i18nc("@action:inmenu menubar:edit", "&Redo");
        iconName: "edit-redo";
        shortcut: StandardKey.Redo;
        onTriggered: UM.OperationStack.redo();
        enabled: UM.OperationStack.canRedo;
    }

    Action
    {
        id: quitAction

        //On MacOS, don't translate the "Quit" word.
        //Qt moves the "quit" entry to a different place, and if it got renamed can't find it again when it attempts to
        //delete the item upon closing the application, causing a crash.
        //In the new location, these items are translated automatically according to the system's language.
        //For more information, see:
        //- https://doc.qt.io/qt-5/macos-issues.html#menu-bar
        //- https://doc.qt.io/qt-5/qmenubar.html#qmenubar-as-a-global-menu-bar
        text: (Qt.platform.os == "osx") ? "&Quit" : catalog.i18nc("@action:inmenu menubar:file", "&Quit")
        iconName: "application-exit"
        shortcut: StandardKey.Quit
    }

    Action
    {
        id: view3DCameraAction
        text: catalog.i18nc("@action:inmenu menubar:view", "3D View")
        onTriggered: UM.Controller.setCameraRotation("3d", 0)
    }

    Action
    {
        id: viewFrontCameraAction
        text: catalog.i18nc("@action:inmenu menubar:view", "Front View")
        onTriggered: UM.Controller.setCameraRotation("home", 0)
    }

    Action
    {
        id: viewTopCameraAction
        text: catalog.i18nc("@action:inmenu menubar:view", "Top View")
        onTriggered: UM.Controller.setCameraRotation("y", 90)
    }

    Action
    {
        id: viewBottomCameraAction
        text: catalog.i18nc("@action:inmenu menubar:view", "Bottom View")
        onTriggered: UM.Controller.setCameraRotation("y", -90)
    }

    Action
    {
        id: viewLeftSideCameraAction
        text: catalog.i18nc("@action:inmenu menubar:view", "Left Side View")
        onTriggered: UM.Controller.setCameraRotation("x", 90)
    }

    Action
    {
        id: viewRightSideCameraAction
        text: catalog.i18nc("@action:inmenu menubar:view", "Right Side View")
        onTriggered: UM.Controller.setCameraRotation("x", -90)
    }

    Action
    {
        id: preferencesAction
        //On MacOS, don't translate the "Configure" word.
        //Qt moves the "configure" entry to a different place, and if it got renamed can't find it again when it
        //attempts to delete the item upon closing the application, causing a crash.
        //In the new location, these items are translated automatically according to the system's language.
        //For more information, see:
        //- https://doc.qt.io/qt-5/macos-issues.html#menu-bar
        //- https://doc.qt.io/qt-5/qmenubar.html#qmenubar-as-a-global-menu-bar
        text: (Qt.platform.os == "osx") ? "Configure Cura..." : catalog.i18nc("@action:inmenu", "Configure Cura...")
        iconName: "configure"
    }

    Action
    {
        id: addMachineAction
        text: catalog.i18nc("@action:inmenu menubar:printer", "&Add Printer...")
    }

    Action
    {
        id: settingsAction
        text: catalog.i18nc("@action:inmenu menubar:printer", "Manage Pr&inters...")
        iconName: "configure"
    }

    Action
    {
        id: manageMaterialsAction
        text: catalog.i18nc("@action:inmenu", "Manage Materials...")
        iconName: "configure"
        shortcut: "Ctrl+K"
    }

    Action
    {
        id: marketplaceMaterialsAction
        text: catalog.i18nc("@action:inmenu", "Add more materials from Marketplace")
    }

    Action
    {
        id: updateProfileAction;
        enabled: !Cura.MachineManager.stacksHaveErrors && Cura.MachineManager.hasUserSettings && Cura.MachineManager.activeQualityChangesGroup != null
        text: catalog.i18nc("@action:inmenu menubar:profile","&Update profile with current settings/overrides");
        onTriggered: Cura.ContainerManager.updateQualityChanges();
    }

    Action
    {
        id: resetProfileAction;
        enabled: Cura.MachineManager.hasUserSettings
        text: catalog.i18nc("@action:inmenu menubar:profile", "&Discard current changes");
        onTriggered:
        {
            forceActiveFocus();
            Cura.ContainerManager.clearUserContainers();
        }
    }

    Action
    {
        id: addProfileAction;
        enabled: !Cura.MachineManager.stacksHaveErrors && Cura.MachineManager.hasUserSettings
        text: catalog.i18nc("@action:inmenu menubar:profile", "&Create profile from current settings/overrides...");
    }

    Action
    {
        id: manageProfilesAction
        text: catalog.i18nc("@action:inmenu menubar:profile", "Manage Profiles...")
        iconName: "configure"
        shortcut: "Ctrl+J"
    }

    Action
    {
        id: documentationAction;
        text: catalog.i18nc("@action:inmenu menubar:help", "Show Online &Documentation");
        iconName: "help-contents";
        shortcut: StandardKey.Help;
        onTriggered: CuraActions.openDocumentation();
    }

    Action {
        id: reportBugAction;
        text: catalog.i18nc("@action:inmenu menubar:help", "Report a &Bug");
        iconName: "tools-report-bug";
        onTriggered: CuraActions.openBugReportPage();
    }

    Action
    {
        id: whatsNewAction;
        text: catalog.i18nc("@action:inmenu menubar:help", "What's New");
    }

    Action
    {
        id: aboutAction;

        //On MacOS, don't translate the "About" word.
        //Qt moves the "about" entry to a different place, and if it got renamed can't find it again when it
        //attempts to delete the item upon closing the application, causing a crash.
        //In the new location, these items are translated automatically according to the system's language.
        //For more information, see:
        //- https://doc.qt.io/qt-5/macos-issues.html#menu-bar
        //- https://doc.qt.io/qt-5/qmenubar.html#qmenubar-as-a-global-menu-bar
        text: (Qt.platform.os == "osx") ? "About..." : catalog.i18nc("@action:inmenu menubar:help", "About...");
        iconName: "help-about";
    }

    Action
    {
        id: deleteSelectionAction;
        text: catalog.i18nc("@action:inmenu menubar:edit", "Delete Selected");
        enabled: UM.Controller.toolsEnabled && UM.Selection.hasSelection;
        iconName: "edit-delete";
        shortcut: StandardKey.Delete | "Backspace"
        onTriggered: CuraActions.deleteSelection();
    }

    Action
    {
        id: centerSelectionAction;
        text: catalog.i18nc("@action:inmenu menubar:edit", "Center Selected");
        enabled: UM.Controller.toolsEnabled && UM.Selection.hasSelection;
        iconName: "align-vertical-center";
        onTriggered: CuraActions.centerSelection();
    }

    Action
    {
        id: multiplySelectionAction;
        text: catalog.i18nc("@action:inmenu menubar:edit", "Multiply Selected");
        enabled: UM.Controller.toolsEnabled && UM.Selection.hasSelection;
        iconName: "edit-duplicate";
        shortcut: "Ctrl+M"
    }

    Action
    {
        id: deleteObjectAction;
        text: catalog.i18nc("@action:inmenu","Delete Model");
        enabled: UM.Controller.toolsEnabled;
        iconName: "edit-delete";
    }

    Action
    {
        id: centerObjectAction;
        text: catalog.i18nc("@action:inmenu","Ce&nter Model on Platform");
    }

    Action
    {
        id: groupObjectsAction
        text: catalog.i18nc("@action:inmenu menubar:edit","&Group Models");
        enabled: UM.Selection.selectionCount > 1 ? true: false
        iconName: "object-group"
        shortcut: "Ctrl+G";
        onTriggered: CuraApplication.groupSelected();
    }

    Action
    {
        id: reloadQmlAction
        onTriggered:
        {
            CuraApplication.reloadQML()
        }
        shortcut: "Shift+F5"
    }

    Action
    {
        id: unGroupObjectsAction
        text: catalog.i18nc("@action:inmenu menubar:edit","Ungroup Models");
        enabled: UM.Selection.isGroupSelected
        iconName: "object-ungroup"
        shortcut: "Ctrl+Shift+G";
        onTriggered: CuraApplication.ungroupSelected();
    }

    Action
    {
        id: mergeObjectsAction
        text: catalog.i18nc("@action:inmenu menubar:edit","&Merge Models");
        enabled: UM.Selection.selectionCount > 1 ? true: false
        iconName: "merge";
        shortcut: "Ctrl+Alt+G";
        onTriggered: CuraApplication.mergeSelected();
    }

    Action
    {
        id: multiplyObjectAction;
        text: catalog.i18nc("@action:inmenu","&Multiply Model...");
        iconName: "edit-duplicate"
    }

    Action
    {
        id: selectAllAction;
        text: catalog.i18nc("@action:inmenu menubar:edit","Select All Models");
        enabled: UM.Controller.toolsEnabled;
        iconName: "edit-select-all";
        shortcut: "Ctrl+A";
        onTriggered: CuraApplication.selectAll();
    }

    Action
    {
        id: deleteAllAction;
        text: catalog.i18nc("@action:inmenu menubar:edit","Clear Build Plate");
        enabled: UM.Controller.toolsEnabled;
        iconName: "edit-delete";
        shortcut: "Ctrl+D";
        onTriggered: CuraApplication.deleteAll();
    }

    Action
    {
        id: reloadAllAction;
        text: catalog.i18nc("@action:inmenu menubar:file","Reload All Models");
        iconName: "document-revert";
        shortcut: "F5"
        onTriggered: CuraApplication.reloadAll();
    }

    Action
    {
        id: arrangeAllBuildPlatesAction;
        text: catalog.i18nc("@action:inmenu menubar:edit","Arrange All Models To All Build Plates");
        onTriggered: Printer.arrangeObjectsToAllBuildPlates();
    }

    Action
    {
        id: arrangeAllAction;
        text: catalog.i18nc("@action:inmenu menubar:edit","Arrange All Models");
        onTriggered: Printer.arrangeAll();
        shortcut: "Ctrl+R";
    }

    Action
    {
        id: arrangeSelectionAction;
        text: catalog.i18nc("@action:inmenu menubar:edit","Arrange Selection");
        onTriggered: Printer.arrangeSelection();
    }

    Action
    {
        id: resetAllTranslationAction;
        text: catalog.i18nc("@action:inmenu menubar:edit","Reset All Model Positions");
        onTriggered: CuraApplication.resetAllTranslation();
    }

    Action
    {
        id: resetAllAction;
        text: catalog.i18nc("@action:inmenu menubar:edit","Reset All Model Transformations");
        onTriggered: CuraApplication.resetAll();
    }

    Action
    {
        id: openAction;
        property var fileProviderModel: CuraApplication.getFileProviderModel()

        text: catalog.i18nc("@action:inmenu menubar:file","&Open File(s)...");
        iconName: "document-open";
        // Unassign the shortcut when there are more than one file providers, since then the file provider's shortcut is
        // enabled instead, and Ctrl+O is assigned to the local file provider
        shortcut: fileProviderModel.count == 1 ? StandardKey.Open : "";
    }

    Action
    {
        id: newProjectAction
        text: catalog.i18nc("@action:inmenu menubar:file","&New Project...");
        shortcut: StandardKey.New
    }

    Action
    {
        id: showProfileFolderAction;
        text: catalog.i18nc("@action:inmenu menubar:help","Show Configuration Folder");
    }


    Action
    {
        id: configureSettingVisibilityAction
        text: catalog.i18nc("@action:menu", "Configure setting visibility...");
        iconName: "configure"
    }

    Action
    {
        id: browsePackagesAction
        text: catalog.i18nc("@action:menu", "&Marketplace")
        iconName: "plugins_browse"
    }
}
