コード例 #1
0
ファイル: Composer.cs プロジェクト: zhiyuanjia/CodeHub
        public Composer () : base (null, null)
        {
            Title = "New Comment";
            EdgesForExtendedLayout = UIRectEdge.None;

            var close = new UIBarButtonItem { Image = Images.Buttons.CancelButton };
            NavigationItem.LeftBarButtonItem = close;
            SendItem = new UIBarButtonItem { Image = Images.Buttons.SaveButton };
            NavigationItem.RightBarButtonItem = SendItem;

            TextView = new UITextView(ComputeComposerSize(CGRect.Empty));
            TextView.Font = UIFont.PreferredBody;
            TextView.AutoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth;

            // Work around an Apple bug in the UITextView that crashes
            if (ObjCRuntime.Runtime.Arch == ObjCRuntime.Arch.SIMULATOR)
                TextView.AutocorrectionType = UITextAutocorrectionType.No;

            View.AddSubview (TextView);

            _normalButtonImage = ImageFromColor(UIColor.White);
            _pressedButtonImage = ImageFromColor(UIColor.FromWhiteAlpha(0.0f, 0.4f));

            OnActivation(d =>
            {
                d(close.GetClickedObservable().Subscribe(_ => CloseComposer()));
                d(SendItem.GetClickedObservable().Subscribe(_ => PostCallback()));
            });
        }
コード例 #2
0
ファイル: Composer.cs プロジェクト: xNUTs/CodeBucket
        public Composer () : base (null, null)
        {
            Title = "New Comment";
            EdgesForExtendedLayout = UIRectEdge.None;

            var close = new UIBarButtonItem { Image = Images.Buttons.Cancel };
            NavigationItem.LeftBarButtonItem = close;
            SendItem = new UIBarButtonItem { Image = Images.Buttons.Save };
            NavigationItem.RightBarButtonItem = SendItem;

            TextView = new UITextView(ComputeComposerSize(CGRect.Empty));
            TextView.Font = UIFont.PreferredBody;
            TextView.AutoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth;

            // Work around an Apple bug in the UITextView that crashes
            if (ObjCRuntime.Runtime.Arch == ObjCRuntime.Arch.SIMULATOR)
                TextView.AutocorrectionType = UITextAutocorrectionType.No;

            View.AddSubview (TextView);

            _normalButtonImage = ImageFromColor(UIColor.White);
            _pressedButtonImage = ImageFromColor(UIColor.FromWhiteAlpha(0.0f, 0.4f));

            OnActivation(d =>
            {
                d(close.GetClickedObservable().Subscribe(_ => CloseComposer()));
                d(SendItem.GetClickedObservable().Subscribe(_ => PostCallback()));
            });
        }
コード例 #3
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            TableView.RowHeight          = UITableView.AutomaticDimension;
            TableView.EstimatedRowHeight = 44f;

            var actionButton = new UIBarButtonItem(UIBarButtonSystemItem.Action);

            HeaderView.SetImage(null, Images.Avatar);
            HeaderView.Text              = Title;
            TableView.RowHeight          = UITableView.AutomaticDimension;
            TableView.EstimatedRowHeight = 44f;

            ViewModel.Bind(x => x.Changeset).Subscribe(x => {
                var msg            = x.Commit.Message ?? string.Empty;
                msg                = msg.Split('\n')[0];
                HeaderView.Text    = msg.Split('\n')[0];
                HeaderView.SubText = "Commited " + (ViewModel.Changeset?.Commit?.Committer?.Date ?? DateTimeOffset.Now).Humanize();
                HeaderView.SetImage(x.Author?.AvatarUrl, Images.Avatar);
                RefreshHeaderView();
            });

            ViewModel.Bind(x => x.Changeset).Subscribe(_ => Render());
            ViewModel.BindCollection(x => x.Comments).Subscribe(_ => Render());
            ViewModel.Bind(x => x.ShouldShowPro).Where(x => x).Subscribe(_ => this.ShowPrivateView());

            OnActivation(d =>
            {
                d(HeaderView.Clicked.BindCommand(ViewModel.GoToOwner));
                d(ViewModel.Bind(x => x.Title).Subscribe(x => Title = x));
                d(actionButton.GetClickedObservable().Subscribe(_ => ShowExtraMenu()));
            });
        }
コード例 #4
0
        public static GistsViewController CreateUserGistsViewController(string username)
        {
            var applicationService = Locator.Current.GetService <IApplicationService>();
            var mine = applicationService.Account.Username.ToLower().Equals(username.ToLower());

            if (mine)
            {
                var viewModel = new CurrentUserGistsViewModel(username);
                var vc        = new GistsViewController(viewModel)
                {
                    Title = "My Gists"
                };

                var button = new UIBarButtonItem(UIBarButtonSystemItem.Add);
                vc.NavigationItem.RightBarButtonItem = button;
                vc.WhenActivated(d =>
                {
                    d(button.GetClickedObservable()
                      .Subscribe(_ => GistCreateViewController.Show(vc)));
                });

                return(vc);
            }
            else
            {
                var viewModel = GistsViewModel.CreateUserGistsViewModel(username);
                var vc        = new GistsViewController(viewModel)
                {
                    Title = $"{username}'s Gists"
                };
                return(vc);
            }
        }
