38#ifndef DRAIN_ALIGN_SVG
39#define DRAIN_ALIGN_SVG
45#include "drain/util/EnumFlags.h"
82 return UNDEFINED_AXIS;
108DRAIN_ENUM_OSTREAM(AlignBase::Axis);
125template <
typename AX = AlignBase::Axis, AlignBase::Axis A = AlignBase::Axis::UNDEFINED_AXIS,
typename POS = AlignBase::Pos>
132 POS pos = AlignBase::Pos::UNDEFINED_POS;
149 template <
typename AX2, AlignBase::Axis A2>
161 const AlignBase::Axis & get(
const AlignBase::Axis & defaultValue)
const {
162 if (axis != AlignBase::Axis::UNDEFINED_AXIS){
172 if (pos != AlignBase::Pos::UNDEFINED_POS){
183 axis = AlignBase::Axis::UNDEFINED_AXIS;
184 pos = AlignBase::Pos::UNDEFINED_POS;
188 template <
typename AX2, AlignBase::Axis A2>
190 bool operator==(
const Alignment<AX2,A2> & align)
const {
191 return (align.axis == axis) && (align.pos == pos);
200template <
typename AX, AlignBase::Axis V>
202std::ostream & operator<<(std::ostream &ostr,
const Alignment<AX,V> & align){
204 return ostr << align.axis <<
'_' << align.pos;
295 template <
typename OBJ,
typename A,
typename V>
297 void setAlign(
const OBJ & owner,
const A & axis,
const V &value){
315 modifyAlign(OBJECT, axis, (topol==INSIDE) ? pos : AlignBase::flip(pos));
328 template <
typename ...T,
typename AX, AlignBase::Axis A>
330 if (align.pos == AlignBase::FILL){
332 setAlign(AlignSVG::OBJECT, align.axis, align.pos);
335 setAlign(align.axis, align.pos, args...);
342 template <
typename AX1, AlignBase::Axis A1,
typename AX2, AlignBase::Axis A2>
344 setAlign(align1.axis, align1.pos, AlignSVG::Topol::INSIDE);
345 setAlign(align2.axis, align2.pos, AlignSVG::Topol::INSIDE);
349 template <
typename AX, AlignBase::Axis A>
359 template <
typename T>
360 void setAlign(
const std::string & align,
const T & topol){
370 void setAlign(
const std::string & align);
385 template <
typename P,
typename A>
397 template <
typename P,
typename A>
407 template <typename ...TT>
408 bool isAlignSet(const TT... args) const {
409 bitvect_t v = combineAlign(args...);
410 return (alignment & v) == v;
418 typedef int bitvect_t;
422 bitvect_t alignment = 0;
425 template <
typename P,
typename A,
typename V>
426 void modifyAlign(
const P & owner,
const A & axis,
const V &value){
431 void updateAlign(){};
434 typedef std::vector<AlignBase::Pos> align_vect_t;
435 typedef std::vector<align_vect_t > align_conf_t;
437 align_conf_t alignments = align_conf_t(2, align_vect_t(2, AlignBase::Pos::UNDEFINED_POS));
446std::ostream & operator<<(std::ostream &ostr,
const AlignSVG & align){
448 align.confToStream(ostr);
455DRAIN_ENUM_OSTREAM(AlignSVG::Owner);
459DRAIN_ENUM_OSTREAM(AlignSVG::Topol);
463void AlignSVG::HorzAlign::reset(){
465 pos = AlignBase::Pos::UNDEFINED_POS;
470void AlignSVG::VertAlign::reset(){
472 pos = AlignBase::Pos::UNDEFINED_POS;
497template <
typename OBJ,
typename A>
501 return alignments[p][a];
504template <
typename OBJ,
typename A>
508 return alignments[p][a];
530template <
typename AX = AlignBase::Axis, AlignBase::Axis A = AlignBase::Axis::UNDEFINED_AXIS>
533 AlignSVG::Topol topol = AlignSVG::Topol::INSIDE;
536 template <
class ...TT>
546 return (this->axis != AlignBase::Axis::UNDEFINED_AXIS) &&
547 (this->pos != AlignBase::Pos::UNDEFINED_POS) &&
548 (topol != AlignSVG::Topol::UNDEFINED_TOPOL);
553 const AlignSVG::Topol & get(
const AlignSVG::Topol & defaultValue)
const {
554 if (topol != AlignSVG::Topol::UNDEFINED_TOPOL){
566 Alignment<AX,A>::reset();
567 topol = AlignSVG::Topol::UNDEFINED_TOPOL;
572 template <
typename AX2, AlignBase::Axis A2,
class ...TT>
573 void set(
const Alignment<AX2,A2> & align,
const TT... args){
574 this->axis = align.axis;
575 this->pos = align.pos;
579 template <
class ...TT>
580 void set(AlignSVG::Topol topol,
const TT... args){
585 template <
class ...TT>
586 void set(AlignBase::Axis axis,
const TT... args){
591 template <
class ...TT>
597 template <
class ...TT>
598 void set(
const std::string & key,
const TT... args){
602 else if (EnumDict<Alignment<> >::setValue(key, *
this)){
619 template <
class ...TT>
620 void set(
const char *key,
const TT... args){
621 set(std::string(key), args...);
636template <
typename AX, AlignBase::Axis A>
637std::ostream & operator<<(std::ostream &ostr,
const CompleteAlignment<AX,A> & ad){
638 return ostr << ad.topol <<
'_' << ad.axis <<
':' << ad.pos;
656 UNDEFINED_DIRECTION=0,
674 LayoutSVG(AlignBase::Axis v=AlignBase::HORZ, Direction d=INCR) : orientation(v), direction(d) {
678 LayoutSVG(
const LayoutSVG & layout) : orientation(layout.orientation), direction(layout.direction){
681 template <
typename V>
683 void setOrientation(
const V &v){
687 template <
typename D>
689 void setDirection(
const D & d){
697 template <
typename D,
typename V>
699 void set(
const D & d,
const V &v){
720DRAIN_ENUM_OSTREAM(LayoutSVG::Direction);
724DRAIN_ENUM_OSTREAM(LayoutSVG::GroupType);
736 anchorVert = anchorHorz = getElem(pathElem);
742 void setAlignAnchorHorz(
const T & pathElem){
743 anchorHorz = getElem(pathElem);
749 void setAlignAnchorVert(
const T & pathElem){
750 anchorVert = getElem(pathElem);
756 const std::string & getAlignAnchorHorz()
const {
761 const std::string & getAlignAnchorVert()
const {
766 const std::string & getAlignStr()
const {
771 ~AlignAdapterSVG(){};
776 const std::string & getElem(
const std::string &s){
781 const char * getElem(
const char *s){
787 const std::string & getElem(
const T & type){
788 return EnumDict<T>::dict.getKey(type,
false);
793 void updateAlign()
override {
797 std::string alignStr;
799 std::string anchorHorz;
800 std::string anchorVert;
802 void updateAlignStr();
816DRAIN_ENUM_OSTREAM(drain::image::AlignBase::Axis);
819DRAIN_ENUM_OSTREAM(drain::image::AlignSVG::Owner);
821DRAIN_ENUM_OSTREAM(drain::image::LayoutSVG::Direction);
Two-way mapping between strings and objects of template class T.
Definition Dictionary.h:63
Flagger accepting values of enum type E.
Definition EnumFlags.h:182
Definition StringBuilder.h:58
Higher level controller for setting alignments.
Definition AlignSVG.h:646
void set(const D &d, const V &v)
Set direction and orientation.
Definition AlignSVG.h:699
Definition DataSelector.cpp:1277
DRAIN_TYPENAME(void)
Add a specialization for each type of those you want to support.
A container for a static dictionary of enumeration values.
Definition EnumFlags.h:69
static E getValue(const E &value, bool lenient=true)
Convenience for object.set(...) like commands.
Definition EnumFlags.h:114
static bool setValue(const std::string &key, E &value)
Assign string values to an enumeration type.
Definition EnumFlags.h:96
Adapter designed for NodeSVG.
Definition AlignSVG.h:730
void setAlignAnchor(const T &pathElem)
Mark one of the elements of this object (SVG or G) as a decisive position.
Definition AlignSVG.h:735
Low level alignment instructions.
Definition AlignSVG.h:53
Pos
Reference position at Axis (HORZ or VERT)
Definition AlignSVG.h:58
User-friendly programming interface for alignment considering two elements.
Definition AlignSVG.h:219
static const HorzAlign LEFT
Alias for {HORZ:MIN}.
Definition AlignSVG.h:229
static const VertAlign MIDDLE
Alias for {VERT:MID}.
Definition AlignSVG.h:256
void setAlign(const std::string &align, const T &topol)
High-level, user friendlier interface for setting the alignments for both OBJECT itself and its ANCHO...
Definition AlignSVG.h:360
void setAlign(const OBJ &owner, const A &axis, const V &value)
Low-level, "atomic" setter of alignment for OBJECT itself or its ANCHOR object.
Definition AlignSVG.h:297
void setAlign(const AlignBase::Axis &axis, const AlignBase::Pos &pos, Topol topol=Topol::INSIDE)
Set a single alignment setting. "Intermediate-level": axis and pos are given separately.
Definition AlignSVG.h:313
const AlignBase::Pos & getAlign(const P &pos, const A &axis) const
Return alignment setting of an object along horizontal or vertical axis .
void confToStream(std::ostream &ostr) const
Definition AlignSVG.cpp:181
bool isAligned() const
Returns true, if any setting is set...
Definition AlignSVG.cpp:274
static const HorzAlign RIGHT
Alias for {HORZ:MAX}.
Definition AlignSVG.h:237
static const HorzAlign HORZ_FILL
Alias for {HORZ:FILL}.
Definition AlignSVG.h:241
void setAlign(const Alignment< AX, A > &align1, const Alignment< AX, A > &align2)
Compiler trap: unimplemented for two of same kind: either HorzAlign or VertAlign twice.
void modifyAlign(const P &owner, const A &axis, const V &value)
Change alignment configuration without updating the alignStr.
Definition AlignSVG.h:426
static const VertAlign VERT_FILL
Alias for {VERT:FILL}.
Definition AlignSVG.h:264
static const VertAlign BOTTOM
Alias for {VERT:MAX}.
Definition AlignSVG.h:260
void setAlign(const Alignment< AX, A > &align, const T... args)
NEW High-level, user friendlier interface for setting INSIDE the alignments for both OBJECT itself an...
Definition AlignSVG.h:329
static const HorzAlign CENTER
Alias for {HORZ:MID}.
Definition AlignSVG.h:233
static const VertAlign TOP
Alias for {VERT:MIN}.
Definition AlignSVG.h:252
AlignBase::Pos & getAlign(const P &pos, const A &axis)
Return alignment setting of an object along horizontal or vertical axis .
Container for Axis and Pos.
Definition AlignSVG.h:126
Alignment(const Alignment &ac)
Copy constructor.
Definition AlignSVG.h:141
Alignment(AlignBase::Pos pos=AlignBase::Pos::UNDEFINED_POS)
Default constructor.
Definition AlignSVG.h:136
virtual ~Alignment()
Destructor.
Definition AlignSVG.h:157
"Alternative" partial alignment configuration for single object. Partial means that either OBJECT its...
Definition AlignSVG.h:531
CompleteAlignment(const TT... args)
Constructor not setting Axis.
Definition AlignSVG.h:537