public override void ViewDidLoad() { base.ViewDidLoad(); NameTakenErrorLabel.Text = Resources.NameTakenError; TitleLabel.Text = Resources.NewProject; NameTextField.Placeholder = Resources.ProjectName; DoneButton.SetTitle(Resources.Create, UIControlState.Normal); var heightConverter = new BoolToConstantValueConverter <nfloat>(nameAlreadyTakenHeight, 0); var bindingSet = this.CreateBindingSet <EditProjectViewController, EditProjectViewModel>(); PrivateProjectSwitch.SetState(ViewModel.IsPrivate, false); //Commands bindingSet.Bind(DoneButton).To(vm => vm.DoneCommand); bindingSet.Bind(CloseButton).To(vm => vm.CloseCommand); bindingSet.Bind(ColorPickerOpeningView) .For(v => v.BindTap()) .To(vm => vm.PickColorCommand); bindingSet.Bind(ClientLabel) .For(v => v.BindTap()) .To(vm => vm.PickClientCommand); bindingSet.Bind(WorkspaceLabel) .For(v => v.BindTap()) .To(vm => vm.PickWorkspaceCommand); bindingSet.Bind(ProjectNameUsedErrorTextHeight) .For(v => v.Constant) .To(vm => vm.IsNameAlreadyTaken) .WithConversion(heightConverter); bindingSet.Bind(PrivateProjectSwitch) .For(v => v.BindValueChanged()) .To(vm => vm.TogglePrivateProjectCommand); //State bindingSet.Bind(NameTextField).To(vm => vm.Name); bindingSet.Bind(WorkspaceLabel).To(vm => vm.WorkspaceName); bindingSet.Bind(ColorCircleView) .For(v => v.BackgroundColor) .To(vm => vm.Color) .WithConversion(new MvxNativeColorValueConverter()); bindingSet.Bind(DoneButton) .For(v => v.Enabled) .To(vm => vm.SaveEnabled); bindingSet.Bind(ClientLabel) .For(v => v.AttributedText) .To(vm => vm.ClientName) .WithConversion(new AddNewAttributedStringConverter(Resources.AddClient, ClientLabel.Font.CapHeight)); bindingSet.Apply(); }
public override void AwakeFromNib() { base.AwakeFromNib(); TimeLabel.Font = TimeLabel.Font.GetMonospacedDigitFont(); this.DelayBind(() => { var colorConverter = new MvxRGBValueConverter(); var visibilityConverter = new MvxVisibilityValueConverter(); var timeSpanConverter = new TimeSpanToDurationValueConverter(); var descriptionTopDistanceValueConverter = new BoolToConstantValueConverter <nfloat>(HasProjectDistance, NoProjectDistance); var bindingSet = this.CreateBindingSet <TimeEntriesLogViewCell, TimeEntryViewModel>(); //Text bindingSet.Bind(ProjectLabel).To(vm => vm.ProjectName); bindingSet.Bind(DescriptionLabel).To(vm => vm.Description); bindingSet.Bind(TimeLabel) .To(vm => vm.Duration) .WithConversion(timeSpanConverter); //Color bindingSet.Bind(ProjectLabel) .For(v => v.TextColor) .To(vm => vm.ProjectColor) .WithConversion(colorConverter); bindingSet.Bind(ProjectDotView) .For(v => v.BackgroundColor) .To(vm => vm.ProjectColor) .WithConversion(colorConverter); //Visibility bindingSet.Bind(DescriptionTopDistanceConstraint) .For(v => v.Constant) .To(vm => vm.HasProject) .WithConversion(descriptionTopDistanceValueConverter); bindingSet.Bind(ProjectLabel) .For(v => v.BindVisibility()) .To(vm => vm.HasProject) .WithConversion(visibilityConverter); bindingSet.Bind(ProjectDotView) .For(v => v.BindVisibility()) .To(vm => vm.HasProject) .WithConversion(visibilityConverter); bindingSet.Bind(TaskLabel) .For(v => v.BindVisibility()) .To(vm => vm.HasProject) .WithConversion(visibilityConverter); bindingSet.Apply(); }); }
public override void AwakeFromNib() { base.AwakeFromNib(); ContentView.BackgroundColor = UIColor.White; FadeView.Layer.AddSublayer(new CAGradientLayer { Colors = new[] { UIColor.White.ColorWithAlpha(0.0f).CGColor, UIColor.White.CGColor }, Locations = new[] { new NSNumber(0.0f), new NSNumber(0.2f) }, StartPoint = new CGPoint(0.0, 0.5), EndPoint = new CGPoint(1.0, 0.5), Frame = FadeView.Bounds }); StartButton.TouchUpInside += onStartButtonTap; this.DelayBind(() => { var colorConverter = new MvxRGBValueConverter(); var visibilityConverter = new MvxVisibilityValueConverter(); var timeSpanConverter = new TimeSpanToDurationValueConverter(); var descriptionTopDistanceValueConverter = new BoolToConstantValueConverter <nfloat>(HasProjectDistance, NoProjectDistance); var projectTaskClientCombiner = new ProjectTaskClientValueCombiner( ProjectTaskClientLabel.Font.CapHeight, Color.Suggestions.ClientColor.ToNativeColor(), true ); var bindingSet = this.CreateBindingSet <SuggestionsViewCell, Suggestion>(); //Text bindingSet.Bind(DescriptionLabel).To(vm => vm.Description); bindingSet.Bind(ProjectTaskClientLabel) .For(v => v.AttributedText) .ByCombining(projectTaskClientCombiner, v => v.ProjectName, v => v.TaskName, v => v.ClientName, v => v.ProjectColor); //Visibility bindingSet.Bind(DescriptionTopDistanceConstraint) .For(v => v.Constant) .To(vm => vm.HasProject) .WithConversion(descriptionTopDistanceValueConverter); bindingSet.Bind(ProjectTaskClientLabel) .For(v => v.BindVisibility()) .To(vm => vm.HasProject) .WithConversion(visibilityConverter); bindingSet.Apply(); }); }
public override void AwakeFromNib() { base.AwakeFromNib(); ContentView.BackgroundColor = UIColor.White; this.DelayBind(() => { var colorConverter = new MvxRGBValueConverter(); var visibilityConverter = new MvxVisibilityValueConverter(); var timeSpanConverter = new TimeSpanToDurationValueConverter(); var descriptionTopDistanceValueConverter = new BoolToConstantValueConverter <nfloat>(HasProjectDistance, NoProjectDistance); var bindingSet = this.CreateBindingSet <SuggestionsViewCell, Suggestion>(); //Text bindingSet.Bind(ProjectLabel).To(vm => vm.ProjectName); bindingSet.Bind(DescriptionLabel).To(vm => vm.Description); //Color bindingSet.Bind(ProjectLabel) .For(v => v.TextColor) .To(vm => vm.ProjectColor) .WithConversion(colorConverter); bindingSet.Bind(ProjectDotView) .For(v => v.BackgroundColor) .To(vm => vm.ProjectColor) .WithConversion(colorConverter); //Visibility bindingSet.Bind(DescriptionTopDistanceConstraint) .For(v => v.Constant) .To(vm => vm.HasProject) .WithConversion(descriptionTopDistanceValueConverter); bindingSet.Bind(ProjectLabel) .For(v => v.BindVisibility()) .To(vm => vm.HasProject) .WithConversion(visibilityConverter); bindingSet.Bind(ProjectDotView) .For(v => v.BindVisibility()) .To(vm => vm.HasProject) .WithConversion(visibilityConverter); bindingSet.Bind(TaskLabel) .For(v => v.BindVisibility()) .To(vm => vm.HasProject) .WithConversion(visibilityConverter); bindingSet.Apply(); }); }
public override void ViewDidLoad() { base.ViewDidLoad(); Title = Resources.LoginForgotPassword; prepareViews(); var boolInverter = new BoolToConstantValueConverter <bool>(false, true); var resetPasswordButtonTitleConverter = new BoolToConstantValueConverter <string>("", Resources.GetPasswordResetLink); var bindingSet = this.CreateBindingSet <ForgotPasswordViewController, ForgotPasswordViewModel>(); //Text bindingSet.Bind(ErrorLabel).To(vm => vm.ErrorMessage); bindingSet.Bind(EmailTextField) .To(vm => vm.Email) .WithConversion(new EmailToStringValueConverter()); bindingSet.Bind(ResetPasswordButton) .For(v => v.BindAnimatedTitle()) .To(vm => vm.IsLoading) .WithConversion(resetPasswordButtonTitleConverter); //Visibility bindingSet.Bind(ErrorLabel) .For(v => v.BindAnimatedVisibility()) .To(vm => vm.HasError); bindingSet.Bind(DoneCard) .For(v => v.BindVisibilityWithFade()) .To(vm => vm.PasswordResetSuccessful); bindingSet.Bind(ResetPasswordButton) .For(v => v.BindVisibilityWithFade()) .To(vm => vm.PasswordResetSuccessful) .WithConversion(boolInverter); bindingSet.Bind(EmailTextField) .For(v => v.BindFirstResponder()) .To(vm => vm.PasswordResetSuccessful) .Mode(MvxBindingMode.OneWay) .WithConversion(boolInverter); bindingSet.Bind(ActivityIndicator) .For(v => v.BindVisibilityWithFade()) .To(vm => vm.IsLoading); //Commands bindingSet.Bind(ResetPasswordButton).To(vm => vm.ResetCommand); bindingSet.Apply(); }
public override void AwakeFromNib() { base.AwakeFromNib(); prepareViews(); this.DelayBind(() => { var backgroundColorConverter = new BoolToConstantValueConverter <UIColor>( Color.Calendar.SelectedDayBackgoundColor.ToNativeColor(), Color.Common.Transparent.ToNativeColor()); var todayVisibilityConverter = new MvxVisibilityValueConverter(); var bindingSet = this.CreateBindingSet <ReportsCalendarViewCell, CalendarDayViewModel>(); //Text bindingSet.Bind(Text).To(vm => vm.Day); //Color bindingSet.Bind(Text) .For(v => v.TextColor) .ByCombining(new CalendarCellTextColorValueCombiner(), v => v.IsInCurrentMonth, v => v.Selected); bindingSet.Bind(BackgroundView) .For(v => v.BackgroundColor) .To(vm => vm.Selected) .WithConversion(backgroundColorConverter); //Rounding bindingSet.Bind(BackgroundView) .For(v => v.RoundLeft) .To(vm => vm.IsStartOfSelectedPeriod); bindingSet.Bind(BackgroundView) .For(v => v.RoundRight) .To(vm => vm.IsEndOfSelectedPeriod); //Today bindingSet.Bind(TodayBackgroundView) .For(v => v.BindVisibility()) .To(vm => vm.IsToday) .WithConversion(todayVisibilityConverter); bindingSet.Apply(); }); AddGestureRecognizer(new UITapGestureRecognizer( () => CellTappedCommand?.Execute((CalendarDayViewModel)DataContext))); }
public override void ViewDidLoad() { base.ViewDidLoad(); prepareViews(); var heightConverter = new BoolToConstantValueConverter <nfloat>(nameAlreadyTakenHeight, 0); var bindingSet = this.CreateBindingSet <EditProjectViewController, EditProjectViewModel>(); //Commands bindingSet.Bind(DoneButton).To(vm => vm.DoneCommand); bindingSet.Bind(CloseButton).To(vm => vm.CloseCommand); bindingSet.Bind(ColorCircleView) .For(v => v.BindTap()) .To(vm => vm.PickColorCommand); bindingSet.Bind(ClientLabel) .For(v => v.BindTap()) .To(vm => vm.PickClientCommand); bindingSet.Bind(WorkspaceLabel) .For(v => v.BindTap()) .To(vm => vm.PickWorkspaceCommand); bindingSet.Bind(ProjectNameUsedErrorTextHeight) .For(v => v.Constant) .To(vm => vm.IsNameAlreadyTaken) .WithConversion(heightConverter); //State bindingSet.Bind(NameTextField).To(vm => vm.Name); bindingSet.Bind(WorkspaceLabel).To(vm => vm.WorkspaceName); bindingSet.Bind(PrivateProjectSwitch).To(vm => vm.IsPrivate); bindingSet.Bind(ColorCircleView) .For(v => v.BackgroundColor) .To(vm => vm.Color) .WithConversion(new MvxNativeColorValueConverter()); bindingSet.Bind(DoneButton) .For(v => v.Enabled) .To(vm => vm.SaveEnabled); bindingSet.Bind(ClientLabel) .For(v => v.AttributedText) .To(vm => vm.ClientName) .WithConversion(new AddNewAttributedStringConverter(Resources.AddClient, ClientLabel.Font.CapHeight)); bindingSet.Apply(); }
public override void AwakeFromNib() { base.AwakeFromNib(); ContentView.BackgroundColor = UIColor.White; FadeView.FadeRight = true; StartButton.TouchUpInside += onStartButtonTap; this.DelayBind(() => { var colorConverter = new MvxRGBValueConverter(); var visibilityConverter = new MvxVisibilityValueConverter(); var timeSpanConverter = new TimeSpanToDurationValueConverter(); var descriptionTopDistanceValueConverter = new BoolToConstantValueConverter <nfloat>(HasProjectDistance, NoProjectDistance); var projectTaskClientCombiner = new ProjectTaskClientValueCombiner( ProjectTaskClientLabel.Font.CapHeight, Color.Suggestions.ClientColor.ToNativeColor(), true ); var bindingSet = this.CreateBindingSet <SuggestionsViewCell, Suggestion>(); //Text bindingSet.Bind(DescriptionLabel).To(vm => vm.Description); bindingSet.Bind(ProjectTaskClientLabel) .For(v => v.AttributedText) .ByCombining(projectTaskClientCombiner, v => v.ProjectName, v => v.TaskName, v => v.ClientName, v => v.ProjectColor); //Visibility bindingSet.Bind(DescriptionTopDistanceConstraint) .For(v => v.Constant) .To(vm => vm.HasProject) .WithConversion(descriptionTopDistanceValueConverter); bindingSet.Bind(ProjectTaskClientLabel) .For(v => v.BindVisibility()) .To(vm => vm.HasProject) .WithConversion(visibilityConverter); bindingSet.Apply(); }); }
public override void AwakeFromNib() { base.AwakeFromNib(); this.DelayBind(() => { var checkboxImageConverter = new BoolToConstantValueConverter <UIImage>( checkBoxCheckedImage, checkBoxUncheckedImage); var bindingSet = this.CreateBindingSet <SelectableTagViewCell, SelectableTagViewModel>(); bindingSet.Bind(TagLabel).To(vm => vm.Name); bindingSet.Bind(SelectedImage) .To(vm => vm.Selected) .WithConversion(checkboxImageConverter); bindingSet.Apply(); }); }
public override void ViewDidLoad() { base.ViewDidLoad(); prepareViews(); UIKeyboard.Notifications.ObserveWillShow(keyboardWillShow); UIKeyboard.Notifications.ObserveWillHide(keyboardWillHide); var source = new StartTimeEntryTableViewSource(SuggestionsTableView); SuggestionsTableView.Source = source; var timeSpanConverter = new TimeSpanToDurationValueConverter(); var buttonColorConverter = new BoolToConstantValueConverter <UIColor>( Color.StartTimeEntry.ActiveButton.ToNativeColor(), Color.StartTimeEntry.InactiveButton.ToNativeColor() ); var bindingSet = this.CreateBindingSet <StartTimeEntryViewController, StartTimeEntryViewModel>(); //TableView bindingSet.Bind(source).To(vm => vm.Suggestions); //Text bindingSet.Bind(TimeLabel).To(vm => vm.ElapsedTime).WithConversion(timeSpanConverter); bindingSet.Bind(DescriptionTextField).To(vm => vm.RawTimeEntryText); //Buttons bindingSet.Bind(BillableButton) .For(v => v.TintColor) .To(vm => vm.IsBillable) .WithConversion(buttonColorConverter); //Commands bindingSet.Bind(DoneButton).To(vm => vm.DoneCommand); bindingSet.Bind(CloseButton).To(vm => vm.BackCommand); bindingSet.Bind(BillableButton).To(vm => vm.ToggleBillableCommand); bindingSet.Apply(); }
public override void AwakeFromNib() { base.AwakeFromNib(); this.DelayBind(() => { var visibilityConverter = new MvxVisibilityValueConverter(); var descriptionTopDistanceValueConverter = new BoolToConstantValueConverter <nfloat>(HasProjectDistance, NoProjectDistance); var projectTaskClientCombiner = new ProjectTaskClientValueCombiner( ProjectLabel.Font.CapHeight, Color.Suggestions.ClientColor.ToNativeColor(), true ); var bindingSet = this.CreateBindingSet <StartTimeEntryViewCell, TimeEntrySuggestion>(); //Text bindingSet.Bind(DescriptionLabel).To(vm => vm.Description); bindingSet.Bind(ProjectLabel) .For(v => v.AttributedText) .ByCombining(projectTaskClientCombiner, v => v.ProjectName, v => v.TaskName, v => v.ClientName, v => v.ProjectColor); //Visibility bindingSet.Bind(DescriptionTopDistanceConstraint) .For(v => v.Constant) .To(vm => vm.HasProject) .WithConversion(descriptionTopDistanceValueConverter); bindingSet.Bind(ProjectLabel) .For(v => v.BindVisibility()) .To(vm => vm.HasProject) .WithConversion(visibilityConverter); bindingSet.Apply(); }); }
public override void AwakeFromNib() { base.AwakeFromNib(); TitleLabel.Font = Font; this.DelayBind(() => { var backgroundColorConverter = new BoolToConstantValueConverter <UIColor>( Color.Calendar.QuickSelect.SelectedBackground.ToNativeColor(), Color.Calendar.QuickSelect.UnselectedBackground.ToNativeColor() ); var titleColorConverter = new BoolToConstantValueConverter <UIColor>( Color.Calendar.QuickSelect.SelectedTitle.ToNativeColor(), Color.Calendar.QuickSelect.UnselectedTitle.ToNativeColor() ); var bindingSet = this.CreateBindingSet <ReportsCalendarQuickSelectViewCell, CalendarBaseQuickSelectShortcut>(); //Text bindingSet.Bind(TitleLabel).To(vm => vm.Title); //Color bindingSet.Bind(ContentView) .For(v => v.BackgroundColor) .To(vm => vm.Selected) .WithConversion(backgroundColorConverter); bindingSet.Bind(TitleLabel) .For(v => v.TextColor) .To(vm => vm.Selected) .WithConversion(titleColorConverter); bindingSet.Apply(); }); }
public override void ViewDidLoad() { base.ViewDidLoad(); Title = Resources.LoginTitle; prepareViews(); var invertedBoolConverter = new BoolToConstantValueConverter <bool>(false, true); var bindingSet = this.CreateBindingSet <TokenResetViewController, TokenResetViewModel>(); //Text bindingSet.Bind(ErrorLabel).To(vm => vm.Error); bindingSet.Bind(PasswordTextField) .For(v => v.BindSecureTextEntry()) .To(vm => vm.IsPasswordMasked); bindingSet.Bind(EmailLabel) .To(vm => vm.Email) .WithConversion(new EmailToStringValueConverter()); bindingSet.Bind(PasswordTextField) .To(vm => vm.Password) .WithConversion(new PasswordToStringValueConverter()); //Commands bindingSet.Bind(SignOutButton).To(vm => vm.SignOutCommand); bindingSet.Bind(nextButton) .For(v => v.BindCommand()) .To(vm => vm.DoneCommand); bindingSet.Bind(ShowPasswordButton) .For(v => v.BindTap()) .To(vm => vm.TogglePasswordVisibilityCommand); //Enabled bindingSet.Bind(PasswordTextField) .For(v => v.BindShouldReturn()) .To(vm => vm.DoneCommand); bindingSet.Bind(nextButton) .For(v => v.Enabled) .To(vm => vm.NextIsEnabled); //Visibility bindingSet.Bind(ErrorView) .For(v => v.BindVisible()) .To(vm => vm.HasError); bindingSet.Bind(ShowPasswordButton) .For(v => v.BindVisibility()) .To(vm => vm.IsLoading) .WithConversion(new MvxInvertedVisibilityValueConverter()); bindingSet.Bind(ActivityIndicatorView) .For(v => v.BindVisible()) .To(vm => vm.IsLoading); //State bindingSet.Apply(); PasswordTextField.BecomeFirstResponder(); }
public override void ViewDidLoad() { base.ViewDidLoad(); prepareViews(); UIKeyboard.Notifications.ObserveWillShow(keyboardWillShow); UIKeyboard.Notifications.ObserveWillHide(keyboardWillHide); var source = new StartTimeEntryTableViewSource(SuggestionsTableView); SuggestionsTableView.Source = source; var timeSpanConverter = new TimeSpanToDurationValueConverter(); var buttonColorConverter = new BoolToConstantValueConverter <UIColor>( Color.StartTimeEntry.ActiveButton.ToNativeColor(), Color.StartTimeEntry.InactiveButton.ToNativeColor() ); var bindingSet = this.CreateBindingSet <StartTimeEntryViewController, StartTimeEntryViewModel>(); //TableView bindingSet.Bind(source).To(vm => vm.Suggestions); bindingSet.Bind(source) .For(v => v.ToggleTasksCommand) .To(vm => vm.ToggleTaskSuggestionsCommand); bindingSet.Bind(source) .For(v => v.UseGrouping) .To(vm => vm.UseGrouping); bindingSet.Bind(source) .For(v => v.SelectionChangedCommand) .To(vm => vm.SelectSuggestionCommand); //Text bindingSet.Bind(TimeLabel) .To(vm => vm.ElapsedTime) .WithConversion(timeSpanConverter); bindingSet.Bind(DescriptionTextView) .For(v => v.BindTextFieldInfo()) .To(vm => vm.TextFieldInfo); //Buttons bindingSet.Bind(TagsButton) .For(v => v.TintColor) .To(vm => vm.IsSuggestingTags) .WithConversion(buttonColorConverter); bindingSet.Bind(BillableButton) .For(v => v.TintColor) .To(vm => vm.IsBillable) .WithConversion(buttonColorConverter); bindingSet.Bind(ProjectsButton) .For(v => v.TintColor) .To(vm => vm.IsSuggestingProjects) .WithConversion(buttonColorConverter); bindingSet.Bind(DurationButton) .For(v => v.TintColor) .To(vm => vm.IsEditingDuration) .WithConversion(buttonColorConverter); bindingSet.Bind(DateTimeButton) .For(v => v.TintColor) .To(vm => vm.IsEditingStartDate) .WithConversion(buttonColorConverter); //Visibility bindingSet.Bind(BillableButtonWidthConstraint) .For(v => v.Constant) .To(vm => vm.IsBillableAvailable) .WithConversion(new BoolToConstantValueConverter <nfloat>(42, 0)); //Commands bindingSet.Bind(DoneButton).To(vm => vm.DoneCommand); bindingSet.Bind(CloseButton).To(vm => vm.BackCommand); bindingSet.Bind(DurationButton).To(vm => vm.ChangeDurationCommand); bindingSet.Bind(BillableButton).To(vm => vm.ToggleBillableCommand); bindingSet.Bind(DateTimeButton).To(vm => vm.ChangeStartTimeCommand); bindingSet.Bind(TagsButton).To(vm => vm.ToggleTagSuggestionsCommand); bindingSet.Bind(ProjectsButton).To(vm => vm.ToggleProjectSuggestionsCommand); bindingSet.Apply(); }
public override void ViewDidLoad() { base.ViewDidLoad(); startTimeChangingSubscription = ViewModel.StartTimeChanging.Subscribe(startTimeChanging); prepareViews(); var durationCombiner = new DurationValueCombiner(); var timeCombiner = new DateTimeOffsetTimeFormatValueCombiner(TimeZoneInfo.Local); var dateCombiner = new DateTimeOffsetDateFormatValueCombiner(TimeZoneInfo.Local, useLongFormat: false); var timeFormatToLocaleConverter = new TimeFormatToLocaleValueConverter(); var inverseBoolConverter = new BoolToConstantValueConverter <bool>(false, true); var editedTimeLabelColorConverter = new BoolToConstantValueConverter <UIColor>( Color.EditDuration.EditedTime.ToNativeColor(), Color.EditDuration.NotEditedTime.ToNativeColor()); var bindingSet = this.CreateBindingSet <EditDurationViewController, EditDurationViewModel>(); //Commands bindingSet.Bind(SaveButton).To(vm => vm.SaveCommand); bindingSet.Bind(CloseButton).To(vm => vm.CloseCommand); //Start and stop date/time bindingSet.Bind(StartTimeLabel) .ByCombining(timeCombiner, vm => vm.StartTime, vm => vm.TimeFormat); bindingSet.Bind(StartDateLabel) .ByCombining(dateCombiner, vm => vm.StartTime, vm => vm.DateFormat); bindingSet.Bind(EndTimeLabel) .ByCombining(timeCombiner, vm => vm.StopTime, vm => vm.TimeFormat); bindingSet.Bind(EndDateLabel) .ByCombining(dateCombiner, vm => vm.StopTime, vm => vm.DateFormat); //Editing start and end time bindingSet.Bind(StartView) .For(v => v.BindTap()) .To(vm => vm.EditStartTimeCommand); bindingSet.Bind(EndView) .For(v => v.BindTap()) .To(vm => vm.EditStopTimeCommand); bindingSet.Bind(SetEndButton) .For(v => v.BindVisibility()) .To(vm => vm.IsRunning) .WithConversion(inverseBoolConverter); bindingSet.Bind(SetEndButton) .To(vm => vm.EditStopTimeCommand); //Visibility bindingSet.Bind(EndTimeLabel) .For(v => v.BindVisibility()) .To(vm => vm.IsRunning); bindingSet.Bind(EndDateLabel) .For(v => v.BindVisibility()) .To(vm => vm.IsRunning); //Stard and end colors bindingSet.Bind(StartTimeLabel) .For(v => v.TextColor) .To(vm => vm.IsEditingStartTime) .WithConversion(editedTimeLabelColorConverter); bindingSet.Bind(StartDateLabel) .For(v => v.TextColor) .To(vm => vm.IsEditingStartTime) .WithConversion(editedTimeLabelColorConverter); bindingSet.Bind(EndTimeLabel) .For(v => v.TextColor) .To(vm => vm.IsEditingStopTime) .WithConversion(editedTimeLabelColorConverter); bindingSet.Bind(EndDateLabel) .For(v => v.TextColor) .To(vm => vm.IsEditingStopTime) .WithConversion(editedTimeLabelColorConverter); //Date picker bindingSet.Bind(DatePickerContainer) .For(v => v.BindAnimatedVisibility()) .To(vm => vm.IsEditingTime); bindingSet.Bind(DatePicker) .For(v => v.BindDateTimeOffset()) .To(vm => vm.EditedTime); bindingSet.Bind(DatePicker) .For(v => v.MaximumDate) .To(vm => vm.MaximumDateTime); bindingSet.Bind(DatePicker) .For(v => v.MinimumDate) .To(vm => vm.MinimumDateTime); bindingSet.Bind(DatePicker) .For(v => v.Locale) .To(vm => vm.TimeFormat) .WithConversion(timeFormatToLocaleConverter); //The wheel bindingSet.Bind(DurationInput) .For(v => v.UserInteractionEnabled) .To(vm => vm.IsEditingTime) .WithConversion(inverseBoolConverter); bindingSet.Bind(DurationInput) .For(v => v.Duration) .To(vm => vm.Duration); bindingSet.Bind(DurationInput) .For(v => v.FormattedDuration) .ByCombining(durationCombiner, vm => vm.Duration, vm => vm.DurationFormat); bindingSet.Bind(WheelView) .For(v => v.UserInteractionEnabled) .To(vm => vm.IsEditingTime) .WithConversion(inverseBoolConverter); bindingSet.Bind(WheelView) .For(v => v.MaximumStartTime) .To(vm => vm.MaximumStartTime); bindingSet.Bind(WheelView) .For(v => v.MinimumStartTime) .To(vm => vm.MinimumStartTime); bindingSet.Bind(WheelView) .For(v => v.MaximumEndTime) .To(vm => vm.MaximumStopTime); bindingSet.Bind(WheelView) .For(v => v.MinimumEndTime) .To(vm => vm.MinimumStopTime); bindingSet.Bind(WheelView) .For(v => v.StartTime) .To(vm => vm.StartTime); bindingSet.Bind(WheelView) .For(v => v.EndTime) .To(vm => vm.StopTime); bindingSet.Bind(WheelView) .For(v => v.IsRunning) .To(vm => vm.IsRunning); bindingSet.Apply(); // Interaction observables for analytics var editingStart = Observable.Merge( StartView.Rx().Tap().Select(true), EndView.Rx().Tap().Select(false) ); var dateComponentChanged = DatePicker.Rx().DateComponent() .WithLatestFrom(editingStart, (_, isStart) => isStart ? EditTimeSource.BarrelStartDate : EditTimeSource.BarrelStopDate ); var timeComponentChanged = DatePicker.Rx().TimeComponent() .WithLatestFrom(editingStart, (_, isStart) => isStart ? EditTimeSource.BarrelStartTime : EditTimeSource.BarrelStopTime ); var durationInputChanged = Observable .FromEventPattern(e => DurationInput.DurationChanged += e, e => DurationInput.DurationChanged -= e) .Select(EditTimeSource.NumpadDuration); Observable.Merge( dateComponentChanged, timeComponentChanged, WheelView.TimeEdited, durationInputChanged ) .Distinct() .Subscribe(ViewModel.TimeEditedWithSource) .DisposedBy(disposeBag); }
public override void AwakeFromNib() { base.AwakeFromNib(); FadeView.FadeRight = true; TimeLabel.Font = TimeLabel.Font.GetMonospacedDigitFont(); ContinueButton.TouchUpInside += onContinueButtonTap; this.DelayBind(() => { var colorConverter = new MvxRGBValueConverter(); var visibilityConverter = new MvxVisibilityValueConverter(); var timeSpanConverter = new TimeSpanToDurationValueConverter(); var invertedVisibilityConverter = new MvxInvertedVisibilityValueConverter(); var projectTaskClientCombiner = new ProjectTaskClientValueCombiner( ProjectTaskClientLabel.Font.CapHeight, Color.TimeEntriesLog.ClientColor.ToNativeColor(), true ); var descriptionTopDistanceValueConverter = new BoolToConstantValueConverter <nfloat>(hasProjectDistance, noProjectDistance); var bindingSet = this.CreateBindingSet <TimeEntriesLogViewCell, TimeEntryViewModel>(); //Text bindingSet.Bind(DescriptionLabel).To(vm => vm.Description); bindingSet.Bind(ProjectTaskClientLabel) .For(v => v.AttributedText) .ByCombining(projectTaskClientCombiner, v => v.ProjectName, v => v.TaskName, v => v.ClientName, v => v.ProjectColor); bindingSet.Bind(TimeLabel) .To(vm => vm.Duration) .WithConversion(timeSpanConverter); //Visibility bindingSet.Bind(DescriptionTopDistanceConstraint) .For(v => v.Constant) .To(vm => vm.HasProject) .WithConversion(descriptionTopDistanceValueConverter); bindingSet.Bind(ProjectTaskClientLabel) .For(v => v.BindVisibility()) .To(vm => vm.HasProject) .WithConversion(visibilityConverter); bindingSet.Bind(AddDescriptionLabel) .For(v => v.BindVisibility()) .To(vm => vm.HasDescription) .WithConversion(invertedVisibilityConverter); bindingSet.Bind(AddDescriptionTopDistanceConstraint) .For(v => v.Constant) .To(vm => vm.HasProject) .WithConversion(descriptionTopDistanceValueConverter); bindingSet.Bind(SyncErrorImageView) .For(v => v.BindVisibility()) .To(vm => vm.CanSync) .WithConversion(invertedVisibilityConverter); bindingSet.Bind(UnsyncedImageView) .For(v => v.BindVisibility()) .To(vm => vm.NeedsSync) .WithConversion(visibilityConverter); bindingSet.Bind(ContinueButton) .For(v => v.BindVisibility()) .To(vm => vm.CanSync) .WithConversion(visibilityConverter); bindingSet.Bind(ContinueImageView) .For(v => v.BindVisibility()) .To(vm => vm.CanSync) .WithConversion(visibilityConverter); bindingSet.Apply(); }); }
public override void AwakeFromNib() { base.AwakeFromNib(); var templateImage = TotalDurationGraph.Image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate); TotalDurationGraph.Image = templateImage; prepareViews(); var colorConverter = new BoolToConstantValueConverter <UIColor>( Color.Reports.Disabled.ToNativeColor(), Color.Reports.TotalTimeActivated.ToNativeColor() ); var durationCombiner = new DurationValueCombiner(); this.DelayBind(() => { var bindingSet = this.CreateBindingSet <ReportsHeaderView, ReportsViewModel>(); //Text bindingSet.Bind(BillablePercentageLabel) .For(v => v.AttributedText) .To(vm => vm.BillablePercentage) .WithConversion(new ReportPercentageLabelValueConverter()); bindingSet.Bind(TotalDurationLabel) .For(v => v.Text) .ByCombining(durationCombiner, vm => vm.TotalTime, vm => vm.DurationFormat); //Loading chart bindingSet.Bind(LoadingPieChartView) .For(v => v.BindVisibilityWithFade()) .To(vm => vm.IsLoading); bindingSet.Bind(LoadingCardView) .For(v => v.BindVisibilityWithFade()) .To(vm => vm.IsLoading); //Pretty stuff bindingSet.Bind(PieChartView) .For(v => v.Segments) .To(vm => vm.GroupedSegments); bindingSet.Bind(BillablePercentageView) .For(v => v.Percentage) .To(vm => vm.BillablePercentage); bindingSet.Bind(TotalDurationGraph) .For(v => v.TintColor) .To(vm => vm.TotalTimeIsZero) .WithConversion(colorConverter); bindingSet.Bind(TotalDurationLabel) .For(v => v.TextColor) .To(vm => vm.TotalTimeIsZero) .WithConversion(colorConverter); // Bar chart if (ViewModel == null) { throw new InvalidOperationException($"The {nameof(ViewModel)} value must be set for {nameof(ReportsHeaderView)} before defining bindings."); } ViewModel.WorkspaceHasBillableFeatureEnabled .Subscribe(ColorsLegendContainerView.Rx().IsVisible()) .DisposedBy(disposeBag); ViewModel.StartDate .CombineLatest( ViewModel.BarChartViewModel.DateFormat, (startDate, format) => startDate.ToString(format.Short)) .Subscribe(StartDateLabel.Rx().Text()) .DisposedBy(disposeBag); ViewModel.EndDate .CombineLatest( ViewModel.BarChartViewModel.DateFormat, (endDate, format) => endDate.ToString(format.Short)) .Subscribe(EndDateLabel.Rx().Text()) .DisposedBy(disposeBag); ViewModel.BarChartViewModel.MaximumHoursPerBar .Select(hours => $"{hours} h") .Subscribe(MaximumHoursLabel.Rx().Text()) .DisposedBy(disposeBag); ViewModel.BarChartViewModel.MaximumHoursPerBar .Select(hours => $"{hours/2} h") .Subscribe(HalfHoursLabel.Rx().Text()) .DisposedBy(disposeBag); ViewModel.BarChartViewModel.HorizontalLegend .Where(legend => legend == null) .Subscribe((DateTimeOffset[] _) => { HorizontalLegendStackView.Subviews.ForEach(subview => subview.RemoveFromSuperview()); StartDateLabel.Hidden = false; EndDateLabel.Hidden = false; }) .DisposedBy(disposeBag); ViewModel.BarChartViewModel.HorizontalLegend .Where(legend => legend != null) .CombineLatest(ViewModel.BarChartViewModel.DateFormat, createHorizontalLegendLabels) .Do(_ => { StartDateLabel.Hidden = true; EndDateLabel.Hidden = true; }) .Subscribe(HorizontalLegendStackView.Rx().ArrangedViews()) .DisposedBy(disposeBag); ViewModel.BarChartViewModel.Bars .Select(createBarViews) .Subscribe(BarsStackView.Rx().ArrangedViews()) .DisposedBy(disposeBag); var spacingObservable = ViewModel.BarChartViewModel.Bars .CombineLatest(updateLayout, (bars, _) => bars) .Select(bars => BarsStackView.Frame.Width / bars.Length * barChartSpacingProportion); spacingObservable .Subscribe(BarsStackView.Rx().Spacing()) .DisposedBy(disposeBag); spacingObservable .Subscribe(HorizontalLegendStackView.Rx().Spacing()) .DisposedBy(disposeBag); ViewModel.IsLoadingObservable .Select(CommonFunctions.Invert) .Subscribe(BarChartContainerView.Rx().IsVisible()) .DisposedBy(disposeBag); //Visibility bindingSet.Bind(EmptyStateView) .For(v => v.BindVisible()) .To(vm => vm.ShowEmptyState); bindingSet.Apply(); }); }
public override void ViewDidLoad() { base.ViewDidLoad(); var loginButtonColorConverter = new BoolToConstantValueConverter <UIColor>(UIColor.White, UIColor.Black); var loginButtonTitleConverter = new BoolToConstantValueConverter <string>("", Resources.LoginTitle); var invertedBoolConverter = new BoolToConstantValueConverter <bool>(false, true); var bindingSet = this.CreateBindingSet <LoginViewController, NewLoginViewModel>(); //Text bindingSet.Bind(ErrorLabel).To(vm => vm.ErrorMessage); bindingSet.Bind(EmailTextField) .To(vm => vm.Email) .WithConversion(new EmailToStringValueConverter()); bindingSet.Bind(PasswordTextField) .To(vm => vm.Password) .WithConversion(new PasswordToStringValueConverter()); bindingSet.Bind(LoginButton) .For(v => v.BindAnimatedTitle()) .To(vm => vm.IsLoading) .WithConversion(loginButtonTitleConverter); //Commands bindingSet.Bind(LoginButton).To(vm => vm.LoginCommand); bindingSet.Bind(GoogleLoginButton).To(vm => vm.GoogleLoginCommand); bindingSet.Bind(ForgotPasswordButton).To(vm => vm.ForgotPasswordCommand); bindingSet.Bind(PasswordManagerButton).To(vm => vm.StartPasswordManagerCommand); bindingSet.Bind(ShowPasswordButton).To(vm => vm.TogglePasswordVisibilityCommand); bindingSet.Bind(SignupCard) .For(v => v.BindTap()) .To(vm => vm.SignupCommand); //Visibilty bindingSet.Bind(ErrorLabel) .For(v => v.BindAnimatedVisibility()) .To(vm => vm.HasError); bindingSet.Bind(ActivityIndicator) .For(v => v.BindVisibilityWithFade()) .To(vm => vm.IsLoading); bindingSet.Bind(PasswordManagerButton) .For(v => v.BindVisible()) .To(vm => vm.IsPasswordManagerAvailable); bindingSet.Bind(PasswordTextField) .For(v => v.BindSecureTextEntry()) .To(vm => vm.IsPasswordMasked); bindingSet.Bind(ShowPasswordButton) .For(v => v.BindVisible()) .To(vm => vm.IsShowPasswordButtonVisible); bindingSet.Bind(PasswordTextField) .For(v => v.BindFirstResponder()) .To(vm => vm.IsShowPasswordButtonVisible) .Mode(MvxBindingMode.OneWayToSource); //Color bindingSet.Bind(LoginButton) .For(v => v.TintColor) .To(vm => vm.HasError) .WithConversion(loginButtonColorConverter); bindingSet.Apply(); prepareViews(); }
public override void ViewDidLoad() { base.ViewDidLoad(); prepareViews(); Title = ViewModel.Title; var inverseBoolConverter = new BoolToConstantValueConverter <bool>(false, true); var visibilityConverter = new MvxVisibilityValueConverter(); var bindingSet = this.CreateBindingSet <SettingsViewController, SettingsViewModel>(); // Text bindingSet.Bind(EmailLabel).To(vm => vm.Email); bindingSet.Bind(VersionLabel).To(vm => vm.Version); bindingSet.Bind(PlanLabel).To(vm => vm.CurrentPlan); bindingSet.Bind(WorkspaceLabel).To(vm => vm.WorkspaceName); // Commands bindingSet.Bind(LogoutButton).To(vm => vm.LogoutCommand); bindingSet.Bind(EmailView) .For(v => v.BindTap()) .To(vm => vm.EditProfileCommand); bindingSet.Bind(WorkspaceView) .For(v => v.BindTap()) .To(vm => vm.EditWorkspaceCommand); bindingSet.Bind(SubscriptionView) .For(v => v.BindTap()) .To(vm => vm.EditSubscriptionCommand); bindingSet.Bind(TwentyFourHourClockView) .For(v => v.BindTap()) .To(vm => vm.ToggleUseTwentyFourHourClockCommand); bindingSet.Bind(AddMobileTagView) .For(v => v.BindTap()) .To(vm => vm.ToggleAddMobileTagCommand); bindingSet.Bind(FeedbackView) .For(v => v.BindTap()) .To(vm => vm.SubmitFeedbackCommand); bindingSet.Bind(RateView) .For(v => v.BindTap()) .To(vm => vm.RateCommand); bindingSet.Bind(UpdateView) .For(v => v.BindTap()) .To(vm => vm.UpdateCommand); bindingSet.Bind(HelpView) .For(v => v.BindTap()) .To(vm => vm.HelpCommand); // Logout process bindingSet.Bind(LogoutButton) .For(btn => btn.Enabled) .To(vm => vm.IsLoggingOut) .WithConversion(inverseBoolConverter); bindingSet.Bind(NavigationItem) .For(nav => nav.BindHidesBackButton()) .To(vm => vm.IsLoggingOut); bindingSet.Bind(SyncingView) .For(view => view.BindVisibility()) .To(vm => vm.IsRunningSync) .WithConversion(visibilityConverter); bindingSet.Bind(SyncedView) .For(view => view.BindVisibility()) .To(vm => vm.IsSynced) .WithConversion(visibilityConverter); bindingSet.Bind(LoggingOutView) .For(view => view.BindVisibility()) .To(vm => vm.IsLoggingOut) .WithConversion(visibilityConverter); // Switches bindingSet.Bind(AddMobileTagSwitch) .For(v => v.BindAnimatedOn()) .To(vm => vm.AddMobileTag); bindingSet.Bind(TwentyFourHourClockSwitch) .For(v => v.BindAnimatedOn()) .To(vm => vm.UseTwentyFourHourClock); bindingSet.Apply(); }
public override void ViewDidLoad() { base.ViewDidLoad(); AddProjectBubbleLabel.Text = Resources.AddProjectBubbleText; prepareViews(); prepareOnboarding(); var source = new StartTimeEntryTableViewSource(SuggestionsTableView); SuggestionsTableView.Source = source; source.ToggleTasksCommand = new MvxCommand <ProjectSuggestion>(toggleTaskSuggestions); var invertedVisibilityConverter = new MvxInvertedVisibilityValueConverter(); var invertedBoolConverter = new BoolToConstantValueConverter <bool>(false, true); var buttonColorConverter = new BoolToConstantValueConverter <UIColor>( Color.StartTimeEntry.ActiveButton.ToNativeColor(), Color.StartTimeEntry.InactiveButton.ToNativeColor() ); var durationCombiner = new DurationValueCombiner(); var bindingSet = this.CreateBindingSet <StartTimeEntryViewController, StartTimeEntryViewModel>(); //TableView bindingSet.Bind(source) .For(v => v.ObservableCollection) .To(vm => vm.Suggestions); bindingSet.Bind(source) .For(v => v.UseGrouping) .To(vm => vm.UseGrouping); bindingSet.Bind(source) .For(v => v.SelectSuggestionCommand) .To(vm => vm.SelectSuggestionCommand); bindingSet.Bind(source) .For(v => v.CreateCommand) .To(vm => vm.CreateCommand); bindingSet.Bind(source) .For(v => v.IsSuggestingProjects) .To(vm => vm.IsSuggestingProjects); bindingSet.Bind(source) .For(v => v.Text) .To(vm => vm.CurrentQuery); bindingSet.Bind(source) .For(v => v.SuggestCreation) .To(vm => vm.SuggestCreation); bindingSet.Bind(source) .For(v => v.ShouldShowNoTagsInfoMessage) .To(vm => vm.ShouldShowNoTagsInfoMessage); bindingSet.Bind(source) .For(v => v.ShouldShowNoProjectsInfoMessage) .To(vm => vm.ShouldShowNoProjectsInfoMessage); //Text bindingSet.Bind(TimeInput) .For(v => v.Duration) .To(vm => vm.DisplayedTime) .Mode(MvxBindingMode.OneWayToSource); bindingSet.Bind(TimeLabel) .For(v => v.Text) .ByCombining(durationCombiner, vm => vm.DisplayedTime, vm => vm.DisplayedTimeFormat); bindingSet.Bind(Placeholder) .To(vm => vm.PlaceholderText); //Buttons bindingSet.Bind(TagsButton) .For(v => v.TintColor) .To(vm => vm.IsSuggestingTags) .WithConversion(buttonColorConverter); bindingSet.Bind(BillableButton) .For(v => v.TintColor) .To(vm => vm.IsBillable) .WithConversion(buttonColorConverter); bindingSet.Bind(ProjectsButton) .For(v => v.TintColor) .To(vm => vm.IsSuggestingProjects) .WithConversion(buttonColorConverter); //Visibility bindingSet.Bind(BillableButtonWidthConstraint) .For(v => v.Constant) .To(vm => vm.IsBillableAvailable) .WithConversion(new BoolToConstantValueConverter <nfloat>(42, 0)); //Commands bindingSet.Bind(DoneButton).To(vm => vm.DoneCommand); bindingSet.Bind(CloseButton).To(vm => vm.BackCommand); bindingSet.Bind(BillableButton).To(vm => vm.ToggleBillableCommand); bindingSet.Bind(StartDateButton).To(vm => vm.SetStartDateCommand); bindingSet.Bind(DateTimeButton).To(vm => vm.ChangeTimeCommand); bindingSet.Bind(TagsButton).To(vm => vm.ToggleTagSuggestionsCommand); bindingSet.Bind(ProjectsButton).To(vm => vm.ToggleProjectSuggestionsCommand); bindingSet.Apply(); // Reactive ViewModel.TextFieldInfoObservable .Subscribe(onTextFieldInfo) .DisposedBy(DisposeBag); DescriptionTextView.Rx().AttributedText() .Select(attributedString => attributedString.Length == 0) .Subscribe(isDescriptionEmptySubject) .DisposedBy(DisposeBag); DescriptionTextView.Rx().AttributedText() .CombineLatest(DescriptionTextView.Rx().CursorPosition(), (text, _) => text) .Where(_ => !isUpdatingDescriptionField) .SubscribeOn(ThreadPoolScheduler.Instance) .Do(updatePlaceholder) .Select(text => text.AsImmutableSpans((int)DescriptionTextView.SelectedRange.Location)) .ObserveOn(SynchronizationContext.Current) .Subscribe(async info => await ViewModel.OnTextFieldInfoFromView(info)) .DisposedBy(DisposeBag); source.TableRenderCallback = () => { ViewModel.StopSuggestionsRenderingStopwatch(); }; }
public override void ViewDidLoad() { base.ViewDidLoad(); startTimeChangingSubscription = ViewModel.StartTimeChanging.Subscribe(startTimeChanging); setupDismissingByTappingOnBackground(); prepareViews(); var durationCombiner = new DurationValueCombiner(); var timeCombiner = new DateTimeOffsetTimeFormatValueCombiner(TimeZoneInfo.Local); var dateCombiner = new DateTimeOffsetDateFormatValueCombiner(TimeZoneInfo.Local, useLongFormat: false); var timeFormatToLocaleConverter = new TimeFormatToLocaleValueConverter(); var inverseBoolConverter = new BoolToConstantValueConverter <bool>(false, true); var editedTimeLabelColorConverter = new BoolToConstantValueConverter <UIColor>( Color.EditDuration.EditedTime.ToNativeColor(), Color.EditDuration.NotEditedTime.ToNativeColor()); var bindingSet = this.CreateBindingSet <EditDurationViewController, EditDurationViewModel>(); //Commands bindingSet.Bind(SaveButton).To(vm => vm.SaveCommand); bindingSet.Bind(CloseButton).To(vm => vm.CloseCommand); //Start and stop date/time bindingSet.Bind(StartTimeLabel) .ByCombining(timeCombiner, vm => vm.StartTime, vm => vm.TimeFormat); bindingSet.Bind(StartDateLabel) .ByCombining(dateCombiner, vm => vm.StartTime, vm => vm.DateFormat); bindingSet.Bind(EndTimeLabel) .ByCombining(timeCombiner, vm => vm.StopTime, vm => vm.TimeFormat); bindingSet.Bind(EndDateLabel) .ByCombining(dateCombiner, vm => vm.StopTime, vm => vm.DateFormat); //Editing start and end time bindingSet.Bind(StartView) .For(v => v.BindTap()) .To(vm => vm.EditStartTimeCommand); bindingSet.Bind(EndView) .For(v => v.BindTap()) .To(vm => vm.EditStopTimeCommand); bindingSet.Bind(SetEndButton) .For(v => v.BindVisibility()) .To(vm => vm.IsRunning) .WithConversion(inverseBoolConverter); bindingSet.Bind(SetEndButton) .To(vm => vm.EditStopTimeCommand); //Visiblity bindingSet.Bind(EndTimeLabel) .For(v => v.BindVisibility()) .To(vm => vm.IsRunning); bindingSet.Bind(EndDateLabel) .For(v => v.BindVisibility()) .To(vm => vm.IsRunning); //Stard and end colors bindingSet.Bind(StartTimeLabel) .For(v => v.TextColor) .To(vm => vm.IsEditingStartTime) .WithConversion(editedTimeLabelColorConverter); bindingSet.Bind(StartDateLabel) .For(v => v.TextColor) .To(vm => vm.IsEditingStartTime) .WithConversion(editedTimeLabelColorConverter); bindingSet.Bind(EndTimeLabel) .For(v => v.TextColor) .To(vm => vm.IsEditingStopTime) .WithConversion(editedTimeLabelColorConverter); bindingSet.Bind(EndDateLabel) .For(v => v.TextColor) .To(vm => vm.IsEditingStopTime) .WithConversion(editedTimeLabelColorConverter); //Date picker bindingSet.Bind(DatePickerContainer) .For(v => v.BindAnimatedVisibility()) .To(vm => vm.IsEditingTime); bindingSet.Bind(DatePicker) .For(v => v.BindDateTimeOffset()) .To(vm => vm.EditedTime); bindingSet.Bind(DatePicker) .For(v => v.MaximumDate) .To(vm => vm.MaximumDateTime); bindingSet.Bind(DatePicker) .For(v => v.MinimumDate) .To(vm => vm.MinimumDateTime); bindingSet.Bind(DatePicker) .For(v => v.Locale) .To(vm => vm.TimeFormat) .WithConversion(timeFormatToLocaleConverter); //The wheel bindingSet.Bind(DurationInput) .For(v => v.UserInteractionEnabled) .To(vm => vm.IsEditingTime) .WithConversion(inverseBoolConverter); bindingSet.Bind(DurationInput) .For(v => v.Duration) .To(vm => vm.Duration); bindingSet.Bind(DurationInput) .For(v => v.FormattedDuration) .ByCombining(durationCombiner, vm => vm.Duration, vm => vm.DurationFormat); bindingSet.Bind(WheelView) .For(v => v.UserInteractionEnabled) .To(vm => vm.IsEditingTime) .WithConversion(inverseBoolConverter); bindingSet.Bind(WheelView) .For(v => v.MaximumStartTime) .To(vm => vm.MaximumStartTime); bindingSet.Bind(WheelView) .For(v => v.MinimumStartTime) .To(vm => vm.MinimumStartTime); bindingSet.Bind(WheelView) .For(v => v.MaximumEndTime) .To(vm => vm.MaximumStopTime); bindingSet.Bind(WheelView) .For(v => v.MinimumEndTime) .To(vm => vm.MinimumStopTime); bindingSet.Bind(WheelView) .For(v => v.StartTime) .To(vm => vm.StartTime); bindingSet.Bind(WheelView) .For(v => v.EndTime) .To(vm => vm.StopTime); bindingSet.Bind(WheelView) .For(v => v.IsRunning) .To(vm => vm.IsRunning); bindingSet.Apply(); }
public override void ViewDidLoad() { base.ViewDidLoad(); prepareViews(); prepareOnboarding(); var source = new StartTimeEntryTableViewSource(SuggestionsTableView); SuggestionsTableView.Source = source; source.ToggleTasksCommand = new MvxCommand <ProjectSuggestion>(toggleTaskSuggestions); var parametricDurationConverter = new ParametricTimeSpanToDurationValueConverter(); var invertedVisibilityConverter = new MvxInvertedVisibilityValueConverter(); var invertedBoolConverter = new BoolToConstantValueConverter <bool>(false, true); var buttonColorConverter = new BoolToConstantValueConverter <UIColor>( Color.StartTimeEntry.ActiveButton.ToNativeColor(), Color.StartTimeEntry.InactiveButton.ToNativeColor() ); var bindingSet = this.CreateBindingSet <StartTimeEntryViewController, StartTimeEntryViewModel>(); //TableView bindingSet.Bind(source) .For(v => v.ObservableCollection) .To(vm => vm.Suggestions); bindingSet.Bind(source) .For(v => v.UseGrouping) .To(vm => vm.UseGrouping); bindingSet.Bind(source) .For(v => v.SelectSuggestionCommand) .To(vm => vm.SelectSuggestionCommand); bindingSet.Bind(source) .For(v => v.CreateCommand) .To(vm => vm.CreateCommand); bindingSet.Bind(source) .For(v => v.IsSuggestingProjects) .To(vm => vm.IsSuggestingProjects); bindingSet.Bind(source) .For(v => v.Text) .To(vm => vm.CurrentQuery); bindingSet.Bind(source) .For(v => v.SuggestCreation) .To(vm => vm.SuggestCreation); bindingSet.Bind(source) .For(v => v.ShouldShowNoTagsInfoMessage) .To(vm => vm.ShouldShowNoTagsInfoMessage); bindingSet.Bind(source) .For(v => v.ShouldShowNoProjectsInfoMessage) .To(vm => vm.ShouldShowNoProjectsInfoMessage); //Text bindingSet.Bind(TimeInput) .For(v => v.Duration) .To(vm => vm.DisplayedTime); bindingSet.Bind(DescriptionTextView) .For(v => v.BindTextFieldInfo()) .To(vm => vm.TextFieldInfo); bindingSet.Bind(TimeInput) .For(v => v.FormattedDuration) .To(vm => vm.DisplayedTime) .WithConversion(parametricDurationConverter, DurationFormat.Improved); bindingSet.Bind(Placeholder) .To(vm => vm.PlaceholderText); bindingSet.Bind(DescriptionRemainingLengthLabel) .To(vm => vm.DescriptionRemainingBytes); //Buttons bindingSet.Bind(TagsButton) .For(v => v.TintColor) .To(vm => vm.IsSuggestingTags) .WithConversion(buttonColorConverter); bindingSet.Bind(BillableButton) .For(v => v.TintColor) .To(vm => vm.IsBillable) .WithConversion(buttonColorConverter); bindingSet.Bind(ProjectsButton) .For(v => v.TintColor) .To(vm => vm.IsSuggestingProjects) .WithConversion(buttonColorConverter); bindingSet.Bind(DoneButton) .For(v => v.Enabled) .To(vm => vm.DescriptionLengthExceeded) .WithConversion(invertedBoolConverter); //Visibility bindingSet.Bind(BillableButtonWidthConstraint) .For(v => v.Constant) .To(vm => vm.IsBillableAvailable) .WithConversion(new BoolToConstantValueConverter <nfloat>(42, 0)); bindingSet.Bind(DescriptionRemainingLengthLabel) .For(v => v.BindVisible()) .To(vm => vm.DescriptionLengthExceeded) .WithConversion(invertedVisibilityConverter); //Commands bindingSet.Bind(DoneButton).To(vm => vm.DoneCommand); bindingSet.Bind(CloseButton).To(vm => vm.BackCommand); bindingSet.Bind(BillableButton).To(vm => vm.ToggleBillableCommand); bindingSet.Bind(StartDateButton).To(vm => vm.SetStartDateCommand); bindingSet.Bind(DateTimeButton).To(vm => vm.ChangeTimeCommand); bindingSet.Bind(TagsButton).To(vm => vm.ToggleTagSuggestionsCommand); bindingSet.Bind(ProjectsButton).To(vm => vm.ToggleProjectSuggestionsCommand); bindingSet.Apply(); }
public override void ViewDidLoad() { base.ViewDidLoad(); setupDismissingByTappingOnBackground(); prepareViews(); var durationCombiner = new DurationValueCombiner(); var dateCombiner = new DateTimeOffsetDateFormatValueCombiner(TimeZoneInfo.Local); var timeCombiner = new DateTimeOffsetTimeFormatValueCombiner(TimeZoneInfo.Local); var visibilityConverter = new MvxVisibilityValueConverter(); var invertedBoolConverter = new BoolToConstantValueConverter <bool>(false, true); var inverterVisibilityConverter = new MvxInvertedVisibilityValueConverter(); var projectTaskClientCombiner = new ProjectTaskClientValueCombiner( ProjectTaskClientLabel.Font.CapHeight, Color.EditTimeEntry.ClientText.ToNativeColor(), false ); var stopRunningTimeEntryAndEditDurationForStoppedConverter = new BoolToConstantValueConverter <IMvxCommand>( ViewModel.StopCommand, ViewModel.EditDurationCommand); var bindingSet = this.CreateBindingSet <EditTimeEntryViewController, EditTimeEntryViewModel>(); //Error message view bindingSet.Bind(ErrorMessageLabel) .For(v => v.Text) .To(vm => vm.SyncErrorMessage); bindingSet.Bind(ErrorView) .For(v => v.BindTap()) .To(vm => vm.DismissSyncErrorMessageCommand); bindingSet.Bind(ErrorView) .For(v => v.BindVisible()) .To(vm => vm.SyncErrorMessageVisible) .WithConversion(inverterVisibilityConverter); //Text bindingSet.Bind(DescriptionTextView) .For(v => v.RemainingLength) .To(vm => vm.DescriptionRemainingLength); bindingSet.Bind(DescriptionTextView) .For(v => v.BindText()) .To(vm => vm.Description); bindingSet.Bind(BillableSwitch) .For(v => v.BindAnimatedOn()) .To(vm => vm.Billable); bindingSet.Bind(DurationLabel) .ByCombining(durationCombiner, vm => vm.Duration, vm => vm.DurationFormat); bindingSet.Bind(ProjectTaskClientLabel) .For(v => v.AttributedText) .ByCombining(projectTaskClientCombiner, v => v.Project, v => v.Task, v => v.Client, v => v.ProjectColor); bindingSet.Bind(StartDateLabel) .ByCombining(dateCombiner, vm => vm.StartTime, vm => vm.DateFormat); bindingSet.Bind(StartTimeLabel) .ByCombining(timeCombiner, vm => vm.StartTime, vm => vm.TimeFormat); bindingSet.Bind(EndTimeLabel) .ByCombining(timeCombiner, vm => vm.StopTime, vm => vm.TimeFormat); //Commands bindingSet.Bind(CloseButton).To(vm => vm.CloseCommand); bindingSet.Bind(DeleteButton).To(vm => vm.DeleteCommand); bindingSet.Bind(ConfirmButton).To(vm => vm.ConfirmCommand); bindingSet.Bind(DurationView) .For(v => v.BindTap()) .To(vm => vm.EditDurationCommand); bindingSet.Bind(StartTimeView) .For(v => v.BindTap()) .To(vm => vm.EditDurationCommand); bindingSet.Bind(StopButton) .To(vm => vm.StopCommand); bindingSet.Bind(EndTimeView) .For(v => v.BindTap()) .To(vm => vm.IsTimeEntryRunning) .WithConversion(stopRunningTimeEntryAndEditDurationForStoppedConverter); bindingSet.Bind(ProjectTaskClientLabel) .For(v => v.BindTap()) .To(vm => vm.SelectProjectCommand); bindingSet.Bind(AddProjectAndTaskView) .For(v => v.BindTap()) .To(vm => vm.SelectProjectCommand); bindingSet.Bind(StartDateView) .For(v => v.BindTap()) .To(vm => vm.SelectStartDateCommand); bindingSet.Bind(TagsTextView) .For(v => v.BindTap()) .To(vm => vm.SelectTagsCommand); bindingSet.Bind(AddTagsView) .For(v => v.BindTap()) .To(vm => vm.SelectTagsCommand); bindingSet.Bind(BillableView) .For(v => v.BindTap()) .To(vm => vm.ToggleBillableCommand); //End time and the stop button visibility bindingSet.Bind(StopButton) .For(v => v.BindVisible()) .To(vm => vm.IsTimeEntryRunning) .WithConversion(inverterVisibilityConverter); bindingSet.Bind(EndTimeLabel) .For(v => v.BindVisible()) .To(vm => vm.IsTimeEntryRunning) .WithConversion(visibilityConverter); //Project visibility bindingSet.Bind(AddProjectAndTaskView) .For(v => v.BindVisible()) .To(vm => vm.Project) .WithConversion(visibilityConverter); bindingSet.Bind(ProjectTaskClientLabel) .For(v => v.BindVisible()) .To(vm => vm.Project) .WithConversion(inverterVisibilityConverter); //Tags visibility bindingSet.Bind(AddTagsView) .For(v => v.BindVisible()) .To(vm => vm.HasTags) .WithConversion(visibilityConverter); bindingSet.Bind(TagsTextView) .For(v => v.BindVisible()) .To(vm => vm.HasTags) .WithConversion(inverterVisibilityConverter); //Confirm button enabled bindingSet.Bind(ConfirmButton) .For(v => v.Enabled) .To(vm => vm.DescriptionLimitExceeded) .WithConversion(invertedBoolConverter); bindingSet.Bind(ConfirmButton) .For(v => v.Alpha) .To(vm => vm.DescriptionLimitExceeded) .WithConversion(new BoolToConstantValueConverter <nfloat>(0.5f, 1)); bindingSet.Bind(BillableView) .For(v => v.BindVisibility()) .To(vm => vm.IsBillableAvailable) .WithConversion(visibilityConverter); bindingSet.Apply(); }
public override void ViewDidLoad() { base.ViewDidLoad(); prepareViews(); prepareOnboarding(); setupTableViewHeader(); var visibilityConverter = new MvxVisibilityValueConverter(); var projectTaskClientCombiner = new ProjectTaskClientValueCombiner( CurrentTimeEntryProjectTaskClientLabel.Font.CapHeight, Color.Main.CurrentTimeEntryClientColor.ToNativeColor(), true ); var startTimeEntryButtonManualModeIconConverter = new BoolToConstantValueConverter <UIImage>( UIImage.FromBundle("manualIcon"), UIImage.FromBundle("playIcon") ); var durationCombiner = new DurationValueCombiner(); var bindingSet = this.CreateBindingSet <MainViewController, MainViewModel>(); // Table view tableViewSource = new TimeEntriesLogViewSource(ViewModel.TimeEntries, TimeEntriesLogViewCell.Identifier); TimeEntriesLogTableView .Rx() .Bind(tableViewSource) .DisposedBy(disposeBag); this.Bind(tableViewSource.FirstCell, f => { onFirstTimeEntryChanged(f); firstTimeEntryCell = f; }); this.Bind(tableViewSource.ScrollOffset, onTableScroll); var continueTimeEntry = Observable.Merge( tableViewSource.ContinueTap, tableViewSource.SwipeToContinue ); this.Bind(continueTimeEntry, ViewModel.ContinueTimeEntry); this.Bind(tableViewSource.SwipeToDelete, ViewModel.TimeEntriesViewModel.DelayDeleteTimeEntry); this.Bind(tableViewSource.ItemSelected, ViewModel.SelectTimeEntry); this.Bind(ViewModel.TimeEntriesViewModel.ShouldShowUndo, toggleUndoDeletion); tableViewSource.SwipeToContinue .VoidSubscribe(() => { swipeRightStep.Dismiss(); }) .DisposedBy(disposeBag); tableViewSource.SwipeToDelete .VoidSubscribe(() => { swipeLeftStep.Dismiss(); }) .DisposedBy(disposeBag); // Refresh Control var refreshControl = new RefreshControl(ViewModel.SyncProgressState, tableViewSource); this.Bind(refreshControl.Refresh, ViewModel.RefreshAction); TimeEntriesLogTableView.CustomRefreshControl = refreshControl; //Commands bindingSet.Bind(settingsButton).To(vm => vm.OpenSettingsCommand); bindingSet.Bind(StopTimeEntryButton).To(vm => vm.StopTimeEntryCommand); bindingSet.Bind(StartTimeEntryButton).To(vm => vm.StartTimeEntryCommand); bindingSet.Bind(EditTimeEntryButton).To(vm => vm.EditTimeEntryCommand); bindingSet.Bind(syncFailuresButton).To(vm => vm.OpenSyncFailuresCommand); bindingSet.Bind(CurrentTimeEntryCard) .For(v => v.BindTap()) .To(vm => vm.EditTimeEntryCommand); bindingSet.Bind(suggestionsView) .For(v => v.SuggestionTappedCommad) .To(vm => vm.SuggestionsViewModel.StartTimeEntryCommand); bindingSet.Bind(StartTimeEntryButton) .For(v => v.BindLongPress()) .To(vm => vm.AlternativeStartTimeEntryCommand); //Visibility var shouldWelcomeBack = ViewModel.ShouldShowWelcomeBack; this.Bind(ViewModel.ShouldShowEmptyState, visible => emptyStateView.Hidden = !visible); this.Bind(shouldWelcomeBack, WelcomeBackView.Rx().IsVisible()); this.Bind(shouldWelcomeBack, spiderContainerView.Rx().IsVisible()); this.Bind(shouldWelcomeBack, visible => { if (visible) { spiderBroView.Show(); } else { spiderBroView.Hide(); } }); //Text bindingSet.Bind(CurrentTimeEntryDescriptionLabel).To(vm => vm.CurrentTimeEntryDescription); bindingSet.Bind(CurrentTimeEntryElapsedTimeLabel) .ByCombining(durationCombiner, vm => vm.CurrentTimeEntryElapsedTime, vm => vm.CurrentTimeEntryElapsedTimeFormat); bindingSet.Bind(CurrentTimeEntryProjectTaskClientLabel) .For(v => v.AttributedText) .ByCombining(projectTaskClientCombiner, v => v.CurrentTimeEntryProject, v => v.CurrentTimeEntryTask, v => v.CurrentTimeEntryClient, v => v.CurrentTimeEntryProjectColor); //The start button bindingSet.Bind(StartTimeEntryButton) .For(v => v.BindImage()) .To(vm => vm.IsInManualMode) .WithConversion(startTimeEntryButtonManualModeIconConverter); //The sync failures button bindingSet.Bind(syncFailuresButton) .For(v => v.BindVisibility()) .To(vm => vm.NumberOfSyncFailures) .WithConversion(visibilityConverter); bindingSet.Apply(); this.Bind(ViewModel.RatingViewModel.IsFeedbackSuccessViewShowing, SendFeedbackSuccessView.Rx().AnimatedIsVisible()); this.BindVoid(SendFeedbackSuccessView.Rx().Tap(), ViewModel.RatingViewModel.CloseFeedbackSuccessView); ViewModel.ShouldReloadTimeEntryLog .VoidSubscribe(reload) .DisposedBy(disposeBag); View.SetNeedsLayout(); View.LayoutIfNeeded(); NSNotificationCenter.DefaultCenter.AddObserver(UIApplication.DidBecomeActiveNotification, onApplicationDidBecomeActive); }
public override void ViewDidLoad() { base.ViewDidLoad(); prepareViews(); var invertedBoolConverter = new BoolToConstantValueConverter <bool>(false, true); var bindingSet = this.CreateBindingSet <LoginViewController, LoginViewModel>(); //Text bindingSet.Bind(EmailTextField) .To(vm => vm.Email) .WithConversion(new EmailToStringValueConverter()); bindingSet.Bind(PasswordTextField) .To(vm => vm.Password) .WithConversion(new PasswordToStringValueConverter()); bindingSet.Bind(InfoLabel).To(vm => vm.InfoText); bindingSet.Bind(PasswordTextField) .For(v => v.BindSecureTextEntry()) .To(vm => vm.IsPasswordMasked); bindingSet.Bind(GoogleSignInButton) .For(v => v.BindTitle()) .To(vm => vm.GoogleButtonText); bindingSet.Bind(this) .For(v => v.Title) .To(vm => vm.Title); //Commands bindingSet.Bind(GoogleSignInButton).To(vm => vm.GoogleLoginCommand); bindingSet.Bind(ForgotPasswordButton).To(vm => vm.ForgotPasswordCommand); bindingSet.Bind(PrivacyPolicyButton).To(vm => vm.OpenPrivacyPolicyCommand); bindingSet.Bind(TermsOfServiceButton).To(vm => vm.OpenTermsOfServiceCommand); bindingSet.Bind(backButton) .For(v => v.BindCommand()) .To(vm => vm.BackCommand); bindingSet.Bind(nextButton) .For(v => v.BindCommand()) .To(vm => vm.NextCommand); bindingSet.Bind(ShowPasswordButton) .For(v => v.BindTap()) .To(vm => vm.TogglePasswordVisibilityCommand); bindingSet.Bind(PasswordManagerButton) .For(v => v.BindTap()) .To(vm => vm.StartPasswordManagerCommand); bindingSet.Bind(TryLoggingInInsteadButton) .For(v => v.BindTap()) .To(vm => vm.ChangeSignUpToLoginCommand); //Enabled bindingSet.Bind(EmailTextField) .For(v => v.BindShouldReturn()) .To(vm => vm.NextCommand); bindingSet.Bind(PasswordTextField) .For(v => v.BindShouldReturn()) .To(vm => vm.NextCommand); bindingSet.Bind(nextButton) .For(v => v.Enabled) .To(vm => vm.NextIsEnabled); bindingSet.Bind(backButton) .For(v => v.Enabled) .To(vm => vm.IsLoading) .WithConversion(invertedBoolConverter); bindingSet.Bind(ForgotPasswordButton) .For(v => v.Enabled) .To(vm => vm.IsLoading) .WithConversion(invertedBoolConverter); //Visibility bindingSet.Bind(EmailTextField) .For(v => v.BindAnimatedVisibility()) .To(vm => vm.EmailFieldVisible); bindingSet.Bind(PasswordTextField) .For(v => v.BindAnimatedVisibility()) .To(vm => vm.IsPasswordPage); bindingSet.Bind(ShowPasswordButton) .For(v => v.BindAnimatedVisibility()) .To(vm => vm.ShowPasswordButtonVisible); bindingSet.Bind(InfoLabel) .For(v => v.BindAnimatedVisibility()) .To(vm => vm.HasInfoText); bindingSet.Bind(ActivityIndicator) .For(v => v.BindVisible()) .To(vm => vm.IsLoading); bindingSet.Bind(ForgotPasswordButton) .For(v => v.BindVisible()) .To(vm => vm.ShowForgotPassword); bindingSet.Bind(SignUpLabels) .For(v => v.BindVisible()) .To(vm => vm.IsSignUp); bindingSet.Bind(PasswordManagerButton) .For(v => v.BindAnimatedVisibility()) .To(vm => vm.PasswordManagerVisible); bindingSet.Bind(TryLoggingInInsteadButton) .For(v => v.BindAnimatedVisibility()) .To(vm => vm.TryLoggingInInsteadOfSignup); //State bindingSet.Bind(EmailTextField) .For(v => v.BindFocus()) .To(vm => vm.IsEmailFocused); bindingSet.Bind(PasswordTextField) .For(v => v.BindFocus()) .To(vm => vm.IsPasswordPage); bindingSet.Apply(); EmailTextField.BecomeFirstResponder(); willEnterForegroundNotification = UIApplication.Notifications.ObserveWillEnterForeground((sender, e) => startAnimations()); }
public override void AwakeFromNib() { base.AwakeFromNib(); var templateImage = TotalDurationGraph.Image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate); TotalDurationGraph.Image = templateImage; prepareViews(); var colorConverter = new BoolToConstantValueConverter <UIColor>( Color.Reports.Disabled.ToNativeColor(), Color.Reports.TotalTimeActivated.ToNativeColor() ); var durationCombiner = new DurationValueCombiner(); this.DelayBind(() => { var bindingSet = this.CreateBindingSet <ReportsHeaderView, ReportsViewModel>(); //Text bindingSet.Bind(BillablePercentageLabel) .For(v => v.AttributedText) .To(vm => vm.BillablePercentage) .WithConversion(new ReportPercentageLabelValueConverter()); bindingSet.Bind(TotalDurationLabel) .For(v => v.Text) .ByCombining(durationCombiner, vm => vm.TotalTime, vm => vm.DurationFormat); //Loading chart bindingSet.Bind(LoadingPieChartView) .For(v => v.BindVisibilityWithFade()) .To(vm => vm.IsLoading); bindingSet.Bind(LoadingCardView) .For(v => v.BindVisibilityWithFade()) .To(vm => vm.IsLoading); //Pretty stuff bindingSet.Bind(PieChartView) .For(v => v.Segments) .To(vm => vm.GroupedSegments); bindingSet.Bind(BillablePercentageView) .For(v => v.Percentage) .To(vm => vm.BillablePercentage); bindingSet.Bind(TotalDurationGraph) .For(v => v.TintColor) .To(vm => vm.TotalTimeIsZero) .WithConversion(colorConverter); bindingSet.Bind(TotalDurationLabel) .For(v => v.TextColor) .To(vm => vm.TotalTimeIsZero) .WithConversion(colorConverter); //Visibility bindingSet.Bind(EmptyStateView) .For(v => v.BindVisible()) .To(vm => vm.ShowEmptyState); bindingSet.Apply(); }); }
public override void ViewDidLoad() { base.ViewDidLoad(); TitleLabel.Text = Resources.Edit; BillableLabel.Text = Resources.Billable; StartDateDescriptionLabel.Text = Resources.Startdate; DurationDescriptionLabel.Text = Resources.Duration; StartDescriptionLabel.Text = Resources.Start; EndDescriptionLabel.Text = Resources.End; ErrorMessageTitleLabel.Text = Resources.Oops; AddProjectTaskLabel.Text = Resources.AddProjectTask; CategorizeWithProjectsLabel.Text = Resources.CategorizeYourTimeWithProjects; AddTagsLabel.Text = Resources.AddTags; DeleteButton.SetTitle(Resources.Delete, UIControlState.Normal); ConfirmButton.SetTitle(Resources.ConfirmChanges, UIControlState.Normal); prepareViews(); prepareOnboarding(); contentSizeChangedDisposable = ScrollViewContent.AddObserver(boundsKey, NSKeyValueObservingOptions.New, onContentSizeChanged); var durationCombiner = new DurationValueCombiner(); var dateCombiner = new DateTimeOffsetDateFormatValueCombiner(TimeZoneInfo.Local); var timeCombiner = new DateTimeOffsetTimeFormatValueCombiner(TimeZoneInfo.Local); var visibilityConverter = new MvxVisibilityValueConverter(); var invertedBoolConverter = new BoolToConstantValueConverter <bool>(false, true); var inverterVisibilityConverter = new MvxInvertedVisibilityValueConverter(); var projectTaskClientCombiner = new ProjectTaskClientValueCombiner( ProjectTaskClientLabel.Font.CapHeight, Color.EditTimeEntry.ClientText.ToNativeColor(), false ); var stopRunningTimeEntryAndSelectStopTimeForStoppedConverter = new BoolToConstantValueConverter <IMvxCommand>( ViewModel.StopCommand, ViewModel.SelectStopTimeCommand); var isInaccessibleTextColorConverter = new BoolToConstantValueConverter <UIColor>( Color.Common.Disabled.ToNativeColor(), Color.Common.TextColor.ToNativeColor() ); var showTagsCombiner = new ShowTagsValueCombiner(); var bindingSet = this.CreateBindingSet <EditTimeEntryViewController, EditTimeEntryViewModel>(); //Error message view bindingSet.Bind(ErrorMessageLabel) .For(v => v.Text) .To(vm => vm.SyncErrorMessage); bindingSet.Bind(ErrorView) .For(v => v.BindTap()) .To(vm => vm.DismissSyncErrorMessageCommand); bindingSet.Bind(ErrorView) .For(v => v.BindVisible()) .To(vm => vm.SyncErrorMessageVisible) .WithConversion(inverterVisibilityConverter); //Text bindingSet.Bind(RemainingCharacterCount) .To(vm => vm.DescriptionRemainingLength); bindingSet.Bind(RemainingCharacterCount) .For(v => v.BindVisible()) .To(vm => vm.DescriptionLimitExceeded); bindingSet.Bind(DescriptionTextView) .For(v => v.BindText()) .To(vm => vm.Description); bindingSet.Bind(DescriptionTextView) .For(v => v.BindDidBecomeFirstResponder()) .To(vm => vm.StartEditingDescriptionCommand); bindingSet.Bind(DurationLabel) .ByCombining(durationCombiner, vm => vm.Duration, vm => vm.DurationFormat); bindingSet.Bind(ProjectTaskClientLabel) .For(v => v.AttributedText) .ByCombining(projectTaskClientCombiner, v => v.Project, v => v.Task, v => v.Client, v => v.ProjectColor); bindingSet.Bind(StartDateLabel) .ByCombining(dateCombiner, vm => vm.StartTime, vm => vm.DateFormat); bindingSet.Bind(StartTimeLabel) .ByCombining(timeCombiner, vm => vm.StartTime, vm => vm.TimeFormat); bindingSet.Bind(EndTimeLabel) .ByCombining(timeCombiner, vm => vm.StopTime, vm => vm.TimeFormat); //Commands bindingSet.Bind(CloseButton).To(vm => vm.CloseCommand); bindingSet.Bind(DeleteButton).To(vm => vm.DeleteCommand); bindingSet.Bind(ConfirmButton).To(vm => vm.SaveCommand); bindingSet.Bind(DurationView) .For(v => v.BindTap()) .To(vm => vm.SelectDurationCommand); bindingSet.Bind(StartTimeView) .For(v => v.BindTap()) .To(vm => vm.SelectStartTimeCommand); bindingSet.Bind(StopButton) .To(vm => vm.StopCommand); bindingSet.Bind(EndTimeView) .For(v => v.BindTap()) .To(vm => vm.IsTimeEntryRunning) .WithConversion(stopRunningTimeEntryAndSelectStopTimeForStoppedConverter); bindingSet.Bind(ProjectTaskClientLabel) .For(v => v.BindTap()) .To(vm => vm.SelectProjectCommand); bindingSet.Bind(AddProjectAndTaskView) .For(v => v.BindTap()) .To(vm => vm.SelectProjectCommand); bindingSet.Bind(StartDateView) .For(v => v.BindTap()) .To(vm => vm.SelectStartDateCommand); bindingSet.Bind(TagsTextView) .For(v => v.BindTap()) .To(vm => vm.SelectTagsCommand); bindingSet.Bind(AddTagsView) .For(v => v.BindTap()) .To(vm => vm.SelectTagsCommand); bindingSet.Bind(BillableSwitch) .For(v => v.BindValueChanged()) .To(vm => vm.ToggleBillableCommand); //End time and the stop button visibility bindingSet.Bind(StopButton) .For(v => v.BindVisible()) .To(vm => vm.IsTimeEntryRunning) .WithConversion(inverterVisibilityConverter); bindingSet.Bind(EndTimeLabel) .For(v => v.BindVisible()) .To(vm => vm.IsTimeEntryRunning) .WithConversion(visibilityConverter); //Project visibility bindingSet.Bind(AddProjectAndTaskView) .For(v => v.BindVisible()) .To(vm => vm.Project) .WithConversion(visibilityConverter); bindingSet.Bind(ProjectTaskClientLabel) .For(v => v.BindVisible()) .To(vm => vm.Project) .WithConversion(inverterVisibilityConverter); //Tags visibility bindingSet.Bind(AddTagsView) .For(v => v.BindVisible()) .To(vm => vm.HasTags) .WithConversion(visibilityConverter); bindingSet.Bind(TagsTextView) .For(v => v.BindVisible()) .To(vm => vm.HasTags) .WithConversion(inverterVisibilityConverter); //Confirm button enabled bindingSet.Bind(ConfirmButton) .For(v => v.Enabled) .To(vm => vm.DescriptionLimitExceeded) .WithConversion(invertedBoolConverter); bindingSet.Bind(ConfirmButton) .For(v => v.Alpha) .To(vm => vm.DescriptionLimitExceeded) .WithConversion(new BoolToConstantValueConverter <nfloat>(0.5f, 1)); bindingSet.Bind(BillableView) .For(v => v.BindVisibility()) .To(vm => vm.IsBillableAvailable) .WithConversion(visibilityConverter); //Regarding inaccessible entries getLabelsToChangeColorWhenEditingInaccessibleEntry().ForEach(createTextColorBindingForInaccessibleEntries); bindingSet.Bind(DescriptionTextView) .For(v => v.TextColor) .To(vm => vm.IsInaccessible) .WithConversion(isInaccessibleTextColorConverter); bindingSet.Bind(DescriptionTextView) .For(v => v.UserInteractionEnabled) .To(vm => vm.IsInaccessible) .WithConversion(invertedBoolConverter); bindingSet.Bind(BillableSwitch) .For(v => v.Enabled) .To(vm => vm.IsInaccessible) .WithConversion(invertedBoolConverter); bindingSet.Bind(TagsContainerView) .For(v => v.Hidden) .ByCombining(showTagsCombiner, vm => vm.IsInaccessible, vm => vm.HasTags) .WithConversion(invertedBoolConverter); bindingSet.Bind(TagsSeparator) .For(v => v.Hidden) .ByCombining(showTagsCombiner, vm => vm.IsInaccessible, vm => vm.HasTags) .WithConversion(invertedBoolConverter); bindingSet.Apply(); void createTextColorBindingForInaccessibleEntries(UILabel label) { bindingSet.Bind(label) .For(v => v.TextColor) .To(vm => vm.IsInaccessible) .WithConversion(isInaccessibleTextColorConverter); } }
public override void ViewDidLoad() { base.ViewDidLoad(); var signupButtonTitleConverter = new BoolToConstantValueConverter <string>("", Resources.SignUpTitle); var invertedVisibilityConverter = new MvxInvertedVisibilityValueConverter(); var bindingSet = this.CreateBindingSet <SignupViewController, SignupViewModel>(); //Text bindingSet.Bind(ErrorLabel).To(vm => vm.ErrorText); bindingSet.Bind(EmailTextField) .To(vm => vm.Email) .WithConversion(new EmailToStringValueConverter()); bindingSet.Bind(PasswordTextField) .To(vm => vm.Password) .WithConversion(new PasswordToStringValueConverter()); bindingSet.Bind(SignupButton) .For(v => v.BindAnimatedTitle()) .To(vm => vm.IsLoading) .WithConversion(signupButtonTitleConverter); bindingSet.Bind(SelectCountryButton) .For(v => v.BindAnimatedTitle()) .To(vm => vm.CountryButtonTitle); //Commands bindingSet.Bind(SignupButton).To(vm => vm.SignupCommand); bindingSet.Bind(GoogleSignupButton).To(vm => vm.GoogleSignupCommand); bindingSet.Bind(ShowPasswordButton).To(vm => vm.TogglePasswordVisibilityCommand); bindingSet.Bind(SelectCountryButton).To(vm => vm.PickCountryCommand); bindingSet.Bind(LoginCard) .For(v => v.BindTap()) .To(vm => vm.LoginCommand); //Visibility bindingSet.Bind(ErrorLabel) .For(v => v.BindAnimatedVisibility()) .To(vm => vm.HasError); bindingSet.Bind(ActivityIndicator) .For(v => v.BindVisibilityWithFade()) .To(vm => vm.IsLoading); bindingSet.Bind(PasswordTextField) .For(v => v.BindSecureTextEntry()) .To(vm => vm.IsPasswordMasked); bindingSet.Bind(ShowPasswordButton) .For(v => v.BindVisible()) .To(vm => vm.IsShowPasswordButtonVisible); bindingSet.Bind(PasswordTextField) .For(v => v.BindFirstResponder()) .To(vm => vm.IsShowPasswordButtonVisible) .Mode(MvxBindingMode.OneWayToSource); bindingSet.Bind(CountryNotSelectedImageView) .For(v => v.BindAnimatedVisibility()) .To(vm => vm.IsCountryErrorVisible); bindingSet.Apply(); prepareViews(); }
public override void ViewDidLoad() { base.ViewDidLoad(); prepareViews(); source = new MainTableViewSource(TimeEntriesLogTableView); prepareOnboarding(); var suggestionsView = new SuggestionsView(); TimeEntriesLogTableView.TableHeaderView = suggestionsView; TimeEntriesLogTableView.Source = source; suggestionsView.DataContext = ViewModel.SuggestionsViewModel; source.Initialize(); var timeEntriesLogFooter = new UIView( new CGRect(0, 0, UIScreen.MainScreen.Bounds.Width, 64) ); var colorConverter = new MvxNativeColorValueConverter(); var visibilityConverter = new MvxVisibilityValueConverter(); var parametricTimeSpanConverter = new ParametricTimeSpanToDurationValueConverter(); var invertedVisibilityConverter = new MvxInvertedVisibilityValueConverter(); var timeEntriesLogFooterConverter = new BoolToConstantValueConverter <UIView>(new UIView(), timeEntriesLogFooter); var projectTaskClientCombiner = new ProjectTaskClientValueCombiner( CurrentTimeEntryProjectTaskClientLabel.Font.CapHeight, Color.Main.CurrentTimeEntryClientColor.ToNativeColor(), true ); var startTimeEntryButtonManualModeIconConverter = new BoolToConstantValueConverter <UIImage>( UIImage.FromBundle("manualIcon"), UIImage.FromBundle("playIcon") ); var bindingSet = this.CreateBindingSet <MainViewController, MainViewModel>(); //Table view bindingSet.Bind(source) .For(v => v.ObservableCollection) .To(vm => vm.TimeEntriesLogViewModel.TimeEntries); bindingSet.Bind(source) .For(v => v.SyncProgress) .To(vm => vm.SyncingProgress); bindingSet.Bind(TimeEntriesLogTableView) .For(v => v.TableFooterView) .To(vm => vm.TimeEntriesLogViewModel.IsEmpty) .WithConversion(timeEntriesLogFooterConverter); //Commands bindingSet.Bind(reportsButton).To(vm => vm.OpenReportsCommand); bindingSet.Bind(settingsButton).To(vm => vm.OpenSettingsCommand); bindingSet.Bind(StopTimeEntryButton).To(vm => vm.StopTimeEntryCommand); bindingSet.Bind(StartTimeEntryButton).To(vm => vm.StartTimeEntryCommand); bindingSet.Bind(EditTimeEntryButton).To(vm => vm.EditTimeEntryCommand); bindingSet.Bind(CurrentTimeEntryCard) .For(v => v.BindTap()) .To(vm => vm.EditTimeEntryCommand); bindingSet.Bind(source) .For(v => v.SelectionChangedCommand) .To(vm => vm.TimeEntriesLogViewModel.EditCommand); bindingSet.Bind(source) .For(v => v.ContinueTimeEntryCommand) .To(vm => vm.TimeEntriesLogViewModel.ContinueTimeEntryCommand); bindingSet.Bind(source) .For(v => v.RefreshCommand) .To(vm => vm.RefreshCommand); bindingSet.Bind(source) .For(v => v.DeleteTimeEntryCommand) .To(vm => vm.TimeEntriesLogViewModel.DeleteCommand); bindingSet.Bind(suggestionsView) .For(v => v.SuggestionTappedCommad) .To(vm => vm.SuggestionsViewModel.StartTimeEntryCommand); //Visibility bindingSet.Bind(WelcomeBackView) .For(v => v.BindVisibility()) .To(vm => vm.ShouldShowWelcomeBack) .WithConversion(visibilityConverter); bindingSet.Bind(spiderContainerView) .For(v => v.BindVisibility()) .To(vm => vm.ShouldShowWelcomeBack) .WithConversion(visibilityConverter); bindingSet.Bind(spiderBroView) .For(v => v.BindSpiderVisibility()) .To(vm => vm.ShouldShowWelcomeBack); bindingSet.Bind(emptyStateView) .For(v => v.BindVisibility()) .To(vm => vm.ShouldShowEmptyState) .WithConversion(visibilityConverter); //Text bindingSet.Bind(CurrentTimeEntryDescriptionLabel).To(vm => vm.CurrentTimeEntryDescription); bindingSet.Bind(CurrentTimeEntryElapsedTimeLabel) .To(vm => vm.CurrentTimeEntryElapsedTime) .WithConversion(parametricTimeSpanConverter, DurationFormat.Improved); bindingSet.Bind(CurrentTimeEntryProjectTaskClientLabel) .For(v => v.AttributedText) .ByCombining(projectTaskClientCombiner, v => v.CurrentTimeEntryProject, v => v.CurrentTimeEntryTask, v => v.CurrentTimeEntryClient, v => v.CurrentTimeEntryProjectColor); //The start button bindingSet.Bind(StartTimeEntryButton) .For(v => v.BindImage()) .To(vm => vm.IsInManualMode) .WithConversion(startTimeEntryButtonManualModeIconConverter); bindingSet.Apply(); View.SetNeedsLayout(); View.LayoutIfNeeded(); }
public override void ViewDidLoad() { base.ViewDidLoad(); prepareViews(); Title = ViewModel.Title; var inverseBoolConverter = new BoolToConstantValueConverter <bool>(false, true); var visibilityConverter = new MvxVisibilityValueConverter(); var durationFormatToStringConverter = new DurationFormatToStringValueConverter(); var bindingSet = this.CreateBindingSet <SettingsViewController, SettingsViewModel>(); // Text bindingSet.Bind(EmailLabel).To(vm => vm.Email); bindingSet.Bind(WorkspaceLabel).To(vm => vm.WorkspaceName); bindingSet.Bind(DateFormatLabel).To(vm => vm.DateFormat.Localized); bindingSet.Bind(DurationFormatLabel) .To(vm => vm.DurationFormat) .WithConversion(durationFormatToStringConverter); bindingSet.Bind(BeginningOfWeekLabel).To(vm => vm.BeginningOfWeek); bindingSet.Bind(VersionLabel).To(vm => vm.Version); // Commands bindingSet.Bind(LogoutButton).To(vm => vm.LogoutCommand); bindingSet.Bind(EmailView) .For(v => v.BindTap()) .To(vm => vm.EditProfileCommand); bindingSet.Bind(DateFormatView) .For(v => v.BindTap()) .To(vm => vm.SelectDateFormatCommand); bindingSet.Bind(DurationFormatView) .For(verticalSpacing => verticalSpacing.BindTap()) .To(vm => vm.SelectDurationFormatCommand); bindingSet.Bind(WorkspaceView) .For(v => v.BindTap()) .To(vm => vm.PickWorkspaceCommand); bindingSet.Bind(ManualModeView) .For(v => v.BindTap()) .To(vm => vm.ToggleManualModeCommand); bindingSet.Bind(TwentyFourHourClockView) .For(v => v.BindTap()) .To(vm => vm.ToggleUseTwentyFourHourClockCommand); bindingSet.Bind(TwentyFourHourClockSwitch) .For(v => v.BindValueChanged()) .To(vm => vm.ToggleUseTwentyFourHourClockCommand); bindingSet.Bind(BeginningOfWeekView) .For(v => v.BindTap()) .To(vm => vm.SelectBeginningOfWeekCommand); bindingSet.Bind(FeedbackView) .For(v => v.BindTap()) .To(vm => vm.SubmitFeedbackCommand); bindingSet.Bind(AboutView) .For(v => v.BindTap()) .To(vm => vm.AboutCommand); // Logout process bindingSet.Bind(LogoutButton) .For(btn => btn.Enabled) .To(vm => vm.IsLoggingOut) .WithConversion(inverseBoolConverter); bindingSet.Bind(NavigationItem) .For(nav => nav.BindHidesBackButton()) .To(vm => vm.IsLoggingOut); bindingSet.Bind(SyncingView) .For(view => view.BindVisibility()) .To(vm => vm.IsRunningSync) .WithConversion(visibilityConverter); bindingSet.Bind(SyncedView) .For(view => view.BindVisibility()) .To(vm => vm.IsSynced) .WithConversion(visibilityConverter); bindingSet.Bind(LoggingOutView) .For(view => view.BindVisibility()) .To(vm => vm.IsLoggingOut) .WithConversion(visibilityConverter); // Switches bindingSet.Bind(TwentyFourHourClockSwitch) .For(v => v.BindAnimatedOn()) .To(vm => vm.UseTwentyFourHourClock); bindingSet.Bind(ManualModeSwitch) .For(v => v.BindAnimatedOn()) .To(vm => vm.IsManualModeEnabled); bindingSet.Apply(); willEnterForegroundNotification = UIApplication.Notifications.ObserveWillEnterForeground((sender, e) => startAnimations()); }