38#ifndef DRAIN_ALIGN_SVG
39#define DRAIN_ALIGN_SVG
41#include <drain/Enum.h>
90 return UNDEFINED_AXIS;
115DRAIN_ENUM_DICT(AlignBase::Axis);
116DRAIN_ENUM_OSTREAM(AlignBase::Axis);
135template <
typename AX = AlignBase::Axis, AlignBase::Axis A = AlignBase::Axis::UNDEFINED_AXIS>
160 template <
typename AX2, AlignBase::Axis A2>
172 const AlignBase::Axis & get(
const AlignBase::Axis & defaultValue)
const {
173 if (axis != AlignBase::Axis::UNDEFINED_AXIS){
183 if (pos != AlignBase::Pos::UNDEFINED_POS){
194 axis = AlignBase::Axis::UNDEFINED_AXIS;
195 pos = AlignBase::Pos::UNDEFINED_POS;
199 template <
typename AX2, AlignBase::Axis A2>
201 bool operator==(
const Alignment<AX2,A2> & align)
const {
202 return (align.axis == axis) && (align.pos == pos);
222template <
typename AX, AlignBase::Axis V>
224std::ostream & operator<<(std::ostream &ostr,
const Alignment<AX,V> & align){
226 return ostr << align.axis <<
'_' << align.pos;
255template <
typename AX = AlignBase::Axis, AlignBase::Axis A = AlignBase::Axis::UNDEFINED_AXIS>
258 MutualAlign::Topol topol = MutualAlign::Topol::INSIDE;
261 template <
class ...TT>
271 return (this->axis != AlignBase::Axis::UNDEFINED_AXIS) &&
272 (this->pos != AlignBase::Pos::UNDEFINED_POS) &&
273 (topol != MutualAlign::Topol::UNDEFINED_TOPOL);
278 const MutualAlign::Topol & getOrDefault(
const MutualAlign::Topol & defaultValue)
const {
279 if (topol != MutualAlign::Topol::UNDEFINED_TOPOL){
291 Alignment<AX,A>::reset();
292 topol = MutualAlign::Topol::UNDEFINED_TOPOL;
297 template <
typename AX2, AlignBase::Axis A2,
class ...TT>
298 void set(
const Alignment<AX2,A2> & align,
const TT... args){
299 this->axis = align.axis;
300 this->pos = align.pos;
304 template <
class ...TT>
305 void set(MutualAlign::Topol topol,
const TT... args){
310 template <
class ...TT>
311 void set(AlignBase::Axis axis,
const TT... args){
316 template <
class ...TT>
322 template <
class ...TT>
323 void set(
const std::string & key,
const TT... args){
327 else if (Enum<Alignment<> >::setValue(key, *
this)){
344 template <
class ...TT>
345 void set(
const char *key,
const TT... args){
346 set(std::string(key), args...);
440 template <
typename OBJ,
typename A,
typename V>
442 void setAlign(
const OBJ & owner,
const A & axis,
const V &value){
458 void setAlign(
const AlignBase::Axis & axis,
const AlignBase::Pos & pos, MutualAlign::Topol topol=MutualAlign::Topol::INSIDE){
459 if (pos != AlignBase::FILL){
475 template <
typename ...T,
typename AX, AlignBase::Axis A>
477 if (align.pos == AlignBase::FILL){
479 setAlign(AlignSVG::OBJECT, align.axis, align.pos);
482 setAlign(align.axis, align.pos, args...);
489 template <
typename AX1, AlignBase::Axis A1,
typename AX2, AlignBase::Axis A2>
491 setAlign(align1.axis, align1.pos, MutualAlign::Topol::INSIDE);
492 setAlign(align2.axis, align2.pos, MutualAlign::Topol::INSIDE);
498 template <
typename AX1, AlignBase::Axis A1>
500 setAlign(align1.axis, align1.pos, align1.topol);
506 template <
typename AX, AlignBase::Axis A>
516 template <
typename T>
517 void setAlign(
const std::string & align,
const T & topol){
532 void setAlign(
const std::string & align);
549 template <
typename P,
typename A>
561 template <
typename P,
typename A>
570 const std::string & getAlignStr()
const {
577 template <typename ...TT>
578 bool isAlignSet(const TT... args) const {
579 bitvect_t v = combineAlign(args...);
580 return (alignment & v) == v;
588 typedef int bitvect_t;
592 bitvect_t alignment = 0;
594 std::string alignStr;
597 template <
typename P,
typename A,
typename V>
598 void modifyAlign(
const P & owner,
const A & axis,
const V &value){
603 void updateAlignStr();
611 typedef std::vector<AlignBase::Pos> align_vect_t;
612 typedef std::vector<align_vect_t > align_conf_t;
614 align_conf_t alignments = align_conf_t(2, align_vect_t(2, AlignBase::Pos::UNDEFINED_POS));
623std::ostream & operator<<(std::ostream &ostr,
const AlignSVG & align){
625 align.confToStream(ostr);
632DRAIN_ENUM_DICT(AlignSVG::Owner);
633DRAIN_ENUM_OSTREAM(AlignSVG::Owner);
637DRAIN_ENUM_DICT(MutualAlign::Topol);
638DRAIN_ENUM_OSTREAM(MutualAlign::Topol);
642void AlignSVG::HorzAlign::reset(){
644 pos = AlignBase::Pos::UNDEFINED_POS;
649void AlignSVG::VertAlign::reset(){
651 pos = AlignBase::Pos::UNDEFINED_POS;
662const drain::Enum<AlignSVG::VertAlign>::dict_t drain::Enum<AlignSVG::VertAlign>::dict;
667const drain::Enum<Alignment<> >::dict_t drain::Enum<Alignment<> >::dict;
670DRAIN_ENUM_DICT(AlignSVG::HorzAlign);
671DRAIN_ENUM_DICT(AlignSVG::VertAlign);
672DRAIN_ENUM_DICT(Alignment<>);
676template <
typename OBJ,
typename A>
680 return alignments[p][a];
683template <
typename OBJ,
typename A>
687 return alignments[p][a];
694template <
typename AX, AlignBase::Axis A>
695std::ostream & operator<<(std::ostream &ostr,
const CompleteAlignment<AX,A> & ad){
696 return ostr << ad.topol <<
'_' << ad.axis <<
':' << ad.pos;
707DRAIN_TYPENAME(image::AlignSVG::HorzAlign);
708DRAIN_TYPENAME(image::AlignSVG::VertAlign);
713DRAIN_ENUM_OSTREAM(drain::image::AlignBase::Axis);
715DRAIN_ENUM_OSTREAM(drain::image::AlignSVG::Owner);
Definition StringBuilder.h:58
Definition DataSelector.cpp:1277
A container for a static dictionary of enumeration values.
Definition Enum.h:51
static E getValue(const E &value, bool lenient=true)
Convenience for object.set(...) like commands.
Definition Enum.h:96
static bool setValue(const std::string &key, E &value)
Assign string values to an enumeration type.
Definition Enum.h:78
Low level alignment instructions.
Definition AlignSVG.h:50
static Axis flip(Axis axis)
supporting simultaneous HORZ|VERT
Definition AlignSVG.h:83
Pos
Reference position at Axis (HORZ or VERT)
Definition AlignSVG.h:55
User-friendly programming interface for alignment considering two elements.
Definition AlignSVG.h:369
static const HorzAlign LEFT
Alias for {HORZ:MIN}.
Definition AlignSVG.h:379
const AlignBase::Pos & getAlignPos(const P &pos, const A &axis) const
Return alignment setting of an object along horizontal or vertical axis .
static const VertAlign MIDDLE
Alias for {VERT:MID}.
Definition AlignSVG.h:406
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:517
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:442
void setAlign(const AlignBase::Axis &axis, const AlignBase::Pos &pos, MutualAlign::Topol topol=MutualAlign::Topol::INSIDE)
Set a single alignment setting. "Intermediate-level": axis and pos are given separately.
Definition AlignSVG.h:458
void confToStream(std::ostream &ostr) const
Definition AlignSVG.cpp:168
bool isAligned() const
Returns true, if any setting is set...
Definition AlignSVG.cpp:255
static const HorzAlign RIGHT
Alias for {HORZ:MAX}.
Definition AlignSVG.h:387
static const HorzAlign HORZ_FILL
Alias for {HORZ:FILL}.
Definition AlignSVG.h:391
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:598
static const VertAlign VERT_FILL
Alias for {VERT:FILL}.
Definition AlignSVG.h:414
static const VertAlign BOTTOM
Alias for {VERT:MAX}.
Definition AlignSVG.h:410
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:476
static const HorzAlign CENTER
Alias for {HORZ:MID}.
Definition AlignSVG.h:383
AlignBase::Pos & getAlignPos(const P &pos, const A &axis)
Return alignment setting of an object along horizontal or vertical axis .
static const VertAlign TOP
Alias for {VERT:MIN}.
Definition AlignSVG.h:402
Container for Axis and Pos.
Definition AlignSVG.h:136
Alignment(const Alignment &ac)
Copy constructor.
Definition AlignSVG.h:152
Alignment(AlignBase::Pos pos=AlignBase::Pos::UNDEFINED_POS)
Default constructor.
Definition AlignSVG.h:147
virtual ~Alignment()
Destructor.
Definition AlignSVG.h:168
"Alternative" partial alignment configuration for single object. Partial means that either OBJECT its...
Definition AlignSVG.h:256
CompleteAlignment(const TT... args)
Constructor not setting Axis.
Definition AlignSVG.h:262
Definition AlignSVG.h:229