コード例 #5
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            var filterBarButtonItem = new UIBarButtonItem {
                Image = Images.Filter
            };
            var addBarButtonItem = new UIBarButtonItem(UIBarButtonSystemItem.Add);

            OnActivation(d => {
                d(filterBarButtonItem.GetClickedObservable().InvokeCommand(ViewModel.GoToFilterCommand));
                d(addBarButtonItem.GetClickedObservable().InvokeCommand(ViewModel.GoToNewIssueCommand));
                d(_viewSegment.GetChangedObservable().Subscribe(x => ViewModel.FilterSelection = (IssuesViewModel.IssueFilterSelection)x));
                d(this.WhenAnyValue(x => x.ViewModel.FilterSelection)
                  .Select(x => x == IssuesViewModel.IssueFilterSelection.Custom)
                  .Subscribe(x => {
                    filterBarButtonItem.Image = x ? Images.FilterFilled : Images.Filter;
                    if (x)
                    {
                        _viewSegment.SelectedSegment = -1;
                    }
                }));
            });

            NavigationItem.TitleView = _viewSegment;
            TableView.Source         = new IssueTableViewSource(TableView, ViewModel.Items);
        }
コード例 #6
0
        protected BaseWebViewController(bool navigationToolbar, bool showPageAsTitle = false)
        {
            NavigationItem.BackBarButtonItem = new UIBarButtonItem { Title = "" };

            _navigationToolbar = navigationToolbar;
            _showPageAsTitle = showPageAsTitle;

            if (_navigationToolbar)
            {
                BackButton = new UIBarButtonItem { Image = Images.Web.BackButton, Enabled = false };
                ForwardButton = new UIBarButtonItem { Image = Images.Web.FowardButton, Enabled = false };
                RefreshButton = new UIBarButtonItem(UIBarButtonSystemItem.Refresh) { Enabled = false };

                BackButton.TintColor = Theme.CurrentTheme.WebButtonTint;
                ForwardButton.TintColor = Theme.CurrentTheme.WebButtonTint;
                RefreshButton.TintColor = Theme.CurrentTheme.WebButtonTint;

                OnActivation(d =>
                {
                    d(BackButton.GetClickedObservable().Subscribe(_ => GoBack()));
                    d(ForwardButton.GetClickedObservable().Subscribe(_ => GoForward()));
                    d(RefreshButton.GetClickedObservable().Subscribe(_ => Refresh()));
                });
            }

            EdgesForExtendedLayout = UIRectEdge.None;
        }
コード例 #7
0
        public NewCommentViewController(Func <string, Task> saveAction)
        {
            ViewModel = new NewCommentViewModel(saveAction);

            Title = "New Comment";
            EdgesForExtendedLayout = UIRectEdge.None;

            var discardButton = new UIBarButtonItem {
                Image = Images.Buttons.Cancel
            };
            var doneButton = new UIBarButtonItem(UIBarButtonSystemItem.Save);

            NavigationItem.RightBarButtonItem = doneButton;
            NavigationItem.LeftBarButtonItem  = discardButton;

            _textView                  = new UITextView();
            _textView.Font             = UIFont.PreferredBody;
            _textView.AutoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth;

            // Work around an Apple bug in the UITextView that crashes
            if (ObjCRuntime.Runtime.Arch == ObjCRuntime.Arch.SIMULATOR)
            {
                _textView.AutocorrectionType = UITextAutocorrectionType.No;
            }

            OnActivation(d =>
            {
                discardButton
                .GetClickedObservable()
                .SelectUnit()
                .BindCommand(ViewModel.DiscardCommand)
                .AddTo(d);

                this.WhenAnyValue(x => x.ViewModel.DoneCommand.CanExecute)
                .Switch()
                .Subscribe(x => doneButton.Enabled = x)
                .AddTo(d);

                doneButton
                .GetClickedObservable()
                .Do(_ => _textView.ResignFirstResponder())
                .SelectUnit()
                .BindCommand(ViewModel.DoneCommand)
                .AddTo(d);

                _textView
                .GetChangedObservable()
                .Subscribe(x => ViewModel.Text = x)
                .AddTo(d);

                this.WhenAnyValue(x => x.ViewModel.Text)
                .Subscribe(x => _textView.Text = x)
                .AddTo(d);

                this.WhenAnyObservable(x => x.ViewModel.DismissCommand)
                .Select(_ => Unit.Default)
                .Subscribe(_dismissSubject)
                .AddTo(d);
            });
        }
コード例 #8
0
        private void PromptForCommitMessage()
        {
            var confirmButton = new UIBarButtonItem {
                Title = "Confirm"
            };
            var cancelButton = new UIBarButtonItem {
                Image = Images.Cancel
            };
            var viewController = new MessageComposerViewController();

            viewController.Title = "Message";
            viewController.TextView.Placeholder = "Merge Message (Optional)";

            viewController.OnActivation(d => {
                d(ViewModel.WhenAnyValue(x => x.MergeComment).Subscribe(x => viewController.TextView.Text = x));
                d(viewController.TextView.GetChangedObservable().Subscribe(x => ViewModel.MergeComment    = x));

                viewController.NavigationItem.RightBarButtonItem = confirmButton;
                d(ViewModel.MergeCommand.CanExecuteObservable.Subscribe(x => confirmButton.Enabled = x));
                d(confirmButton.GetClickedObservable().InvokeCommand(ViewModel.MergeCommand));
                d(ViewModel.MergeCommand.Subscribe(_ => viewController.DismissViewController(true, null)));
                d(Disposable.Create(() => viewController.NavigationItem.RightBarButtonItem = null));

                viewController.NavigationItem.LeftBarButtonItem = cancelButton;
                d(cancelButton.GetClickedObservable().Subscribe(_ => viewController.DismissViewController(true, null)));
                d(Disposable.Create(() => viewController.NavigationItem.LeftBarButtonItem = null));
            });

            PresentViewController(new ThemedNavigationController(viewController), true, null);
        }
