WME Fix UI

Allows alterations to the WME UI to fix things screwed up or ignored by Waze

当前为 2016-06-21 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name                WME Fix UI
// @namespace           https://greasyfork.org/en/users/46070
// @description         Allows alterations to the WME UI to fix things screwed up or ignored by Waze
// @include             https://www.waze.com/editor/*
// @include             https://www.waze.com/*/editor/*
// @include             https://editor-beta.waze.com/*
// @exclude             https://www.waze.com/user/editor/*
// @supportURL          https://www.waze.com/forum/viewtopic.php?f=819&t=191178
// @version             1.0
// @grant               none
// ==/UserScript==

// Thanks to (in no particular order) Bellhouse, Twister-UK, Timbones, Dave2084, Rickzabel, Glodenox

(function()
{
// global variables
var wmefu_version = "1.0";
var tabAttempts = 0;
var wmeFUAddon;

function init1() {
	// go round again if map container isn't there yet
	if(!window.Waze.map) {
			console.log("WMEFU: waiting for WME...");
			setTimeout(init1, 200);
			return;
	}
	// create tab content and store it
	wmeFUAddon = createAddon();
	// insert the content as a tab
	addMyTab(null,0);
	//pass control to init2
	init2();
}

function init2() {
	//go round again if my tab isn't there yet
	if (!getId('sidepanel-FixUI')) {
		console.log('WMEFU: waiting for my tab to appear');
		setTimeout(init2, 200);
		return;
	}
	// setup event handlers for user actions:
	getId('_cbMoveZoomBar').onclick = moveZoomBar;
	getId('_cbShrinkBlackBar').onclick = shrinkBlackBar;
	getId('_cbHideUserInfo').onclick = hideUserInfo;
	getId('_cbCompressSegmentTab').onclick = compressSegmentTab;
	getId('_cbRestyleReports').onclick = restyleReports;
	getId('_cbDisableMapBlocker').onclick = disableMapBlocker;
	getId('_cbNarrowSidePanel').onclick = narrowSidePanel;
	getId('_cbHideAveSpeedControls').onclick = hideAveSpeedControls;
	// set event to recreate my tab when MTE mode is exited
	Waze.app.modeController.model.bind('change:mode', addMyTab);

	// restore saved settings
	if (localStorage.WMEFixUI) {
		console.log("WMEFU: loading options");
		options = JSON.parse(localStorage.WMEFixUI);
		getId('_cbMoveZoomBar').checked = options[1];
		getId('_cbShrinkBlackBar').checked = options[2];
		getId('_cbHideUserInfo').checked = options[3];
		getId('_cbCompressSegmentTab').checked = options[4];
		getId('_cbRestyleReports').checked = options[5];
		getId('_cbDisableMapBlocker').checked = options[6];
		getId('_cbNarrowSidePanel').checked = options[7];
		getId('_cbHideAveSpeedControls').checked = options[8];
	} else {
		// default values if option isn't stored
		getId('_cbMoveZoomBar').checked = true;
		getId('_cbShrinkBlackBar').checked = true;
		getId('_cbHideUserInfo').checked = true;
		getId('_cbCompressSegmentTab').checked = true;
		getId('_cbRestyleReports').checked = true;
		getId('_cbDisableMapBlocker').checked = false;
		getId('_cbNarrowSidePanel').checked = false;
		getId('_cbHideAveSpeedControls').checked = false;
	}

	// Adds an extra checkbox so I can test segment panel changes easily
	if (Waze.loginManager.user.userName == 'iainhouse') {
		var brand = getId('brand');
		extraCBSection = document.createElement('p');
		extraCBSection.innerHTML = '<input type="checkbox" id="_cbextraCBSection" />';
		brand.appendChild(extraCBSection);
		getId('_cbextraCBSection').onclick = FALSEcompressSegmentTab;
		_cbextraCBSection.checked = _cbCompressSegmentTab.checked;
	}
	// overload the WME exit function to save my settings
	saveOptions = function() {
		if (localStorage) {
			console.log("WMEFU: saving options");
			var options = [];

			// preserve previous options which may get lost after logout
			if (localStorage.WMEFixUI)
				options = JSON.parse(localStorage.WMEFixUI);
			options[1] = getId('_cbMoveZoomBar').checked;
			options[2] = getId('_cbShrinkBlackBar').checked;
			options[3] = getId('_cbHideUserInfo').checked;
			options[4] = getId('_cbCompressSegmentTab').checked;
			options[5] = getId('_cbRestyleReports').checked;
			options[6] = getId('_cbDisableMapBlocker').checked;
			options[7] = getId('_cbNarrowSidePanel').checked;
			options[8] = getId('_cbHideAveSpeedControls').checked;
			localStorage.WMEFixUI = JSON.stringify(options);
		}
	};
	window.addEventListener("beforeunload", saveOptions, false);

	// apply the settings
	setTimeout(applyAllSettings, 2000);
	
	console.log("WMEFU: Initialised");
}

function createAddon() {
	//create the contents of my side-panel tab
	var addon = document.createElement('section');
	var section = document.createElement('p');
	addon.id = "sidepanel-FixUI";
	section.style.paddingTop = "0px";
	section.id = "fuContent";
	section.innerHTML  = '<b>UI Fixes</b><br>';
	section.innerHTML += '<input type="checkbox" id="_cbMoveZoomBar" /> ' +
			'<span title="Because nobody likes a pointless UI change that breaks your workflow, imposed by idiots who rarely use the editor and don\'t listen to feedback">Move zoom bar to left <sup>*</sup></span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbHideUserInfo" /> ' +
			'<span title="Because we can earn points quicker without a massive chunk of space wasted on telling us how many we earnt up to yesterday">Hide user info in the side panel</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbShrinkBlackBar" /> ' +
			'<span title="Because we can\'t afford to waste screen space on stuff we didn\'t ask for and don\'t want">Shrink the black bar above the map</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbCompressSegmentTab" /> ' +
			'<span title="Because I\'m sick of having to scroll the side panel because of oversized fonts and wasted space">Compress the contents of the side panel</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbRestyleReports" /> ' +
			'<span title="Another UI element configured for developers with massive screens instead of normal users">Change formatting for report panels (UR/MP)</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbDisableMapBlocker" /> ' +
			'<span title="As if the crappy interface wasn\'t making life hard enough, now they force us to wait for an arbitrary time after every save!">Disable map blocking during/after saving.</span><span title="Use at your own risk. We don\'t know why it\'s there. Maybe there\'s a good reason but Waze can\'t be arsed to tell us what it is." style="font-size: 16px; color: red;">&#9888</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbNarrowSidePanel" /> ' +
			'<span title="If you have a netbook, Waze isn\'t interested in your experience. You need every bit of map space you can get - so have a present from me!">Reduce width of the side panel</span><span title="This will definitely interfere with scripts that rely on a fixed width for their tabs." style="font-size: 16px; color: red;">&#9888</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbHideAveSpeedControls" /> ' +
			'<span title="If you don\'t have these in your country, YOU\'RE LUCKY! But don\'t forget you\'ve disabled this - they\'ll be coming soon!">Hide average speed camera controls</span><br>';
	section.innerHTML += '<br>';
	var tbHackStr = '<sup>* If you have WME Toolbox installed, make sure the setting "Move zoom control to left" is ';
	if (document.body.dir != "rtl") {
		tbHackStr += 'OFF';
	} else {
		tbHackStr += 'ON';
	}
	tbHackStr += '.</sup><br>';
	section.innerHTML += tbHackStr;
	section.innerHTML += '<br>';
	section.innerHTML += '<b><a href="https://www.waze.com/forum/viewtopic.php?f=819&t=191178" title="Forum topic" target="_blank"><u>' +
			'WME Fix UI</u></a></b> &nbsp; v' + wmefu_version;

	addon.appendChild(section);
	addon.className = "tab-pane";
	return addon
}

function addMyTab(model,modeID) {
	if (modeID === 0) {
		console.log("WMEFU: entering default mode, so creating tab");
		tabAttempts = 0;
		tabsLooper();
	} else {
		console.log("WMEFU: entering event mode, so not initialising");
		return;
	}
}

function tabsLooper() {
	tabAttempts += 1;
	if (tabAttempts > 20) {
		// tried 20 times to create tab without luck
		console.log("WMEFU: Unable to create my tab after 20 attempts");
		return;
	}
	var userTabs = getId('user-info');
	var navTabs = getElementsByClassName('nav-tabs', userTabs)[0];
	if (typeof navTabs === "undefined") {
		//the basic tabs aren't there yet, so I can't add mine
		setTimeout(tabsLooper, 200);
	} else{
		var tabContent = getElementsByClassName('tab-content', userTabs)[0];
		newtab = document.createElement('li');
		newtab.innerHTML = '<a href="#sidepanel-FixUI" data-toggle="tab" title="Fix UI">FU</a>';
		navTabs.appendChild(newtab);
		tabContent.appendChild(wmeFUAddon);
	}
}

function applyAllSettings() {
	moveZoomBar();
	shrinkBlackBar();
	hideUserInfo();
	compressSegmentTab();
	restyleReports();
	disableMapBlocker();
	narrowSidePanel();
	hideAveSpeedControls();
}

function moveZoomBar() {
	var reportPanel = getId('panel-container');
	
	reportPanel.style.position = "absolute";
	if (_cbMoveZoomBar.checked) {
		addGlobalStyle('.olControlPanZoomBar { left: 10px; width: 30px; right: inherit; }');
		addGlobalStyle('#WMETB_ZoomLevelIndicator { left: 43px !important; right: inherit !important; }');
		if (document.body.dir != "rtl") {
			addGlobalStyle('.panel { left: 61px; }');
		} else {
			addGlobalStyle('.panel { right: inherit; }');
		}
	} else {
		addGlobalStyle('.olControlPanZoomBar { left: inherit; width: 30px; right: 10px; }');
		addGlobalStyle('#WMETB_ZoomLevelIndicator { left: inherit !important; right: 43px !important; }');
		if (document.body.dir != "rtl") {
			addGlobalStyle('.panel { left: inherit; }');
		} else {
			addGlobalStyle('.panel { right: 61px; }');
		}
	}
}

function hideUserInfo() {
	// WME Panel Swap buttons - move them up if user info is hidden
	var PSButton1 = getId('WMEPS_UIButton');
	var PSButton2 = getId('WMEPS_EditButton');
	if (_cbHideUserInfo.checked) {
		addGlobalStyle('#sidebar #user-info #user-box { padding: 0px; }');
		addGlobalStyle('#sidebar #user-details .user-profile { display: none !important; }');
		if (PSButton1) PSButton1.style.top = '-27px';
		if (PSButton2) PSButton2.style.top = '-27px';
		// Keep My Layers toggle - move up if user info is hidden
		addGlobalStyle('.kml-toggle-container { top: -25px; }');
	} else {
		addGlobalStyle('#sidebar #user-info #user-box { padding: 20px; }');
		addGlobalStyle('#sidebar #user-details .user-profile { display: inherit !important; }');
		if (PSButton1) PSButton1.style.top = '0px';
		if (PSButton2) PSButton2.style.top = '0px';
		// Keep My Layers toggle - move back down if user info is shown
		addGlobalStyle('.kml-toggle-container { top: 13px; }');
	}
}

function shrinkBlackBar() {
	var wm = getId('WazeMap');
	if (_cbShrinkBlackBar.checked) {
		addGlobalStyle('.topbar { height: 20px; line-height: 20px; }');
		addGlobalStyle('.topbar .location-info { font-size: 12px; }');
	} else {
		addGlobalStyle('.topbar { height: 30px; line-height: 30px; }');
		addGlobalStyle('.topbar .location-info { font-size: 15px; }');
	}
//	$(window).trigger('resize');
	window.dispatchEvent(new Event('resize'));
}

function FALSEcompressSegmentTab() {
	_cbCompressSegmentTab.checked = _cbextraCBSection.checked;
	compressSegmentTab();
}

function compressSegmentTab() {
	var ep=getId('edit-panel');
	if (_cbCompressSegmentTab.checked) {
		// shrink address
		addGlobalStyle('#edit-panel .primary-street { font-size: 14px; line-height: 15px; font-weight: 600; color: black; }');
		addGlobalStyle('#edit-panel .address-edit-view .preview .address-edit-btn:not(.disabled) { background-color: #FFF9C4; }');
		addGlobalStyle('#edit-panel .segment .address-edit-view, .edit-panel .segment .address-edit-view { margin-bottom: 5px; }');
		//shrink tabs
		addGlobalStyle('#sidebar .nav-tabs li a { padding: 4px; }');
		addGlobalStyle('#sidebar .nav-tabs { margin-bottom: 5px; }');
		//reduce some vertical margins
		addGlobalStyle('#edit-panel .contents { padding-top: 0px; }');
		addGlobalStyle('#edit-panel .form-group { margin-bottom: 2px; line-height: 1; font-size: 11px; }');
		addGlobalStyle('#edit-panel .selection { margin-bottom: 5px; }');
		addGlobalStyle('#sidebar .side-panel-section:not(:last-child) { margin-bottom: 2px; }');
		addGlobalStyle('#sidebar .side-panel-section:not(:last-child)::after { margin-top: 5px; margin-bottom: 2px; }');
		addGlobalStyle('#edit-panel .control-label { margin-bottom: 1px; }');
		addGlobalStyle('#sidebar .controls-container { padding-top: 2px; }');
		addGlobalStyle('#edit-panel .segment .speed-limit label { margin-bottom: 0px; }');
		addGlobalStyle('#edit-panel .more-actions { padding-top: 2px; }');
		addGlobalStyle('#edit-panel .segment .speed-limit .direction-label, #edit-panel .segment .speed-limit .unit-label { line-height: 2.1em; }');
		//shrink dropdown controls & buttons
		addGlobalStyle('#edit-panel button, #edit-panel select, #edit-panel .form-control { font-size: 11px; height: 22px; padding: 0px 4px; }');
		addGlobalStyle('#edit-panel .more-actions button:not(:last-of-type) { margin-bottom: 2px; }');
		addGlobalStyle('.edit-closure .input-group-addon { padding: 2px 8px; }');
		//fit road property checkboxes on one line for all three (if text length allows)
		addGlobalStyle('#edit-panel .controls-container { display: inline-block; }');
		addGlobalStyle('#edit-panel .controls-container label { font-size: 12px; line-height: 18px; padding-left: 22px; }');
		addGlobalStyle('#edit-panel .select-entire-street { width: 49%; overflow: hidden; }');
		addGlobalStyle('#edit-panel .edit-house-numbers { width: 49%; overflow: hidden; }');
		addGlobalStyle('#edit-panel .action-button { color: black; }');
	} else {
		//enlarge address
		addGlobalStyle('#edit-panel .primary-street { font-size: 18px; line-height: 24px; font-weight: inherit; color: inherit; }');
		addGlobalStyle('#edit-panel .address-edit-view .preview .address-edit-btn:not(.disabled) { background-color: inherit; }');
		addGlobalStyle('#edit-panel .segment .address-edit-view, .edit-panel .segment .address-edit-view { margin-bottom: 20px; }');
		//enlarge tabs
		addGlobalStyle('#sidebar .nav-tabs li a { padding: 5px 15px; }');
		addGlobalStyle('#sidebar .nav-tabs { margin-bottom: 20px; }');
		//restore vertical margins
		addGlobalStyle('#edit-panel .contents { padding-top: 20px; }');
		addGlobalStyle('#edit-panel .form-group { margin-bottom: 10px; line-height: 1.43; font-size: 13px; }');
		addGlobalStyle('#edit-panel .selection { margin-bottom: 20px; }');
		addGlobalStyle('#sidebar .side-panel-section:not(:last-child) { margin-bottom: 21px; }');
		addGlobalStyle('#sidebar .side-panel-section:not(:last-child)::after { margin-top: 21px; margin-bottom: 21px; }');
		addGlobalStyle('#edit-panel .control-label { margin-bottom: 5px; }');
		addGlobalStyle('#sidebar .controls-container { padding-top: 7px; }');
		addGlobalStyle('#edit-panel .segment .speed-limit label { margin-bottom: 5px; }');
		addGlobalStyle('#edit-panel .more-actions { padding-top: 10px; }');
		addGlobalStyle('#edit-panel .segment .speed-limit .direction-label, #edit-panel .segment .speed-limit .unit-label { line-height: 2.5em; }');
		//enlarge dropdown controls & buttons
		addGlobalStyle('#edit-panel button, #edit-panel select, #edit-panel .form-control { font-size: 13px; height: 32px; padding: 6px 12px; }');
		addGlobalStyle('#edit-panel .more-actions button:not(:last-of-type) { margin-bottom: 10px; }');
		addGlobalStyle('.edit-closure .input-group-addon { padding: 6px 8px; }');
		//restore road property checkboxes to one line per item
		addGlobalStyle('#edit-panel .controls-container { display: inherit; }');
		addGlobalStyle('#edit-panel .controls-container label { font-size: inherit; line-height: inherit; padding-left: 25px; }');
		addGlobalStyle('#edit-panel .select-entire-street { width: 100%; overflow: inherit; }');
		addGlobalStyle('#edit-panel .edit-house-numbers { width: 100%; overflow: inherit; }');
		addGlobalStyle('#edit-panel .action-button { color: inherit; }');
	}
	//tweak required for Speedhelper script
	addGlobalStyle('div[id^="spd_"] { line-height: 1.43; }');
}

function restyleReports() {
	if (_cbRestyleReports.checked) {
		addGlobalStyle('#panel-container .panel { font-size: 12px; line-height: 15px; }');
		addGlobalStyle('#panel-container .problem-edit .header { padding: 5px 10px; line-height: 15px; }');
		addGlobalStyle('#panel-container .problem-edit .problem-data .title { line-height: 22px; }');
		addGlobalStyle('#panel-container .problem-edit .section .content { padding: 5px; }');
		addGlobalStyle('#WMEFP-UR-ALLPM { top: -2px !important; }');
		addGlobalStyle('#panel-container .problem-edit .conversation.section .comment .comment-content { padding: 5px; }');
		addGlobalStyle('#panel-container .problem-edit .conversation.section .new-comment-form { padding: 5px; }');
		addGlobalStyle('#panel-container .problem-edit .conversation.section .new-comment-form textarea { resize: vertical; height: 110px; margin-bottom: 5px; padding: 3px 5px; font-size: 12px; }');
		addGlobalStyle('#panel-container .btn { height: 20px; padding: 0px 10px;}');
		addGlobalStyle('#panel-container .problem-edit .actions .content { padding: 2px 5px;}');
		addGlobalStyle('#panel-container .problem-edit .actions .controls-container label { margin-bottom: 2px; }');
		addGlobalStyle('#panel-container .problem-edit .actions .navigation { margin-top: 5px;}');
		addGlobalStyle('#panel-container .problem-edit .actions .controls-container { display: inline-flex; flex-wrap: wrap; }');
	} else {
		addGlobalStyle('#panel-container .panel { font-size: inherit; line-height: inherit; }');
		addGlobalStyle('#panel-container .problem-edit .header { padding: 10px 15px; line-height: 21px; }');
		addGlobalStyle('#panel-container .problem-edit .problem-data .title { line-height: 40px; }');
		addGlobalStyle('#panel-container .problem-edit .section .content { padding: 15px; }');
		addGlobalStyle('#WMEFP-UR-ALLPM { top: 10px !important; }');
		addGlobalStyle('#panel-container .problem-edit .conversation.section .comment .comment-content { padding: 10px 15px 10px 15px; }');
		addGlobalStyle('#panel-container .problem-edit .conversation.section .new-comment-form { padding: 15px 15px 10px 15px; }');
		addGlobalStyle('#panel-container .problem-edit .conversation.section .new-comment-form textarea { resize: none; height: 70px; margin-bottom: 10px; padding: 6px 10px; font-size: 13px; }');
		addGlobalStyle('#panel-container .btn { height: inherit; padding: 6px 20px;}');
		addGlobalStyle('#panel-container .problem-edit .actions .content { padding: 15px;}');
		addGlobalStyle('#panel-container .problem-edit .actions .controls-container label { margin-bottom: 12px; }');
		addGlobalStyle('#panel-container .problem-edit .actions .navigation { margin-top: 10px;}');
		addGlobalStyle('#panel-container .problem-edit .actions .controls-container { display: inherit; flex-wrap: inherit; }');
	}
}

function disableMapBlocker() {
	if (_cbDisableMapBlocker.checked) {
		addGlobalStyle('#popup-overlay { width: 0%; height: 0%; }');
	} else {
		addGlobalStyle('#popup-overlay { width: 100%; height: 100%; }');
	}
}

function narrowSidePanel() {
	if (_cbNarrowSidePanel.checked) {
		addGlobalStyle('.row-fluid #sidebar { width: 250px; }');
		addGlobalStyle('.col-fixed-330 { width: 250px; }');
		if (document.body.dir != "rtl") {
			addGlobalStyle('.show-sidebar .row-fluid .fluid-fixed { margin-left: 250px; }');
			addGlobalStyle('.col-offset-330 { padding-left: 250px; }');
		} else {
			addGlobalStyle('.show-sidebar .row-fluid .fluid-fixed { margin-right: 250px; }');
			addGlobalStyle('.col-offset-330 { padding-right: 250px; }');
		}
		addGlobalStyle('.edit-closure .form { padding: 2px; }');
		addGlobalStyle('.edit-closure .date-input-group { width: 56%; }');
	} else {
		addGlobalStyle('.row-fluid #sidebar { width: 330px; }');
		addGlobalStyle('.col-fixed-330 { width: 330px; }');
		if (document.body.dir != "rtl") {
			addGlobalStyle('.show-sidebar .row-fluid .fluid-fixed { margin-left: 330px; }');
			addGlobalStyle('.col-offset-330 { padding-left: 330px; }');
		} else {
			addGlobalStyle('.show-sidebar .row-fluid .fluid-fixed { margin-right: 330px; }');
			addGlobalStyle('.col-offset-330 { padding-right: 330px; }');
		}
		addGlobalStyle('.edit-closure .form { padding 15px; }');
		addGlobalStyle('.edit-closure .date-input-group { width: 62%; }');
	}
//	$(window).trigger('resize')
	window.dispatchEvent(new Event('resize'));
}

function hideAveSpeedControls() {
	if (_cbHideAveSpeedControls.checked) {
		addGlobalStyle('#segment-edit-general > .side-panel-section.attributes-form > .form-group:nth-of-type(4) { display: none; }');
	}else {
		addGlobalStyle('#segment-edit-general > .side-panel-section.attributes-form > .form-group:nth-of-type(4) { display: inherit; }');
	}
}

//Helper functions

function addGlobalStyle(css) {
	var head, style;
	head = document.getElementsByTagName('head')[0];
	if (!head) {
		return;
	}
	style = document.createElement('style');
	style.type = 'text/css';
	style.innerHTML = css;
	head.appendChild(style);
}

function getElementsByClassName(classname, node) {
	if(!node) node = document.getElementsByTagName("body")[0];
	var a = [];
	var re = new RegExp('\\b' + classname + '\\b');
	var els = node.getElementsByTagName("*");
	for (var i=0,j=els.length; i<j; i++)
		if (re.test(els[i].className)) a.push(els[i]);
	return a;
}

function getId(node) {
	return document.getElementById(node);
}

// Start it running
setTimeout(init1, 2);
})();