From d79e40023aee6ab85480cf6bd4657fab5a273e02 Mon Sep 17 00:00:00 2001
From: Tristan Walter <twalter@orn.mpg.de>
Date: Thu, 29 Oct 2020 15:50:19 +0100
Subject: [PATCH] * adding tooltips to opening dialog fields

---
 .../src/commons/common/gui/FileChooser.cpp    | 16 ++++++
 .../src/commons/common/gui/FileChooser.h      |  3 ++
 .../commons/common/gui/types/StaticText.cpp   |  9 ++++
 .../src/commons/common/gui/types/StaticText.h |  1 +
 .../src/commons/common/gui/types/Tooltip.cpp  |  4 ++
 .../src/commons/common/gui/types/Tooltip.h    |  4 +-
 Application/src/tracker/VideoOpener.cpp       | 51 +++++++++++++++++++
 Application/src/tracker/VideoOpener.h         |  6 +++
 8 files changed, 93 insertions(+), 1 deletion(-)

diff --git a/Application/src/commons/common/gui/FileChooser.cpp b/Application/src/commons/common/gui/FileChooser.cpp
index cf0fc52..6141514 100644
--- a/Application/src/commons/common/gui/FileChooser.cpp
+++ b/Application/src/commons/common/gui/FileChooser.cpp
@@ -33,6 +33,8 @@ FileChooser::FileChooser(const file::Path& start, const std::string& extension,
         if(_on_update)
             _on_update(*_graph);
         _graph->draw_log_messages();
+        if(_tooltip)
+            _graph->wrap_object(*_tooltip);
         
         if(!_selected_file.empty()) {
 
@@ -269,6 +271,20 @@ void FileChooser::update_names() {
     _list->set_items(_names);
 }
 
+void FileChooser::set_tooltip(Drawable* ptr, const std::string& docs) {
+    if(!ptr)
+        _tooltip = nullptr;
+    else {
+        if(!_tooltip) {
+            _tooltip = std::make_shared<Tooltip>(ptr, 400);
+            _tooltip->text().set_default_font(Font(0.5));
+        } else
+            _tooltip->set_other(ptr);
+        
+        _tooltip->set_text(docs);
+    }
+}
+
 FileChooser::FileItem::FileItem(const file::Path& path) : _path(path)
 {
     
diff --git a/Application/src/commons/common/gui/FileChooser.h b/Application/src/commons/common/gui/FileChooser.h
index 5cfe6d0..f2fb4bd 100644
--- a/Application/src/commons/common/gui/FileChooser.h
+++ b/Application/src/commons/common/gui/FileChooser.h
@@ -7,6 +7,7 @@
 #include <gui/types/Button.h>
 #include <gui/types/Textfield.h>
 #include <gui/types/Layout.h>
+#include <gui/types/Tooltip.h>
 
 namespace gui {
 
@@ -52,6 +53,7 @@ protected:
     derived_ptr<HorizontalLayout> _columns;
     derived_ptr<VerticalLayout> _overall;
     derived_ptr<HorizontalLayout> _tabs_bar;
+    derived_ptr<Tooltip> _tooltip;
     std::vector<Layout::Ptr> tabs_elements;
     IMGUIBase _base;
     std::vector<FileItem> _names;
@@ -88,6 +90,7 @@ public:
     void on_tab_change(std::function<void(std::string)>&& fn) { _on_tab_change = std::move(fn); }
     void set_validity_check(std::function<bool(file::Path)>&& fn) { _validity = std::move(fn); }
     void deselect();
+    void set_tooltip(Drawable*, const std::string&);
     
 private:
     void file_selected(size_t i, file::Path path);
diff --git a/Application/src/commons/common/gui/types/StaticText.cpp b/Application/src/commons/common/gui/types/StaticText.cpp
index b34146a..4a79c45 100644
--- a/Application/src/commons/common/gui/types/StaticText.cpp
+++ b/Application/src/commons/common/gui/types/StaticText.cpp
@@ -73,6 +73,15 @@ namespace gui {
         if(_origin != Vec2(0))
             structure_changed(true);
     }
+
+void StaticText::set_default_font(const Font& font) {
+    if(font == _default_font)
+        return;
+    
+    _default_font = font;
+    set_content_changed(true);
+    update_text();
+}
             
     void StaticText::set_max_size(const Size2 &size) {
         if(size != _max_size) {
diff --git a/Application/src/commons/common/gui/types/StaticText.h b/Application/src/commons/common/gui/types/StaticText.h
index ff84a0b..b3afabb 100644
--- a/Application/src/commons/common/gui/types/StaticText.h
+++ b/Application/src/commons/common/gui/types/StaticText.h
@@ -70,6 +70,7 @@ namespace gui {
         virtual const Size2& size() override;
         virtual const Bounds& bounds() override;
         void set_max_size(const Size2&);
+        void set_default_font(const Font&);
         
     private:
         void update_text();
diff --git a/Application/src/commons/common/gui/types/Tooltip.cpp b/Application/src/commons/common/gui/types/Tooltip.cpp
index 718b81e..62ad89e 100644
--- a/Application/src/commons/common/gui/types/Tooltip.cpp
+++ b/Application/src/commons/common/gui/types/Tooltip.cpp
@@ -36,6 +36,10 @@ namespace gui {
         _text.set_bounds_changed();
         
         auto global_offset = stage()->mouse_position() + Vec2(5, 0);
+        if(global_offset.y - _text.height() < 0)
+            set_origin(Vec2(0, 0));
+        else
+            set_origin(Vec2(0, 1));
         set_bounds(Bounds(global_offset, _text.size() + Vec2(5, 2) * 2));
     }
     
diff --git a/Application/src/commons/common/gui/types/Tooltip.h b/Application/src/commons/common/gui/types/Tooltip.h
index ff78679..4b03a4c 100644
--- a/Application/src/commons/common/gui/types/Tooltip.h
+++ b/Application/src/commons/common/gui/types/Tooltip.h
@@ -1,10 +1,12 @@
+#pragma once
+
 #include <gui/types/Entangled.h>
 #include <gui/types/StaticText.h>
 
 namespace gui {
     class Tooltip : public Entangled {
         GETTER_PTR(Drawable*, other)
-        StaticText _text;
+        GETTER_NCONST(StaticText, text)
         float _max_width;
         
     public:
diff --git a/Application/src/tracker/VideoOpener.cpp b/Application/src/tracker/VideoOpener.cpp
index 039103e..460bd3f 100644
--- a/Application/src/tracker/VideoOpener.cpp
+++ b/Application/src/tracker/VideoOpener.cpp
@@ -20,6 +20,8 @@ VideoOpener::LabeledCheckbox::LabeledCheckbox(const std::string& name)
       _checkbox(std::make_shared<gui::Checkbox>(Vec2(), name)),
       _ref(gui::temp_settings[name])
 {
+    _docs = gui::temp_docs[name];
+    
     _checkbox->set_checked(_ref.value<bool>());
     _checkbox->set_font(Font(0.6));
 
@@ -42,6 +44,8 @@ VideoOpener::LabeledTextField::LabeledTextField(const std::string& name)
 {
     _text_field->set_placeholder(name);
     _text_field->set_font(Font(0.6));
+    
+    _docs = gui::temp_docs[name];
 
     _text_field->set_text(_ref.get().valueString());
     _text_field->on_text_changed([this](){
@@ -61,6 +65,8 @@ VideoOpener::LabeledDropDown::LabeledDropDown(const std::string& name)
       _dropdown(std::make_shared<gui::Dropdown>(Bounds(0, 0, 300, 28))),
       _ref(gui::temp_settings[name])
 {
+    _docs = gui::temp_docs[name];
+    
     _dropdown->textfield()->set_font(Font(0.6));
     assert(_ref.get().is_enum());
     std::vector<Dropdown::TextItem> items;
@@ -99,7 +105,9 @@ VideoOpener::VideoOpener() {
     _horizontal->set_children({_infos, _extra});
     
     TEMP_SETTING(output_name) = file::Path("video");
+    gui::temp_docs["output_name"] = "Basename of the converted video in PV-format.";
     TEMP_SETTING(cmd_parameters) = std::string("-reset_average");
+    gui::temp_docs["cmd_parameters"] = "Additional command-line parameters for TGrabs.";
     
     _horizontal_raw = std::make_shared<gui::HorizontalLayout>();
     _horizontal_raw->set_clickable(true);
@@ -246,6 +254,49 @@ VideoOpener::VideoOpener() {
     });
     
     _file_chooser->on_update([this](auto&) mutable {
+        Drawable* found = nullptr;
+        std::string name;
+        std::unique_ptr<sprite::Reference> ref;
+        
+        if(_file_chooser->current_tab().extension == "pv") {
+            for(auto& [key, ptr] : pointers) {
+                if(ptr->hovered()) {
+                    found = ptr;
+                    name = key;
+                    ref = std::make_unique<sprite::Reference>(GlobalSettings::get(name));
+                }
+            }
+            
+        } else {
+            for(auto & [key, ptr] : _text_fields) {
+                ptr->_text->set_clickable(true);
+                
+                if(ptr->representative()->hovered()) {
+                    found = ptr->representative();
+                    name = key;
+                }
+            }
+            
+            if(found) {
+                ref = std::make_unique<sprite::Reference>(temp_settings[name]);
+            }
+        }
+        
+        if(found && ref) {
+            auto str = "<h3>"+name+"</h3>";
+            
+            str += "type: " +settings::htmlify(ref->get().type_name()) + "\n";
+            if(GlobalSettings::defaults().has(name)) {
+                auto ref = GlobalSettings::defaults().operator[](name);
+                str += "default: " +settings::htmlify(ref.get().valueString()) + "\n";
+            }
+            if(gui::temp_docs.find(name) != gui::temp_docs.end())
+                str += "\n" + settings::htmlify(gui::temp_docs[name]);
+            
+            _file_chooser->set_tooltip(found, str);
+        } else
+            _file_chooser->set_tooltip(nullptr, "");
+        
         std::lock_guard guard(_video_mutex);
         if(_buffer) {
             auto image = _buffer->next();
diff --git a/Application/src/tracker/VideoOpener.h b/Application/src/tracker/VideoOpener.h
index a1bc47d..b252573 100644
--- a/Application/src/tracker/VideoOpener.h
+++ b/Application/src/tracker/VideoOpener.h
@@ -7,6 +7,7 @@
 #include <file/Path.h>
 #include <video/VideoSource.h>
 #include <gui/types/Dropdown.h>
+#include <gui/types/Tooltip.h>
 
 namespace gui {
 
@@ -81,6 +82,7 @@ public:
     
     struct LabeledField {
         gui::derived_ptr<gui::Text> _text;
+        std::string _docs;
         //gui::derived_ptr<gui::HorizontalLayout> _joint;
         
         LabeledField(const std::string& name = "")
@@ -97,6 +99,7 @@ public:
             v.push_back(_text);
         }
         virtual void update() {}
+        virtual Drawable* representative() { return _text.get(); }
     };
     struct LabeledTextField : public LabeledField {
         gui::derived_ptr<gui::Textfield> _text_field;
@@ -107,6 +110,7 @@ public:
             v.push_back(_text_field);
         }
         void update() override;
+        Drawable* representative() override { return _text_field.get(); }
     };
     struct LabeledDropDown : public LabeledField {
         gui::derived_ptr<gui::Dropdown> _dropdown;
@@ -117,6 +121,7 @@ public:
             v.push_back(_dropdown);
         }
         void update() override;
+        Drawable* representative() override { return _dropdown.get(); }
     };
     struct LabeledCheckbox : public LabeledField {
         gui::derived_ptr<gui::Checkbox> _checkbox;
@@ -127,6 +132,7 @@ public:
             v.push_back(_checkbox);
         }
         void update() override;
+        Drawable* representative() override { return _checkbox.get(); }
     };
     std::map<std::string, std::unique_ptr<LabeledField>> _text_fields;
     
-- 
GitLab