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