WME Shortcuts+

Shortcuts for multiple WME functions

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         WME Shortcuts+
// @description  Shortcuts for multiple WME functions
// @icon         data:image/png;base64,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
// @author       N190392
// @match        https://*.waze.com/*editor*
// @version      0.5
// @require      https://greasyfork.org/scripts/24851-wazewrap/code/WazeWrap.js
// @namespace    https://greasyfork.org/en/scripts/517140-wme-shortcuts
// @grant        GM_xmlhttpRequest
// @license      MIT
// ==/UserScript==

/* global W */
/* global WazeWrap */

(function() {
    'use strict';

    const SCRIPT_NAME = 'WME Shortcuts+';
    const SCRIPT_VERSION = '0.5';
    const UPDATE_MESSAGE = '';
    const FORUM_URL = '';
    const DOWNLOAD_URL = '';
    const EXTERNAL_SETTINGS_NAME = 'WME_SHORTCUTS_PLUS_SETTINGS';

    // *** 1 ADD SHORTCUTS HERE *** //
    const EXTERNAL_SETTINGS = {
        pressPieEditGeomShortcut: '',
        clickOtherPointShortcut: '',
        toggleRankShortcut: '',
        clickOtherPolygonShortcut: '',
        highlightSmallVenuesShortcut: '',
        wmeutkadastrsShortcut: ''
    };

    // *** 2 FUNCTIONS *** //
    // Function to create Other point
    function clickOtherPoint() {
        notifyAction("Creating 'Other' point");
        const menuItems = document.querySelectorAll('wz-menu-item');
        let pointButtonFound = false;

        menuItems.forEach(item => {
            const label = item.querySelector('.itemLabel--kXZjU');
            if (label && ["Cits", "Other"].includes(label.textContent.trim())) {
                const pointButton = item.querySelector('wz-button.point');
                if (pointButton) {
                    pointButton.click();
                    console.log("WME Shortcuts+: Other (point) activated successfully.");
                    pointButtonFound = true;
                }
            }
        });

        if (!pointButtonFound) {
            console.log("WME Shortcuts+: 'Other' button not found.");
        }
    }

    // Function to create Other polygon
    function clickOtherPolygon() {
        notifyAction("Creating 'Other' polygon");
        const menuItems = document.querySelectorAll('wz-menu-item');
        let PolygonButtonFound = false;

        menuItems.forEach(item => {
            const label = item.querySelector('.itemLabel--kXZjU');
            if (label && ["Cits", "Other"].includes(label.textContent.trim())) {
                const PolygonButton = item.querySelector('wz-button.polygon');
                if (PolygonButton) {
                    PolygonButton.click();
                    console.log("WME Shortcuts+: Other (polygon) activated successfully.");
                    PolygonButtonFound = true;
                }
            }
        });

        if (!PolygonButtonFound) {
            console.log("WME Shortcuts+: 'Other' button not found.");
        }
    }

    // Function to toggle rank to 2 and transoform point to polygon
    function toggleRank() {
        notifyAction("Rank 2 & Polygon");
        const checkableChip = document.querySelector('#lockRank-1');
        if (checkableChip) {
            checkableChip.click();
            console.log("WME Shortcuts+: Local rank changed to 2.");
        }

        const poligonsChip = Array.from(document.querySelectorAll('wz-checkable-chip'))
        .find(chip => ['Poligons', 'Area'].some(text => chip.textContent.includes(text)));
        if (poligonsChip) {
            poligonsChip.click();
            console.log("WME Shortcuts+: Point transformed to polygon");
        }
    }

    // Function to open PIE Geometry settings
    function pressPieEditGeomButton() {
        notifyAction("PIE Geometry settings");
        const button = document.querySelector('#pieEditGeom');
        if (button) {
            button.click();
            console.log("WME Shortcuts+: Opened Geometry menu.");
        }
    }

    // Function to highlight a place with specified colors
    function highlightSmallVenues() {
        notifyAction("Highlight venues < 500 m²");
        //console.log("Starting small venues scan...");
        function highlightAPlace(venue, fg, bg) {
            var poly = W.userscripts.getFeatureElementByDataModel(venue);
            if (poly) {
                if (venue.isPoint()) {
                    poly.setAttribute("fill", fg);
                } else { // area (polygon)
                    poly.setAttribute("stroke", fg);
                    poly.setAttribute("fill", bg);
                    poly.setAttribute("stroke-width", 4);
                }
            }
        }
        // Iterate over all venues
        for (var mark in W.model.venues.objects) {
            var venue = W.model.venues.getObjectById(mark);
            if (!venue) continue;
            if (venue.attributes) {
                try {
                    // Try to get geometry directly from the venue
                    var metersArea = venue.getOLGeometry().getGeodesicArea(W.map.getProjectionObject());
                    // If area is less than 500m², highlight in red
                    if (metersArea < 500) {
                        highlightAPlace(venue, "#f00", "#f99");  // Red stroke, light red fill
                        const message = venue.attributes.name +": " + metersArea.toFixed(2) + " m²";
                        showToast(message);
                    }
                } catch(e) {
                    // Skip venues that cause errors (like points)
                    continue;
                }
            }
        }
    }

    // Function WME UT Kadastrs button
    function wmeutkadastrs() {
        notifyAction("WME UT Kadastrs");
        //console.log("WME UT Kadastrs");
        const wmeutbutton = document.querySelector('.overlay-buttons-container.top wz-button.overlay-button h6.w-icon');
        if (wmeutbutton) {
            wmeutbutton.click();
            console.log("WME UT Kadastrs");
        }
    }

    // *** 3 SHORTCUT MENU *** //
    // WazeWrap Shortcut setup functions
    function addShortcuts() {
        new WazeWrap.Interface.Shortcut(
            'clickOtherPoint',
            'Cits: Izveidot punktu',
            'shortcuts_plus',
            'WME Shortcuts+',
            EXTERNAL_SETTINGS.clickOtherPointShortcut,
            clickOtherPoint,
            null
        ).add();

        new WazeWrap.Interface.Shortcut(
            'clickOtherPolygon',
            'Cits: Izveidot poligonu',
            'shortcuts_plus',
            'WME Shortcuts+',
            EXTERNAL_SETTINGS.clickOtherPolygonShortcut,
            clickOtherPolygon,
            null
        ).add();

        new WazeWrap.Interface.Shortcut(
            'toggleRank',
            'Slēgt ar līmeni (2) & pārveidot punktu par poligonu',
            'shortcuts_plus',
            'WME Shortcuts+',
            EXTERNAL_SETTINGS.toggleRankShortcut,
            toggleRank,
            null
        ).add();

        new WazeWrap.Interface.Shortcut(
            'PressEditGeom',
            'Atvērt ģeometrijas izvēlni',
            'shortcuts_plus',
            'WME Shortcuts+',
            EXTERNAL_SETTINGS.pressPieEditGeomShortcut,
            pressPieEditGeomButton,
            null
        ).add();

        new WazeWrap.Interface.Shortcut(
            'highlightSmallVenues',
            'Iezīmēt vietas, kas ir mazākas par 500m²',
            'shortcuts_plus',
            'WME Shortcuts+',
            EXTERNAL_SETTINGS.highlightSmallVenuesShortcut,
            highlightSmallVenues,
            null
        ).add();

        new WazeWrap.Interface.Shortcut(
            'wmeutkadastrs',
            'WME UT Kadastrs',
            'shortcuts_plus',
            'WME Shortcuts+',
            EXTERNAL_SETTINGS.wmeutkadastrsShortcut,
            wmeutkadastrs,
            null
        ).add();
    }

    // *** 4 MAKE SHORTCUTS CHANGABLE *** //
    function sandboxLoadSettings() {
        const loadedSettings = JSON.parse(localStorage.getItem(EXTERNAL_SETTINGS_NAME)) || {};
        EXTERNAL_SETTINGS.clickOtherPointShortcut = loadedSettings.clickOtherPointShortcut || 'C+1';
        EXTERNAL_SETTINGS.clickOtherPolygonShortcut = loadedSettings.clickOtherPolygonShortcut || 'C+2';
        EXTERNAL_SETTINGS.toggleRankShortcut = loadedSettings.toggleRankShortcut || 'A+2';
        EXTERNAL_SETTINGS.pressPieEditGeomShortcut = loadedSettings.pressPieEditGeomShortcut || 'A+3';
        EXTERNAL_SETTINGS.highlightSmallVenuesShortcut = loadedSettings.highlightSmallVenuesShortcut || 'A+1';
        EXTERNAL_SETTINGS.wmeutkadastrsShortcut = loadedSettings.wmeutkadastrsShortcut || 'A+4';
        addShortcuts();
        $(window).on('beforeunload', () => sandboxSaveSettings());
    }

    function getShortcutKeys(shortcutAction) {
        let keys = '';
        const { shortcut } = shortcutAction;
        if (shortcut) {
            if (shortcut.altKey) keys += 'A';
            if (shortcut.shiftKey) keys += 'S';
            if (shortcut.ctrlKey) keys += 'C';
            if (keys.length) keys += '+';
            if (shortcut.keyCode) keys += shortcut.keyCode;
        }
        return keys;
    }

    function sandboxSaveSettings() {
        EXTERNAL_SETTINGS.clickOtherPointShortcut = getShortcutKeys(W.accelerators.Actions.clickOtherPoint);
        EXTERNAL_SETTINGS.toggleRankShortcut = getShortcutKeys(W.accelerators.Actions.toggleRank);
        EXTERNAL_SETTINGS.pressPieEditGeomShortcut = getShortcutKeys(W.accelerators.Actions.PressEditGeom);
        EXTERNAL_SETTINGS.clickOtherPolygonShortcut = getShortcutKeys(W.accelerators.Actions.clickOtherPolygon);
        EXTERNAL_SETTINGS.highlightSmallVenuesShortcut = getShortcutKeys(W.accelerators.Actions.highlightSmallVenues);  // Add this line
        localStorage.setItem(EXTERNAL_SETTINGS_NAME, JSON.stringify(EXTERNAL_SETTINGS));
    }

    function loadScriptUpdateMonitor() {
        let updateMonitor;
        try {
            updateMonitor = new WazeWrap.Alerts.ScriptUpdateMonitor(
                SCRIPT_NAME,
                SCRIPT_VERSION,
                DOWNLOAD_URL,
                GM_xmlhttpRequest
            );
            updateMonitor.start();
        } catch (ex) {
            console.error(`${SCRIPT_NAME}:`, ex);
        }
    }

    function bootstrap() {
        if (WazeWrap?.Ready) {
            WazeWrap.Interface.ShowScriptUpdate(
                SCRIPT_NAME,
                SCRIPT_VERSION,
                UPDATE_MESSAGE,
                FORUM_URL
            );
            loadScriptUpdateMonitor();
            sandboxLoadSettings();
        } else {
            setTimeout(bootstrap, 250);
        }
    }

    let toastMessages = [];
    let toastTimeout = null;
    let toastElement = null;  // Keep global reference to the toast

    function showToast(message, options = {}) {
        const {
            duration = 4000,
            position = 'bottom-left',
            containerId = 'editor-container'
        } = options;

        const container = document.getElementById(containerId);
        if (!container) return;

        container.style.position = 'relative';

        const positionStyles = {
            'bottom-left': { left: '10px', bottom: '30px' },
            'bottom-right': { right: '10px', bottom: '30px' },
            'top-left': { left: '10px', top: '30px' },
            'top-right': { right: '10px', top: '30px' }
        };

        if (!toastElement || !document.body.contains(toastElement)) {
            toastElement = document.createElement('div');
            toastElement.className = 'wme-toast';
            Object.assign(toastElement.style, {
                position: 'absolute',
                background: '#333',
                color: '#fff',
                padding: '8px 12px',
                borderRadius: '20px',
                boxShadow: '0 0 10px rgba(0,0,0,0.3)',
                zIndex: '9999',
                fontFamily: 'Arial, sans-serif',
                maxWidth: '300px',
                ...positionStyles[position] || positionStyles['bottom-left']
            });

            const list = document.createElement('ul');
            list.id = 'wme-toast-list';
            list.style.paddingLeft = '20px';
            list.style.margin = '0';
            list.style.whiteSpace = 'pre-line';
            toastElement.appendChild(list);
            container.appendChild(toastElement);
        }

        // Prevent duplicate messages
        if (toastMessages.includes(message)) return;

        toastMessages.push(message);

        const list = toastElement.querySelector('#wme-toast-list');
        const item = document.createElement('li');
        item.textContent = message;
        list.appendChild(item);

        if (toastTimeout) clearTimeout(toastTimeout);
        toastTimeout = setTimeout(() => {
            toastElement.remove();
            toastElement = null;
            toastMessages = [];
            toastTimeout = null;
        }, duration);
    }

    let actionPopupTimeout = null;
    let actionPopupElement = null;

    function notifyAction(text, duration = 3000) {
        if (actionPopupElement) {
            actionPopupElement.remove();
            clearTimeout(actionPopupTimeout);
        }

        actionPopupElement = document.createElement('div');
        actionPopupElement.className = 'wme-action-popup';
        Object.assign(actionPopupElement.style, {
            position: 'fixed',
            top: '40px',
            right: '0px',
            background: '#007acc',
            color: '#fff',
            padding: '5px 12px',
            borderRadius: '4px',
            boxShadow: '0 2px 6px rgba(0,0,0,0.3)',
            fontFamily: 'Arial, sans-serif',
            fontSize: '14px',
            zIndex: '99999',
            maxWidth: '300px',
            whiteSpace: 'nowrap'
        });

        actionPopupElement.textContent = `✓ ${text}`;
        document.body.appendChild(actionPopupElement);

        actionPopupTimeout = setTimeout(() => {
            actionPopupElement.remove();
            actionPopupElement = null;
        }, duration);
    }


    bootstrap();
})();