private void PopulateRichTextAreas(Problem problemToDisplay) { Question question = problemToDisplay.GetQuestion(); int textAreaCount = question.GetQuestionPartCount(); float ySpacePerArea = 1f / (float)(textAreaCount - question.GetMultipleChoiceLetterCount()); float xSpacePerImage = (float)1 / Mathf.Clamp((float)question.GetMaximumQuestionPartRepeated(), 1, imagesPerRow); float ySpacePerImage = (float)1 / Mathf.Ceil((float)question.GetMaximumQuestionPartRepeated() / (float)imagesPerRow); int row = 0; bool previousAreaWasMultipleChoice = false; if (textAreaCount == 0) { Senseix.Logger.BasicLog("I got a problem with no question atoms."); return; //throw new UnityException ("I got a problem with no question atoms."); } richTextAreas = new GameObject[textAreaCount]; for (int i = 0; i < textAreaCount; i++) { GameObject newArea = Instantiate(questionTextPrefab) as GameObject; ProblemPart problemPart = problemToDisplay.GetQuestion().GetQuestionPart(i); if (newArea.GetComponent <RectTransform>() == null || newArea.GetComponent <Text>() == null) { throw new UnityException("richTextArea must have a rect transform and Text"); } if (problemPart.HasString()) { newArea.GetComponent <Text>().text += problemPart.GetString(); } float indentedX = 0f; if (previousAreaWasMultipleChoice) { indentedX = indentMultipleChoices; } newArea.GetComponent <RectTransform>().SetParent(questionParent); PositionRectTransform(newArea.GetComponent <RectTransform>(), indentedX, 1 - (row + 1) * ySpacePerArea, 1, 1 - row * ySpacePerArea); if (problemPart.HasSprite()) { //squish this a little bit to provide space between image groups newArea.GetComponent <RectTransform>().anchorMin += new Vector2(0f, spaceImageAreas); newArea.GetComponent <RectTransform>().anchorMax -= new Vector2(0f, spaceImageAreas); for (int j = 0; j < problemPart.TimesRepeated(); j++) { GameObject newImage = Instantiate(questionImagePrefab) as GameObject; newImage.GetComponent <RectTransform>().SetParent(newArea.transform); int imageColumn = j % imagesPerRow; int imageRow = Mathf.FloorToInt((float)j / (float)imagesPerRow); PositionRectTransform(newImage.GetComponent <RectTransform>(), (imageColumn * xSpacePerImage), 1 - (imageRow + 1) * ySpacePerImage, ((imageColumn + 1) * xSpacePerImage), 1 - imageRow * ySpacePerImage); newImage.GetComponent <Image>().sprite = problemPart.GetSprite(); } } richTextAreas[i] = newArea; if (!problemPart.IsMultipleChoiceLetter()) { row++; previousAreaWasMultipleChoice = false; } else { previousAreaWasMultipleChoice = true; } } }