public SuggestionView(ActivitiesSuggestion suggestion, bool isFirstSuggestion, Dictionary <ActivitySuggestion, bool> repeatingDeclinedSuggestion, LayoutStack layoutStack) { this.suggestion = suggestion; this.layoutStack = layoutStack; bool allWorseThanAverage = true; foreach (ActivitySuggestion child in suggestion.Children) { if (!child.WorseThanRootActivity) { allWorseThanAverage = false; } } GridLayout_Builder fullBuilder = new Vertical_GridLayout_Builder(); string startTimeText = suggestion.Children[0].StartDate.ToString("HH:mm"); bool badSuggestion = (allWorseThanAverage && suggestion.Skippable); if (badSuggestion) { fullBuilder.AddLayout(new TextblockLayout("Best ideas at " + startTimeText + ":", 24).AlignHorizontally(TextAlignment.Center)); } else { fullBuilder.AddLayout(new TextblockLayout("At " + startTimeText + ":", 24).AlignHorizontally(TextAlignment.Center)); } List <LayoutChoice_Set> specificFont_contentChoices = new List <LayoutChoice_Set>(); // list of layouts we might use, each with a different font size this.explainButtons = new Dictionary <Button, ActivitySuggestion>(); this.doButtons = new Dictionary <Button, ActivitySuggestion>(); for (int mainFontSize = 20; mainFontSize >= 12; mainFontSize -= 8) { // grid containing the specific activities the user could do GridLayout activityOptionsGrid = GridLayout.New(new BoundProperty_List(3), BoundProperty_List.Uniform(suggestion.Children.Count), LayoutScore.Zero); for (int i = 0; i < suggestion.Children.Count; i++) { ActivitySuggestion child = suggestion.Children[i]; // set up the options for the text string mainText = this.summarize(child, repeatingDeclinedSuggestion[child]); TextblockLayout mainBlock = new TextblockLayout(mainText, mainFontSize); TextAlignment horizontalAlignment; TextAlignment verticalAlignment; if (i == 0) { horizontalAlignment = TextAlignment.Start; if (suggestion.Children.Count == 1) { verticalAlignment = TextAlignment.Start; } else { verticalAlignment = TextAlignment.End; } } else { if (i == suggestion.Children.Count - 1) { horizontalAlignment = TextAlignment.End; verticalAlignment = TextAlignment.Start; } else { horizontalAlignment = TextAlignment.Center; verticalAlignment = TextAlignment.Center; } } mainBlock.AlignHorizontally(horizontalAlignment); mainBlock.AlignVertically(verticalAlignment); activityOptionsGrid.PutLayout(mainBlock, i, 0); // set up the buttons GridLayout_Builder buttonsBuilder = new Horizontal_GridLayout_Builder().Uniform(); double buttonFontSize = mainFontSize * 0.9; // make a doNow button if needed if (isFirstSuggestion) { Button doNowButton = new Button(); doNowButton.Clicked += DoNowButton_Clicked; this.doButtons[doNowButton] = child; ButtonLayout doButtonLayout = new ButtonLayout(doNowButton, "OK", buttonFontSize); buttonsBuilder.AddLayout(doButtonLayout); } if (child.PredictedScoreDividedByAverage != null) { Button explainButton = new Button(); explainButton.Clicked += explainButton_Clicked; this.explainButtons[explainButton] = child; ButtonLayout explainLayout = new ButtonLayout(explainButton, "?", buttonFontSize); buttonsBuilder.AddLayout(explainLayout); } activityOptionsGrid.PutLayout(buttonsBuilder.BuildAnyLayout(), i, 1); if (child.ExpectedReaction != null) { TextblockLayout reactionLayout = new TextblockLayout(child.ExpectedReaction, buttonFontSize * 0.9); reactionLayout.AlignHorizontally(horizontalAlignment); reactionLayout.AlignVertically(verticalAlignment); activityOptionsGrid.PutLayout(reactionLayout, i, 2); } } LayoutChoice_Set optionsAtThisFontSize; if (badSuggestion) { // If the suggestion is bad and we don't really want the user to do it, then we also show the user some convenient buttons for making more activities GridLayout wrapper = GridLayout.New(new BoundProperty_List(1), BoundProperty_List.WithRatios(new List <double>() { suggestion.Children.Count, 1 }), LayoutScore.Zero); wrapper.AddLayout(activityOptionsGrid); // activity suggestions wrapper.AddLayout(this.make_otherActivities_layout(mainFontSize)); // layout for making new activities optionsAtThisFontSize = wrapper; } else { // If the suggestion isn't bad, then the options we give are just the activities being suggested optionsAtThisFontSize = activityOptionsGrid; } specificFont_contentChoices.Add(optionsAtThisFontSize); } LayoutChoice_Set contentGrid = LayoutUnion.New(specificFont_contentChoices); // Add cancel buttons to the bottom this.cancelButton = new Button(); this.cancelButton.Clicked += cancelButton_Click; this.explainWhyYouCantSkipButton = new Button(); this.explainWhyYouCantSkipButton.Clicked += ExplainWhyYouCantSkipButton_Clicked; ButtonLayout cancelLayout; if (suggestion.Skippable) { cancelLayout = new ButtonLayout(this.cancelButton, "X"); } else { cancelLayout = new ButtonLayout(this.explainWhyYouCantSkipButton, "!"); } fullBuilder.AddLayout(contentGrid) .AddLayout(cancelLayout); this.SubLayout = fullBuilder.BuildAnyLayout(); }