コード例 #9
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            var descriptionElement = new ExpandingInputElement("Description");

            descriptionElement.AccessoryView = x => new MarkdownAccessoryView(x);
            var titleElement = new DummyInputElement("Title");

            var saveButton   = new UIBarButtonItem(UIBarButtonSystemItem.Save);
            var cancelButton = new UIBarButtonItem(UIBarButtonSystemItem.Cancel);

            NavigationItem.LeftBarButtonItem  = cancelButton;
            NavigationItem.RightBarButtonItem = saveButton;

            var source = new DialogTableViewSource(TableView);

            source.Root.Add(new Section {
                titleElement, descriptionElement
            });
            TableView.Source          = source;
            TableView.TableFooterView = new UIView();

            OnActivation(d => {
                d(descriptionElement.Changed
                  .Subscribe(x => ViewModel.Description = x));

                d(this.WhenAnyValue(x => x.ViewModel.Title)
                  .Subscribe(title => Title = title));

                d(this.WhenAnyValue(x => x.ViewModel.Subject)
                  .Subscribe(x => titleElement.Value = x));

                d(this.WhenAnyValue(x => x.ViewModel.Description)
                  .Subscribe(x => descriptionElement.Value = x));

                d(titleElement.Changed.Subscribe(x => ViewModel.Subject = x));

                d(cancelButton.GetClickedObservable()
                  .Select(_ => Unit.Default)
                  .InvokeReactiveCommand(ViewModel.DismissCommand));

                d(this.WhenAnyObservable(x => x.ViewModel.DismissCommand)
                  .Where(x => x)
                  .Subscribe(_ => DismissViewController(true, null)));

                d(saveButton.GetClickedObservable()
                  .Do(x => ResignFirstResponder())
                  .InvokeReactiveCommand(ViewModel.SubmitCommand));

                d(ViewModel.SubmitCommand
                  .Subscribe(_ => DismissViewController(true, null)));

                d(this.WhenAnyObservable(x => x.ViewModel.SubmitCommand.CanExecute)
                  .Subscribe(x => saveButton.Enabled = x));

                d(this.WhenAnyObservable(x => x.ViewModel.SubmitCommand.IsExecuting)
                  .SubscribeStatus("Submitting feedback"));
            });
        }
コード例 #10
0
ファイル: LiteComposer.cs プロジェクト: zhiyuanjia/CodeHub
        public LiteComposer() : base(null, null)
        {
            Title = "New Comment";
            EdgesForExtendedLayout = UIRectEdge.None;

            _textView = new UITextView()
            {
                Font = UIFont.PreferredBody
            };

            var close = new UIBarButtonItem {
                Image = Images.Buttons.BackButton
            };

            NavigationItem.LeftBarButtonItem = close;
            _sendButton = new UIBarButtonItem {
                Image = Images.Buttons.SaveButton
            };
            NavigationItem.RightBarButtonItem = _sendButton;

            OnActivation(d =>
            {
                d(close.GetClickedObservable().Subscribe(_ => CloseComposer()));
                d(_sendButton.GetClickedObservable().Subscribe(_ => PostCallback()));
            });
        }
コード例 #11
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            TableView.RowHeight          = UITableView.AutomaticDimension;
            TableView.EstimatedRowHeight = 44f;

            var cancelButton = new UIBarButtonItem {
                Image = Images.Buttons.CancelButton
            };
            var saveButton = new UIBarButtonItem {
                Image = Images.Buttons.SaveButton
            };

            NavigationItem.LeftBarButtonItem  = cancelButton;
            NavigationItem.RightBarButtonItem = saveButton;

            OnActivation(d =>
            {
                d(cancelButton.GetClickedObservable().Subscribe(_ => Discard()));
                d(saveButton.GetClickedObservable().Subscribe(_ => Save()));
                d(_descriptionElement.Clicked.Subscribe(_ => ChangeDescription()));
                d(_addFileElement.Clicked.Subscribe(_ => AddFile()));
            });
        }
コード例 #12
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            var actionButton = new UIBarButtonItem(UIBarButtonSystemItem.Action);

            NavigationItem.RightBarButtonItem = actionButton;

            this.WhenAnyValue(x => x.ContentText)
            .Select(x => new DescriptionModel(x, (int)UIFont.PreferredSubheadline.PointSize))
            .Select(x => new MarkdownView {
                Model = x
            }.GenerateString())
            .Subscribe(LoadContent);

            OnActivation(disposable =>
            {
                actionButton
                .GetClickedObservable()
                .SelectUnit()
                .BindCommand(this, x => x.ViewModel.ShowMenuCommand)
                .AddTo(disposable);

                this.WhenAnyValue(x => x.ViewModel.ContentText)
                .Subscribe(x => ContentText = x)
                .AddTo(disposable);
            });
        }
コード例 #13
0
        public PullRequestApproveViewController(string username, string repository, int pullRequestId,
                                                IApplicationService applicationService = null)
            : base(UITableViewStyle.Plain)
        {
            _root = new Lazy <RootElement>(() => new RootElement(TableView));

            applicationService = applicationService ?? Locator.Current.GetService <IApplicationService>();

            Title = "Approve";

            MergeCommand = ReactiveCommand.CreateFromTask(t =>
            {
                return(applicationService.Client.PullRequests.Merge(
                           username, repository, pullRequestId, Message, DeleteSourceBranch));
            });

            MergeCommand.IsExecuting.SubscribeStatus("Merging...");

            var merge = new UIBarButtonItem(UIBarButtonSystemItem.Done);

            NavigationItem.RightBarButtonItem = merge;

            OnActivation(d =>
            {
                this.WhenAnyObservable(x => x.MergeCommand.CanExecute)
                .Subscribe(x => merge.Enabled = x)
                .AddTo(d);

                merge.GetClickedObservable()
                .SelectUnit()
                .BindCommand(this, x => x.MergeCommand)
                .AddTo(d);
            });
        }
