152 lines
4.7 KiB
C#
152 lines
4.7 KiB
C#
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
// Licensed under the MIT license. See LICENSE file in the project root for details.
|
||
|
|
||
|
using System;
|
||
|
using CoreGraphics;
|
||
|
using Foundation;
|
||
|
using ObjCRuntime;
|
||
|
using UIKit;
|
||
|
using MyDriving.ViewModel;
|
||
|
using SDWebImage;
|
||
|
|
||
|
namespace MyDriving.iOS
|
||
|
{
|
||
|
public partial class TripsTableViewController : UITableViewController
|
||
|
{
|
||
|
const string TripCellWithImageIdentifier = "TRIP_CELL_WITHIMAGE_IDENTIFIER";
|
||
|
const string TripCellIdentifier = "TRIP_CELL_IDENTIFIER";
|
||
|
const string PastTripSegueIdentifier = "pastTripSegue";
|
||
|
|
||
|
public TripsTableViewController(IntPtr handle) : base(handle)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public PastTripsViewModel ViewModel { get; set; }
|
||
|
|
||
|
public override async void ViewDidLoad()
|
||
|
{
|
||
|
base.ViewDidLoad();
|
||
|
|
||
|
ViewModel = new PastTripsViewModel();
|
||
|
await ViewModel.ExecuteLoadPastTripsCommandAsync();
|
||
|
|
||
|
TableView.ReloadData();
|
||
|
TableView.TableFooterView = new UIView(new CGRect(0, 0, 0, 0));
|
||
|
|
||
|
RefreshControl.AddTarget(this, new Selector("RefreshSource"), UIControlEvent.ValueChanged);
|
||
|
NSNotificationCenter.DefaultCenter.AddObserver(new NSString("RefreshPastTripsTable"),
|
||
|
HandleReloadTableNotification);
|
||
|
}
|
||
|
|
||
|
public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
|
||
|
{
|
||
|
if (segue.Identifier == PastTripSegueIdentifier)
|
||
|
{
|
||
|
var controller = segue.DestinationViewController as CurrentTripViewController;
|
||
|
var indexPath = TableView.IndexPathForCell(sender as UITableViewCell);
|
||
|
var trip = ViewModel.Trips[indexPath.Row];
|
||
|
|
||
|
controller.PastTripsDetailViewModel = new PastTripsDetailViewModel(trip);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[Export("RefreshSource")]
|
||
|
async void RefreshControl_ValueChanged()
|
||
|
{
|
||
|
await ViewModel.ExecuteLoadPastTripsCommandAsync();
|
||
|
|
||
|
InvokeOnMainThread(delegate
|
||
|
{
|
||
|
TableView.ReloadData();
|
||
|
RefreshControl.EndRefreshing();
|
||
|
});
|
||
|
}
|
||
|
|
||
|
async void HandleReloadTableNotification(NSNotification obj)
|
||
|
{
|
||
|
await ViewModel.ExecuteLoadPastTripsCommandAsync();
|
||
|
|
||
|
InvokeOnMainThread(delegate { TableView.ReloadData(); });
|
||
|
}
|
||
|
|
||
|
#region UITableViewSource
|
||
|
|
||
|
public override nint RowsInSection(UITableView tableView, nint section)
|
||
|
{
|
||
|
return ViewModel.Trips.Count;
|
||
|
}
|
||
|
|
||
|
public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
|
||
|
{
|
||
|
if (ViewModel.CanLoadMore && !ViewModel.IsBusy && ViewModel.Trips.Count > 0 && indexPath.Row == ViewModel.Trips.Count - 1)
|
||
|
{
|
||
|
ViewModel.ExecuteLoadMorePastTripsCommandAsync().ContinueWith((t) =>
|
||
|
{
|
||
|
InvokeOnMainThread(delegate { TableView.ReloadData(); });
|
||
|
}, scheduler: System.Threading.Tasks.TaskScheduler.Current);
|
||
|
}
|
||
|
|
||
|
var trip = ViewModel.Trips[indexPath.Row];
|
||
|
if (string.IsNullOrEmpty(trip.MainPhotoUrl))
|
||
|
{
|
||
|
var cell = tableView.DequeueReusableCell(TripCellIdentifier) as TripTableViewCell;
|
||
|
|
||
|
if (cell == null)
|
||
|
{
|
||
|
cell = new TripTableViewCell(new NSString(TripCellIdentifier));
|
||
|
}
|
||
|
|
||
|
cell.LocationName = trip.Name;
|
||
|
cell.TimeAgo = trip.TimeAgo;
|
||
|
cell.Distance = trip.TotalDistance;
|
||
|
|
||
|
return cell;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
var cell = tableView.DequeueReusableCell(TripCellWithImageIdentifier) as TripTableViewCellWithImage;
|
||
|
|
||
|
if (cell == null)
|
||
|
{
|
||
|
cell = new TripTableViewCellWithImage(new NSString(TripCellWithImageIdentifier));
|
||
|
}
|
||
|
|
||
|
cell.DisplayImage.SetImage(new NSUrl(trip.MainPhotoUrl));
|
||
|
cell.LocationName = trip.Name;
|
||
|
cell.TimeAgo = trip.TimeAgo;
|
||
|
cell.Distance = trip.TotalDistance;
|
||
|
|
||
|
return cell;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
|
||
|
{
|
||
|
var trip = ViewModel.Trips[indexPath.Row];
|
||
|
if (string.IsNullOrEmpty(trip.MainPhotoUrl))
|
||
|
return 70;
|
||
|
else
|
||
|
return 221;
|
||
|
}
|
||
|
|
||
|
public override bool CanEditRow(UITableView tableView, NSIndexPath indexPath)
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public override async void CommitEditingStyle(UITableView tableView, UITableViewCellEditingStyle editingStyle,
|
||
|
NSIndexPath indexPath)
|
||
|
{
|
||
|
switch (editingStyle)
|
||
|
{
|
||
|
case UITableViewCellEditingStyle.Delete:
|
||
|
var trip = ViewModel.Trips[indexPath.Row];
|
||
|
if(await ViewModel.ExecuteDeleteTripCommand(trip))
|
||
|
tableView.DeleteRows(new[] {indexPath}, UITableViewRowAnimation.Automatic);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endregion
|
||
|
}
|
||
|
}
|