Added layout hints config option to class diagrams
This commit is contained in:
@@ -204,6 +204,8 @@ using clanguml::common::model::scope_t;
|
|||||||
using clanguml::config::class_diagram;
|
using clanguml::config::class_diagram;
|
||||||
using clanguml::config::config;
|
using clanguml::config::config;
|
||||||
using clanguml::config::filter;
|
using clanguml::config::filter;
|
||||||
|
using clanguml::config::hint_t;
|
||||||
|
using clanguml::config::layout_hint;
|
||||||
using clanguml::config::method_arguments;
|
using clanguml::config::method_arguments;
|
||||||
using clanguml::config::package_diagram;
|
using clanguml::config::package_diagram;
|
||||||
using clanguml::config::plantuml;
|
using clanguml::config::plantuml;
|
||||||
@@ -375,6 +377,7 @@ template <> struct convert<class_diagram> {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
get_option(node, rhs.classes);
|
get_option(node, rhs.classes);
|
||||||
|
get_option(node, rhs.layout);
|
||||||
get_option(node, rhs.include_relations_also_as_members);
|
get_option(node, rhs.include_relations_also_as_members);
|
||||||
get_option(node, rhs.generate_method_arguments);
|
get_option(node, rhs.generate_method_arguments);
|
||||||
|
|
||||||
@@ -410,6 +413,41 @@ template <> struct convert<package_diagram> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// layout_hint Yaml decoder
|
||||||
|
//
|
||||||
|
template <> struct convert<layout_hint> {
|
||||||
|
static bool decode(const Node &node, layout_hint &rhs)
|
||||||
|
{
|
||||||
|
assert(node.Type() == NodeType::Map);
|
||||||
|
|
||||||
|
if (node["up"]) {
|
||||||
|
rhs.hint = hint_t::up;
|
||||||
|
rhs.entity = node["up"].as<std::string>();
|
||||||
|
}
|
||||||
|
else if (node["down"]) {
|
||||||
|
rhs.hint = hint_t::down;
|
||||||
|
rhs.entity = node["down"].as<std::string>();
|
||||||
|
}
|
||||||
|
else if (node["left"]) {
|
||||||
|
rhs.hint = hint_t::left;
|
||||||
|
rhs.entity = node["left"].as<std::string>();
|
||||||
|
}
|
||||||
|
else if (node["right"]) {
|
||||||
|
rhs.hint = hint_t::right;
|
||||||
|
rhs.entity = node["right"].as<std::string>();
|
||||||
|
}
|
||||||
|
else if (node["hidden"]) {
|
||||||
|
rhs.hint = hint_t::hidden;
|
||||||
|
rhs.entity = node["hidden"].as<std::string>();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// config Yaml decoder
|
// config Yaml decoder
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -65,6 +65,15 @@ struct filter {
|
|||||||
std::vector<common::model::scope_t> scopes;
|
std::vector<common::model::scope_t> scopes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class hint_t { up, down, left, right, hidden };
|
||||||
|
|
||||||
|
struct layout_hint {
|
||||||
|
hint_t hint;
|
||||||
|
std::string entity;
|
||||||
|
};
|
||||||
|
|
||||||
|
using layout_hints = std::map<std::string, std::vector<layout_hint>>;
|
||||||
|
|
||||||
std::string to_string(const diagram_type t);
|
std::string to_string(const diagram_type t);
|
||||||
|
|
||||||
struct inheritable_diagram_options {
|
struct inheritable_diagram_options {
|
||||||
@@ -109,6 +118,7 @@ struct class_diagram : public diagram {
|
|||||||
diagram_type type() const override;
|
diagram_type type() const override;
|
||||||
|
|
||||||
option<std::vector<std::string>> classes{"classes"};
|
option<std::vector<std::string>> classes{"classes"};
|
||||||
|
option<layout_hints> layout{"layout"};
|
||||||
|
|
||||||
bool has_class(std::string clazz);
|
bool has_class(std::string clazz);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -78,3 +78,27 @@ TEST_CASE("Test config includes", "[unit-test]")
|
|||||||
CHECK(cus.generate_method_arguments() ==
|
CHECK(cus.generate_method_arguments() ==
|
||||||
clanguml::config::method_arguments::none);
|
clanguml::config::method_arguments::none);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Test config layout", "[unit-test]")
|
||||||
|
{
|
||||||
|
auto cfg = clanguml::config::load("./test_config_data/layout.yml");
|
||||||
|
|
||||||
|
CHECK(cfg.diagrams.size() == 1);
|
||||||
|
auto &def = static_cast<clanguml::config::class_diagram &>(
|
||||||
|
*cfg.diagrams["class_main"]);
|
||||||
|
CHECK(def.type() == clanguml::config::diagram_type::class_diagram);
|
||||||
|
|
||||||
|
CHECK(def.layout().at("ABCD").size() == 2);
|
||||||
|
CHECK(def.layout().at("ABCD")[0].hint == clanguml::config::hint_t::up);
|
||||||
|
CHECK(def.layout().at("ABCD")[0].entity == "ABCD_SUBCLASS");
|
||||||
|
CHECK(def.layout().at("ABCD")[1].hint == clanguml::config::hint_t::left);
|
||||||
|
CHECK(def.layout().at("ABCD")[1].entity == "ABCD_SIBLING");
|
||||||
|
|
||||||
|
CHECK(def.layout().at("ABCD_SIBLING").size() == 2);
|
||||||
|
CHECK(def.layout().at("ABCD_SIBLING")[0].hint ==
|
||||||
|
clanguml::config::hint_t::right);
|
||||||
|
CHECK(def.layout().at("ABCD_SIBLING")[0].entity == "ABCD_OTHER_SIBLING");
|
||||||
|
CHECK(def.layout().at("ABCD_SIBLING")[1].hint ==
|
||||||
|
clanguml::config::hint_t::down);
|
||||||
|
CHECK(def.layout().at("ABCD_SIBLING")[1].entity == "ABCD_SIBLING_SIBLING");
|
||||||
|
}
|
||||||
22
tests/test_config_data/layout.yml
Normal file
22
tests/test_config_data/layout.yml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
compilation_database_dir: debug
|
||||||
|
output_directory: output
|
||||||
|
diagrams:
|
||||||
|
class_main:
|
||||||
|
type: class
|
||||||
|
glob:
|
||||||
|
- src/**/*.cc
|
||||||
|
- src/**/*.h
|
||||||
|
using_namespace:
|
||||||
|
- clanguml
|
||||||
|
generate_method_arguments: full
|
||||||
|
layout:
|
||||||
|
ABCD:
|
||||||
|
- up: ABCD_SUBCLASS
|
||||||
|
- left: ABCD_SIBLING
|
||||||
|
ABCD_SIBLING:
|
||||||
|
- right: ABCD_OTHER_SIBLING
|
||||||
|
- down: ABCD_SIBLING_SIBLING
|
||||||
|
include:
|
||||||
|
namespaces:
|
||||||
|
- clanguml
|
||||||
|
- ABCD
|
||||||
Reference in New Issue
Block a user