diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Assets/materialdesignicons-webfont.ttf b/CarouselViewChallenge/CarouselViewChallenge.Android/Assets/materialdesignicons-webfont.ttf new file mode 100644 index 0000000..569f59e Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Assets/materialdesignicons-webfont.ttf differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj b/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj index 82e6221..229af4c 100644 --- a/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj +++ b/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj @@ -63,6 +63,7 @@ + @@ -100,5 +101,23 @@ CarouselViewChallenge + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/London.jpg b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/London.jpg new file mode 100644 index 0000000..a00c880 Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/London.jpg differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Restaurant.jpeg b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Restaurant.jpeg new file mode 100644 index 0000000..7d049b4 Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Restaurant.jpeg differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Seattle.jpg b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Seattle.jpg new file mode 100644 index 0000000..9e2656d Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Seattle.jpg differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Sight.jpeg b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Sight.jpeg new file mode 100644 index 0000000..1cab635 Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Sight.jpeg differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Zurich.jpg b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Zurich.jpg new file mode 100644 index 0000000..4e3e894 Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Zurich.jpg differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/ZurichLandmark.jpg b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/ZurichLandmark.jpg new file mode 100644 index 0000000..7ff86f2 Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/ZurichLandmark.jpg differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj b/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj index 155cd56..2743390 100644 --- a/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj +++ b/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj @@ -65,6 +65,7 @@ + diff --git a/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/materialdesignicons-webfont.ttf b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/materialdesignicons-webfont.ttf new file mode 100644 index 0000000..569f59e Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/materialdesignicons-webfont.ttf differ diff --git a/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj b/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj index 198ec7f..5435aa8 100644 --- a/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj +++ b/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj @@ -6,12 +6,14 @@ - - + + + - + + diff --git a/CarouselViewChallenge/CarouselViewChallenge/ViewModels/CarouselViewModel.cs b/CarouselViewChallenge/CarouselViewChallenge/ViewModels/CarouselViewModel.cs new file mode 100644 index 0000000..3ab27a5 --- /dev/null +++ b/CarouselViewChallenge/CarouselViewChallenge/ViewModels/CarouselViewModel.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Xamarin.Forms; + +namespace CarouselViewChallenge.ViewModels +{ + public class CarouselViewModel : BaseViewModel + { + public CarouselViewModel() + { + _cities = new ObservableCollection + { + new City + { + CityImage = "London", + CityName = "London", + Country = "UK", + IsFavorite = false, + }, + new City + { + CityImage = "Zurich", + CityName = "Zurich", + Country = "Switzerland", + IsFavorite = true, + }, + new City + { + CityImage = "Seattle", + CityName = "Seattle", + Country = "USA", + IsFavorite = false, + }, + }; + Index = "1"; + } + + private ObservableCollection _cities; + private City _currentCity; + private string _index; + + public ObservableCollection Cities + { + get + { + return _cities; + } + set + { + if (_cities != value) + { + _cities = value; + OnPropertyChanged(nameof(Cities)); + } + } + } + + public string Index + { + get => _index; set + { + _index = value; + + OnPropertyChanged(nameof(Index)); + } + } + + public City CurrentCity + { + get + { + return _currentCity; + } + set + { + _currentCity = value; + var index = Cities.IndexOf(_currentCity); + Index = (index + 1).ToString(); + OnPropertyChanged(nameof(CurrentCity)); + } + } + } + + public class City : BaseViewModel, IEquatable + { + private bool _isFavorite; + + public City() + { + ChangeFavoriteStatus = new Command(() => IsFavorite = !IsFavorite); + } + + public string CityImage { get; set; } + public string CityName { get; set; } + public string Country { get; set; } + public string FavoriteIcon => IsFavorite ? "\uf2d1" : "\uf2d5"; + public bool IsFavorite + { + get => _isFavorite; + set + { + _isFavorite = value; + OnPropertyChanged(nameof(FavoriteIcon)); + } + } + + public Command ChangeFavoriteStatus { get; set; } + + public override bool Equals(object obj) + { + return Equals(obj as City); + } + + public bool Equals(City other) + { + return other != null && + CityImage == other.CityImage && + CityName == other.CityName && + Country == other.Country && + IsFavorite == other.IsFavorite && + EqualityComparer.Default.Equals(ChangeFavoriteStatus, other.ChangeFavoriteStatus); + } + + public override int GetHashCode() + { + var hashCode = -870885539; + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(CityImage); + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(CityName); + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Country); + hashCode = hashCode * -1521134295 + IsFavorite.GetHashCode(); + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ChangeFavoriteStatus); + return hashCode; + } + } +} diff --git a/CarouselViewChallenge/CarouselViewChallenge/ViewModels/WelcomePageViewModel.cs b/CarouselViewChallenge/CarouselViewChallenge/ViewModels/WelcomePageViewModel.cs index fdaa195..e7df887 100644 --- a/CarouselViewChallenge/CarouselViewChallenge/ViewModels/WelcomePageViewModel.cs +++ b/CarouselViewChallenge/CarouselViewChallenge/ViewModels/WelcomePageViewModel.cs @@ -14,9 +14,17 @@ public class Section public string Emoji { get; set; } }; - public class WelcomePageViewModel : INotifyPropertyChanged + public class BaseViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; + protected void OnPropertyChanged(string propertyName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + } + + public class WelcomePageViewModel : BaseViewModel + { private ObservableCollection
_sections; public ObservableCollection
Sections @@ -30,14 +38,10 @@ public ObservableCollection
Sections if (_sections != value) { _sections = value; - OnPropertyChanged(new PropertyChangedEventArgs("Sections")); + OnPropertyChanged(nameof(Sections)); } } } - private void OnPropertyChanged(PropertyChangedEventArgs eventArgs) - { - PropertyChanged?.Invoke(this, eventArgs); - } } } diff --git a/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml b/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml index 1a7cc0d..3429386 100644 --- a/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml +++ b/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml @@ -5,9 +5,104 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="CarouselViewChallenge.Views.CarouselViewChallengePage"> + + Black + #B5B5B5 + White + #FFBF00 + #FAACC1 + + #xf349; + #xf4ce; + #xf2d1; + #xf2d5; + + 22 + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +