38 #ifndef DRAIN_ALIGN_SVG
39 #define DRAIN_ALIGN_SVG
45 #include "drain/util/EnumFlags.h"
78 return AlignBase::VERT;
82 return UNDEFINED_AXIS;
108 DRAIN_ENUM_OSTREAM(AlignBase::Axis);
125 template <
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>
170 const AlignBase::Axis & get(
const AlignBase::Axis & defaultValue)
const {
171 if (axis != AlignBase::Axis::UNDEFINED_AXIS){
181 if (pos != AlignBase::Pos::UNDEFINED_POS){
192 axis = AlignBase::Axis::UNDEFINED_AXIS;
193 pos = AlignBase::Pos::UNDEFINED_POS;
197 template <
typename AX2, AlignBase::Axis A2>
199 bool operator==(
const Alignment<AX2,A2> & align)
const {
200 return (align.axis == axis) && (align.pos == pos);
257 template <
typename AX, AlignBase::Axis V>
259 std::ostream & operator<<(std::ostream &ostr,
const Alignment<AX,V> & align){
261 return ostr << align.axis <<
'_' << align.pos;
352 template <
typename OBJ,
typename A,
typename V>
354 void setAlign(
const OBJ & owner,
const A & axis,
const V &value){
372 modifyAlign(OBJECT, axis, (topol==INSIDE) ? pos : AlignBase::flip(pos));
385 template <
typename ...T,
typename AX, AlignBase::Axis A>
387 if (align.pos == AlignBase::FILL){
389 setAlign(AlignSVG::OBJECT, align.axis, align.pos);
392 setAlign(align.axis, align.pos, args...);
399 template <
typename AX1, AlignBase::Axis A1,
typename AX2, AlignBase::Axis A2>
401 setAlign(align1.axis, align1.pos, AlignSVG::Topol::INSIDE);
402 setAlign(align2.axis, align2.pos, AlignSVG::Topol::INSIDE);
406 template <
typename AX, AlignBase::Axis A>
416 template <
typename T>
417 void setAlign(
const std::string & align,
const T & topol){
427 void setAlign(
const std::string & align);
442 template <
typename P,
typename A>
454 template <
typename P,
typename A>
475 typedef int bitvect_t;
479 bitvect_t alignment = 0;
482 template <
typename P,
typename A,
typename V>
483 void modifyAlign(
const P & owner,
const A & axis,
const V &value){
488 void updateAlign(){};
491 typedef std::vector<AlignBase::Pos> align_vect_t;
492 typedef std::vector<align_vect_t > align_conf_t;
494 align_conf_t alignments = align_conf_t(2, align_vect_t(2, AlignBase::Pos::UNDEFINED_POS));
503 std::ostream & operator<<(std::ostream &ostr,
const AlignSVG & align){
505 align.confToStream(ostr);
512 DRAIN_ENUM_OSTREAM(AlignSVG::Owner);
516 DRAIN_ENUM_OSTREAM(AlignSVG::Topol);
520 void AlignSVG::HorzAlign::reset(){
522 pos = AlignBase::Pos::UNDEFINED_POS;
527 void AlignSVG::VertAlign::reset(){
529 pos = AlignBase::Pos::UNDEFINED_POS;
532 DRAIN_TYPENAME(AlignSVG::HorzAlign);
534 DRAIN_TYPENAME(AlignSVG::VertAlign);
554 template <
typename OBJ,
typename A>
558 return alignments[p][a];
561 template <
typename OBJ,
typename A>
565 return alignments[p][a];
587 template <
typename AX = AlignBase::Axis, AlignBase::Axis A = AlignBase::Axis::UNDEFINED_AXIS>
590 AlignSVG::Topol topol = AlignSVG::Topol::INSIDE;
593 template <
class ...TT>
603 return (this->axis != AlignBase::Axis::UNDEFINED_AXIS) &&
604 (this->pos != AlignBase::Pos::UNDEFINED_POS) &&
605 (topol != AlignSVG::Topol::UNDEFINED_TOPOL);
610 const AlignSVG::Topol & get(
const AlignSVG::Topol & defaultValue)
const {
611 if (topol != AlignSVG::Topol::UNDEFINED_TOPOL){
623 Alignment<AX,A>::reset();
624 topol = AlignSVG::Topol::UNDEFINED_TOPOL;
629 template <
typename AX2, AlignBase::Axis A2,
class ...TT>
630 void set(
const Alignment<AX2,A2> & align,
const TT... args){
631 this->axis = align.axis;
632 this->pos = align.pos;
636 template <
class ...TT>
637 void set(AlignSVG::Topol topol,
const TT... args){
642 template <
class ...TT>
643 void set(AlignBase::Axis axis,
const TT... args){
648 template <
class ...TT>
654 template <
class ...TT>
655 void set(
const std::string & key,
const TT... args){
659 else if (EnumDict<Alignment<> >::setValue(key, *
this)){
676 template <
class ...TT>
677 void set(
const char *key,
const TT... args){
678 set(std::string(key), args...);
693 template <
typename AX, AlignBase::Axis A>
694 std::ostream & operator<<(std::ostream &ostr,
const CompleteAlignment<AX,A> & ad){
695 return ostr << ad.topol <<
'_' << ad.axis <<
':' << ad.pos;
713 UNDEFINED_DIRECTION=0,
731 LayoutSVG(AlignBase::Axis v=AlignBase::HORZ, Direction d=INCR) : orientation(v), direction(d) {
735 LayoutSVG(
const LayoutSVG & layout) : orientation(layout.orientation), direction(layout.direction){
738 template <
typename V>
740 void setOrientation(
const V &v){
744 template <
typename D>
746 void setDirection(
const D & d){
754 template <
typename D,
typename V>
756 void set(
const D & d,
const V &v){
777 DRAIN_ENUM_OSTREAM(LayoutSVG::Direction);
781 DRAIN_ENUM_OSTREAM(LayoutSVG::GroupType);
793 anchorVert = anchorHorz = getElem(pathElem);
799 void setAlignAnchorHorz(
const T & pathElem){
800 anchorHorz = getElem(pathElem);
806 void setAlignAnchorVert(
const T & pathElem){
807 anchorVert = getElem(pathElem);
813 const std::string & getAlignAnchorHorz()
const {
818 const std::string & getAlignAnchorVert()
const {
823 const std::string & getAlignStr()
const {
828 ~AlignAdapterSVG(){};
833 const std::string & getElem(
const std::string &s){
838 const char * getElem(
const char *s){
844 const std::string & getElem(
const T & type){
845 return EnumDict<T>::dict.getKey(type,
false);
850 void updateAlign()
override {
854 std::string alignStr;
856 std::string anchorHorz;
857 std::string anchorVert;
859 void updateAlignStr();
873 DRAIN_ENUM_OSTREAM(drain::image::AlignBase::Axis);
876 DRAIN_ENUM_OSTREAM(drain::image::AlignSVG::Owner);
878 DRAIN_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:190
virtual void set(const key_t &key)
Sets one or several flags.
Definition: FlagBase.h:423
Definition: StringBuilder.h:58
Higher level controller for setting alignments.
Definition: AlignSVG.h:703
void set(const D &d, const V &v)
Set direction and orientation.
Definition: AlignSVG.h:756
Definition: DataSelector.cpp:1277
Wrapper for unique (static) dictionary of enum values.
Definition: EnumFlags.h:66
static E getValue(const E &value, bool lenient=true)
Convenience for object.set(...) like commands.
Definition: EnumFlags.h:118
static bool setValue(const std::string &key, E &value)
Convenience function for leniently setting string values to separate enum lists.
Definition: EnumFlags.h:100
Adapter designed for NodeSVG.
Definition: AlignSVG.h:787
void setAlignAnchor(const T &pathElem)
Mark one of the elements of this object (SVG or G) as a decisive position.
Definition: AlignSVG.h:792
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:276
static const HorzAlign LEFT
Alias for {HORZ:MIN}.
Definition: AlignSVG.h:286
static const VertAlign MIDDLE
Alias for {VERT:MID}.
Definition: AlignSVG.h:313
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:417
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:354
const AlignBase::Pos & getAlign(const P &pos, const A &axis) const
Return alignment setting of an object along horizontal or vertical axis .
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:370
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:294
static const HorzAlign HORZ_FILL
Alias for {HORZ:FILL}.
Definition: AlignSVG.h:298
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:483
static const VertAlign VERT_FILL
Alias for {VERT:FILL}.
Definition: AlignSVG.h:321
static const VertAlign BOTTOM
Alias for {VERT:MAX}.
Definition: AlignSVG.h:317
AlignBase::Pos & getAlign(const P &pos, const A &axis)
Return alignment setting of an object along horizontal or vertical axis .
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:386
static const HorzAlign CENTER
Alias for {HORZ:MID}.
Definition: AlignSVG.h:290
static const VertAlign TOP
Alias for {VERT:MIN}.
Definition: AlignSVG.h:309
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:588
CompleteAlignment(const TT... args)
Constructor not setting Axis.
Definition: AlignSVG.h:594