38#ifndef DRAIN_ALIGN_SVG
39#define DRAIN_ALIGN_SVG
42#include "drain/util/EnumFlags.h"
79 return UNDEFINED_AXIS;
105DRAIN_ENUM_OSTREAM(AlignBase::Axis);
124template <
typename AX = AlignBase::Axis, AlignBase::Axis A = AlignBase::Axis::UNDEFINED_AXIS>
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){
314 if (pos != AlignBase::FILL){
317 modifyAlign(OBJECT, axis, (topol==INSIDE) ? pos : AlignBase::flip(pos));
330 template <
typename ...T,
typename AX, AlignBase::Axis A>
332 if (align.pos == AlignBase::FILL){
334 setAlign(AlignSVG::OBJECT, align.axis, align.pos);
337 setAlign(align.axis, align.pos, args...);
344 template <
typename AX1, AlignBase::Axis A1,
typename AX2, AlignBase::Axis A2>
346 setAlign(align1.axis, align1.pos, AlignSVG::Topol::INSIDE);
347 setAlign(align2.axis, align2.pos, AlignSVG::Topol::INSIDE);
351 template <
typename AX, AlignBase::Axis A>
361 template <
typename T>
362 void setAlign(
const std::string & align,
const T & topol){
372 void setAlign(
const std::string & align);
389 template <
typename P,
typename A>
401 template <
typename P,
typename A>
410 const std::string & getAlignStr()
const {
417 template <typename ...TT>
418 bool isAlignSet(const TT... args) const {
419 bitvect_t v = combineAlign(args...);
420 return (alignment & v) == v;
428 typedef int bitvect_t;
432 bitvect_t alignment = 0;
434 std::string alignStr;
437 template <
typename P,
typename A,
typename V>
438 void modifyAlign(
const P & owner,
const A & axis,
const V &value){
443 void updateAlignStr();
451 typedef std::vector<AlignBase::Pos> align_vect_t;
452 typedef std::vector<align_vect_t > align_conf_t;
454 align_conf_t alignments = align_conf_t(2, align_vect_t(2, AlignBase::Pos::UNDEFINED_POS));
463std::ostream & operator<<(std::ostream &ostr,
const AlignSVG & align){
465 align.confToStream(ostr);
472DRAIN_ENUM_DICT(AlignSVG::Owner);
473DRAIN_ENUM_OSTREAM(AlignSVG::Owner);
477DRAIN_ENUM_DICT(AlignSVG::Topol);
478DRAIN_ENUM_OSTREAM(AlignSVG::Topol);
482void AlignSVG::HorzAlign::reset(){
484 pos = AlignBase::Pos::UNDEFINED_POS;
489void AlignSVG::VertAlign::reset(){
491 pos = AlignBase::Pos::UNDEFINED_POS;
516template <
typename OBJ,
typename A>
520 return alignments[p][a];
523template <
typename OBJ,
typename A>
527 return alignments[p][a];
549template <
typename AX = AlignBase::Axis, AlignBase::Axis A = AlignBase::Axis::UNDEFINED_AXIS>
552 AlignSVG::Topol topol = AlignSVG::Topol::INSIDE;
555 template <
class ...TT>
565 return (this->axis != AlignBase::Axis::UNDEFINED_AXIS) &&
566 (this->pos != AlignBase::Pos::UNDEFINED_POS) &&
567 (topol != AlignSVG::Topol::UNDEFINED_TOPOL);
572 const AlignSVG::Topol & getOrDefault(
const AlignSVG::Topol & defaultValue)
const {
573 if (topol != AlignSVG::Topol::UNDEFINED_TOPOL){
585 Alignment<AX,A>::reset();
586 topol = AlignSVG::Topol::UNDEFINED_TOPOL;
591 template <
typename AX2, AlignBase::Axis A2,
class ...TT>
592 void set(
const Alignment<AX2,A2> & align,
const TT... args){
593 this->axis = align.axis;
594 this->pos = align.pos;
598 template <
class ...TT>
599 void set(AlignSVG::Topol topol,
const TT... args){
604 template <
class ...TT>
605 void set(AlignBase::Axis axis,
const TT... args){
610 template <
class ...TT>
616 template <
class ...TT>
617 void set(
const std::string & key,
const TT... args){
621 else if (EnumDict<Alignment<> >::setValue(key, *
this)){
638 template <
class ...TT>
639 void set(
const char *key,
const TT... args){
640 set(std::string(key), args...);
655template <
typename AX, AlignBase::Axis A>
656std::ostream & operator<<(std::ostream &ostr,
const CompleteAlignment<AX,A> & ad){
657 return ostr << ad.topol <<
'_' << ad.axis <<
':' << ad.pos;
671DRAIN_ENUM_OSTREAM(drain::image::AlignBase::Axis);
673DRAIN_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:50
Pos
Reference position at Axis (HORZ or VERT)
Definition AlignSVG.h:55
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:362
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: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: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:438
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:331
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:125
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:550
CompleteAlignment(const TT... args)
Constructor not setting Axis.
Definition AlignSVG.h:556