Use better widget for multiline strings in particle GUI

Change-Id: I3ffc7736d96cd95c171b8f421ccd79d0055a983d
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212725
Auto-Submit: Brian Osman <brianosman@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/tools/viewer/ParticlesSlide.cpp b/tools/viewer/ParticlesSlide.cpp
index bf95783..33141ee 100644
--- a/tools/viewer/ParticlesSlide.cpp
+++ b/tools/viewer/ParticlesSlide.cpp
@@ -43,6 +43,16 @@
     return 0;
 }
 
+static int count_lines(const SkString& s) {
+    int lines = 1;
+    for (size_t i = 0; i < s.size(); ++i) {
+        if (s[i] == '\n') {
+            ++lines;
+        }
+    }
+    return lines;
+}
+
 class SkGuiVisitor : public SkFieldVisitor {
 public:
     SkGuiVisitor() {
@@ -62,9 +72,16 @@
     }
     void visit(const char* name, SkString& s) override {
         if (fTreeStack.back()) {
+            int lines = count_lines(s);
             ImGuiInputTextFlags flags = ImGuiInputTextFlags_CallbackResize;
-            ImGui::InputText(item(name), s.writable_str(), s.size() + 1, flags, InputTextCallback,
-                             &s);
+            if (lines > 1) {
+                ImVec2 boxSize(-1.0f, ImGui::GetTextLineHeight() * (lines + 1));
+                ImGui::InputTextMultiline(item(name), s.writable_str(), s.size() + 1, boxSize,
+                                          flags, InputTextCallback, &s);
+            } else {
+                ImGui::InputText(item(name), s.writable_str(), s.size() + 1, flags,
+                                 InputTextCallback, &s);
+            }
         }
     }
     void visit(const char* name, int& i, const EnumStringMapping* map, int count) override {