コード例 #14
0
        public WebBrowserViewController(bool navigationToolbar, bool showPageAsTitle = false)
        {
            NavigationItem.BackBarButtonItem = new UIBarButtonItem {
                Title = ""
            };
            NavigationItem.LeftBarButtonItem = _closeButton;

            _web = new UIWebView {
                ScalesPageToFit = true
            };
            _web.ShouldStartLoad = (w, r, n) => true;

            _web.LoadStarted += (sender, e) => {
                NetworkActivityService.Instance.PushNetworkActive();
                _refreshButton.Enabled = false;
            };

            _web.LoadError += (sender, e) => {
                _refreshButton.Enabled = true;
            };

            _web.LoadFinished += (sender, e) => {
                NetworkActivityService.Instance.PopNetworkActive();
                _backButton.Enabled    = _web.CanGoBack;
                _forwardButton.Enabled = _web.CanGoForward;
                _refreshButton.Enabled = true;

                if (showPageAsTitle)
                {
                    Title = _web.EvaluateJavascript("document.title");
                }
            };

            if (navigationToolbar)
            {
                ToolbarItems = new [] {
                    _backButton,
                    new UIBarButtonItem(UIBarButtonSystemItem.FixedSpace)
                    {
                        Width = 40f
                    },
                    _forwardButton,
                    new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace),
                    _refreshButton
                };
            }

            EdgesForExtendedLayout = UIRectEdge.None;

            this.WhenAnyValue(x => x.ViewModel.Uri)
            .SubscribeSafe(x => _web.LoadRequest(new NSUrlRequest(new NSUrl(x.AbsoluteUri))));

            OnActivation(d => {
                d(_backButton.GetClickedObservable().Subscribe(_ => _web.GoBack()));
                d(_forwardButton.GetClickedObservable().Subscribe(_ => _web.GoForward()));
                d(_refreshButton.GetClickedObservable().Subscribe(_ => _web.Reload()));
                d(_closeButton.GetClickedObservable().Subscribe(_ => DismissViewController(true, null)));
            });
        }
コード例 #15
0
        public AccountsViewController()
            : base(UITableViewStyle.Plain)
        {
            Title = "Accounts";

            var addButton = new UIBarButtonItem(UIBarButtonSystemItem.Add);
            NavigationItem.RightBarButtonItem = addButton;
            OnActivation(d => d(addButton.GetClickedObservable().Subscribe(_ => AddAccount())));
        }
コード例 #16
0
        public AccountsViewController() : base(UITableViewStyle.Plain)
        {
            Title = "Accounts";

            var addButton = new UIBarButtonItem(UIBarButtonSystemItem.Add);

            NavigationItem.RightBarButtonItem = addButton;
            OnActivation(d => d(addButton.GetClickedObservable().Subscribe(_ => AddAccount())));
        }
コード例 #17
0
        public ReadmeViewController(
            string owner,
            string repository,
            Octokit.Readme readme = null,
            IApplicationService applicationService = null,
            IMarkdownService markdownService       = null)
            : base(false, false)
        {
            _owner              = owner;
            _repository         = repository;
            _applicationService = applicationService ?? Locator.Current.GetService <IApplicationService>();
            _markdownService    = markdownService ?? Locator.Current.GetService <IMarkdownService>();

            Title = "Readme";

            var loadCommand = ReactiveCommand.CreateFromTask(() =>
            {
                if (readme != null)
                {
                    return(Task.FromResult(readme));
                }
                return(_applicationService.GitHubClient.Repository.Content.GetReadme(owner, repository));
            });

            loadCommand
            .ThrownExceptions
            .Do(_ => SetErrorView())
            .Select(error => new UserError(LoadErrorMessage, error))
            .SelectMany(Interactions.Errors.Handle)
            .Subscribe();

            loadCommand
            .ToProperty(this, x => x.Readme, out _readme);

            Appearing
            .Take(1)
            .Select(_ => Unit.Default)
            .InvokeReactiveCommand(loadCommand);

            this.WhenAnyValue(x => x.Readme)
            .Where(x => x != null)
            .SelectMany(ConvertToWebView)
            .Subscribe(LoadContent);

            this.WhenAnyValue(x => x.Readme)
            .Select(x => x != null)
            .Subscribe(x => _actionButton.Enabled = x);

            NavigationItem.RightBarButtonItem = _actionButton;

            this.WhenActivated(d =>
            {
                d(_actionButton.GetClickedObservable()
                  .Subscribe(ShareButtonPress));
            });
        }
コード例 #18
0
ファイル: IssueAddView.cs プロジェクト: RaineriOS/CodeHub
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            TableView.RowHeight = UITableView.AutomaticDimension;
            TableView.EstimatedRowHeight = 44f;

            var vm = (IssueAddViewModel)ViewModel;
            var saveButton = new UIBarButtonItem { Image = Images.Buttons.SaveButton };
            NavigationItem.RightBarButtonItem = saveButton;

            var title = new EntryElement("Title", string.Empty, string.Empty);
            var assignedTo = new StringElement("Responsible", "Unassigned", UITableViewCellStyle.Value1);
            var milestone = new StringElement("Milestone", "None", UITableViewCellStyle.Value1);
            var labels = new StringElement("Labels", "None", UITableViewCellStyle.Value1);
            var content = new MultilinedElement("Description");

            Root.Reset(new Section { title, assignedTo, milestone, labels }, new Section { content });

            OnActivation(d =>
            {
                d(vm.Bind(x => x.IssueTitle, true).Subscribe(x => title.Value = x));
                d(title.Changed.Subscribe(x => vm.IssueTitle = x));

                d(vm.Bind(x => x.Content, true).Subscribe(x => content.Details = x));
                d(labels.Clicked.Subscribe(_ => vm.GoToLabelsCommand.Execute(null)));
                d(milestone.Clicked.Subscribe(_ => vm.GoToMilestonesCommand.Execute(null)));
                d(assignedTo.Clicked.Subscribe(_ => vm.GoToAssigneeCommand.Execute(null)));
                d(vm.Bind(x => x.IsSaving).SubscribeStatus("Saving..."));

                d(vm.Bind(x => x.AssignedTo, true).Subscribe(x => {
                    assignedTo.Value = x == null ? "Unassigned" : x.Login;
                }));

                d(vm.Bind(x => x.Milestone, true).Subscribe(x => {
                    milestone.Value = x == null ? "None" : x.Title;
                }));

                d(vm.BindCollection(x => x.Labels, true).Subscribe(_ => {
                    labels.Value = vm.Labels.Items.Count == 0 ? "None" : string.Join(", ", vm.Labels.Items.Select(i => i.Name));
                }));

                d(saveButton.GetClickedObservable().Subscribe(_ => {
                    View.EndEditing(true);
                    vm.SaveCommand.Execute(null);
                }));

                d(content.Clicked.Subscribe(_ => {
                    var composer = new MarkdownComposerViewController { Title = "Issue Description", Text = content.Details };
                    composer.NewComment(this, (text) => {
                        vm.Content = text;
                        composer.CloseComposer();
                    });
                }));
            });
        }
