Added skipping of landmarks. Better navigation through waypoints.
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
@@ -7,14 +7,18 @@ namespace NavCityBreda.Helpers.Comparer
|
||||
{
|
||||
public int Compare(Landmark x, Landmark y)
|
||||
{
|
||||
if (x.Visited == y.Visited)
|
||||
{
|
||||
if (x.Status == y.Status)
|
||||
return x.Name.CompareTo(y.Name);
|
||||
}
|
||||
else if (x.Visited)
|
||||
else if (x.Status == Landmark.LandmarkStatus.VISITED)
|
||||
return 1;
|
||||
else
|
||||
else if (y.Status == Landmark.LandmarkStatus.VISITED)
|
||||
return -1;
|
||||
else if (x.Status == Landmark.LandmarkStatus.SKIPPED)
|
||||
return 1;
|
||||
else if (y.Status == Landmark.LandmarkStatus.SKIPPED)
|
||||
return -1;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,14 +7,18 @@ namespace NavCityBreda.Helpers.Comparer
|
||||
{
|
||||
public int Compare(Landmark x, Landmark y)
|
||||
{
|
||||
if (x.Visited == y.Visited)
|
||||
{
|
||||
if (x.Status == y.Status)
|
||||
return x.Name.CompareTo(y.Name);
|
||||
}
|
||||
else if (x.Visited)
|
||||
else if (x.Status == Landmark.LandmarkStatus.VISITED)
|
||||
return -1;
|
||||
else
|
||||
else if (y.Status == Landmark.LandmarkStatus.VISITED)
|
||||
return 1;
|
||||
else if (x.Status == Landmark.LandmarkStatus.SKIPPED)
|
||||
return -1;
|
||||
else if (y.Status == Landmark.LandmarkStatus.SKIPPED)
|
||||
return 1;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
using System;
|
||||
using Windows.UI.Xaml.Controls;
|
||||
using Windows.UI.Xaml.Data;
|
||||
|
||||
namespace NavCityBreda.Helpers.Converter
|
||||
{
|
||||
class BoolToIconConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, string language)
|
||||
{
|
||||
if ((bool)value)
|
||||
return Symbol.Like;
|
||||
else
|
||||
return Symbol.Cancel;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, string language)
|
||||
{
|
||||
//Not implemented
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
using System;
|
||||
using Windows.UI.Xaml.Controls;
|
||||
using Windows.UI.Xaml.Data;
|
||||
|
||||
namespace NavCityBreda.Helpers.Converter
|
||||
{
|
||||
class StatusToIconConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, string language)
|
||||
{
|
||||
Model.Landmark.LandmarkStatus st = (Model.Landmark.LandmarkStatus)value;
|
||||
|
||||
switch(st)
|
||||
{
|
||||
default:
|
||||
case Model.Landmark.LandmarkStatus.NOTVISITED:
|
||||
return Symbol.Cancel;
|
||||
case Model.Landmark.LandmarkStatus.VISITED:
|
||||
return Symbol.Accept;
|
||||
case Model.Landmark.LandmarkStatus.SKIPPED:
|
||||
return Symbol.Forward;
|
||||
}
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, string language)
|
||||
{
|
||||
//Not implemented
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -306,4 +306,10 @@
|
||||
<data name="SortOrder" xml:space="preserve">
|
||||
<value>Sort Order</value>
|
||||
</data>
|
||||
<data name="SkipLandmark" xml:space="preserve">
|
||||
<value>Skip landmark</value>
|
||||
</data>
|
||||
<data name="Skipped" xml:space="preserve">
|
||||
<value>Skipped</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -306,4 +306,10 @@
|
||||
<data name="SortOrder" xml:space="preserve">
|
||||
<value>Sorteer volgorde</value>
|
||||
</data>
|
||||
<data name="SkipLandmark" xml:space="preserve">
|
||||
<value>Bezienswaardigheid overslaan</value>
|
||||
</data>
|
||||
<data name="Skipped" xml:space="preserve">
|
||||
<value>Overgeslagen</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -15,13 +15,15 @@ namespace NavCityBreda.Model
|
||||
|
||||
public List<Image> Images { get; private set; }
|
||||
|
||||
private bool _visited;
|
||||
public bool Visited
|
||||
public enum LandmarkStatus { NOTVISITED, VISITED, SKIPPED }
|
||||
|
||||
private LandmarkStatus _status;
|
||||
public LandmarkStatus Status
|
||||
{
|
||||
get { return _visited; }
|
||||
get { return _status; }
|
||||
set
|
||||
{
|
||||
_visited = value;
|
||||
_status = value;
|
||||
UpdateIcon();
|
||||
}
|
||||
}
|
||||
@@ -42,7 +44,7 @@ namespace NavCityBreda.Model
|
||||
|
||||
private void Create(string name, string desc, int num, List<Image> images)
|
||||
{
|
||||
_visited = false;
|
||||
_status = LandmarkStatus.NOTVISITED;
|
||||
_desckey = desc;
|
||||
|
||||
Images = images;
|
||||
@@ -60,10 +62,19 @@ namespace NavCityBreda.Model
|
||||
{
|
||||
Icon.Title = Name;
|
||||
|
||||
if(_visited)
|
||||
Icon.Image = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/LandmarkVisited.png"));
|
||||
else
|
||||
Icon.Image = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/LandmarkNotVisited.png"));
|
||||
switch(_status)
|
||||
{
|
||||
default:
|
||||
case LandmarkStatus.NOTVISITED:
|
||||
Icon.Image = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/LandmarkNotVisited.png"));
|
||||
break;
|
||||
case LandmarkStatus.VISITED:
|
||||
Icon.Image = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/LandmarkVisited.png"));
|
||||
break;
|
||||
case LandmarkStatus.SKIPPED:
|
||||
Icon.Image = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/LandmarkSkipped.png"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ namespace NavCityBreda.Model
|
||||
{
|
||||
foreach(Landmark l in Landmarks)
|
||||
{
|
||||
l.Visited = false;
|
||||
l.Status = Landmark.LandmarkStatus.NOTVISITED;
|
||||
await Task.Delay(TimeSpan.FromMilliseconds(2));
|
||||
}
|
||||
return "success";
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
using NavCityBreda.Helpers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Windows.Devices.Geolocation;
|
||||
using Windows.Devices.Geolocation.Geofencing;
|
||||
using Windows.Services.Maps;
|
||||
using Windows.UI.Core;
|
||||
@@ -138,7 +140,7 @@ namespace NavCityBreda.Model
|
||||
{
|
||||
dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
|
||||
{
|
||||
i.Visited = true;
|
||||
i.Status = Landmark.LandmarkStatus.VISITED;
|
||||
});
|
||||
_currentlandmark = i;
|
||||
LandmarkVisited(i, LandmarkVisitedEventArgs.VisitedStatus.ENTERED);
|
||||
@@ -177,21 +179,60 @@ namespace NavCityBreda.Model
|
||||
|
||||
public async Task<String> UpdateRoute()
|
||||
{
|
||||
//Can't navigate without current position
|
||||
if (App.Geo.Position == null) return "error";
|
||||
|
||||
_currentlandmark = _currentroute.Landmarks.FirstOrDefault(p => !p.Visited);
|
||||
_routetolandmark = await Util.FindWalkingRoute(App.Geo.Position.Coordinate.Point, _currentlandmark.Position);
|
||||
//Stop route if end is reached
|
||||
_currentlandmark = _currentroute.Landmarks.FirstOrDefault(p => p.Status == Landmark.LandmarkStatus.NOTVISITED);
|
||||
if (_currentlandmark == null)
|
||||
{
|
||||
StopRoute();
|
||||
return "stopped";
|
||||
}
|
||||
|
||||
//Create route from last landmark trough all the waypoints
|
||||
List<Geopoint> _waypoints = new List<Geopoint>();
|
||||
_waypoints.Add(App.Geo.Position.Coordinate.Point);
|
||||
|
||||
Landmark lastlandmark = _currentroute.Landmarks.ElementAtOrDefault(_currentroute.Landmarks.IndexOf(_currentlandmark) - 1);
|
||||
|
||||
if (lastlandmark != null)
|
||||
{
|
||||
int start = _currentroute.Waypoints.IndexOf(lastlandmark) + 1;
|
||||
int offset = _currentroute.Waypoints.IndexOf(_currentlandmark) - start;
|
||||
List<Geopoint> temp = _currentroute.Waypoints.GetRange(start, offset).Select(e => e.Position).ToList();
|
||||
_waypoints.AddRange(temp);
|
||||
}
|
||||
_waypoints.Add(_currentlandmark.Position);
|
||||
|
||||
|
||||
//Update all other vars to match
|
||||
//_routetolandmark = await Util.FindWalkingRoute(App.Geo.Position.Coordinate.Point, _currentlandmark.Position);
|
||||
_routetolandmark = await Util.FindWalkingRoute(_waypoints);
|
||||
_currentroutelegs = _routetolandmark.Legs.ToList() as List<MapRouteLeg>;
|
||||
_currentroutelegcount = 0;
|
||||
_currentmaneuvercount = 0;
|
||||
_currentmaneuver = _currentmaneuvers[_currentmaneuvercount];
|
||||
|
||||
//Send out events
|
||||
UpdateRoute(_routetolandmark, _currentlandmark);
|
||||
UpdateManeuver(_currentmaneuver);
|
||||
|
||||
return "success";
|
||||
}
|
||||
|
||||
public async Task<String> SkipLandmark()
|
||||
{
|
||||
if (Status != RouteStatus.STARTED) return "error";
|
||||
|
||||
await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
|
||||
{
|
||||
_currentlandmark.Status = Landmark.LandmarkStatus.SKIPPED;
|
||||
});
|
||||
string s = await UpdateRoute();
|
||||
return s;
|
||||
}
|
||||
|
||||
public async void StartRoute(Route r)
|
||||
{
|
||||
App.Geo.ClearHistory();
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
<Content Include="Assets\LandmarkNotVisited.png">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Assets\LandmarkSkipped.png" />
|
||||
<Content Include="Assets\LandmarkVisited.png">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
@@ -153,7 +154,7 @@
|
||||
<Compile Include="Helpers\Comparer\LandmarkAlphaReversedComparer.cs" />
|
||||
<Compile Include="Helpers\Comparer\LandmarkNotVisitedComparer.cs" />
|
||||
<Compile Include="Helpers\Comparer\LandmarkVisitedComparer.cs" />
|
||||
<Compile Include="Helpers\Converter\BoolToIconConverter.cs" />
|
||||
<Compile Include="Helpers\Converter\StatusToIconConverter.cs" />
|
||||
<Compile Include="Helpers\Extensions.cs" />
|
||||
<Compile Include="Helpers\RouteParser.cs" />
|
||||
<Compile Include="Helpers\Settings.cs" />
|
||||
|
||||
@@ -25,6 +25,29 @@ namespace NavCityBreda.ViewModels
|
||||
NotifyPropertyChanged(nameof(Description));
|
||||
}
|
||||
|
||||
public void Skip()
|
||||
{
|
||||
NotifyPropertyChanged(nameof(CurrentLandmark));
|
||||
NotifyPropertyChanged(nameof(IsVisited));
|
||||
NotifyPropertyChanged(nameof(Visited));
|
||||
}
|
||||
|
||||
public bool CurrentLandmark
|
||||
{
|
||||
get
|
||||
{
|
||||
return landmark == App.RouteManager.CurrentLandmark;
|
||||
}
|
||||
}
|
||||
|
||||
public string SkipLandmarkText
|
||||
{
|
||||
get
|
||||
{
|
||||
return Util.Loader.GetString("SkipLandmark");
|
||||
}
|
||||
}
|
||||
|
||||
public string Address
|
||||
{
|
||||
get
|
||||
@@ -41,11 +64,11 @@ namespace NavCityBreda.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsVisited
|
||||
public Landmark.LandmarkStatus IsVisited
|
||||
{
|
||||
get
|
||||
{
|
||||
return landmark.Visited;
|
||||
return landmark.Status;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,10 +76,16 @@ namespace NavCityBreda.ViewModels
|
||||
{
|
||||
get
|
||||
{
|
||||
if (landmark.Visited)
|
||||
return Util.Loader.GetString("Visited");
|
||||
else
|
||||
return Util.Loader.GetString("NotVisited");
|
||||
switch(landmark.Status)
|
||||
{
|
||||
default:
|
||||
case Landmark.LandmarkStatus.NOTVISITED:
|
||||
return Util.Loader.GetString("NotVisited");
|
||||
case Landmark.LandmarkStatus.VISITED:
|
||||
return Util.Loader.GetString("Visited");
|
||||
case Landmark.LandmarkStatus.SKIPPED:
|
||||
return Util.Loader.GetString("Skipped");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using NavCityBreda.Helpers;
|
||||
using NavCityBreda.Helpers.Comparer;
|
||||
using NavCityBreda.Model;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace NavCityBreda.ViewModels
|
||||
|
||||
@@ -89,6 +89,9 @@ namespace NavCityBreda.ViewModels
|
||||
{
|
||||
get
|
||||
{
|
||||
if (route.Landmarks.TrueForAll(lm => lm.Status != Landmark.LandmarkStatus.NOTVISITED))
|
||||
return false;
|
||||
|
||||
return App.RouteManager.CurrentRoute != route;
|
||||
}
|
||||
}
|
||||
@@ -105,7 +108,10 @@ namespace NavCityBreda.ViewModels
|
||||
{
|
||||
get
|
||||
{
|
||||
return !StartEnabled;
|
||||
if (route.Landmarks.TrueForAll(lm => lm.Status != Landmark.LandmarkStatus.NOTVISITED))
|
||||
return false;
|
||||
|
||||
return App.RouteManager.CurrentRoute == route;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,12 +9,14 @@
|
||||
mc:Ignorable="d">
|
||||
|
||||
<Page.Resources>
|
||||
<convert:BoolToIconConverter x:Key="BoolConverter"/>
|
||||
<convert:StatusToIconConverter x:Key="IconConverter"/>
|
||||
<convert:BoolToVisibilityConverter x:Key="VisConverter" />
|
||||
</Page.Resources>
|
||||
|
||||
<ScrollViewer>
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
@@ -56,14 +58,18 @@
|
||||
</Viewbox>
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Column="1" Orientation="Horizontal">
|
||||
<SymbolIcon Symbol="{Binding IsVisited, Converter={StaticResource BoolConverter}}" Style="{StaticResource InfoIcon}"/>
|
||||
<SymbolIcon Symbol="{Binding IsVisited, Converter={StaticResource IconConverter}}" Style="{StaticResource InfoIcon}"/>
|
||||
<Viewbox StretchDirection="DownOnly" Stretch="UniformToFill">
|
||||
<TextBlock Text="{Binding Visited}" Style="{StaticResource InfoText}"/>
|
||||
</Viewbox>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
<StackPanel Grid.Row="2" Margin="10">
|
||||
<StackPanel Grid.Row="2" Margin="10">
|
||||
<Button Name="Button" Click="Button_Click" Content="{Binding SkipLandmarkText}" Background="DarkRed" Foreground="White" HorizontalAlignment="Stretch" Visibility="{Binding CurrentLandmark, Converter={StaticResource VisConverter}}"/>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Grid.Row="3" Margin="10">
|
||||
<TextBlock Text="{Binding DescriptionTitle}" Style="{StaticResource Header}"/>
|
||||
<TextBlock TextWrapping="WrapWholeWords" Text="{Binding Description}"/>
|
||||
</StackPanel>
|
||||
|
||||
@@ -25,5 +25,16 @@ namespace NavCityBreda.Views
|
||||
landmarkvm = new LandmarkDetailVM(landmark);
|
||||
this.DataContext = landmarkvm;
|
||||
}
|
||||
|
||||
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
|
||||
{
|
||||
Skip();
|
||||
}
|
||||
|
||||
private async void Skip()
|
||||
{
|
||||
await App.RouteManager.SkipLandmark();
|
||||
landmarkvm.Skip();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
mc:Ignorable="d">
|
||||
|
||||
<Page.Resources>
|
||||
<convert:BoolToIconConverter x:Key="BoolConverter" />
|
||||
<convert:StatusToIconConverter x:Key="IconConverter" />
|
||||
</Page.Resources>
|
||||
|
||||
<ScrollViewer>
|
||||
@@ -49,7 +49,7 @@
|
||||
<ListView.ItemTemplate>
|
||||
<DataTemplate x:Name="ListViewDataTemplate">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<SymbolIcon Symbol="{Binding Visited, Converter={StaticResource BoolConverter}}" Margin="0,0,10,0"/>
|
||||
<SymbolIcon Symbol="{Binding Status, Converter={StaticResource IconConverter}}" Margin="0,0,10,0"/>
|
||||
<TextBlock Text="{Binding Name}" FontSize="18"/>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
|
||||
@@ -151,7 +151,7 @@ namespace NavCityBreda.Views
|
||||
|
||||
foreach (Landmark l in r.Landmarks)
|
||||
{
|
||||
if (!l.Visited)
|
||||
if (l.Status == Landmark.LandmarkStatus.NOTVISITED)
|
||||
GeofenceMonitor.Current.Geofences.Add(new Geofence(l.Id, new Geocircle(l.Position.Position, 35), MonitoredGeofenceStates.Entered, true));
|
||||
l.UpdateIcon();
|
||||
await Task.Delay(TimeSpan.FromMilliseconds(3));
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
mc:Ignorable="d">
|
||||
|
||||
<Page.Resources>
|
||||
<convert:BoolToIconConverter x:Key="BoolConverter"/>
|
||||
<convert:StatusToIconConverter x:Key="IconConverter"/>
|
||||
<convert:BoolToVisibilityConverter x:Key="VisConverter"/>
|
||||
</Page.Resources>
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
<StackPanel Grid.Row="2" Margin="10" Visibility="Visible">
|
||||
<StackPanel Grid.Row="2" Margin="10">
|
||||
<Button Click="StartRouteButton_Click" Content="{Binding StartRouteText}" Background="DarkGreen" Foreground="White" HorizontalAlignment="Stretch" Visibility="{Binding StartEnabled, Converter={StaticResource VisConverter}}"/>
|
||||
<Button Click="StopRouteButton_Click" Content="{Binding StopRouteText}" Background="DarkRed" Foreground="White" HorizontalAlignment="Stretch" Visibility="{Binding StopEnabled, Converter={StaticResource VisConverter}}"/>
|
||||
</StackPanel>
|
||||
@@ -64,7 +64,7 @@
|
||||
<ListView.ItemTemplate>
|
||||
<DataTemplate x:Name="ListViewDataTemplate">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<SymbolIcon Symbol="{Binding Visited, Converter={StaticResource BoolConverter}}" Margin="0,0,10,0"/>
|
||||
<SymbolIcon Symbol="{Binding Status, Converter={StaticResource IconConverter}}" Margin="0,0,10,0"/>
|
||||
<TextBlock Text="{Binding Name}" FontSize="18"/>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
|
||||
Reference in New Issue
Block a user