[calref/cboe]: Implement automatic height calculation for text labels
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
<dialog defbtn='okay'>
|
<dialog defbtn='okay'>
|
||||||
<pict type='dlog' num='16' top='6' left='6'/>
|
<pict type='dlog' num='16' top='6' left='6'/>
|
||||||
<text top='4' left='136' width='265' height='16'>WELCOME TO OPEN BLADES OF EXILE!</text>
|
<text top='4' left='136' width='265' height='16'>WELCOME TO OPEN BLADES OF EXILE!</text>
|
||||||
<text top='22' left='50' width='413' height='48'>
|
<text top='22' left='50' width='413'>
|
||||||
Welcome to the evolving world of Open Blades of Exile!<br/>
|
Welcome to the evolving world of Open Blades of Exile!<br/>
|
||||||
Open Blades of Exile is the open-source variant of the
|
Open Blades of Exile is the open-source variant of the
|
||||||
Blades of Exile game developed by Spiderweb Software in
|
Blades of Exile game developed by Spiderweb Software in
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
<text name='spidweb' relative='pos-in pos' rel-anchor='prev' top='0' left='16' width='390' height='12' colour='link' underline='true'>
|
<text name='spidweb' relative='pos-in pos' rel-anchor='prev' top='0' left='16' width='390' height='12' colour='link' underline='true'>
|
||||||
http://www.spidweb.com/blades/opensource.html
|
http://www.spidweb.com/blades/opensource.html
|
||||||
</text>
|
</text>
|
||||||
<text relative='neg pos' rel-anchor='prev' top='12' left='16' width='413' height='36'>
|
<text relative='neg pos' rel-anchor='prev' top='12' left='16' width='413'>
|
||||||
Three exciting original scenarios await you, filled
|
Three exciting original scenarios await you, filled
|
||||||
with many hours of puzzles, fighting and adventure!
|
with many hours of puzzles, fighting and adventure!
|
||||||
In addition to these, hundreds more written by
|
In addition to these, hundreds more written by
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
<text name='scen' relative='pos-in pos' rel-anchor='prev' top='0' left='16' width='390' height='12' colour='link' underline='true'>
|
<text name='scen' relative='pos-in pos' rel-anchor='prev' top='0' left='16' width='390' height='12' colour='link' underline='true'>
|
||||||
http://openboe.com/scenarios
|
http://openboe.com/scenarios
|
||||||
</text>
|
</text>
|
||||||
<text relative='neg pos' rel-anchor='prev' top='12' left='16' width='413' height='84'>
|
<text relative='neg pos' rel-anchor='prev' top='12' left='16' width='413'>
|
||||||
Even better, when you are through with those adventures,
|
Even better, when you are through with those adventures,
|
||||||
you can make your own using the Blades of Exile scenario
|
you can make your own using the Blades of Exile scenario
|
||||||
editor!
|
editor!
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
<text name='forum' relative='pos-in pos' rel-anchor='prev' top = '0' left='16' width='390' height='12' colour='link' underline='true'>
|
<text name='forum' relative='pos-in pos' rel-anchor='prev' top = '0' left='16' width='390' height='12' colour='link' underline='true'>
|
||||||
http://spiderwebforums.ipbhost.com/
|
http://spiderwebforums.ipbhost.com/
|
||||||
</text>
|
</text>
|
||||||
<text relative='neg pos' rel-anchor='prev' top='12' left='16' width='413' height='96'>
|
<text relative='neg pos' rel-anchor='prev' top='12' left='16' width='413'>
|
||||||
Also be sure to look at the Preferences Window, where
|
Also be sure to look at the Preferences Window, where
|
||||||
you can change animation speed, game difficulty, display
|
you can change animation speed, game difficulty, display
|
||||||
options and special effects settings.
|
options and special effects settings.
|
||||||
|
|||||||
@@ -265,6 +265,8 @@ void cDialog::loadFromFile(std::string path){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
prevCtrl = *inserted;
|
prevCtrl = *inserted;
|
||||||
|
// Needed to correctly resolve relative positioning
|
||||||
|
inserted->second->recalcRect();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resolve relative positioning
|
// Resolve relative positioning
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include "message.hpp"
|
#include "message.hpp"
|
||||||
#include "mathutil.hpp"
|
#include "mathutil.hpp"
|
||||||
#include "dialog.hpp"
|
#include "dialog.hpp"
|
||||||
|
#include <numeric>
|
||||||
|
|
||||||
extern sf::Texture bg_gworld;
|
extern sf::Texture bg_gworld;
|
||||||
|
|
||||||
@@ -85,6 +86,64 @@ void cTextMsg::validatePostParse(ticpp::Element& who, std::string fname, const s
|
|||||||
cControl::validatePostParse(who, fname, attrs, nodes);
|
cControl::validatePostParse(who, fname, attrs, nodes);
|
||||||
if(!attrs.count("color") && !attrs.count("colour") && parent->getBg() == cDialog::BG_DARK)
|
if(!attrs.count("color") && !attrs.count("colour") && parent->getBg() == cDialog::BG_DARK)
|
||||||
setColour(sf::Color::White);
|
setColour(sf::Color::White);
|
||||||
|
if(attrs.count("width")) fixedWidth = true;
|
||||||
|
if(attrs.count("height")) fixedHeight = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cTextMsg::recalcRect() {
|
||||||
|
if(fixedWidth && fixedHeight) return;
|
||||||
|
TextStyle style;
|
||||||
|
style.font = textFont;
|
||||||
|
style.pointSize = textSize;
|
||||||
|
style.underline = underlined;
|
||||||
|
style.lineHeight = textSize + 2;
|
||||||
|
std::string test = lbl;
|
||||||
|
size_t lines = 1, cur_line_chars = 0, max_line_chars = 0;
|
||||||
|
// Substitute | with newlines for measuring
|
||||||
|
for(auto& c : test) {
|
||||||
|
if(c == '|') {
|
||||||
|
c = '\n';
|
||||||
|
lines++;
|
||||||
|
max_line_chars = max(max_line_chars, cur_line_chars);
|
||||||
|
cur_line_chars = 0;
|
||||||
|
} else {
|
||||||
|
cur_line_chars++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
max_line_chars = max(max_line_chars, cur_line_chars);
|
||||||
|
std::vector<hilite_t> hilites;
|
||||||
|
std::vector<rectangle> rects;
|
||||||
|
hilites.emplace_back(0,test.size());
|
||||||
|
rectangle calc_rect = frame;
|
||||||
|
if(lines == 1) {
|
||||||
|
calc_rect.left += 3;
|
||||||
|
} else {
|
||||||
|
calc_rect.inset(4,4);
|
||||||
|
}
|
||||||
|
if(!fixedHeight) {
|
||||||
|
// Fix the width and calculate the height
|
||||||
|
calc_rect.height() = lines * style.lineHeight * 10;
|
||||||
|
} else if(!fixedWidth) {
|
||||||
|
// Fix the height and calculate the width
|
||||||
|
calc_rect.width() = 100 * max_line_chars;
|
||||||
|
} else return; // This case should be impossible, but just in case...
|
||||||
|
sf::RenderTexture temp;
|
||||||
|
temp.create(frame.width(), frame.height());
|
||||||
|
rectangle test_rect = calc_rect;
|
||||||
|
test_rect.offset(-test_rect.left, -test_rect.top);
|
||||||
|
rects = draw_string_hilite(temp, test_rect, lbl, style, hilites, sf::Color::Black);
|
||||||
|
if(rects.empty()) return;
|
||||||
|
// Basically take the the union of the rects, and add 8 to its height or width
|
||||||
|
rectangle combo = rects.back();
|
||||||
|
if(rects.size() > 1) {
|
||||||
|
combo = std::accumulate(rects.begin(), rects.end() - 1, combo, rectunion);
|
||||||
|
}
|
||||||
|
if(!fixedHeight) {
|
||||||
|
calc_rect.height() = combo.height() + 8;
|
||||||
|
} else if(!fixedWidth) {
|
||||||
|
calc_rect.width() = combo.width() + 8;
|
||||||
|
}
|
||||||
|
frame = calc_rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
cTextMsg::cTextMsg(cDialog& parent) :
|
cTextMsg::cTextMsg(cDialog& parent) :
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ public:
|
|||||||
bool isScrollable();
|
bool isScrollable();
|
||||||
virtual ~cTextMsg();
|
virtual ~cTextMsg();
|
||||||
void draw();
|
void draw();
|
||||||
|
void recalcRect() override;
|
||||||
/// @copydoc cControl::getSupportedHandlers
|
/// @copydoc cControl::getSupportedHandlers
|
||||||
///
|
///
|
||||||
/// @todo Document possible handlers
|
/// @todo Document possible handlers
|
||||||
@@ -52,6 +53,6 @@ private:
|
|||||||
sf::Color color;
|
sf::Color color;
|
||||||
std::vector<boost::optional<std::string>> keyRefs;
|
std::vector<boost::optional<std::string>> keyRefs;
|
||||||
std::string fromList;
|
std::string fromList;
|
||||||
bool underlined = false;
|
bool underlined = false, fixedWidth = false, fixedHeight = false;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user