コード例 #19
0
ファイル: UserGistsView.cs プロジェクト: RaineriOS/CodeHub
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            var button = new UIBarButtonItem(UIBarButtonSystemItem.Add);

            if (ViewModel.IsMine)
                NavigationItem.RightBarButtonItem = button;

            OnActivation(d => d(button.GetClickedObservable().Subscribe(_ => GoToCreateGist())));
        }
コード例 #20
0
        public GistFileViewController(
            string gistId,
            string filename,
            Octokit.Gist gist = null,
            IApplicationService applicationService = null,
            IAlertDialogService alertDialogService = null,
            IMessageService messageService         = null)
            : base(false)
        {
            _gistId             = gistId;
            _filename           = filename;
            _gist               = gist;
            _applicationService = applicationService ?? Locator.Current.GetService <IApplicationService>();
            _alertDialogService = alertDialogService ?? Locator.Current.GetService <IAlertDialogService>();
            messageService      = messageService ?? Locator.Current.GetService <IMessageService>();

            Title = System.IO.Path.GetFileName(filename);

            var actionButton = new UIBarButtonItem(UIBarButtonSystemItem.Action)
            {
                Enabled = false
            };

            NavigationItem.RightBarButtonItem = actionButton;

            var loadCommand = ReactiveCommand.CreateFromTask(Load);

            loadCommand
            .ThrownExceptions
            .Select(HandleLoadError)
            .SelectMany(Interactions.Errors.Handle)
            .Subscribe();

            this.OnActivation(d =>
            {
                d(this.WhenAnyValue(x => x.Gist)
                  .Select(x => x != null)
                  .Subscribe(x => actionButton.Enabled = x));

                d(actionButton
                  .GetClickedObservable()
                  .Subscribe(CreateActionSheet));

                d(loadCommand
                  .IsExecuting
                  .Subscribe(x => actionButton.Enabled = !x));
            });

            Appearing
            .Take(1)
            .Select(_ => Unit.Default)
            .InvokeReactiveCommand(loadCommand);
        }
コード例 #21
0
ファイル: UserGistsView.cs プロジェクト: zhiyuanjia/CodeHub
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            var button = new UIBarButtonItem(UIBarButtonSystemItem.Add);

            if (ViewModel.IsMine)
            {
                NavigationItem.RightBarButtonItem = button;
            }

            OnActivation(d => d(button.GetClickedObservable().Subscribe(_ => GoToCreateGist())));
        }
コード例 #22
0
        public static UIViewController PresentUpgradeViewController(this UIViewController @this)
        {
            var vc  = new UpgradeViewController();
            var nav = new ThemedNavigationController(vc);

            var navObj = new UIBarButtonItem {
                Image = Images.Buttons.Cancel
            };

            vc.OnActivation(disposble => navObj.GetClickedObservable().Subscribe(_ => @this.DismissViewController(true, null)).AddTo(disposble));
            vc.NavigationItem.LeftBarButtonItem = navObj;
            @this.PresentViewController(nav, true, null);
            return(vc);
        }
コード例 #23
0
        public WikiViewController()
        {
            var actionButton = new UIBarButtonItem(UIBarButtonSystemItem.Action);

            NavigationItem.RightBarButtonItem = actionButton;

            OnActivation(disposable =>
            {
                actionButton
                .GetClickedObservable()
                .SelectUnit()
                .BindCommand(this, x => x.ViewModel.ShowMenuCommand)
                .AddTo(disposable);
            });
        }
コード例 #24
0
        public static void Show(UIViewController parent, IssueLabelsViewModel viewModel)
        {
            var viewController = new IssueLabelsViewController {
                Title = "Labels", ViewModel = viewModel
            };
            var backButton = new UIBarButtonItem {
                Image = Images.BackButton
            };

            viewController.NavigationItem.LeftBarButtonItem = backButton;
            viewController.WhenActivated(d => d(backButton.GetClickedObservable().Subscribe(_ => {
                viewController.ViewModel.SaveCommand.ExecuteIfCan();
                viewController.NavigationController.PopToViewController(parent, true);
            })));
            parent.NavigationController.PushViewController(viewController, true);
        }
