WME Mobil Fix

Ermöglicht das Anpassen der Straßenbreite und das Auswählen von Segmenten beim Hovern.

当前为 2025-05-18 提交的版本,查看 最新版本

// ==UserScript==
// @name         WME Mobil Fix
// @namespace    https://greasyfork.org/de/users/863740-horst-wittlich
// @version      2015.05.30
// @description  Ermöglicht das Anpassen der Straßenbreite und das Auswählen von Segmenten beim Hovern.
// @author       Hiwi234
// @match        https://www.waze.com/editor*
// @match        https://beta.waze.com/editor*
// @match        https://www.waze.com/*/editor*
// @match        https://beta.waze.com/*/editor*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    let slider = null; // Referenz zum Slider
    let valueDisplay = null; // Referenz zur Wertanzeige des Sliders
    let sliderStatus = null; // Referenz zur Statusanzeige des Sliders
    let tabPaneElement = null; // Referenz zum Tab-Inhaltsbereich

    // Funktion zum Anwenden der Straßenbreite
    function applyStreetWidth(currentValue) {
        if (!W || !W.model || !W.model.segments || !W.userscripts) {
            console.warn('WME Script (v2015.05.30): WME-Objekte nicht verfügbar für applyStreetWidth.');
            if (sliderStatus) {
                sliderStatus.textContent = 'Fehler: WME nicht bereit.';
                sliderStatus.style.color = '#ff6347'; // tomato
            }
            return;
        }

        try {
            const segments = W.model.segments.getObjectArray();
            let updatedCount = 0;
            segments.forEach(segment => {
                const element = W.userscripts.getFeatureElementByDataModel(segment);
                if (element) {
                    element.style.strokeWidth = `${currentValue / 100}em`;
                    updatedCount++;
                }
            });
            if (valueDisplay) {
                 valueDisplay.textContent = currentValue;
            }
            if (sliderStatus) {
                sliderStatus.style.color = 'green';
                sliderStatus.textContent = `${updatedCount} Segmente aktualisiert.`;
            }
        } catch (error) {
            console.error('WME Script (v2015.05.30): Fehler beim Anpassen der Straßenbreite:', error);
            if (sliderStatus) {
                sliderStatus.textContent = 'Fehler beim Anpassen.';
                sliderStatus.style.color = 'red';
            }
        }
    }

    async function initializeScriptFeatures() {
        console.log("WME Script (v2015.05.30): initializeScriptFeatures called (wme-ready).");

        if (typeof W === 'undefined' || !W.map || !W.model || !W.selectionManager || !W.model.streets || !W.model.segments || !W.userscripts || !W.map.olMap || !W.map.olMap.viewPortDiv) {
            console.error("WME Script (v2015.05.30): WME core objects not available. Aborting.");
            alert("WME Script Fehler: Wichtige WME-Objekte nicht gefunden. Das Skript kann nicht initialisiert werden. Bitte Konsole prüfen.");
            return;
        }
        console.log("WME Script (v2015.05.30): All required WME objects confirmed.");

        try {
            const scriptId = "wme-street-width-tab";
            let tabLabel;

            try {
                console.log(`WME Script (v2015.05.30): Attempting to register sidebar tab with ID: ${scriptId}`);
                const registrationResult = W.userscripts.registerSidebarTab(scriptId);
                tabLabel = registrationResult.tabLabel;
                tabPaneElement = registrationResult.tabPane; // Store tabPane globally for access
                console.log(`WME Script (v2015.05.30): Sidebar tab ${scriptId} registered successfully.`);
            } catch (e) {
                console.warn(`WME Script (v2015.05.30): Tab mit ID ${scriptId} konnte nicht registriert werden, ggf. existiert er bereits. Fehler: ${e.message}. Versuche neu zu erstellen.`);
                try {
                    W.userscripts.removeSidebarTab(scriptId); // Attempt to remove if it exists
                    const registrationResult = W.userscripts.registerSidebarTab(scriptId);
                    tabLabel = registrationResult.tabLabel;
                    tabPaneElement = registrationResult.tabPane;
                    console.log(`WME Script (v2015.05.30): Sidebar tab ${scriptId} re-registered successfully.`);
                } catch (removeError) {
                    console.error(`WME Script (v2015.05.30): Konnte existierenden Tab ${scriptId} nicht entfernen oder neu registrieren: ${removeError.message}`);
                    alert(`WME Script Fehler: Tab ${scriptId} konnte nicht erstellt werden. Bitte Konsole prüfen.`);
                    return;
                }
            }

            tabLabel.innerText = 'Breite';
            tabLabel.title = 'Straßenbreiten-Anpasser';

            const content = `
                <div style="padding: 10px;">
                    <h4>Straßenbreiten-Steuerung</h4>
                    <div class="control-group" style="margin-top: 15px;">
                        <label for="widthSliderTab">Breite (%): <span id="widthValueTab">100</span></label>
                        <input type="range" id="widthSliderTab" min="50" max="300" value="100" style="width: 100%; margin-top: 5px;">
                        <div id="sliderStatusTab" style="color: green; min-height: 1em; font-size: 0.9em; margin-top: 5px;"></div>
                    </div>
                </div>
            `;

            tabPaneElement.innerHTML = content;
            console.log(`WME Script (v2015.05.30): Tab content set for ${scriptId}.`);
            await W.userscripts.waitForElementConnected(tabPaneElement);
            console.log(`WME Script (v2015.05.30): Tab pane for ${scriptId} connected to DOM.`);

            // UI-Elemente aus dem Tab-Inhalt holen
            slider = tabPaneElement.querySelector('#widthSliderTab');
            valueDisplay = tabPaneElement.querySelector('#widthValueTab');
            sliderStatus = tabPaneElement.querySelector('#sliderStatusTab');

            if (slider && valueDisplay && sliderStatus) {
                slider.addEventListener('input', (e) => {
                    applyStreetWidth(e.target.value);
                });

                window.addEventListener('resize', () => {
                    if (slider) {
                        console.log("WME Script (v2015.05.30): Window resized, applying street width.");
                        applyStreetWidth(slider.value);
                    }
                });

                document.addEventListener('wme-map-data-loaded', () => {
                    if (slider) {
                        console.log("WME Script (v2015.05.30): Map data loaded, applying street width.");
                        applyStreetWidth(slider.value);
                    }
                });

                applyStreetWidth(slider.value); // Initial anwenden
                console.log(`WME Script (v2015.05.30): Slider functionality and listeners initialized in sidebar tab.`);
            } else {
                console.error('WME Script (v2015.05.30): Slider-Elemente im Tab nicht gefunden.');
                sliderStatus.textContent = 'Fehler: UI-Elemente nicht gefunden.';
                sliderStatus.style.color = 'red';
            }

            console.log("WME Script (v2015.05.30): All UI elements and functionalities initialized in sidebar tab.");

        } catch (error) {
            console.error('WME Script (v2015.05.30): Kritischer Fehler bei der Initialisierung des Sidebar Tabs:', error);
            alert("WME Script Fehler: Kritischer Fehler bei der Initialisierung des Tabs. Das Skript funktioniert möglicherweise nicht. Bitte Konsole prüfen.");
        }
    }

    // Initialisierung des Skripts
    console.log("WME Script (v2015.05.30): Script execution started. Checking WME state.");
    if (typeof W !== 'undefined' && W.userscripts && W.userscripts.state && W.userscripts.state.isReady) {
        console.log("WME Script (v2015.05.30): WME is already ready. Calling initializeScriptFeatures directly.");
        initializeScriptFeatures();
    } else {
        console.log("WME Script (v2015.05.30): WME not ready yet. Adding 'wme-ready' event listener for initial setup.");
        document.addEventListener("wme-ready", initializeScriptFeatures, { once: true });
    }
})();