WME Change Speed

Verhoog of verlaag de snelheid van de geselecteerde segmenten. Gebruik 1 voor verlagen en 2 voor verhogen. Wissel tussen km/u en mph in het sidebar menu.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         WME Change Speed
// @version      1.3
// @namespace    https://greasyfork.org/users/1499279
// @author       DeKoerier
// @description  Verhoog of verlaag de snelheid van de geselecteerde segmenten. Gebruik 1 voor verlagen en 2 voor verhogen. Wissel tussen km/u en mph in het sidebar menu.
// @match        https://www.waze.com/editor*
// @match        https://www.waze.com/*/editor*
// @match        https://beta.waze.com/editor*
// @match        https://beta.waze.com/*/editor*
// @exclude      https://www.waze.com/user/editor*
// @license      GNU GPLv3
// @connect      greasyfork.org
// @grant        none
// ==/UserScript==

const SCRIPT_VERSION = "1.3";
const SCRIPT_NAME = "WME Change Speed";

const WHATS_NEW = {
    "1.3": "- Logica toegepast om 1 te gebruiken bij verlagen en 2 bij verhogen. Was voorheen andersom.",
    "1.2": "- Probleem opgelost waarin snelheid niet aangepast werd als segment maar één richting was",
    "1.1": "- MPH ondersteuning toegevoegd\n- Sidebar layout verbeterd",
    "1.0": "- Eerste werkende versie met km/u ondersteuning"
};

function versionCheck() {
    const storageKey = 'WMEChangeSpeed_Version';
    const previous = localStorage.getItem(storageKey);

    if (previous !== SCRIPT_VERSION) {
        const changes = Object.entries(WHATS_NEW)
        .filter(([ver]) => !previous || ver > previous)
        .map(([ver, msg]) => `${ver}:\n${msg}`)
        .join("\n\n");

        if (changes) {
            alert(`${SCRIPT_NAME} geüpdatet naar versie ${SCRIPT_VERSION}\n\n${changes}`);
        }

        localStorage.setItem(storageKey, SCRIPT_VERSION);
    }
}


