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);
127template <
typename AX = AlignBase::Axis, AlignBase::Axis A = AlignBase::Axis::UNDEFINED_AXIS>
152 template <
typename AX2, AlignBase::Axis A2>
164 const AlignBase::Axis & get(
const AlignBase::Axis & defaultValue)
const {
165 if (axis != AlignBase::Axis::UNDEFINED_AXIS){
175 if (pos != AlignBase::Pos::UNDEFINED_POS){
186 axis = AlignBase::Axis::UNDEFINED_AXIS;
187 pos = AlignBase::Pos::UNDEFINED_POS;
191 template <
typename AX2, AlignBase::Axis A2>
193 bool operator==(
const Alignment<AX2,A2> & align)
const {
194 return (align.axis == axis) && (align.pos == pos);
203template <
typename AX, AlignBase::Axis V>
205std::ostream & operator<<(std::ostream &ostr,
const Alignment<AX,V> & align){
207 return ostr << align.axis <<
'_' << align.pos;
298 template <
typename OBJ,
typename A,
typename V>
300 void setAlign(
const OBJ & owner,
const A & axis,
const V &value){
317 if (pos != AlignBase::FILL){
320 modifyAlign(OBJECT, axis, (topol==INSIDE) ? pos : AlignBase::flip(pos));
333 template <
typename ...T,
typename AX, AlignBase::Axis A>
335 if (align.pos == AlignBase::FILL){
337 setAlign(AlignSVG::OBJECT, align.axis, align.pos);
340 setAlign(align.axis, align.pos, args...);
347 template <
typename AX1, AlignBase::Axis A1,
typename AX2, AlignBase::Axis A2>
349 setAlign(align1.axis, align1.pos, AlignSVG::Topol::INSIDE);
350 setAlign(align2.axis, align2.pos, AlignSVG::Topol::INSIDE);
354 template <
typename AX, AlignBase::Axis A>
364 template <
typename T>
365 void setAlign(
const std::string & align,
const T & topol){
375 void setAlign(
const std::string & align);
392 template <
typename P,
typename A>
404 template <
typename P,
typename A>
413 const std::string & getAlignStr()
const {
420 template <typename ...TT>
421 bool isAlignSet(const TT... args) const {
422 bitvect_t v = combineAlign(args...);
423 return (alignment & v) == v;
431 typedef int bitvect_t;
435 bitvect_t alignment = 0;
437 std::string alignStr;
440 template <
typename P,
typename A,
typename V>
441 void modifyAlign(
const P & owner,
const A & axis,
const V &value){
446 void updateAlignStr();
454 typedef std::vector<AlignBase::Pos> align_vect_t;
455 typedef std::vector<align_vect_t > align_conf_t;
457 align_conf_t alignments = align_conf_t(2, align_vect_t(2, AlignBase::Pos::UNDEFINED_POS));
466std::ostream & operator<<(std::ostream &ostr,
const AlignSVG & align){
468 align.confToStream(ostr);
475DRAIN_ENUM_DICT(AlignSVG::Owner);
476DRAIN_ENUM_OSTREAM(AlignSVG::Owner);
480DRAIN_ENUM_DICT(AlignSVG::Topol);
481DRAIN_ENUM_OSTREAM(AlignSVG::Topol);
485void AlignSVG::HorzAlign::reset(){
487 pos = AlignBase::Pos::UNDEFINED_POS;
492void AlignSVG::VertAlign::reset(){
494 pos = AlignBase::Pos::UNDEFINED_POS;
519template <
typename OBJ,
typename A>
523 return alignments[p][a];
526template <
typename OBJ,
typename A>
530 return alignments[p][a];
552template <
typename AX = AlignBase::Axis, AlignBase::Axis A = AlignBase::Axis::UNDEFINED_AXIS>
555 AlignSVG::Topol topol = AlignSVG::Topol::INSIDE;
558 template <
class ...TT>
568 return (this->axis != AlignBase::Axis::UNDEFINED_AXIS) &&
569 (this->pos != AlignBase::Pos::UNDEFINED_POS) &&
570 (topol != AlignSVG::Topol::UNDEFINED_TOPOL);
575 const AlignSVG::Topol & getOrDefault(
const AlignSVG::Topol & defaultValue)
const {
576 if (topol != AlignSVG::Topol::UNDEFINED_TOPOL){
588 Alignment<AX,A>::reset();
589 topol = AlignSVG::Topol::UNDEFINED_TOPOL;
594 template <
typename AX2, AlignBase::Axis A2,
class ...TT>
595 void set(
const Alignment<AX2,A2> & align,
const TT... args){
596 this->axis = align.axis;
597 this->pos = align.pos;
601 template <
class ...TT>
602 void set(AlignSVG::Topol topol,
const TT... args){
607 template <
class ...TT>
608 void set(AlignBase::Axis axis,
const TT... args){
613 template <
class ...TT>
619 template <
class ...TT>
620 void set(
const std::string & key,
const TT... args){
624 else if (EnumDict<Alignment<> >::setValue(key, *
this)){
641 template <
class ...TT>
642 void set(
const char *key,
const TT... args){
643 set(std::string(key), args...);
658template <
typename AX, AlignBase::Axis A>
659std::ostream & operator<<(std::ostream &ostr,
const CompleteAlignment<AX,A> & ad){
660 return ostr << ad.topol <<
'_' << ad.axis <<
':' << ad.pos;
674DRAIN_ENUM_OSTREAM(drain::image::AlignBase::Axis);
676DRAIN_ENUM_OSTREAM(drain::image::AlignSVG::Owner);
Two-way mapping between strings and objects of template class T.
Definition Dictionary.h:63
Definition StringBuilder.h:58
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
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:222
static const HorzAlign LEFT
Alias for {HORZ:MIN}.
Definition AlignSVG.h:232
static const VertAlign MIDDLE
Alias for {VERT:MID}.
Definition AlignSVG.h:259
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:365
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:300
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:316
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:173
bool isAligned() const
Returns true, if any setting is set...
Definition AlignSVG.cpp:264
static const HorzAlign RIGHT
Alias for {HORZ:MAX}.
Definition AlignSVG.h:240
static const HorzAlign HORZ_FILL
Alias for {HORZ:FILL}.
Definition AlignSVG.h:244
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:441
static const VertAlign VERT_FILL
Alias for {VERT:FILL}.
Definition AlignSVG.h:267
static const VertAlign BOTTOM
Alias for {VERT:MAX}.
Definition AlignSVG.h:263
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:334
static const HorzAlign CENTER
Alias for {HORZ:MID}.
Definition AlignSVG.h:236
static const VertAlign TOP
Alias for {VERT:MIN}.
Definition AlignSVG.h:255
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:128
Alignment(const Alignment &ac)
Copy constructor.
Definition AlignSVG.h:144
Alignment(AlignBase::Pos pos=AlignBase::Pos::UNDEFINED_POS)
Default constructor.
Definition AlignSVG.h:139
virtual ~Alignment()
Destructor.
Definition AlignSVG.h:160
"Alternative" partial alignment configuration for single object. Partial means that either OBJECT its...
Definition AlignSVG.h:553
CompleteAlignment(const TT... args)
Constructor not setting Axis.
Definition AlignSVG.h:559