diff --git a/images/missions.svg b/images/missions.svg new file mode 100644 index 00000000..f9cf8429 --- /dev/null +++ b/images/missions.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/mobile/res/drawable-hdpi/ic_missions.png b/mobile/res/drawable-hdpi/ic_missions.png new file mode 100644 index 00000000..4ce99216 Binary files /dev/null and b/mobile/res/drawable-hdpi/ic_missions.png differ diff --git a/mobile/res/drawable-mdpi/ic_missions.png b/mobile/res/drawable-mdpi/ic_missions.png new file mode 100644 index 00000000..0cf7a468 Binary files /dev/null and b/mobile/res/drawable-mdpi/ic_missions.png differ diff --git a/mobile/res/drawable-xhdpi/ic_missions.png b/mobile/res/drawable-xhdpi/ic_missions.png new file mode 100644 index 00000000..b314730e Binary files /dev/null and b/mobile/res/drawable-xhdpi/ic_missions.png differ diff --git a/mobile/res/drawable-xxhdpi/ic_missions.png b/mobile/res/drawable-xxhdpi/ic_missions.png new file mode 100644 index 00000000..e45cb367 Binary files /dev/null and b/mobile/res/drawable-xxhdpi/ic_missions.png differ diff --git a/plugins/missions.css b/plugins/missions.css index 8df699b3..6ca45056 100644 --- a/plugins/missions.css +++ b/plugins/missions.css @@ -1,3 +1,14 @@ +.plugin-mission-pane { + background: transparent; + border: 0 none !important; + height: 100% !important; + width: 100% !important; + left: 0 !important; + top: 0 !important; + position: absolute; + overflow: auto; +} + .plugin-mission-summary { padding: 5px; border-top: black solid 1px; diff --git a/plugins/missions.user.js b/plugins/missions.user.js index 88cf0a17..78712ac9 100644 --- a/plugins/missions.user.js +++ b/plugins/missions.user.js @@ -138,23 +138,58 @@ window.plugin.missions = { showMissionDialog: function(mission) { var me = this; var markers = this.highlightMissionPortals(mission); - dialog({ - id: 'plugin-mission-details-' + mission.guid.replace(/\./g, '_') /* dots irritate the dialog framework */, - title: mission.title, - height: 'auto', - html: this.renderMission(mission), - width: '450px', - closeCallback: function() { - me.unhighlightMissionPortals(markers); - }, - collapseCallback: this.collapseFix, - expandCallback: this.collapseFix, - }).dialog('option', 'buttons', { - 'Zoom to mission': function() { - me.zoomToMission(mission); - }, - 'OK': function() { $(this).dialog('close'); }, - }); + var content = this.renderMission(mission); + var id = mission.guid.replace(/\./g, '_'); // dots irritate the dialog framework and are not allowed in HTML IDs + + if(useAndroidPanes()) { + if(this.tabHeaders[id]) { + this.tabHeaders[id].parentNode.querySelector('.ui-icon-close').click(); + } + + var li = this.tabBar.appendChild(document.createElement('li')); + var a = li.appendChild(document.createElement('a')); + a.textContent = mission.title; + a.href = '#mission_pane_'+id; + this.tabHeaders[id] = a; + var span = li.appendChild(document.createElement('span')); + span.className = 'ui-icon ui-icon-close'; + span.textContent = 'Close mission'; + span.addEventListener('click', function() { + li.parentNode.removeChild(li); + content.parentNode.removeChild(content); + delete this.tabHeaders[id]; + $(this.tabs) + .tabs('refresh') + .find('.ui-tabs-nav') + .sortable('refresh'); + }.bind(this), false); + + this.tabs.appendChild(content); + content.id = 'mission_pane_'+id; + var tabs = $(this.tabs); + tabs.tabs('refresh'); + tabs.find('.ui-tabs-nav').sortable('refresh'); + tabs.tabs('option','active', -1); + show('plugin-missions'); + } else { + dialog({ + id: 'plugin-mission-details-' + id, + title: mission.title, + height: 'auto', + html: content, + width: '450px', + closeCallback: function() { + me.unhighlightMissionPortals(markers); + }, + collapseCallback: this.collapseFix, + expandCallback: this.collapseFix, + }).dialog('option', 'buttons', { + 'Zoom to mission': function() { + me.zoomToMission(mission); + }, + 'OK': function() { $(this).dialog('close'); }, + }); + } }, showMissionListDialog: function(missions) { @@ -272,7 +307,7 @@ window.plugin.missions = { callback(mission); }, function() { - console.error('Error loading mission data: ' + guid + ", " + Array.prototype.slice.call(arguments)); + console.error('Error loading mission data: ' + guid + ', ' + Array.prototype.slice.call(arguments)); if (errorcallback) { errorcallback(error); @@ -335,9 +370,9 @@ window.plugin.missions = { if(len > 0) { if(len > 1000) - len = Math.round(len / 100) / 10 + "km"; + len = Math.round(len / 100) / 10 + 'km'; else - len = Math.round(len * 10) / 10 + "m"; + len = Math.round(len * 10) / 10 + 'm'; var infoLength = container.appendChild(document.createElement('span')); infoLength.className = 'plugin-mission-info length help'; @@ -466,11 +501,13 @@ window.plugin.missions = { title.href = perma; title.addEventListener('click', function(ev) { + show('map'); selectPortalByLatLng(lat, lng); ev.preventDefault(); return false; }, false); title.addEventListener('dblclick', function(ev) { + show('map'); zoomToAndShowPortal(waypoint.portal.guid, [lat, lng]); ev.preventDefault(); return false; @@ -630,7 +667,7 @@ window.plugin.missions = { this.cacheByPortalGuid = JSON.parse(localStorage['plugins-missions-portalcache'] || '{}'); this.cacheByMissionGuid = JSON.parse(localStorage['plugins-missions-missioncache'] || '{}'); - if("plugins-missions-settings" in localStorage) { + if('plugins-missions-settings' in localStorage) { var settings = JSON.parse(localStorage['plugins-missions-settings'] || '{}'); localStorage['plugins-missions-checkedMissions'] = JSON.stringify(settings.checkedMissions); localStorage['plugins-missions-checkedWaypoints'] = JSON.stringify(settings.checkedWaypoints); @@ -834,6 +871,14 @@ window.plugin.missions = { } }, + onPaneChanged: function(pane) { + if(pane == 'plugin-missions') { + document.body.appendChild(this.mobilePane); + } else if(this.mobilePane.parentNode) { + this.mobilePane.parentNode.removeChild(this.mobilePane); + } + }, + setup: function() { this.cacheByPortalGuid = {}; this.cacheByMissionGuid = {}; @@ -846,6 +891,31 @@ window.plugin.missions = { $('