コード例 #25
0
        public NotificationsViewController()
        {
            EmptyView = new Lazy <UIView>(() =>
                                          new EmptyListView(Octicon.Inbox.ToEmptyListImage(), "No new notifications."));

            _markButton   = new UIBarButtonItem();
            _markToolbar  = new [] { new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace), _markButton, new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace) };
            _editButton   = new UIBarButtonItem(UIBarButtonSystemItem.Edit);
            _cancelButton = new UIBarButtonItem(UIBarButtonSystemItem.Cancel);

            if (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Pad)
            {
                NavigationItem.TitleView = _viewSegment;
                _segmentToolbar          = new [] { new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace) };
            }
            else
            {
                _segmentToolbar = new [] { new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace), new UIBarButtonItem(_viewSegment), new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace) };
                ToolbarItems    = _segmentToolbar;
            }

            OnActivation(d => {
                d(_editButton.GetClickedObservable().Subscribe(_ => StartEditing()));
                d(_cancelButton.GetClickedObservable().Subscribe(_ => StopEditing()));
                d(_markButton.GetClickedObservable().InvokeCommand(ViewModel.ReadSelectedCommand));
                d(_viewSegment.GetChangedObservable().Subscribe(x => ViewModel.ActiveFilter = x));

                d(this.WhenAnyValue(x => x.ViewModel.ShowEditButton)
                  .Subscribe(x => NavigationItem.SetRightBarButtonItem(x ? _editButton : null, true)));

                d(this.WhenAnyValue(x => x.ViewModel.ActiveFilter)
                  .Subscribe(x => _viewSegment.SelectedSegment = x));

                d(this.WhenAnyValue(x => x.ViewModel.IsAnyItemsSelected)
                  .Subscribe(x => _markButton.Title = x ? "Mark Selected as Read" : "Mark All as Read"));

                d(this.WhenAnyObservable(x => x.ViewModel.Notifications.ItemChanged)
                  .Select(_ => ViewModel.Notifications.Count)
                  .Subscribe(x => {
                    _editButton.Enabled = x > 0;
                    if (x == 0 && TableView.Editing)
                    {
                        StopEditing();
                    }
                }));
            });
        }
コード例 #26
0
        public override void ViewDidLoad()
        {
            Title = "Notifications";

            base.ViewDidLoad();

            _segmentBarButton.Width = View.Frame.Width - 10f;
            ToolbarItems = new [] { new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace), _segmentBarButton, new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace) };

            var checkButton = new UIBarButtonItem { Image = Images.Buttons.CheckButton };
            NavigationItem.RightBarButtonItem = checkButton;

            var vm = (NotificationsViewModel)ViewModel;
            var weakVm = new WeakReference<NotificationsViewModel>(vm);

            BindCollection(vm.Notifications, x =>
            {
                var el = new StringElement(x.Subject.Title, x.UpdatedAt.Humanize(), UITableViewCellStyle.Subtitle) { Accessory = UITableViewCellAccessory.DisclosureIndicator };

                var subject = x.Subject.Type.ToLower();
                if (subject.Equals("issue"))
                    el.Image = Octicon.IssueOpened.ToImage();
                else if (subject.Equals("pullrequest"))
                    el.Image = Octicon.GitPullRequest.ToImage();
                else if (subject.Equals("commit"))
                    el.Image = Octicon.GitCommit.ToImage();
                else if (subject.Equals("release"))
                    el.Image = Octicon.Tag.ToImage();
                else
                    el.Image = Octicon.Alert.ToImage();

                el.Clicked.Subscribe(MakeCallback(weakVm, x));
                return el;
            });

            var o = Observable.FromEventPattern(t => vm.ReadAllCommand.CanExecuteChanged += t, t => vm.ReadAllCommand.CanExecuteChanged -= t);

            OnActivation(d =>
            {
                d(checkButton.GetClickedObservable().BindCommand(vm.ReadAllCommand));
                d(vm.Bind(x => x.IsMarking).SubscribeStatus("Marking..."));
                d(vm.Bind(x => x.ShownIndex, true).Subscribe(x => _viewSegment.SelectedSegment = (nint)x));
                d(_viewSegment.GetChangedObservable().Subscribe(x => vm.ShownIndex = x));
                d(o.Subscribe(_ => NavigationItem.RightBarButtonItem.Enabled = vm.ReadAllCommand.CanExecute(null)));
            });
        }
コード例 #27
0
 public static void PresentModal(this UIViewController presenter, UIViewController presentee)
 {
     if (presentee is WebBrowserViewController)
     {
         presenter.PresentViewController(presentee, true, null);
     }
     else
     {
         var cancelButton = new UIBarButtonItem {
             Image = Images.Buttons.Cancel
         };
         cancelButton.GetClickedObservable().Subscribe(_ => presenter.DismissViewController(true, null));
         presentee.NavigationItem.LeftBarButtonItem = cancelButton;
         var nav = new ThemedNavigationController(presentee);
         presenter.PresentViewController(nav, true, null);
     }
 }
コード例 #28
0
        public AddSourceViewController(
            string username,
            string repository,
            string path,
            string branch,
            IApplicationService applicationService = null)
            : base(UITableViewStyle.Plain)
        {
            _username           = username;
            _repository         = repository;
            _path               = path;
            _branch             = branch;
            _applicationService = applicationService ?? Locator.Current.GetService <IApplicationService>();

            _titleElement = new DummyInputElement("Name")
            {
                SpellChecking = false
            };
            _descriptionElement = new ExpandingInputElement("Content")
            {
                SpellChecking = false,
                Font          = UIFont.FromName("Courier", UIFont.PreferredBody.PointSize)
            };

            EdgesForExtendedLayout = UIRectEdge.None;
            Title = "Add File";

            var commitButton = new UIBarButtonItem {
                Title = "Commit"
            };

            NavigationItem.RightBarButtonItem = commitButton;

            this.OnActivation(d =>
            {
                d(commitButton
                  .GetClickedObservable()
                  .Subscribe(_ => Commit()));

                d(_titleElement
                  .Changed
                  .Select(x => x.Length != 0)
                  .Subscribe(x => commitButton.Enabled = x));
            });
        }
