diff --git a/src/config/config.cc b/src/config/config.cc index c4402bec..5489529d 100644 --- a/src/config/config.cc +++ b/src/config/config.cc @@ -58,6 +58,22 @@ std::string to_string(const diagram_type t) } } +std::string to_string(const hint_t t) +{ + switch (t) { + case hint_t::up: + return "up"; + case hint_t::down: + return "down"; + case hint_t::left: + return "left"; + case hint_t::right: + return "right"; + default: + assert(false); + } +} + void plantuml::append(const plantuml &r) { before.insert(before.end(), r.before.begin(), r.before.end()); @@ -439,10 +455,6 @@ template <> struct convert { rhs.hint = hint_t::right; rhs.entity = node["right"].as(); } - else if (node["hidden"]) { - rhs.hint = hint_t::hidden; - rhs.entity = node["hidden"].as(); - } else return false; diff --git a/src/config/config.h b/src/config/config.h index 9a954c90..9ae7b614 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -65,7 +65,7 @@ struct filter { std::vector scopes; }; -enum class hint_t { up, down, left, right, hidden }; +enum class hint_t { up, down, left, right }; struct layout_hint { hint_t hint; @@ -75,6 +75,7 @@ struct layout_hint { using layout_hints = std::map>; std::string to_string(const diagram_type t); +std::string to_string(const hint_t t); struct inheritable_diagram_options { option> glob{"glob"}; diff --git a/src/package_diagram/generators/plantuml/package_diagram_generator.cc b/src/package_diagram/generators/plantuml/package_diagram_generator.cc index 940a838d..a14c917b 100644 --- a/src/package_diagram/generators/plantuml/package_diagram_generator.cc +++ b/src/package_diagram/generators/plantuml/package_diagram_generator.cc @@ -109,6 +109,31 @@ void generator::generate_relationships( } } +void generator::generate_config_layout_hints(std::ostream &ostr) const +{ + const auto &uns = m_config.using_namespace(); + + // Generate layout hints + for (const auto &[entity, hints] : m_config.layout()) { + for (const auto &hint : hints) { + std::stringstream hint_str; + try { + hint_str << m_model.to_alias(ns_relative(uns, entity)) + << " -[hidden]" + << clanguml::config::to_string(hint.hint) << "- " + << m_model.to_alias(ns_relative(uns, hint.entity)) + << '\n'; + ostr << hint_str.str(); + } + catch (error::uml_alias_missing &e) { + LOG_ERROR("=== Skipping layout hint from {} to {} due " + "to: {}", + entity, hint.entity, e.what()); + } + } + } +} + void generator::generate(const package &p, std::ostream &ostr) const { const auto &uns = m_config.using_namespace(); @@ -175,6 +200,8 @@ void generator::generate(std::ostream &ostr) const ostr << '\n'; } + generate_config_layout_hints(ostr); + // Process aliases in any of the puml directives for (const auto &b : m_config.puml().after) { std::string note{b}; diff --git a/src/package_diagram/generators/plantuml/package_diagram_generator.h b/src/package_diagram/generators/plantuml/package_diagram_generator.h index ed5b8fcf..5fe96ed9 100644 --- a/src/package_diagram/generators/plantuml/package_diagram_generator.h +++ b/src/package_diagram/generators/plantuml/package_diagram_generator.h @@ -60,6 +60,8 @@ public: void generate_relationships(const package &p, std::ostream &ostr) const; + void generate_config_layout_hints(std::ostream &ostr) const; + void generate(const package &e, std::ostream &ostr) const; void generate(std::ostream &ostr) const;