diff options
Diffstat (limited to 'src/FbTk/TextButton.cc')
-rw-r--r-- | src/FbTk/TextButton.cc | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/src/FbTk/TextButton.cc b/src/FbTk/TextButton.cc index ba15280..1d5936c 100644 --- a/src/FbTk/TextButton.cc +++ b/src/FbTk/TextButton.cc | |||
@@ -28,16 +28,18 @@ | |||
28 | namespace FbTk { | 28 | namespace FbTk { |
29 | 29 | ||
30 | TextButton::TextButton(const FbTk::FbWindow &parent, | 30 | TextButton::TextButton(const FbTk::FbWindow &parent, |
31 | const FbTk::Font &font, | 31 | FbTk::Font &font, |
32 | const std::string &text): | 32 | const std::string &text): |
33 | FbTk::Button(parent, 0, 0, 10, 10), | 33 | FbTk::Button(parent, 0, 0, 10, 10), |
34 | m_font(&font), | 34 | m_font(&font), |
35 | m_text(text), | 35 | m_text(text), |
36 | m_justify(FbTk::LEFT), m_bevel(1), | 36 | m_justify(FbTk::LEFT), |
37 | m_orientation(FbTk::ROT0), | ||
38 | m_bevel(1), | ||
37 | m_left_padding(0), | 39 | m_left_padding(0), |
38 | m_right_padding(0) { | 40 | m_right_padding(0) { |
39 | setRenderer(*this); | ||
40 | 41 | ||
42 | setRenderer(*this); | ||
41 | } | 43 | } |
42 | 44 | ||
43 | void TextButton::resize(unsigned int width, unsigned int height) { | 45 | void TextButton::resize(unsigned int width, unsigned int height) { |
@@ -60,6 +62,23 @@ void TextButton::setJustify(FbTk::Justify just) { | |||
60 | m_justify = just; | 62 | m_justify = just; |
61 | } | 63 | } |
62 | 64 | ||
65 | bool TextButton::setOrientation(FbTk::Orientation orient) { | ||
66 | if (!m_font->validOrientation(orient)) | ||
67 | return false; | ||
68 | |||
69 | if ((m_orientation == FbTk::ROT0 || m_orientation == FbTk::ROT180) && | ||
70 | (orient == FbTk::ROT90 || orient == FbTk::ROT270) || | ||
71 | (m_orientation == FbTk::ROT90 || m_orientation == FbTk::ROT270) && | ||
72 | (orient == FbTk::ROT0 || orient == FbTk::ROT180)) { | ||
73 | // flip width and height | ||
74 | m_orientation = orient; | ||
75 | resize(height(), width()); | ||
76 | } else { | ||
77 | m_orientation = orient; | ||
78 | } | ||
79 | return true; | ||
80 | } | ||
81 | |||
63 | void TextButton::setText(const std::string &text) { | 82 | void TextButton::setText(const std::string &text) { |
64 | if (m_text != text) { | 83 | if (m_text != text) { |
65 | m_text = text; | 84 | m_text = text; |
@@ -68,7 +87,7 @@ void TextButton::setText(const std::string &text) { | |||
68 | } | 87 | } |
69 | } | 88 | } |
70 | 89 | ||
71 | void TextButton::setFont(const FbTk::Font &font) { | 90 | void TextButton::setFont(FbTk::Font &font) { |
72 | // no need to set new font if it's the same | 91 | // no need to set new font if it's the same |
73 | if (&font == m_font) | 92 | if (&font == m_font) |
74 | return; | 93 | return; |
@@ -109,10 +128,16 @@ void TextButton::clearArea(int x, int y, | |||
109 | drawText(0, 0, this); | 128 | drawText(0, 0, this); |
110 | } | 129 | } |
111 | 130 | ||
131 | |||
112 | unsigned int TextButton::textWidth() const { | 132 | unsigned int TextButton::textWidth() const { |
113 | return font().textWidth(text().c_str(), text().size()); | 133 | return font().textWidth(text().c_str(), text().size()); |
114 | } | 134 | } |
115 | 135 | ||
136 | unsigned int TextButton::textHeight() const { | ||
137 | return font().height(); | ||
138 | |||
139 | } | ||
140 | |||
116 | void TextButton::renderForeground(FbWindow &win, FbDrawable &drawable) { | 141 | void TextButton::renderForeground(FbWindow &win, FbDrawable &drawable) { |
117 | // (win should always be *this, no need to check) | 142 | // (win should always be *this, no need to check) |
118 | drawText(0, 0, &drawable); | 143 | drawText(0, 0, &drawable); |
@@ -122,7 +147,10 @@ void TextButton::drawText(int x_offset, int y_offset, FbDrawable *drawable) { | |||
122 | unsigned int textlen = text().size(); | 147 | unsigned int textlen = text().size(); |
123 | // do text alignment | 148 | // do text alignment |
124 | 149 | ||
125 | int align_x = FbTk::doAlignment(width() - x_offset - m_left_padding - m_right_padding, | 150 | unsigned int textw = width(), texth = height(); |
151 | translateSize(m_orientation, textw, texth); | ||
152 | |||
153 | int align_x = FbTk::doAlignment(textw - x_offset - m_left_padding - m_right_padding, | ||
126 | bevel(), | 154 | bevel(), |
127 | justify(), | 155 | justify(), |
128 | font(), | 156 | font(), |
@@ -130,17 +158,22 @@ void TextButton::drawText(int x_offset, int y_offset, FbDrawable *drawable) { | |||
130 | textlen); // return new text lne | 158 | textlen); // return new text lne |
131 | 159 | ||
132 | // center text by default | 160 | // center text by default |
133 | int center_pos = height()/2 + font().ascent()/2 - 1; | 161 | int center_pos = texth/2 + font().ascent()/2 - 1; |
162 | |||
163 | int textx = align_x + x_offset + m_left_padding; | ||
164 | int texty = center_pos + y_offset; | ||
134 | 165 | ||
135 | if (drawable == 0) | 166 | if (drawable == 0) |
136 | drawable = this; | 167 | drawable = this; |
137 | 168 | ||
169 | // give it ROT0 style coords | ||
170 | translateCoords(m_orientation, textx, texty, textw, texth); | ||
171 | |||
138 | font().drawText(*drawable, | 172 | font().drawText(*drawable, |
139 | screenNumber(), | 173 | screenNumber(), |
140 | gc(), // graphic context | 174 | gc(), // graphic context |
141 | text().c_str(), textlen, // string and string size | 175 | text().c_str(), textlen, // string and string size |
142 | align_x + x_offset + m_left_padding, center_pos + y_offset); // position | 176 | textx, texty, m_orientation); // position |
143 | |||
144 | } | 177 | } |
145 | 178 | ||
146 | void TextButton::exposeEvent(XExposeEvent &event) { | 179 | void TextButton::exposeEvent(XExposeEvent &event) { |