public override void ViewDidLoad() { base.ViewDidLoad(); HeaderView.Image = Images.LoginUserUnknown; HeaderView.SubImageView.TintColor = UIColor.FromRGB(243, 156, 18); Appeared.Take(1) .Select(_ => Observable.Timer(TimeSpan.FromSeconds(0.35f))) .Switch() .Select(_ => this.WhenAnyValue(x => x.ViewModel.IsFollowing).Where(x => x.HasValue)) .Switch() .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(x => HeaderView.SetSubImage(x.Value ? Octicon.Star.ToImage() : null)); var split = new SplitButtonElement(); var followers = split.AddButton("Followers", "-"); var following = split.AddButton("Following", "-"); var events = new StringElement("Events", Octicon.Rss.ToImage()); var organizations = new StringElement("Organizations", Octicon.Organization.ToImage()); var repos = new StringElement("Repositories", Octicon.Repo.ToImage()); var gists = new StringElement("Gists", Octicon.Gist.ToImage()); var website = new StringElement("Website", Octicon.Globe.ToImage()) { Hidden = true }; Root.Reset(new [] { new Section { split }, new Section { events, organizations, repos, gists }, new Section { website } }); OnActivation(d => { d(followers.Clicked.InvokeCommand(ViewModel.GoToFollowersCommand)); d(following.Clicked.InvokeCommand(ViewModel.GoToFollowingCommand)); d(website.Clicked.InvokeCommand(ViewModel.GoToWebsiteCommand)); d(events.Clicked.InvokeCommand(ViewModel.GoToEventsCommand)); d(organizations.Clicked.InvokeCommand(ViewModel.GoToOrganizationsCommand)); d(repos.Clicked.InvokeCommand(ViewModel.GoToRepositoriesCommand)); d(gists.Clicked.InvokeCommand(ViewModel.GoToGistsCommand)); d(this.WhenAnyValue(x => x.ViewModel) .Where(x => !x.IsLoggedInUser) .Select(x => x.ShowMenuCommand) .ToBarButtonItem(UIBarButtonSystemItem.Action, x => NavigationItem.RightBarButtonItem = x)); d(this.WhenAnyValue(x => x.ViewModel.Avatar) .Subscribe(x => HeaderView.SetImage(x?.ToUri(128), Images.LoginUserUnknown))); d(this.WhenAnyValue(x => x.ViewModel.User.Name).Select(x => string.IsNullOrEmpty(x) ? null : x) .Subscribe(x => RefreshHeaderView(subtext: x))); d(followers.BindText(this.WhenAnyValue(x => x.ViewModel.User.Followers))); d(following.BindText(this.WhenAnyValue(x => x.ViewModel.User.Following))); d(this.WhenAnyValue(x => x.ViewModel.HasBlog).Subscribe(x => website.Hidden = !x)); }); }
public override void ViewDidLoad() { base.ViewDidLoad(); HeaderView.Image = Images.LoginUserUnknown; HeaderView.SubImageView.TintColor = UIColor.FromRGB(243, 156, 18); Appeared.Take(1) .Select(_ => Observable.Timer(TimeSpan.FromSeconds(0.35f))) .Switch() .Select(_ => this.WhenAnyValue(x => x.ViewModel.IsFollowing).Where(x => x.HasValue)) .Switch() .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(x => HeaderView.SetSubImage(x.Value ? Octicon.Star.ToImage() : null)); var websiteElement = new StringElement("Website", () => ViewModel.GoToWebsiteCommand.ExecuteIfCan(), Octicon.Globe.ToImage()); var extraSection = new Section(); var split = new SplitButtonElement(); var followers = split.AddButton("Followers", "-", () => ViewModel.GoToFollowersCommand.ExecuteIfCan()); var following = split.AddButton("Following", "-", () => ViewModel.GoToFollowingCommand.ExecuteIfCan()); var events = new StringElement("Events", () => ViewModel.GoToEventsCommand.ExecuteIfCan(), Octicon.Rss.ToImage()); var organizations = new StringElement("Organizations", () => ViewModel.GoToOrganizationsCommand.ExecuteIfCan(), Octicon.Organization.ToImage()); var repos = new StringElement("Repositories", () => ViewModel.GoToRepositoriesCommand.ExecuteIfCan(), Octicon.Repo.ToImage()); var gists = new StringElement("Gists", () => ViewModel.GoToGistsCommand.ExecuteIfCan(), Octicon.Gist.ToImage()); Root.Reset(new [] { new Section { split }, new Section { events, organizations, repos, gists }, extraSection }); this.WhenAnyValue(x => x.ViewModel.IsLoggedInUser) .Subscribe(x => NavigationItem.RightBarButtonItem = x ? null : ViewModel.ShowMenuCommand.ToBarButtonItem(UIBarButtonSystemItem.Action)); this.WhenAnyValue(x => x.ViewModel.Avatar) .Subscribe(x => HeaderView.SetImage(x?.ToUri(128), Images.LoginUserUnknown)); this.WhenAnyValue(x => x.ViewModel.User).IsNotNull().Subscribe(x => { followers.Text = x.Followers.ToString(); following.Text = x.Following.ToString(); HeaderView.SubText = string.IsNullOrEmpty(x.Name) ? null : x.Name; RefreshHeaderView(); }); this.WhenAnyValue(x => x.ViewModel.HasBlog).Subscribe(x => { if (x && websiteElement.Section == null) { extraSection.Add(websiteElement); } else if (!x && websiteElement.Section != null) { extraSection.Remove(websiteElement); } }); }
public UserView() { HeaderView.Image = Images.LoginUserUnknown; Appeared.Take(1) .Select(_ => Observable.Timer(TimeSpan.FromSeconds(0.35f))) .Switch() .Select(_ => this.WhenAnyValue(x => x.ViewModel.IsFollowing).Where(x => x.HasValue)) .Switch() .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(x => HeaderView.SetSubImage(x.Value ? Octicon.Star.ToImage() : null)); this.WhenAnyValue(x => x.ViewModel.IsLoggedInUser) .Subscribe(x => NavigationItem.RightBarButtonItem = x ? null : ViewModel.ShowMenuCommand.ToBarButtonItem(UIBarButtonSystemItem.Action)); }
public override void ViewDidLoad() { base.ViewDidLoad(); Title = ViewModel.Username; HeaderView.SetImage(null, Images.Avatar); HeaderView.Text = ViewModel.RepositoryName; HeaderView.SubImageView.TintColor = UIColor.FromRGB(243, 156, 18); Appeared.Take(1) .Select(_ => Observable.Timer(TimeSpan.FromSeconds(0.35f)).Take(1)) .Switch() .Select(_ => ViewModel.Bind(x => x.IsStarred, true).Where(x => x.HasValue)) .Switch() .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(x => HeaderView.SetSubImage(x.Value ? Octicon.Star.ToImage() : null)); var actionButton = NavigationItem.RightBarButtonItem = new UIBarButtonItem(UIBarButtonSystemItem.Action) { Enabled = false }; _split = new SplitButtonElement(); _stargazers = _split.AddButton("Stargazers", "-"); _watchers = _split.AddButton("Watchers", "-"); _forks = _split.AddButton("Forks", "-"); OnActivation(d => { d(_watchers.Clicked .Select(_ => ViewModel) .Select(x => UsersViewController.CreateWatchersViewController(x.Username, x.RepositoryName)) .Subscribe(x => NavigationController.PushViewController(x, true))); d(_stargazers.Clicked .Select(_ => ViewModel) .Select(x => UsersViewController.CreateStargazersViewController(x.Username, x.RepositoryName)) .Subscribe(x => NavigationController.PushViewController(x, true))); d(actionButton.GetClickedObservable().Subscribe(_ => ShowExtraMenu())); d(_forks.Clicked.Subscribe(_ => { var vc = RepositoriesViewController.CreateForkedViewController(ViewModel.Username, ViewModel.RepositoryName); NavigationController?.PushViewController(vc, true); })); d(_eventsElement.Clicked.BindCommand(ViewModel.GoToEventsCommand)); d(_ownerElement.Clicked.BindCommand(ViewModel.GoToOwnerCommand)); d(_commitsElement.Clicked.BindCommand(ViewModel.GoToCommitsCommand)); d(_pullRequestsElement.Clicked.BindCommand(ViewModel.GoToPullRequestsCommand)); d(_sourceElement.Clicked.BindCommand(ViewModel.GoToSourceCommand)); d(ViewModel.Bind(x => x.Branches, true).Subscribe(_ => Render())); d(ViewModel.Bind(x => x.Readme, true).Subscribe(_ => Render())); d(_forkElement.Value.Clicked.Select(x => ViewModel.Repository.Parent).BindCommand(ViewModel.GoToForkParentCommand)); d(_issuesElement.Value.Clicked.BindCommand(ViewModel.GoToIssuesCommand)); d(_readmeElement.Value.Clicked.BindCommand(ViewModel.GoToReadmeCommand)); d(_websiteElement.Value.Clicked.Select(x => ViewModel.Repository.Homepage).BindCommand(ViewModel.GoToUrlCommand)); d(HeaderView.Clicked.BindCommand(ViewModel.GoToOwnerCommand)); d(ViewModel.Bind(x => x.Repository, true).Where(x => x != null).Subscribe(x => { if (x.Private && !_featuresService.IsProEnabled) { if (_privateView == null) { _privateView = this.ShowPrivateView(); } actionButton.Enabled = false; } else { actionButton.Enabled = true; _privateView?.Dispose(); } ViewModel.ImageUrl = x.Owner?.AvatarUrl; HeaderView.SubText = Emojis.FindAndReplace(x.Description); HeaderView.SetImage(x.Owner?.AvatarUrl, Images.Avatar); Render(); RefreshHeaderView(); })); }); }
public override void ViewDidLoad() { base.ViewDidLoad(); HeaderView.Image = Images.LoginUserUnknown; _sourceSection = new Section { new StringElement("Commits", () => ViewModel.GoToCommitsCommand.ExecuteIfCan(), Octicon.GitCommit.ToImage()), new StringElement("Pull Requests", () => ViewModel.GoToPullRequestsCommand.ExecuteIfCan(), Octicon.GitPullRequest.ToImage()), new StringElement("Source", () => ViewModel.GoToSourceCommand.ExecuteIfCan(), Octicon.Code.ToImage()), }; _ownerElement = new StringElement("Owner", string.Empty) { Image = Octicon.Person.ToImage() }; _ownerElement.Tapped += () => ViewModel.GoToOwnerCommand.ExecuteIfCan(); this.WhenAnyValue(x => x.ViewModel.Repository) .Subscribe(x => _ownerElement.Value = x == null ? string.Empty : x.Owner.Login); HeaderView.SubImageView.TintColor = UIColor.FromRGB(243, 156, 18); this.WhenAnyValue(x => x.ViewModel.GoToOwnerCommand).Subscribe(x => HeaderView.ImageButtonAction = x != null ? new Action(() => ViewModel.GoToOwnerCommand.ExecuteIfCan()) : null); _splitElements[0] = new SplitViewElement(); _splitElements[0].Button1 = new SplitViewElement.SplitButton(Octicon.Lock.ToImage(), string.Empty); _splitElements[0].Button2 = new SplitViewElement.SplitButton(Octicon.Package.ToImage(), string.Empty); _splitElements[1] = new SplitViewElement(); _splitElements[1].Button1 = new SplitViewElement.SplitButton(Octicon.IssueOpened.ToImage(), string.Empty, () => ViewModel.GoToIssuesCommand.ExecuteIfCan()); _splitElements[1].Button2 = new SplitViewElement.SplitButton(Octicon.Organization.ToImage(), string.Empty, () => ViewModel.GoToContributors.ExecuteIfCan()); _splitElements[2] = new SplitViewElement(); _splitElements[2].Button1 = new SplitViewElement.SplitButton(Octicon.Tag.ToImage(), string.Empty, () => ViewModel.GoToReleasesCommand.ExecuteIfCan()); _splitElements[2].Button2 = new SplitViewElement.SplitButton(Octicon.GitBranch.ToImage(), string.Empty, () => ViewModel.GoToBranchesCommand.ExecuteIfCan()); var stargazers = _split.AddButton("Stargazers", "-", () => ViewModel.GoToStargazersCommand.ExecuteIfCan()); var watchers = _split.AddButton("Watchers", "-", () => ViewModel.GoToWatchersCommand.ExecuteIfCan()); var forks = _split.AddButton("Forks", "-", () => ViewModel.GoToForksCommand.ExecuteIfCan()); this.WhenAnyValue(x => x.ViewModel.Stargazers) .Select(x => x != null ? x.ToString() : "-") .Subscribe(x => stargazers.Text = x); this.WhenAnyValue(x => x.ViewModel.Watchers) .Select(x => x != null ? x.ToString() : "-") .Subscribe(x => watchers.Text = x); this.WhenAnyValue(x => x.ViewModel.Repository.ForksCount) .Subscribe(x => forks.Text = x.ToString()); this.WhenAnyValue(x => x.ViewModel.Repository) .IsNotNull() .Subscribe(x => { _splitElements[0].Button1.Text = x.Private ? "Private" : "Public"; _splitElements[0].Button2.Text = x.Language ?? "N/A"; _splitElements[1].Button1.Text = x.OpenIssuesCount + (x.OpenIssuesCount == 1 ? " Issue" : " Issues"); }); Appeared.Take(1) .Select(_ => Observable.Timer(TimeSpan.FromSeconds(0.35f))) .Switch() .ObserveOn(RxApp.MainThreadScheduler) .Select(_ => this.WhenAnyValue(x => x.ViewModel.IsStarred).Where(x => x.HasValue)) .Switch() .Subscribe(x => HeaderView.SetSubImage(x.Value ? Octicon.Star.ToImage() : null)); this.WhenAnyValue(x => x.ViewModel.RepositoryName) .Subscribe(x => HeaderView.Text = x); this.WhenAnyValue(x => x.ViewModel.ShowMenuCommand) .Select(x => x.ToBarButtonItem(UIBarButtonSystemItem.Action)) .Subscribe(x => NavigationItem.RightBarButtonItem = x); this.WhenAnyValue(x => x.ViewModel.Branches) .Select(x => x == null ? "- Branches" : (x.Count >= 100 ? "100+" : x.Count.ToString()) + (x.Count == 1 ? " Branch" : " Branches")) .SubscribeSafe(x => _splitElements[2].Button2.Text = x); this.WhenAnyValue(x => x.ViewModel.Contributors) .Select(x => x == null ? "- Contributors" : (x >= 100 ? "100+" : x.ToString()) + (x == 1 ? " Contributor" : " Contributors")) .SubscribeSafe(x => _splitElements[1].Button2.Text = x); this.WhenAnyValue(x => x.ViewModel.Releases) .Select(x => x == null ? "- Releases" : (x >= 100 ? "100+" : x.ToString()) + (x == 1 ? " Release" : " Releases")) .SubscribeSafe(x => _splitElements[2].Button1.Text = x); this.WhenAnyValue(x => x.ViewModel.Description) .Subscribe(x => { HeaderView.SubText = x; RefreshHeaderView(); }); this.WhenAnyValue(x => x.ViewModel.Avatar) .Subscribe(x => HeaderView.SetImage(x?.ToUri(128), Images.LoginUserUnknown)); this.WhenAnyValue(x => x.ViewModel.Repository) .IsNotNull() .Subscribe(_ => Render()); this.WhenAnyValue(x => x.ViewModel.Readme) .Where(x => x != null && ViewModel.Repository != null) .Subscribe(_ => Render()); }
protected BaseIssueViewController() { CommentsElement = new HtmlElement("comments"); this.WhenAnyValue(x => x.ViewModel.GoToUrlCommand) .Subscribe(x => CommentsElement.UrlRequested = x.ExecuteIfCan); DescriptionElement = new HtmlElement("description"); this.WhenAnyValue(x => x.ViewModel.GoToUrlCommand) .Subscribe(x => DescriptionElement.UrlRequested = x.ExecuteIfCan); this.WhenAnyValue(x => x.ViewModel.ShowMenuCommand) .Select(x => x.ToBarButtonItem(UIBarButtonSystemItem.Action)) .Subscribe(x => NavigationItem.RightBarButtonItem = x); this.WhenAnyObservable(x => x.ViewModel.GoToAssigneesCommand) .Subscribe(_ => IssueAssigneeViewController.Show(this, ViewModel.CreateAssigneeViewModel())); this.WhenAnyObservable(x => x.ViewModel.GoToMilestonesCommand) .Subscribe(_ => IssueMilestonesViewController.Show(this, ViewModel.CreateMilestonesViewModel())); this.WhenAnyObservable(x => x.ViewModel.GoToLabelsCommand) .Subscribe(_ => IssueLabelsViewController.Show(this, ViewModel.CreateLabelsViewModel())); this.WhenAnyValue(x => x.ViewModel.GoToOwnerCommand) .Subscribe(x => HeaderView.ImageButtonAction = x != null ? new Action(() => ViewModel.GoToOwnerCommand.ExecuteIfCan()) : null); Appeared.Take(1) .Select(_ => Observable.Timer(TimeSpan.FromSeconds(0.2f))) .Switch() .ObserveOn(RxApp.MainThreadScheduler) .Select(_ => this.WhenAnyValue(x => x.ViewModel.IsClosed)) .Switch() .Subscribe(x => { HeaderView.SubImageView.TintColor = x ? UIColor.FromRGB(0xbd, 0x2c, 0) : UIColor.FromRGB(0x6c, 0xc6, 0x44); HeaderView.SetSubImage((x ? Octicon.IssueClosed :Octicon.IssueOpened).ToImage()); }); MilestoneElement = new StringElement("Milestone", string.Empty, UITableViewCellStyle.Value1) { Image = Octicon.Milestone.ToImage() }; MilestoneElement.Tapped = () => ViewModel.GoToMilestonesCommand.ExecuteIfCan(); this.WhenAnyValue(x => x.ViewModel.AssignedMilestone) .Select(x => x == null ? "No Milestone" : x.Title) .Subscribe(x => MilestoneElement.Value = x); AssigneeElement = new StringElement("Assigned", string.Empty, UITableViewCellStyle.Value1) { Image = Octicon.Person.ToImage() }; AssigneeElement.Tapped = () => ViewModel.GoToAssigneesCommand.ExecuteIfCan(); this.WhenAnyValue(x => x.ViewModel.AssignedUser) .Select(x => x == null ? "Unassigned" : x.Login) .Subscribe(x => AssigneeElement.Value = x); LabelsElement = new StringElement("Labels", string.Empty, UITableViewCellStyle.Value1) { Image = Octicon.Tag.ToImage() }; LabelsElement.Tapped = () => ViewModel.GoToLabelsCommand.ExecuteIfCan(); this.WhenAnyValue(x => x.ViewModel.AssignedLabels) .Select(x => (x == null || x.Count == 0) ? "None" : string.Join(",", x.Select(y => y.Name))) .Subscribe(x => LabelsElement.Value = x); this.WhenAnyValue(x => x.ViewModel.CanModify) .Select(x => x ? UITableViewCellAccessory.DisclosureIndicator : UITableViewCellAccessory.None) .Subscribe(x => MilestoneElement.Accessory = AssigneeElement.Accessory = LabelsElement.Accessory = x); DetailsSection.Add(MilestoneElement); DetailsSection.Add(AssigneeElement); DetailsSection.Add(LabelsElement); this.WhenAnyValue(x => x.ViewModel.Avatar) .SubscribeSafe(x => HeaderView.SetImage(x?.ToUri(128), Images.LoginUserUnknown)); this.WhenAnyValue(x => x.ViewModel.Issue) .IsNotNull() .Subscribe(x => { HeaderView.Text = x.Title; HeaderView.SubText = x.UpdatedAt.HasValue ? ("Updated " + x.UpdatedAt.Value.UtcDateTime.Humanize()) : ("Created " + x.CreatedAt.UtcDateTime.Humanize()); RefreshHeaderView(); }); this.WhenAnyValue(x => x.ViewModel.MarkdownDescription) .Subscribe(x => { if (string.IsNullOrEmpty(x)) { DetailsSection.Remove(DescriptionElement); } else { var model = new DescriptionModel(x, (int)UIFont.PreferredSubheadline.PointSize); var markdown = new MarkdownView { Model = model }; var html = markdown.GenerateString(); DescriptionElement.Value = html; if (!DetailsSection.Contains(DescriptionElement)) { DetailsSection.Insert(0, UITableViewRowAnimation.Fade, DescriptionElement); } } }); CommentsSection.FooterView = new TableFooterButton("Add Comment", () => ViewModel.AddCommentCommand.ExecuteIfCan()); this.WhenAnyValue(x => x.ViewModel.Events) .Select(x => x.Changed) .Switch() .Select(x => ViewModel.Events) .Subscribe(events => { var comments = events.Select(x => { var body = string.Empty; var comment = x as IssueCommentItemViewModel; var @event = x as IssueEventItemViewModel; if (comment != null) { body = comment.Comment; } else if (@event != null) { body = CreateEventBody(@event.EventInfo, @event.Commit); } return(new Comment(x.AvatarUrl.ToUri(), x.Actor, body, x.CreatedAt.Humanize())); }) .Where(x => !string.IsNullOrEmpty(x.Body)) .ToList(); if (comments.Count > 0) { var commentModel = new CommentModel(comments, (int)UIFont.PreferredSubheadline.PointSize); var razorView = new CommentsView { Model = commentModel }; var html = razorView.GenerateString(); CommentsElement.Value = html; if (!CommentsSection.Contains(CommentsElement)) { CommentsSection.Insert(0, UITableViewRowAnimation.Fade, CommentsElement); } } else { CommentsSection.Remove(CommentsElement); } }); var commentsButton = SplitButton.AddButton("Comments", "-"); var participantsButton = SplitButton.AddButton("Participants", "-"); this.WhenAnyValue(x => x.ViewModel.CommentCount) .Subscribe(x => commentsButton.Text = x.ToString()); this.WhenAnyValue(x => x.ViewModel.Participants) .Subscribe(x => participantsButton.Text = x.ToString()); }
public override void ViewDidLoad() { base.ViewDidLoad(); _splitButton1 = _split.AddButton("Comments", "-"); _splitButton2 = _split.AddButton("Participants", "-"); Title = "Issue #" + ViewModel.Id; HeaderView.SetImage(null, Images.Avatar); HeaderView.Text = Title; Appeared.Take(1) .Select(_ => Observable.Timer(TimeSpan.FromSeconds(0.2f))) .Switch() .ObserveOn(RxApp.MainThreadScheduler) .Select(_ => ViewModel.Bind(x => x.IsClosed, true).Where(x => x.HasValue).Select(x => x.Value)) .Switch() .Subscribe(x => { HeaderView.SubImageView.TintColor = x ? UIColor.FromRGB(0xbd, 0x2c, 0) : UIColor.FromRGB(0x6c, 0xc6, 0x44); HeaderView.SetSubImage((x ? Octicon.IssueClosed :Octicon.IssueOpened).ToImage()); }); _milestoneElement = new StringElement("Milestone", "No Milestone", UITableViewCellStyle.Value1) { Image = Octicon.Milestone.ToImage() }; _assigneeElement = new StringElement("Assigned", "Unassigned", UITableViewCellStyle.Value1) { Image = Octicon.Person.ToImage() }; _labelsElement = new StringElement("Labels", "None", UITableViewCellStyle.Value1) { Image = Octicon.Tag.ToImage() }; _addCommentElement = new StringElement("Add Comment") { Image = Octicon.Pencil.ToImage() }; var actionButton = new UIBarButtonItem(UIBarButtonSystemItem.Action) { Enabled = false }; NavigationItem.RightBarButtonItem = actionButton; ViewModel.Bind(x => x.IsModifying).SubscribeStatus("Loading..."); ViewModel.Bind(x => x.Issue).Subscribe(x => { _assigneeElement.Value = x.Assignee != null ? x.Assignee.Login : "******"; _milestoneElement.Value = x.Milestone != null ? x.Milestone.Title : "No Milestone"; _labelsElement.Value = x.Labels.Count == 0 ? "None" : string.Join(", ", x.Labels.Select(i => i.Name)); var model = new MarkdownModel(ViewModel.MarkdownDescription, (int)UIFont.PreferredSubheadline.PointSize, true); var markdown = new MarkdownWebView { Model = model }; var html = markdown.GenerateString(); _descriptionElement.SetValue(string.IsNullOrEmpty(ViewModel.MarkdownDescription) ? null : html); HeaderView.Text = x.Title; HeaderView.SubText = "Updated " + x.UpdatedAt.Humanize(); HeaderView.SetImage(x.User?.AvatarUrl, Images.Avatar); RefreshHeaderView(); Render(); }); ViewModel.BindCollection(x => x.Comments).Subscribe(_ => RenderComments()); ViewModel.BindCollection(x => x.Events).Subscribe(_ => RenderComments()); ViewModel.Bind(x => x.ShouldShowPro).Subscribe(x => { if (x) { this.ShowPrivateView(); } }); OnActivation(d => { d(_milestoneElement.Clicked.BindCommand(ViewModel.GoToMilestoneCommand)); d(_assigneeElement.Clicked.BindCommand(ViewModel.GoToAssigneeCommand)); d(_labelsElement.Clicked.BindCommand(ViewModel.GoToLabelsCommand)); d(_addCommentElement.Clicked.Subscribe(_ => AddCommentTapped())); d(_descriptionElement.UrlRequested.BindCommand(ViewModel.GoToUrlCommand)); d(_commentsElement.UrlRequested.BindCommand(ViewModel.GoToUrlCommand)); d(actionButton.GetClickedObservable().Subscribe(ShowExtraMenu)); d(HeaderView.Clicked.BindCommand(ViewModel.GoToOwner)); d(ViewModel.Bind(x => x.IsCollaborator, true).Subscribe(x => { foreach (var i in new [] { _assigneeElement, _milestoneElement, _labelsElement }) { i.Accessory = x ? UITableViewCellAccessory.DisclosureIndicator : UITableViewCellAccessory.None; } })); d(ViewModel.Bind(x => x.IsLoading).Subscribe(x => actionButton.Enabled = !x)); }); }
public override void ViewDidLoad() { base.ViewDidLoad(); Title = "Gist"; var editButton = NavigationItem.RightBarButtonItem = new UIBarButtonItem(UIBarButtonSystemItem.Action); HeaderView.SetImage(null, Images.Avatar); HeaderView.Text = "Gist #" + ViewModel.Id; HeaderView.SubImageView.TintColor = UIColor.FromRGB(243, 156, 18); Appeared.Take(1) .Select(_ => Observable.Timer(TimeSpan.FromSeconds(0.35f)).Take(1)) .Switch() .Select(_ => ViewModel.Bind(x => x.IsStarred, true)) .Switch() .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(x => HeaderView.SetSubImage(x ? Octicon.Star.ToImage() : null)); TableView.RowHeight = UITableView.AutomaticDimension; TableView.EstimatedRowHeight = 44f; _split = new SplitButtonElement(); var files = _split.AddButton("Files", "-"); var comments = _split.AddButton("Comments", "-"); var forks = _split.AddButton("Forks", "-"); _splitRow1 = new SplitViewElement(Octicon.Lock.ToImage(), Octicon.Package.ToImage()); _splitRow2 = new SplitViewElement(Octicon.Calendar.ToImage(), Octicon.Star.ToImage()); _ownerElement = new StringElement("Owner", string.Empty, UITableViewCellStyle.Value1) { Image = Octicon.Person.ToImage(), Accessory = UITableViewCellAccessory.DisclosureIndicator }; OnActivation(d => { d(editButton.GetClickedObservable().Subscribe(_ => ShareButtonTap(editButton))); d(_ownerElement.Clicked.BindCommand(ViewModel.GoToUserCommand)); d(ViewModel.Bind(x => x.IsStarred, true).Subscribe(isStarred => _splitRow2.Button2.Text = isStarred ? "Starred" : "Not Starred")); d(ViewModel.BindCollection(x => x.Comments, true).Subscribe(_ => RenderGist())); d(HeaderView.Clicked.BindCommand(ViewModel.GoToUserCommand)); d(ViewModel.Bind(x => x.Gist, true).Where(x => x != null).Subscribe(gist => { var daysOld = gist.CreatedAt.TotalDaysAgo(); _splitRow1.Button1.Text = gist.Public ? "Public" : "Private"; _splitRow1.Button2.Text = (gist.History?.Count ?? 0) + " Revisions"; _splitRow2.Button1.Text = daysOld == 0 ? "Created today" : "day".ToQuantity(daysOld) + " old"; _ownerElement.Value = gist.Owner?.Login ?? "Unknown"; files.Text = gist.Files?.Count.ToString() ?? "-"; comments.Text = gist.Comments.ToString(); forks.Text = gist.Forks?.Count.ToString() ?? "-"; HeaderView.SubText = gist.Description; HeaderView.Text = gist.Files?.Select(x => x.Key).FirstOrDefault() ?? HeaderView.Text; HeaderView.SetImage(gist.Owner?.AvatarUrl, Images.Avatar); RenderGist(); RefreshHeaderView(); })); }); }
public override void ViewDidLoad() { base.ViewDidLoad(); HeaderView.Image = Images.LoginUserUnknown; HeaderView.SubImageView.TintColor = UIColor.FromRGB(243, 156, 18); Appeared.Take(1) .Select(_ => Observable.Timer(TimeSpan.FromSeconds(0.35f)).Take(1)) .Switch() .Select(_ => this.WhenAnyValue(x => x.ViewModel.IsStarred).Where(x => x.HasValue)) .Switch() .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(x => HeaderView.SetSubImage(x.Value ? Octicon.Star.ToImage() : null)); var events = new StringElement("Events", Octicon.Rss.ToImage()) { Accessory = UITableViewCellAccessory.DisclosureIndicator }; var issuesElement = new StringElement("Issues", Octicon.IssueOpened.ToImage()) { Accessory = UITableViewCellAccessory.DisclosureIndicator }; var commitsElement = new StringElement("Commits", Octicon.GitCommit.ToImage()) { Accessory = UITableViewCellAccessory.DisclosureIndicator }; var pullRequestsElement = new StringElement("Pull Requests", Octicon.GitPullRequest.ToImage()) { Accessory = UITableViewCellAccessory.DisclosureIndicator }; var sourceElement = new StringElement("Source", Octicon.Code.ToImage()) { Accessory = UITableViewCellAccessory.DisclosureIndicator }; var websiteElement = new StringElement("Website", Octicon.Globe.ToImage()) { Accessory = UITableViewCellAccessory.DisclosureIndicator }; var readmeElement = new StringElement("Readme", Octicon.Book.ToImage()) { Accessory = UITableViewCellAccessory.DisclosureIndicator }; var forkedElement = new StringElement("Fork", string.Empty) { Image = Octicon.RepoForked.ToImage(), Font = StringElement.DefaultDetailFont, Accessory = UITableViewCellAccessory.DisclosureIndicator }; _splitElements[0] = new SplitViewElement(Octicon.Lock.ToImage(), Octicon.Package.ToImage()); _splitElements[1] = new SplitViewElement(Octicon.IssueOpened.ToImage(), Octicon.Organization.ToImage()); _splitElements[2] = new SplitViewElement(Octicon.Tag.ToImage(), Octicon.GitBranch.ToImage()); var stargazers = _split.AddButton("Stargazers", "-"); var watchers = _split.AddButton("Watchers", "-"); var forks = _split.AddButton("Forks", "-"); var renderFunc = new Action(() => { var model = ViewModel.Repository; var sec1 = new Section(); sec1.Add(_splitElements); if (model.Parent != null) { forkedElement.Value = model.Parent.FullName; sec1.Add(forkedElement); } var sec2 = new Section { events }; if (model.HasIssues) { sec2.Add(issuesElement); } if (ViewModel.Readme != null) { sec2.Add(readmeElement); } Root.Reset(new Section { _split }, sec1, sec2, new Section { commitsElement, pullRequestsElement, sourceElement }); if (!string.IsNullOrEmpty(model.Homepage)) { Root.Add(new Section { websiteElement }); } }); OnActivation(d => { d(HeaderView.Clicked.InvokeCommand(ViewModel.GoToOwnerCommand)); d(_splitElements[1].Button1.Clicked.InvokeCommand(ViewModel.GoToIssuesCommand)); d(_splitElements[1].Button2.Clicked.InvokeCommand(ViewModel.GoToContributors)); d(_splitElements[2].Button1.Clicked.InvokeCommand(ViewModel.GoToReleasesCommand)); d(_splitElements[2].Button2.Clicked.InvokeCommand(ViewModel.GoToBranchesCommand)); d(events.Clicked.InvokeCommand(ViewModel.GoToEventsCommand)); d(issuesElement.Clicked.InvokeCommand(ViewModel.GoToIssuesCommand)); d(websiteElement.Clicked.InvokeCommand(ViewModel.GoToHomepageCommand)); d(forkedElement.Clicked.InvokeCommand(ViewModel.GoToForkParentCommand)); d(readmeElement.Clicked.InvokeCommand(ViewModel.GoToReadmeCommand)); d(stargazers.Clicked.InvokeCommand(ViewModel.GoToStargazersCommand)); d(watchers.Clicked.InvokeCommand(ViewModel.GoToWatchersCommand)); d(forks.Clicked.InvokeCommand(ViewModel.GoToForksCommand)); d(commitsElement.Clicked.InvokeCommand(ViewModel.GoToCommitsCommand)); d(pullRequestsElement.Clicked.InvokeCommand(ViewModel.GoToPullRequestsCommand)); d(sourceElement.Clicked.InvokeCommand(ViewModel.GoToSourceCommand)); d(this.WhenAnyValue(x => x.ViewModel.Stargazers) .Select(x => x != null ? x.ToString() : "-") .Subscribe(x => stargazers.Text = x)); d(this.WhenAnyValue(x => x.ViewModel.Watchers) .Select(x => x != null ? x.ToString() : "-") .Subscribe(x => watchers.Text = x)); d(this.WhenAnyValue(x => x.ViewModel.Repository.ForksCount) .Subscribe(x => forks.Text = x.ToString())); d(this.WhenAnyValue(x => x.ViewModel.Repository) .IsNotNull() .Subscribe(x => { _splitElements[0].Button1.Text = x.Private ? "Private" : "Public"; _splitElements[0].Button2.Text = x.Language ?? "N/A"; _splitElements[1].Button1.Text = x.OpenIssuesCount + (x.OpenIssuesCount == 1 ? " Issue" : " Issues"); })); d(this.WhenAnyValue(x => x.ViewModel.RepositoryName) .Subscribe(x => HeaderView.Text = x)); d(this.WhenAnyValue(x => x.ViewModel.ShowMenuCommand) .ToBarButtonItem(UIBarButtonSystemItem.Action, x => NavigationItem.RightBarButtonItem = x)); d(this.WhenAnyValue(x => x.ViewModel.Branches) .Select(x => x == null ? "Branches" : (x.Count >= 100 ? "100+" : x.Count.ToString()) + (x.Count == 1 ? " Branch" : " Branches")) .SubscribeSafe(x => _splitElements[2].Button2.Text = x)); d(this.WhenAnyValue(x => x.ViewModel.Contributors) .Select(x => x == null ? "Contributors" : (x >= 100 ? "100+" : x.ToString()) + (x == 1 ? " Contributor" : " Contributors")) .SubscribeSafe(x => _splitElements[1].Button2.Text = x)); d(this.WhenAnyValue(x => x.ViewModel.Releases) .Select(x => x == null ? "Releases" : (x >= 100 ? "100+" : x.ToString()) + (x == 1 ? " Release" : " Releases")) .SubscribeSafe(x => _splitElements[2].Button1.Text = x)); d(this.WhenAnyValue(x => x.ViewModel.Description).Subscribe(x => RefreshHeaderView(subtext: x))); d(this.WhenAnyValue(x => x.ViewModel.Avatar) .Subscribe(x => HeaderView.SetImage(x?.ToUri(128), Images.LoginUserUnknown))); d(this.WhenAnyValue(x => x.ViewModel.Repository) .IsNotNull() .Subscribe(_ => renderFunc())); d(this.WhenAnyValue(x => x.ViewModel.Readme) .Where(x => x != null && ViewModel.Repository != null) .Subscribe(_ => renderFunc())); }); }
public RepositoryView() { HeaderView.Image = Images.LoginUserUnknown; _sourceSection = new Section { new DialogStringElement("Commits", () => ViewModel.GoToCommitsCommand.ExecuteIfCan(), Images.Commit), new DialogStringElement("Pull Requests", () => ViewModel.GoToPullRequestsCommand.ExecuteIfCan(), Images.PullRequest), new DialogStringElement("Source", () => ViewModel.GoToSourceCommand.ExecuteIfCan(), Images.Code), }; _ownerElement = new StyledStringElement("Owner", string.Empty) { Image = Images.Person, Accessory = UITableViewCellAccessory.DisclosureIndicator }; _ownerElement.Tapped += () => ViewModel.GoToOwnerCommand.ExecuteIfCan(); this.WhenAnyValue(x => x.ViewModel.Repository) .Subscribe(x => _ownerElement.Value = x == null ? string.Empty : x.Owner.Login); HeaderView.SubImageView.TintColor = UIColor.FromRGB(243, 156, 18); this.WhenAnyValue(x => x.ViewModel.GoToOwnerCommand).Subscribe(x => HeaderView.ImageButtonAction = x != null ? new Action(() => ViewModel.GoToOwnerCommand.ExecuteIfCan()) : null); _splitElements[0] = new SplitViewElement(); _splitElements[0].Button1 = new SplitViewElement.SplitButton(Images.Lock, string.Empty); _splitElements[0].Button2 = new SplitViewElement.SplitButton(Images.Package, string.Empty); _splitElements[1] = new SplitViewElement(); _splitElements[1].Button1 = new SplitViewElement.SplitButton(Images.IssueOpened, string.Empty, () => ViewModel.GoToIssuesCommand.ExecuteIfCan()); _splitElements[1].Button2 = new SplitViewElement.SplitButton(Images.Organization, string.Empty, () => ViewModel.GoToContributors.ExecuteIfCan()); _splitElements[2] = new SplitViewElement(); _splitElements[2].Button1 = new SplitViewElement.SplitButton(Images.Tag, string.Empty, () => ViewModel.GoToReleasesCommand.ExecuteIfCan()); _splitElements[2].Button2 = new SplitViewElement.SplitButton(Images.Branch, string.Empty, () => ViewModel.GoToBranchesCommand.ExecuteIfCan()); var stargazers = _split.AddButton("Stargazers", "-", () => ViewModel.GoToStargazersCommand.ExecuteIfCan()); var watchers = _split.AddButton("Watchers", "-", () => ViewModel.GoToWatchersCommand.ExecuteIfCan()); var forks = _split.AddButton("Forks", "-", () => ViewModel.GoToForksCommand.ExecuteIfCan()); this.WhenAnyValue(x => x.ViewModel.Stargazers) .Select(x => x != null ? x.ToString() : "-") .Subscribe(x => stargazers.Text = x); this.WhenAnyValue(x => x.ViewModel.Watchers) .Select(x => x != null ? x.ToString() : "-") .Subscribe(x => watchers.Text = x); this.WhenAnyValue(x => x.ViewModel.Repository.ForksCount) .Subscribe(x => forks.Text = x.ToString()); this.WhenAnyValue(x => x.ViewModel.Repository) .IsNotNull() .Subscribe(x => { _splitElements[0].Button1.Text = x.Private ? "Private" : "Public"; _splitElements[0].Button2.Text = x.Language ?? "N/A"; _splitElements[1].Button1.Text = x.OpenIssues + (x.OpenIssues == 1 ? " Issue" : " Issues"); }); Appeared.Take(1) .Select(_ => Observable.Timer(TimeSpan.FromSeconds(0.35f))) .Switch() .ObserveOn(RxApp.MainThreadScheduler) .Select(_ => this.WhenAnyValue(x => x.ViewModel.IsStarred).Where(x => x.HasValue)) .Switch() .Subscribe(x => HeaderView.SetSubImage(x.Value ? Images.Star.ImageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) : null)); this.WhenAnyValue(x => x.ViewModel.RepositoryName) .Subscribe(x => HeaderView.Text = x); this.WhenAnyValue(x => x.ViewModel.ShowMenuCommand) .Select(x => x.ToBarButtonItem(UIBarButtonSystemItem.Action)) .Subscribe(x => NavigationItem.RightBarButtonItem = x); this.WhenAnyValue(x => x.ViewModel.Branches) .SubscribeSafe(x => { if (x == null) { _splitElements[2].Button2.Text = "- Branches"; } else { _splitElements[2].Button2.Text = (x.Count >= 100 ? "100+" : x.Count.ToString()) + (x.Count == 1 ? " Branch" : " Branches"); } }); this.WhenAnyValue(x => x.ViewModel.Contributors) .SubscribeSafe(x => { if (x == null) { _splitElements[1].Button2.Text = "- Contributors"; } else { _splitElements[1].Button2.Text = (x >= 100 ? "100+" : x.ToString()) + (x == 1 ? " Contributor" : " Contributors"); } }); this.WhenAnyValue(x => x.ViewModel.Releases) .SubscribeSafe(x => { if (x == null) { _splitElements[2].Button1.Text = "- Releases"; } else { _splitElements[2].Button1.Text = (x >= 100 ? "100+" : x.ToString()) + (x == 1 ? " Release" : " Releases"); } }); }