コード例 #29
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            var titleElement = new DummyInputElement("Title")
            {
                SpellChecking = false
            };
            var contentElement = new ExpandingInputElement("Content");

            Root.Add(new Section {
                titleElement, contentElement
            });
            TableView.TableFooterView = new UIView();

            var saveButton = new UIBarButtonItem {
                Image = Images.Buttons.SaveButton
            };

            NavigationItem.RightBarButtonItem = saveButton;

            OnActivation(d =>
            {
                d(this.Bind(x => x.Filename, true).Subscribe(x =>
                {
                    Title = string.IsNullOrEmpty(x) ? "Gist File" : x;
                    titleElement.Value = x;
                }));

                d(titleElement.Changed.Subscribe(x => Filename = x));

                d(this.Bind(x => x.Content, true).Subscribe(x => contentElement.Value = x));

                d(contentElement.Changed.Subscribe(x => Content = x));

                d(SaveCommand.Subscribe(_ => ResignFirstResponder()));

                d(saveButton.GetClickedObservable()
                  .Select(_ => Unit.Default)
                  .InvokeCommand(SaveCommand));

                d(SaveCommand.IsExecuting
                  .Subscribe(x => saveButton.Enabled = !x));
            });
        }
コード例 #30
0
ファイル: IssuesView.cs プロジェクト: RaineriOS/CodeHub
        public override void ViewDidLoad()
        {
            var addButton = new UIBarButtonItem(UIBarButtonSystemItem.Add);
            NavigationItem.RightBarButtonItem = addButton;

            base.ViewDidLoad();

            _viewSegment = new CustomUISegmentedControl(new [] { "Open", "Closed", "Mine", "Custom" }, 3);
            _segmentBarButton = new UIBarButtonItem(_viewSegment);
            _segmentBarButton.Width = View.Frame.Width - 10f;
            ToolbarItems = new [] { new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace), _segmentBarButton, new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace) };
            BindCollection(ViewModel.Issues, CreateElement);

            OnActivation(d =>
            {
                d(addButton.GetClickedObservable().BindCommand(ViewModel.GoToNewIssueCommand));
            });
        }
コード例 #31
0
        public SourceViewController()
        {
            NavigationItem.RightBarButtonItem = _actionButton;

            OnActivation(disposable =>
            {
                _actionButton
                .GetClickedObservable()
                .Select(x => (object)x)
                .BindCommand(ViewModel.ShowMenuCommand)
                .AddTo(disposable);

                this.WhenAnyValue(x => x.ViewModel.FilePath)
                .Where(x => x != null)
                .Subscribe(Load)
                .AddTo(disposable);
            });
        }
コード例 #32
0
ファイル: IssuesView.cs プロジェクト: zhiyuanjia/CodeHub
        public override void ViewDidLoad()
        {
            var addButton = new UIBarButtonItem(UIBarButtonSystemItem.Add);

            NavigationItem.RightBarButtonItem = addButton;

            base.ViewDidLoad();

            _viewSegment            = new CustomUISegmentedControl(new [] { "Open", "Closed", "Mine", "Custom" }, 3);
            _segmentBarButton       = new UIBarButtonItem(_viewSegment);
            _segmentBarButton.Width = View.Frame.Width - 10f;
            ToolbarItems            = new [] { new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace), _segmentBarButton, new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace) };
            BindCollection(ViewModel.Issues, CreateElement);

            OnActivation(d =>
            {
                d(addButton.GetClickedObservable().BindCommand(ViewModel.GoToNewIssueCommand));
            });
        }
コード例 #33
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            TableView.Source = new AccountTableViewSource(TableView, ViewModel.Items);

            var add    = NavigationItem.RightBarButtonItem = new UIBarButtonItem(UIBarButtonSystemItem.Add);
            var cancel = new UIBarButtonItem {
                Image = Images.Buttons.Cancel
            };

            if (_backButton)
            {
                NavigationItem.LeftBarButtonItem = cancel;
            }

            OnActivation(disposable =>
            {
                add.GetClickedObservable()
                .SelectUnit()
                .BindCommand(ViewModel.AddAccountCommand)
                .AddTo(disposable);

                cancel.GetClickedObservable()
                .SelectUnit()
                .BindCommand(ViewModel.DismissCommand)
                .AddTo(disposable);

                ViewModel.AddAccountCommand
                .Subscribe(_ => NavigationController.PushViewController(new LoginViewController(), true))
                .AddTo(disposable);

                ViewModel.DismissCommand
                .Subscribe(_ => DismissViewController(true, null))
                .AddTo(disposable);

                ViewModel.DismissCommand.CanExecute
                .Subscribe(x => cancel.Enabled = x)
                .AddTo(disposable);
            });
        }
コード例 #34
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            var descriptionElement = new ExpandingInputElement("Description");

            descriptionElement.AccessoryView = x => new MarkdownAccessoryView(x);
            var titleElement = new DummyInputElement("Title");

            var saveButton   = new UIBarButtonItem(UIBarButtonSystemItem.Save);
            var cancelButton = new UIBarButtonItem {
                Image = Images.Cancel
            };

            NavigationItem.LeftBarButtonItem  = cancelButton;
            NavigationItem.RightBarButtonItem = saveButton;

            var source = new DialogTableViewSource(TableView);

            source.Root.Add(new Section {
                titleElement, descriptionElement
            });
            TableView.Source          = source;
            TableView.TableFooterView = new UIView();

            OnActivation(d => {
                d(descriptionElement.Changed.Subscribe(x => ViewModel.Description = x));
                d(this.WhenAnyValue(x => x.ViewModel.Subject).Subscribe(x => titleElement.Value           = x));
                d(this.WhenAnyValue(x => x.ViewModel.Description).Subscribe(x => descriptionElement.Value = x));
                d(titleElement.Changed.Subscribe(x => ViewModel.Subject = x));
                d(this.WhenAnyValue(x => x.ViewModel.DismissCommand)
                  .ToBarButtonItem(Images.Cancel, x => NavigationItem.LeftBarButtonItem = x));

                d(saveButton.GetClickedObservable()
                  .Do <Unit>(x => ResignFirstResponder())
                  .InvokeCommand(ViewModel.SubmitCommand));

                d(this.WhenAnyObservable(x => x.ViewModel.SubmitCommand.CanExecuteObservable)
                  .Subscribe(x => saveButton.Enabled = x));
            });
        }