(function () {
  'use strict';

  let useMph = false;

  const waitSDK = setInterval(() => {
    if (window.SDK_INITIALIZED && typeof window.getWmeSdk === 'function') {
      clearInterval(waitSDK);
      window.SDK_INITIALIZED.then(initScript);
    }
  }, 200);

  function initScript() {
    const sdk = window.getWmeSdk({
      scriptId: "wme_change_speed_sdk",
      scriptName: "Change Speed"
    });

    sdk.Events.once({ eventName: "wme-ready" }).then(() => {
      console.log("✅ SDK en WME klaar");

      registerShortcuts(sdk);
      registerTab(sdk);
      registerSelectionLogger(sdk);

      console.log("✅ Script geladen en actief");
    });
  }

  function registerShortcuts(sdk) {
    sdk.Shortcuts.createShortcut({
      shortcutId: "speed_up",
      description: "Snelheid verhogen",
      shortcutKeys: "2",
      callback: () => adjustSpeed(sdk, getSpeedStep())
    });

    sdk.Shortcuts.createShortcut({
      shortcutId: "speed_down",
      description: "Snelheid verlagen",
      shortcutKeys: "1",
      callback: () => adjustSpeed(sdk, -getSpeedStep())
    });

    console.log("✅ Shortcuts actief: 1 = omlaag en 2 = omhoog");
  }

  function getSpeedStep() {
    return useMph ? 5 : 10;
  }

  function toDisplay(speedKmh) {
    return useMph ? Math.round(speedKmh / 1.609344) : speedKmh;
  }

  function toKmh(displaySpeed) {
    return useMph ? Math.round(displaySpeed * 1.609344) : displaySpeed;
  }

  function adjustSpeed(sdk, delta) {
    const selection = sdk.Editing.getSelection();
    if (!selection || selection.objectType !== 'segment') {
      console.warn("⚠️ Geen segmenten geselecteerd");
      return;
    }

    selection.ids.forEach(id => {
      const seg = sdk.DataModel.Segments.getById({ segmentId: id });
      if (!seg) return;

      const fwd = toDisplay(seg.fwdSpeedLimit || 0);
      const rev = toDisplay(seg.revSpeedLimit || 0);

      const newFwd = Math.max(0, toKmh(fwd + delta));
      const newRev = Math.max(0, toKmh(rev + delta));

      const updateData = {};

      if (seg.fwdSpeedLimit != null) {
          updateData.fwdSpeedLimit = newFwd;
      }
      if (seg.revSpeedLimit != null) {
          updateData.revSpeedLimit = newRev;
      }

      if (Object.keys(updateData).length > 0) {
          sdk.DataModel.Segments.updateSegment({
              segmentId: seg.id,
              ...updateData
      });

          console.log(`↕️ Segment ${seg.id}: A>B ${seg.fwdSpeedLimit} → ${updateData.fwdSpeedLimit ?? 'n.v.t.'}, B>A ${seg.revSpeedLimit} → ${updateData.revSpeedLimit ?? 'n.v.t.'}`);
      } else {
          console.warn(`⚠️ Segment ${seg.id} heeft geen richting om aan te passen`);
      }
    });
  }

  function registerSelectionLogger(sdk) {
    sdk.Events.on({
      eventName: "wme-selection-changed",
      eventHandler: () => {
        const sel = sdk.Editing.getSelection();
        if (sel?.objectType === 'segment') {
          console.log("🔍 Segmenten geselecteerd:", sel.ids);
        } else {
          console.log("⚠️ Geen segmentselectie actief");
        }
      }
    });
  }

  versionCheck();

  function registerTab(sdk) {
    sdk.Sidebar.registerScriptTab().then(({ tabLabel, tabPane }) => {
      tabLabel.innerText = "ChangeSpeed";
      tabLabel.title = "Snelheden bekijken";

      tabPane.id = "speedhelper-tab";
      tabPane.innerHTML = `
        <div style="padding: 10px;">
          <h2>Snelheden</h2>
          <p>Druk op 1 om snelheid te verlagen of 2 om te verhogen, of bekijk huidige waardes hier:</p>
          <label><input type="radio" name="unit" value="kmh" checked> km/u</label>
          <label style="margin-left: 10px;"><input type="radio" name="unit" value="mph"> mph</label>
          <pre id="segmentInfo" style="margin-top:10px; background:#f8f8f8; padding:8px;"></pre>
          <p style="margin-top:15px; font-size: 13px;">ℹ️ Bij <strong>km/u</strong> wordt de snelheid in stappen van <strong>10 km/u</strong> aangepast.</p>
          <p style="font-size: 13px;">ℹ️ Bij <strong>mph</strong> wordt de snelheid in stappen van <strong>5 mph</strong> aangepast.</p>
        </div>
        <div style="padding: 10px;">
        <small>${SCRIPT_NAME} v${SCRIPT_VERSION}</small>
        </div>
      `;

      document.querySelectorAll('input[name="unit"]').forEach(radio => {
        radio.addEventListener('change', e => {
          useMph = e.target.value === 'mph';
          updateSegmentInfo(sdk);
        });
      });

      new IntersectionObserver((entries) => {
        entries.forEach(entry => {
          if (entry.isIntersecting) updateSegmentInfo(sdk);
        });
      }).observe(tabPane.parentElement);

      document.getElementById("btnSegmentInfo").onclick = () => updateSegmentInfo(sdk);
    });
  }

  function updateSegmentInfo(sdk) {
    const out = document.getElementById("segmentInfo");
    const selection = sdk.Editing.getSelection();

    if (!selection || selection.objectType !== 'segment') {
      out.innerText = "⚠️ Selecteer segmenten om informatie te tonen.";
      return;
    }

    const lines = selection.ids.map(id => {
      const seg = sdk.DataModel.Segments.getById({ segmentId: id });
      if (!seg) return `Segment ${id} → ⚠️ Niet gevonden`;

      const fwd = seg.fwdSpeedLimit != null ? `${toDisplay(seg.fwdSpeedLimit)} ${useMph ? 'mph' : 'km/u'}` : '–';
      const rev = seg.revSpeedLimit != null ? `${toDisplay(seg.revSpeedLimit)} ${useMph ? 'mph' : 'km/u'}` : '–';

      return `Geselecteerd segment ${id}\n  A>B: ${fwd}\n  B>A: ${rev}`;
    });

    out.innerText = lines.join('\n\n');
  }

})();