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);
211template <
typename AX, AlignBase::Axis V>
213std::ostream & operator<<(std::ostream &ostr,
const Alignment<AX,V> & align){
215 return ostr << align.axis <<
'_' << align.pos;
306 template <
typename OBJ,
typename A,
typename V>
308 void setAlign(
const OBJ & owner,
const A & axis,
const V &value){
325 if (pos != AlignBase::FILL){
341 template <
typename ...T,
typename AX, AlignBase::Axis A>
343 if (align.pos == AlignBase::FILL){
345 setAlign(AlignSVG::OBJECT, align.axis, align.pos);
348 setAlign(align.axis, align.pos, args...);
355 template <
typename AX1, AlignBase::Axis A1,
typename AX2, AlignBase::Axis A2>
357 setAlign(align1.axis, align1.pos, AlignSVG::Topol::INSIDE);
358 setAlign(align2.axis, align2.pos, AlignSVG::Topol::INSIDE);
362 template <
typename AX, AlignBase::Axis A>
372 template <
typename T>
373 void setAlign(
const std::string & align,
const T & topol){
383 void setAlign(
const std::string & align);
400 template <
typename P,
typename A>
412 template <
typename P,
typename A>
421 const std::string & getAlignStr()
const {
428 template <typename ...TT>
429 bool isAlignSet(const TT... args) const {
430 bitvect_t v = combineAlign(args...);
431 return (alignment & v) == v;
439 typedef int bitvect_t;
443 bitvect_t alignment = 0;
445 std::string alignStr;
448 template <
typename P,
typename A,
typename V>
449 void modifyAlign(
const P & owner,
const A & axis,
const V &value){
454 void updateAlignStr();
462 typedef std::vector<AlignBase::Pos> align_vect_t;
463 typedef std::vector<align_vect_t > align_conf_t;
465 align_conf_t alignments = align_conf_t(2, align_vect_t(2, AlignBase::Pos::UNDEFINED_POS));
474std::ostream & operator<<(std::ostream &ostr,
const AlignSVG & align){
476 align.confToStream(ostr);
483DRAIN_ENUM_DICT(AlignSVG::Owner);
484DRAIN_ENUM_OSTREAM(AlignSVG::Owner);
488DRAIN_ENUM_DICT(AlignSVG::Topol);
489DRAIN_ENUM_OSTREAM(AlignSVG::Topol);
493void AlignSVG::HorzAlign::reset(){
495 pos = AlignBase::Pos::UNDEFINED_POS;
500void AlignSVG::VertAlign::reset(){
502 pos = AlignBase::Pos::UNDEFINED_POS;
516const drain::Enum<AlignSVG::VertAlign>::dict_t drain::Enum<AlignSVG::VertAlign>::dict;
521const drain::Enum<Alignment<> >::dict_t drain::Enum<Alignment<> >::dict;
524DRAIN_ENUM_DICT(AlignSVG::HorzAlign);
525DRAIN_ENUM_DICT(AlignSVG::VertAlign);
526DRAIN_ENUM_DICT(Alignment<>);
530template <
typename OBJ,
typename A>
534 return alignments[p][a];
537template <
typename OBJ,
typename A>
541 return alignments[p][a];
563template <
typename AX = AlignBase::Axis, AlignBase::Axis A = AlignBase::Axis::UNDEFINED_AXIS>
566 AlignSVG::Topol topol = AlignSVG::Topol::INSIDE;
569 template <
class ...TT>
579 return (this->axis != AlignBase::Axis::UNDEFINED_AXIS) &&
580 (this->pos != AlignBase::Pos::UNDEFINED_POS) &&
581 (topol != AlignSVG::Topol::UNDEFINED_TOPOL);
586 const AlignSVG::Topol & getOrDefault(
const AlignSVG::Topol & defaultValue)
const {
587 if (topol != AlignSVG::Topol::UNDEFINED_TOPOL){
599 Alignment<AX,A>::reset();
600 topol = AlignSVG::Topol::UNDEFINED_TOPOL;
605 template <
typename AX2, AlignBase::Axis A2,
class ...TT>
606 void set(
const Alignment<AX2,A2> & align,
const TT... args){
607 this->axis = align.axis;
608 this->pos = align.pos;
612 template <
class ...TT>
613 void set(AlignSVG::Topol topol,
const TT... args){
618 template <
class ...TT>
619 void set(AlignBase::Axis axis,
const TT... args){
624 template <
class ...TT>
630 template <
class ...TT>
631 void set(
const std::string & key,
const TT... args){
635 else if (Enum<Alignment<> >::setValue(key, *
this)){
652 template <
class ...TT>
653 void set(
const char *key,
const TT... args){
654 set(std::string(key), args...);
669template <
typename AX, AlignBase::Axis A>
670std::ostream & operator<<(std::ostream &ostr,
const CompleteAlignment<AX,A> & ad){
671 return ostr << ad.topol <<
'_' << ad.axis <<
':' << ad.pos;
685DRAIN_ENUM_OSTREAM(drain::image::AlignBase::Axis);
687DRAIN_ENUM_OSTREAM(drain::image::AlignSVG::Owner);
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 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:230
static const HorzAlign LEFT
Alias for {HORZ:MIN}.
Definition AlignSVG.h:240
static const VertAlign MIDDLE
Alias for {VERT:MID}.
Definition AlignSVG.h:267
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:373
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:308
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:324
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:168
bool isAligned() const
Returns true, if any setting is set...
Definition AlignSVG.cpp:259
static const HorzAlign RIGHT
Alias for {HORZ:MAX}.
Definition AlignSVG.h:248
static const HorzAlign HORZ_FILL
Alias for {HORZ:FILL}.
Definition AlignSVG.h:252
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:449
static const VertAlign VERT_FILL
Alias for {VERT:FILL}.
Definition AlignSVG.h:275
static const VertAlign BOTTOM
Alias for {VERT:MAX}.
Definition AlignSVG.h:271
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:342
static const HorzAlign CENTER
Alias for {HORZ:MID}.
Definition AlignSVG.h:244
static const VertAlign TOP
Alias for {VERT:MIN}.
Definition AlignSVG.h:263
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: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:564
CompleteAlignment(const TT... args)
Constructor not setting Axis.
Definition AlignSVG.h:570