public PostView(AnalyzedPost post) { this.post = post; Vertical_GridLayout_Builder mainBuilder = new Vertical_GridLayout_Builder(); Vertical_GridLayout_Builder titleBuilder = new Vertical_GridLayout_Builder(); // post title foreach (AnalyzedString component in post.TitleComponents) { Label label = new Label(); if (component.Score > 0) { label.TextColor = Color.Green; } else { if (component.Score < 0) { label.TextColor = Color.Red; } else { label.TextColor = Color.White; } } label.BackgroundColor = Color.Black; TextblockLayout textBlockLayout = new TextblockLayout(label, 16, false, true); textBlockLayout.setText(component.Text); titleBuilder.AddLayout(textBlockLayout); } this.starButton = new Button(); this.updateStarButton(); this.starButton.Clicked += SaveButton_Clicked; GridLayout topGrid = GridLayout.New(new BoundProperty_List(1), BoundProperty_List.WithRatios(new List <double>() { 5, 1 }), LayoutScore.Zero); topGrid.AddLayout(titleBuilder.BuildAnyLayout()); topGrid.AddLayout(new ButtonLayout(this.starButton)); mainBuilder.AddLayout(topGrid); this.linkLayout = new TextblockLayout(post.Interaction.Post.Source, 16, false, true); this.linkLayout.setBackgroundColor(Color.Black); this.updateLinkColor(); mainBuilder.AddLayout(this.linkLayout); Button openButton = new Button(); mainBuilder.AddLayout(new ButtonLayout(openButton, "Open", 16)); openButton.Clicked += OpenButton_Clicked; this.SubLayout = mainBuilder.BuildAnyLayout(); }
public ActivityNameEntryBox(string title, ActivityDatabase activityDatabase, LayoutStack layoutStack, bool createNewActivity = false, bool placeTitleAbove = true) { // some settings this.layoutStack = layoutStack; this.AutoAcceptAutocomplete = true; this.createNewActivity = createNewActivity; this.activityDatabase = activityDatabase; this.numAutocompleteRowsToShow = 1; // the box the user is typing in this.nameBox = new Editor(); this.nameBox.TextChanged += NameBox_TextChanged; this.nameBox_layout = new TextboxLayout(this.nameBox); // "X"/"?" button for clearing text or getting help // We use one button for both purposes so that the layout doesn't relayout (and shift focus) when this button switches from one to the other this.sideButton = new Button(); this.sideButton.Clicked += SideButton_Clicked; this.sideButtonLayout = new ButtonLayout(this.sideButton); // layouts controlling the alignment of the main text box and the side button this.sideLayout = new ContainerLayout(); this.sideLayout.SubLayout = this.sideButtonLayout; GridView gridView = new GridView(); GridLayout evenBox = GridLayout.New(new BoundProperty_List(1), BoundProperty_List.WithRatios(new List <double>() { 7, 1 }), LayoutScore.Zero, 1, gridView); GridLayout unevenBox = GridLayout.New(new BoundProperty_List(1), new BoundProperty_List(2), LayoutScore.Get_UnCentered_LayoutScore(1), 1, gridView); evenBox.AddLayout(this.nameBox_layout); evenBox.AddLayout(this.sideLayout); unevenBox.AddLayout(this.nameBox_layout); unevenBox.AddLayout(this.sideLayout); this.nameBoxWithSideLayout = new LayoutUnion(evenBox, unevenBox); // the autocomplete above the text box this.autocompleteLayout = new TextblockLayout(); this.autocompleteLayout.ScoreIfEmpty = false; // button that gives help with autocomplete this.helpWindow = new HelpWindowBuilder() .AddMessage("This screen explains how to enter " + title + " in the previous screen. " + "If you haven't already created the activity that you want to enter here, you will have to go back and create it first in the Activities screen.") .AddMessage("") .AddMessage("To input an activity name, you may type it in using the letters on the keyboard.") .AddMessage("While you do this, ActivityRecommender will try to guess which activity you mean, and " + "that autocomplete guess will appear above. If this autocomplete suggestion is what you want, then you can press " + "[enter] to use the autocomplete suggestion.") .AddMessage("Autocomplete does not require you to type full words but it does require spaces between words.") .AddMessage("Autocomplete does not require that you type letters using the correct case but it is more effective if you do.") .AddMessage("Consider the following example:") .AddMessage("If you have already entered an activity named \"Taking out the Garbage\", " + "here are some things you can type that might cause it to become the autocomplete suggestion:") .AddMessage("Taking out the") .AddMessage("Taking") .AddMessage("out") .AddMessage("Garbage") .AddMessage("garbage") .AddMessage("Taking o t G") .AddMessage("T o t G") .AddMessage("T") .AddMessage("G") .AddMessage("t") .AddMessage("") .AddMessage("Note, of course, that the longer and more unique your text, the more likely that it will be matched with the activity that you intend, rather than " + "with another activity, like for example, 'Talking on the Phone'") .AddLayout(new CreditsButtonBuilder(layoutStack) .AddContribution(ActRecContributor.ANNI_ZHANG, new DateTime(2020, 6, 7), "Pointed out that completed ToDos should have a very low autocomplete priority") .Build() ) .Build(); // help buttons that appear when the user types something invalid Button help_createNew_button = new Button(); help_createNew_button.Clicked += help_createNew_button_Clicked; this.autocomplete_longHelpLayout = new Horizontal_GridLayout_Builder().Uniform() .AddLayout(new ButtonLayout(help_createNew_button, "Create")) .AddLayout(new HelpButtonLayout(this.helpWindow, layoutStack)) .Build(); // the main layout that contains everything LayoutChoice_Set content; if (createNewActivity) { content = unevenBox; } else { GridLayout contentWithFeedback = GridLayout.New(new BoundProperty_List(2), new BoundProperty_List(1), LayoutScore.Get_UnCentered_LayoutScore(1)); contentWithFeedback.AddLayout(this.responseLayout); contentWithFeedback.AddLayout(this.nameBoxWithSideLayout); content = contentWithFeedback; this.UpdateFeedback(); } this.updateSideButton(); TextblockLayout titleLayout = new TextblockLayout(title); titleLayout.AlignHorizontally(TextAlignment.Center); if (placeTitleAbove) { this.SubLayout = new Vertical_GridLayout_Builder() .AddLayout(titleLayout) .AddLayout(content) .Build(); } else { GridLayout evenGrid = GridLayout.New(new BoundProperty_List(1), BoundProperty_List.Uniform(2), LayoutScore.Zero); GridLayout unevenGrid = GridLayout.New(new BoundProperty_List(1), new BoundProperty_List(2), LayoutScore.Get_UnCentered_LayoutScore(1)); evenGrid.AddLayout(titleLayout); unevenGrid.AddLayout(titleLayout); evenGrid.AddLayout(content); unevenGrid.AddLayout(content); this.SubLayout = new LayoutUnion(evenGrid, unevenGrid); } }
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(); }