Fixed issue #1441 (RDB support for text attributes like size, font, halign/valign)

This commit is contained in:
Matthias Koefferlein 2023-08-01 22:48:28 +02:00
parent ae3c8c27f6
commit 76a1450f32
3 changed files with 178 additions and 4 deletions

View File

@ -26,6 +26,61 @@
namespace db
{
static char halign2code (db::HAlign ha)
{
if (ha == db::HAlignCenter) {
return 'c';
} else if (ha == db::HAlignLeft) {
return 'l';
} else if (ha == db::HAlignRight) {
return 'r';
} else {
return 0;
}
}
static db::HAlign extract_halign (tl::Extractor &ex)
{
if (ex.test ("c")) {
return db::HAlignCenter;
} else if (ex.test ("l")) {
return db::HAlignLeft;
} else if (ex.test ("r")) {
return db::HAlignRight;
} else {
return db::NoHAlign;
}
}
static char valign2code (db::VAlign va)
{
if (va == db::VAlignCenter) {
return 'c';
} else if (va == db::VAlignBottom) {
return 'b';
} else if (va == db::VAlignTop) {
return 't';
} else {
return 0;
}
}
static db::VAlign extract_valign (tl::Extractor &ex)
{
if (ex.test ("c")) {
return db::VAlignCenter;
} else if (ex.test ("t")) {
return db::VAlignTop;
} else if (ex.test ("b")) {
return db::VAlignBottom;
} else {
return db::NoVAlign;
}
}
// ----------------------------------------------------------------------------
// StringRef implementation
StringRef::~StringRef ()
{
if (mp_rep) {
@ -33,6 +88,42 @@ StringRef::~StringRef ()
}
}
// ----------------------------------------------------------------------------
// text implementation
template <class C>
std::string text<C>::to_string (double dbu) const
{
std::string s = std::string ("(") + tl::to_quoted_string (string ()) + "," + m_trans.to_string (dbu) + ")";
if (size () > 0) {
s += " s=";
s += tl::to_string (size ());
}
if (font () >= 0) {
s += " f=";
s += tl::to_string (int (font ()));
}
char c;
c = halign2code (halign ());
if (c) {
s += " ha=";
s += c;
}
c = valign2code (valign ());
if (c) {
s += " va=";
s += c;
}
return s;
}
template class text<Coord>;
template class text<DCoord>;
}
namespace tl
@ -69,6 +160,28 @@ template<class C> bool _test_extractor_impl (tl::Extractor &ex, db::text<C> &t)
ex.expect (")");
if (ex.test ("s=")) {
C size = 0;
ex.read (size);
t.size (size);
}
if (ex.test ("f=")) {
int font = -1;
ex.read (font);
t.font (db::Font (font));
}
if (ex.test ("ha=")) {
db::HAlign ha = db::extract_halign (ex);
t.halign (ha);
}
if (ex.test ("va=")) {
db::VAlign va = db::extract_valign (ex);
t.valign (va);
}
return true;
} else {

View File

@ -757,10 +757,7 @@ public:
/**
* @brief String conversion
*/
std::string to_string (double dbu = 0.0) const
{
return std::string ("(") + tl::to_quoted_string (string ()) + "," + m_trans.to_string (dbu) + ")";
}
std::string to_string (double dbu = 0.0) const;
/**
* @brief Reduce the text

View File

@ -133,4 +133,68 @@ TEST(3)
EXPECT_EQ (std::string (s2b.text_string ()), "U");
}
std::string string_trip (const db::Text &t)
{
std::string s = t.to_string ();
tl::Extractor ex (s.c_str ());
db::Text t2;
ex.read (t2);
return t2.to_string ();
}
TEST(4)
{
db::Text t ("abc", db::Trans (db::Trans::r90));
EXPECT_EQ (t.to_string (), "('abc',r90 0,0)");
EXPECT_EQ (string_trip (t), t.to_string ());
t.size (150);
EXPECT_EQ (t.to_string (), "('abc',r90 0,0) s=150");
EXPECT_EQ (string_trip (t), t.to_string ());
t.size (0);
EXPECT_EQ (t.to_string (), "('abc',r90 0,0)");
EXPECT_EQ (string_trip (t), t.to_string ());
t.halign (db::HAlignCenter);
EXPECT_EQ (t.to_string (), "('abc',r90 0,0) ha=c");
EXPECT_EQ (string_trip (t), t.to_string ());
t.halign (db::HAlignLeft);
EXPECT_EQ (t.to_string (), "('abc',r90 0,0) ha=l");
EXPECT_EQ (string_trip (t), t.to_string ());
t.halign (db::HAlignRight);
EXPECT_EQ (t.to_string (), "('abc',r90 0,0) ha=r");
EXPECT_EQ (string_trip (t), t.to_string ());
t.valign (db::VAlignCenter);
EXPECT_EQ (t.to_string (), "('abc',r90 0,0) ha=r va=c");
EXPECT_EQ (string_trip (t), t.to_string ());
t.valign (db::VAlignTop);
EXPECT_EQ (t.to_string (), "('abc',r90 0,0) ha=r va=t");
EXPECT_EQ (string_trip (t), t.to_string ());
t.valign (db::VAlignBottom);
EXPECT_EQ (t.to_string (), "('abc',r90 0,0) ha=r va=b");
EXPECT_EQ (string_trip (t), t.to_string ());
t.halign (db::NoHAlign);
t.valign (db::NoVAlign);
t.font (db::Font (17));
EXPECT_EQ (t.to_string (), "('abc',r90 0,0) f=17");
EXPECT_EQ (string_trip (t), t.to_string ());
}