From fb1fab2e1593ba13fae8eae519f5482525eb68a1 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Mon, 1 Apr 2013 13:34:49 +0400 Subject: AppViewModel --- Juick/ViewModels/AppViewModel.cs | 67 ++++++++++++++++++++ Juick/ViewModels/PageViewModel.cs | 111 ++++++++++++++++++++++++++++++++ Juick/ViewModels/ThreadViewModel.cs | 7 ++- Juick/ViewModels/ViewModelBase.cs | 122 +++--------------------------------- 4 files changed, 192 insertions(+), 115 deletions(-) create mode 100644 Juick/ViewModels/AppViewModel.cs create mode 100644 Juick/ViewModels/PageViewModel.cs (limited to 'Juick/ViewModels') diff --git a/Juick/ViewModels/AppViewModel.cs b/Juick/ViewModels/AppViewModel.cs new file mode 100644 index 0000000..5d22cab --- /dev/null +++ b/Juick/ViewModels/AppViewModel.cs @@ -0,0 +1,67 @@ +using System; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; +using System.Collections.ObjectModel; +using Juick.Classes; +using RestSharp; + +namespace Juick.ViewModels +{ + public class AppViewModel : ViewModelBase + { + private ObservableCollection _pages; + public ObservableCollection Pages + { + get + { + if (_pages == null) + _pages = new ObservableCollection(); + return _pages; + } + } + + static readonly string IsDataLoadingPropertyName = ExpressionHelper.GetPropertyName(x => x.IsDataLoading); + bool isDataLoading; + + public bool IsDataLoading + { + get { return isDataLoading; } + set + { + isDataLoading = value; + NotifyPropertyChanged(IsDataLoadingPropertyName); + foreach (var page in Pages) + { + page.LoadMessagesPageCommand.NotifyCanExecuteChanged(); + } + } + } + + private AccountManager _acc; + + public AccountManager Account + { + get { return _acc ?? (_acc = new AccountManager()); } + } + + private RestClient _cl; + public RestClient Client + { + get + { + return _cl ?? (_cl = new RestClient("http://api.juick.com") + { + UserAgent = "Juick 1.1/Windows Phone " + Environment.OSVersion.Version + }); + } + } + + } +} diff --git a/Juick/ViewModels/PageViewModel.cs b/Juick/ViewModels/PageViewModel.cs new file mode 100644 index 0000000..9b9cae5 --- /dev/null +++ b/Juick/ViewModels/PageViewModel.cs @@ -0,0 +1,111 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Net; +using System.Windows; +using System.Windows.Media.Imaging; +using Juick.Classes; +using JuickApi; +using RestSharp; +using System.Diagnostics; +using System.Windows.Navigation; +using Microsoft.Phone.Controls; +using System.Windows.Controls; + +namespace Juick.ViewModels +{ + public class PageViewModel : ViewModelBase + { + public PageViewModel(AppViewModel context) + { + this.context = context; + Items = new ObservableCollection(); + LoadMessagesPageCommand = new DelegateCommand(LoadData, () => !context.IsDataLoading); + NavigateNextCommand = new DelegateCommand(NavigateToThread, () => true); + } + + private AppViewModel context; + + public string RestUri { get; set; } + public virtual string Caption { get { return "juick"; } } + + /// + /// A collection for MessageViewModel objects. + /// + public ObservableCollection Items { get; private set; } + + public DelegateCommand LoadMessagesPageCommand { get; private set; } + + public DelegateCommand NavigateNextCommand { get; private set; } + + public void NavigateToThread(object param) + { + var selectionChangedEventArgs = param as SelectionChangedEventArgs; + if (param != null) + { + ((App)App.Current).NavigateTo(new Uri(string.Format("/ThreadView.xaml?mid={0}", ((PostItem)selectionChangedEventArgs.AddedItems[0]).MID), UriKind.Relative)); + } + + } + + /// + /// Creates and adds a few MessageViewModel objects into the Items collection. + /// + public void LoadData(object EventArgs) + { + const int offset = 5; + if (context.IsDataLoading) + { + return; + } + if (EventArgs != null) + { + var item = (EventArgs as LinkUnlinkEventArgs).ContentPresenter.Content; + if (!item.Equals(Items[Items.Count - offset])) { + return; + } + } + + int count = Items.Count; + + + if (string.IsNullOrEmpty(RestUri)) + { + RestUri = "/home?1=1"; + } + + // super-костыли + // todo: rewrite + else if (RestUri.StartsWith("/home?", StringComparison.InvariantCulture) && Items.Count > 0) + { + var lastItem = Items[Items.Count - 1]; + RestUri = string.Format("/home?before_mid={0}", lastItem.MID); + } + else if (RestUri.StartsWith("/messages?", StringComparison.InvariantCulture) && Items.Count > 0) + { + var lastItem = Items[Items.Count - 1]; + RestUri = string.Format("/messages?before_mid={0}", lastItem.MID); + } + + var request = new RestRequest(RestUri + "&rnd=" + Environment.TickCount); + context.Client.Authenticator = new HttpBasicAuthenticator(context.Account.Credentials.UserName, context.Account.Credentials.Password); + context.Client.ExecuteAsync>(request, ProcessResponse); + context.IsDataLoading = true; + } + + void ProcessResponse(IRestResponse> response) + { + context.IsDataLoading = false; + if (response.StatusCode != HttpStatusCode.OK) + { + MessageBox.Show(response.StatusCode.ToString()); + return; + } + + //Items.Clear(); + response.Data.Select(x => new PostItem(x)).ToList().ForEach(i => Items.Add(i)); + } + } +} diff --git a/Juick/ViewModels/ThreadViewModel.cs b/Juick/ViewModels/ThreadViewModel.cs index 1cbaab7..c004851 100644 --- a/Juick/ViewModels/ThreadViewModel.cs +++ b/Juick/ViewModels/ThreadViewModel.cs @@ -2,8 +2,13 @@ namespace Juick.ViewModels { - public class ThreadViewModel : ViewModelBase + public class ThreadViewModel : PageViewModel { + public ThreadViewModel(AppViewModel context) : base(context) + { + + } + static readonly string CaptionPropertyName = ExpressionHelper.GetPropertyName(x => x.Caption); private int _mid; diff --git a/Juick/ViewModels/ViewModelBase.cs b/Juick/ViewModels/ViewModelBase.cs index 746ce04..9ac3023 100644 --- a/Juick/ViewModels/ViewModelBase.cs +++ b/Juick/ViewModels/ViewModelBase.cs @@ -1,127 +1,21 @@ using System; -using System.Linq; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; using System.Net; using System.Windows; -using System.Windows.Media.Imaging; -using Juick.Classes; -using JuickApi; -using RestSharp; -using System.Diagnostics; -using System.Windows.Navigation; -using Microsoft.Phone.Controls; using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; +using System.ComponentModel; +using Juick.Classes; namespace Juick.ViewModels { public class ViewModelBase : INotifyPropertyChanged { - static readonly string IsDataLoadingPropertyName = ExpressionHelper.GetPropertyName(x => x.IsDataLoading); - bool isDataLoading; - - public ViewModelBase() - { - Items = new ObservableCollection(); - LoadMessagesPageCommand = new DelegateCommand(LoadData, () => !IsDataLoading); - NavigateNextCommand = new DelegateCommand(NavigateToThread, () => true); - } - - public string RestUri { get; set; } - public virtual string Caption { get { return "juick"; } } - - /// - /// A collection for MessageViewModel objects. - /// - public ObservableCollection Items { get; private set; } - - public DelegateCommand LoadMessagesPageCommand { get; private set; } - - public DelegateCommand NavigateNextCommand { get; private set; } - - public bool IsDataLoading - { - get { return isDataLoading; } - set - { - isDataLoading = value; - NotifyPropertyChanged(IsDataLoadingPropertyName); - LoadMessagesPageCommand.NotifyCanExecuteChanged(); - } - } - - public void NavigateToThread(object param) - { - var selectionChangedEventArgs = param as SelectionChangedEventArgs; - if (param != null) - { - ((App)App.Current).NavigateTo(new Uri(string.Format("/ThreadView.xaml?mid={0}", ((PostItem)selectionChangedEventArgs.AddedItems[0]).MID), UriKind.Relative)); - } - - } - - /// - /// Creates and adds a few MessageViewModel objects into the Items collection. - /// - public void LoadData(object EventArgs) - { - const int offset = 5; - if (IsDataLoading) - { - return; - } - if (EventArgs != null) - { - var item = (EventArgs as LinkUnlinkEventArgs).ContentPresenter.Content; - if (!item.Equals(Items[Items.Count - offset])) { - return; - } - } - - int count = Items.Count; - - - if (string.IsNullOrEmpty(RestUri)) - { - RestUri = "/home?1=1"; - } - - // super-костыли - // todo: rewrite - else if (RestUri.StartsWith("/home?", StringComparison.InvariantCulture) && Items.Count > 0) - { - var lastItem = Items[Items.Count - 1]; - RestUri = string.Format("/home?before_mid={0}", lastItem.MID); - } - else if (RestUri.StartsWith("/messages?", StringComparison.InvariantCulture) && Items.Count > 0) - { - var lastItem = Items[Items.Count - 1]; - RestUri = string.Format("/messages?before_mid={0}", lastItem.MID); - } - - var request = new RestRequest(RestUri + "&rnd=" + Environment.TickCount); - App.Client.Authenticator = new HttpBasicAuthenticator(App.Account.Credentials.UserName, App.Account.Credentials.Password); - App.Client.ExecuteAsync>(request, ProcessResponse); - IsDataLoading = true; - } - - void ProcessResponse(IRestResponse> response) - { - IsDataLoading = false; - if (response.StatusCode != HttpStatusCode.OK) - { - MessageBox.Show(response.StatusCode.ToString()); - return; - } - - //Items.Clear(); - response.Data.Select(x => new PostItem(x)).ToList().ForEach(i => Items.Add(i)); - } - - public event PropertyChangedEventHandler PropertyChanged; - public void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) -- cgit v1.2.3