コード例 #35
0
ファイル: Composer.cs プロジェクト: sicsbd/CodeHub.iOS
        public void PresentAsModal(UIViewController parent, Action <string> onSave, Action onClose = null)
        {
            onClose = onClose ?? new Action(() => parent.DismissViewController(true, null));

            var closeButton = new UIBarButtonItem(UIBarButtonSystemItem.Cancel);

            NavigationItem.LeftBarButtonItem = closeButton;

            OnActivation(d =>
            {
                d(closeButton.GetClickedObservable()
                  .Subscribe(_ => onClose?.Invoke()));

                d(SendItem.GetClickedObservable()
                  .Subscribe(_ => onSave?.Invoke(this.Text)));
            });

            var navigationController = new UINavigationController(this);

            parent.PresentViewController(navigationController, true, null);
        }
コード例 #36
0
ファイル: LiteComposer.cs プロジェクト: RaineriOS/CodeHub
        public LiteComposer()
            : base(null, null)
        {
            Title = "New Comment";
            EdgesForExtendedLayout = UIRectEdge.None;

            _textView = new UITextView()
            {
                Font = UIFont.PreferredBody
            };

            var close = new UIBarButtonItem { Image = Images.Buttons.BackButton };
            NavigationItem.LeftBarButtonItem = close;
            _sendButton = new UIBarButtonItem { Image = Images.Buttons.SaveButton };
            NavigationItem.RightBarButtonItem = _sendButton;

            OnActivation(d =>
            {
                d(close.GetClickedObservable().Subscribe(_ => CloseComposer()));
                d(_sendButton.GetClickedObservable().Subscribe(_ => PostCallback()));
            });
        }
コード例 #37
0
        protected BaseWebViewController(bool navigationToolbar, bool showPageAsTitle = false)
        {
            NavigationItem.BackBarButtonItem = new UIBarButtonItem {
                Title = ""
            };

            _navigationToolbar = navigationToolbar;
            _showPageAsTitle   = showPageAsTitle;

            if (_navigationToolbar)
            {
                BackButton = new UIBarButtonItem {
                    Image = Images.Web.BackButton, Enabled = false
                };
                ForwardButton = new UIBarButtonItem {
                    Image = Images.Web.FowardButton, Enabled = false
                };
                RefreshButton = new UIBarButtonItem(UIBarButtonSystemItem.Refresh)
                {
                    Enabled = false
                };

                BackButton.TintColor    = Theme.CurrentTheme.WebButtonTint;
                ForwardButton.TintColor = Theme.CurrentTheme.WebButtonTint;
                RefreshButton.TintColor = Theme.CurrentTheme.WebButtonTint;

                OnActivation(d =>
                {
                    d(BackButton.GetClickedObservable().Subscribe(_ => GoBack()));
                    d(ForwardButton.GetClickedObservable().Subscribe(_ => GoForward()));
                    d(RefreshButton.GetClickedObservable().Subscribe(_ => Refresh()));
                });
            }

            EdgesForExtendedLayout = UIRectEdge.None;
        }
コード例 #38
0
        public FileSourceViewController(
            string username,
            string repository,
            string path,
            string sha,
            ShaType shaType,
            bool forceBinary = false,
            IApplicationService applicationService = null,
            IAlertDialogService alertDialogService = null,
            IMessageService messageService         = null)
            : base(false)
        {
            _username           = username;
            _repository         = repository;
            _path               = path;
            _sha                = sha;
            _shaType            = shaType;
            _forceBinary        = forceBinary;
            _applicationService = applicationService ?? Locator.Current.GetService <IApplicationService>();
            _alertDialogService = alertDialogService ?? Locator.Current.GetService <IAlertDialogService>();
            messageService      = messageService ?? Locator.Current.GetService <IMessageService>();

            Title = System.IO.Path.GetFileName(path);

            var extension = System.IO.Path.GetExtension(path);

            _isMarkdown = MarkdownExtensions.Contains(extension);

            var actionButton = new UIBarButtonItem(UIBarButtonSystemItem.Action)
            {
                Enabled = false
            };

            NavigationItem.RightBarButtonItem = actionButton;

            var loadCommand = ReactiveCommand.CreateFromTask(Load);

            loadCommand
            .ThrownExceptions
            .Select(HandleLoadError)
            .SelectMany(Interactions.Errors.Handle)
            .Subscribe();

            this.OnActivation(d =>
            {
                d(this.WhenAnyValue(x => x.Content)
                  .Select(x => x != null)
                  .Subscribe(x => actionButton.Enabled = x));

                d(actionButton
                  .GetClickedObservable()
                  .Subscribe(_ => CreateActionSheet(actionButton)));

                d(loadCommand
                  .IsExecuting
                  .Subscribe(x => actionButton.Enabled = !x));
            });

            Appearing
            .Take(1)
            .Select(_ => Unit.Default)
            .InvokeReactiveCommand(loadCommand);

            _messageBus = messageService.Listen <Core.Messages.SourceEditMessage>(_ =>
            {
                Content = null;
                loadCommand.ExecuteNow();
            });
        }
コード例 #39
0
ファイル: IssueView.cs プロジェクト: GitWatcher/CodeHub
        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 DescriptionModel(ViewModel.MarkdownDescription, (int)UIFont.PreferredSubheadline.PointSize, true);
                var markdown = new MarkdownView { 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));
            });
        }