public ExplorerProvider( Target target, IExplorerTrigger trigger, IMessageLoader messageLoader, IMessageModelFactory messageModelFactory, IAvatarManager avatarManager ) { _items = new SourceList <ItemModel>(); var loadRequests = Observable.FromEventPattern <MessageLoadRequestedArgs>( h => trigger.MessageLoadRequested += h, h => trigger.MessageLoadRequested -= h) .Select(args => args.EventArgs); BindLoading(loadRequests, target, messageLoader, messageModelFactory) .DisposeWith(_serviceDisposable); var visibleRangeChanges = Observable.FromEventPattern <VisibleRangeNotifiedArgs>( h => trigger.VisibleRangeNotified += h, h => trigger.VisibleRangeNotified -= h) .Select(args => args.EventArgs); BindAvatarLoading(visibleRangeChanges, avatarManager) .DisposeWith(_serviceDisposable); BindMediaLoading(visibleRangeChanges) .DisposeWith(_serviceDisposable); }
public FriendViewModel(IDataService dataService, int friendNumber) { _toxModel = dataService.ToxModel; _avatarManager = dataService.AvatarManager; FriendNumber = friendNumber; Conversation = new ConversationViewModel(dataService, this); FileTransfers = new FileTransfersViewModel(dataService, friendNumber); Call = new CallViewModel(friendNumber); Name = _toxModel.GetFriendName(friendNumber); if (Name == string.Empty) { Name = _toxModel.GetFriendPublicKey(friendNumber).ToString(); } StatusMessage = _toxModel.GetFriendStatusMessage(friendNumber); if (StatusMessage == string.Empty) { StatusMessage = "Friend request sent."; } SetFriendStatus(_toxModel.GetFriendStatus(friendNumber)); IsConnected = _toxModel.IsFriendOnline(friendNumber); _avatarManager.FriendAvatarChanged += FriendAvatarChangedHandler; _toxModel.FriendNameChanged += FriendNameChangedHandler; _toxModel.FriendStatusMessageChanged += FriendStatusMessageChangedHandler; _toxModel.FriendStatusChanged += FriendStatusChangedHandler; _toxModel.FriendConnectionStatusChanged += FriendConnectionStatusChangedHandler; }
private ProfileViewModel(IDataService dataService, ToxData toxData, ToxDataInfo toxDataInfo) { _toxModel = dataService.ToxModel; _avatarManager = dataService.AvatarManager; _toxData = toxData; _toxDataInfo = toxDataInfo; }
public UserViewModel(IDataService dataService) { _toxModel = dataService.ToxModel; _avatarManager = dataService.AvatarManager; _toxModel.PropertyChanged += ToxModelPropertyChangedHandler; _avatarManager.UserAvatarChanged += UserAvatarChangedHandler; }
public ProfileManagementViewModel(IDataService dataService) { _dataService = dataService; _toxModel = dataService.ToxModel; _avatarManager = dataService.AvatarManager; Profiles = new ObservableCollection <ProfileViewModel>(); }
public ProfileSettingsViewModel(IDataService dataService) { _toxModel = dataService.ToxModel; _avatarManager = dataService.AvatarManager; _toxModel.PropertyChanged += ToxModelPropertyChangedHandler; _avatarManager.UserAvatarChanged += UserAvatarChangedHandler; _avatarManager.IsUserAvatarSetChanged += IsUserAvatarSetChangedHandler; RefreshQrCodeId(); }
/// <summary> /// Invoked when the application is launched normally by the end user. Other entry points /// will be used such as when the application is launched to open a specific file. /// </summary> /// <param name="e">Details about the launch request and process.</param> protected override async void OnLaunched(LaunchActivatedEventArgs e) { DispatcherHelper.Initialize(); // We cheat a little bit here... TODO: Fix it! Until then: Please, don't use ServiceLocator anywhere else in the code than ViewModelLocator! var dataService = ServiceLocator.Current.GetInstance <IDataService>(); _toxModel = dataService.ToxModel; _avatarManager = dataService.AvatarManager; var rootFrame = Window.Current.Content as Frame; // Do not repeat app initialization when the Window already has content, // just ensure that the window is active if (rootFrame == null) { // Create a Frame to act as the navigation context and navigate to the first page rootFrame = new Frame(); // Associate the frame with a SuspensionManager key SuspensionManager.RegisterFrame(rootFrame, "AppFrame"); // Set the default language rootFrame.Language = ApplicationLanguages.Languages[0]; rootFrame.NavigationFailed += OnNavigationFailed; await HandlePreviousExecutionState(e.PreviousExecutionState); await InitializeSingletons(); // Place the frame in the current Window Window.Current.Content = rootFrame; } if (rootFrame.Content == null) { // When the navigation stack isn't restored navigate to the first page, // configuring the new page by passing required information as a navigation // parameter if (Window.Current.Bounds.Width < 930) { rootFrame.Navigate(typeof(FriendListPage)); } else { rootFrame.Navigate(typeof(MainPage)); } } // Ensure the current window is active Window.Current.Activate(); ApplicationView.GetForCurrentView().SetPreferredMinSize(new Size { Width = 500, Height = 500 }); }
public ExplorerController( Target target, IMessageManager messageManager, IAvatarManager avatarManager) { _items = new SourceList <ItemModel>(); BindSource() .DisposeWith(this); BindVisibleRangeChanges(target, messageManager, avatarManager) .DisposeWith(this); InitMessageLoading(target, messageManager, avatarManager) .DisposeWith(this); }
public ExplorerModel( IMessageManager messageManager, IAvatarManager avatarManager, Target target ) { var visibleRangeChanges = this.WhenAnyValue(m => m.VisibleIndexes) .Select(tuple => new Range(tuple?.Item1 ?? 0, tuple?.Item2 ?? 0)) .SubscribeOn(TaskPoolScheduler.Default); BindMessages(target, messageManager, visibleRangeChanges) .DisposeWith(_modelDisposable); BindAvatars(avatarManager, visibleRangeChanges) .DisposeWith(_modelDisposable); }
private IDisposable BindAvatars( IAvatarManager avatarManager, IObservable <Range> visibleRangeChanges) { var prevRange = new Range(0, 0); return(visibleRangeChanges .SelectMany(range => { var releases = avatarManager.ReleaseAvatars(_items, prevRange, range); var loads = avatarManager.LoadAvatars(_items, prevRange, range); return releases.Concat(loads); }) .SubscribeOn(TaskPoolScheduler.Default) .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(action => action())); }
private IDisposable InitMessageLoading( Target target, IMessageManager messageManager, IAvatarManager avatarManager) { var messageLoading = messageManager.LoadPrevMessages(target) .Select(models => new { Action = new Action(() => { _items.InsertRange(models, 0); }), Models = models }); var avatarLoading = messageLoading .SelectMany(item => { var action = item.Action; var models = item.Models; var messageLoadAction = Observable.Return(action); var avatarPreloadAction = avatarManager.PreloadAvatars(models) .Select((avatar, i) => new Action(() => { var messageModel = models[i]; messageModel.Avatar = avatar; })); var avatarLoadAction = avatarManager.LoadAvatars(models) .Select((avatar, i) => new Action(() => { var messageModel = models[i]; messageModel.Avatar = avatar; })); return(messageLoadAction .Concat(avatarPreloadAction) .Concat(avatarLoadAction)); }); return(SubscribeToActions(avatarLoading)); }
private IDisposable BindAvatarLoading( IObservable <VisibleRangeNotifiedArgs> visibleRangeChanges, IAvatarManager avatarManager) { var prevRange = new Range(0, 0); return(visibleRangeChanges .ObserveOn(TaskPoolScheduler.Default) .SubscribeOn(RxApp.MainThreadScheduler) .Subscribe(args => { var range = args.Range; avatarManager.ReleaseAvatars(_items, prevRange, range) .DisposeWith(_serviceDisposable); avatarManager.LoadAvatars(_items, prevRange, range) .DisposeWith(_serviceDisposable); prevRange = range; })); }
/// <summary> /// 初始化类<see cref="AvatarController"/>。 /// </summary> /// <param name="avatarManager">存储文件夹接口。</param> public AvatarController(IAvatarManager avatarManager) { _avatarManager = avatarManager; }
private IDisposable BindVisibleRangeChanges( Target target, IMessageManager messageManager, IAvatarManager avatarManager) { var prevRange = default(Range); var visibleRangeChanges = Model.WhenAnyValue(m => m.VisibleRange) .Select(range => new { PrevRange = prevRange, Range = range }) .Do(item => prevRange = item.Range) .Do(Console.WriteLine); var messageLoading = visibleRangeChanges .SelectMany(item => { if (item.Range.Length > 0) { if (item.Range.Index == 0 && item.Range.Index != item.PrevRange.Index) { var items = _items.Items.OfType <MessageModel>().ToList(); var firstMessage = items.FirstOrDefault(); return(messageManager.LoadPrevMessages(target, firstMessage?.Message) .Select(models => new { Action = new Action(() => { _items.InsertRange(models, 0); }), Models = models })); } if (item.Range.Index + item.Range.Length == _items.Count && item.Range.LastIndex != item.PrevRange.LastIndex) { var items = _items.Items.OfType <MessageModel>().ToList(); var lastMessage = items.LastOrDefault(); return(messageManager.LoadNextMessages(target, lastMessage?.Message) .Select(models => new { Action = new Action(() => { _items.AddRange(models); }), Models = models })); } } return(Observable.Empty <IList <MessageModel> >() .Select(models => new { Action = new Action(() => { }), Models = models })); }); var avatarLoading = messageLoading .SelectMany(item => { var action = item.Action; var models = item.Models; var messageLoadAction = Observable.Return(action); var avatarPreloadAction = avatarManager.PreloadAvatars(models) .Select((avatar, i) => new Action(() => { var messageModel = models[i]; messageModel.Avatar = avatar; })); var avatarLoadAction = avatarManager.LoadAvatars(models) .Select((avatar, i) => new Action(() => { var messageModel = models[i]; messageModel.Avatar = avatar; })); return(messageLoadAction .Concat(avatarPreloadAction) .Concat(avatarLoadAction)); }); return(SubscribeToActions(avatarLoading)); }