all repos — openbox @ 77342413efd183bd1c0681a57b68acc836022923

openbox fork - make it a bit more like ryudo

otk/label.cc (raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "label.hh"

namespace otk {

OtkLabel::OtkLabel(OtkWidget *parent)
  : OtkWidget(parent), _text("")
{
  setTexture(getStyle()->getLabelUnfocus());
}

OtkLabel::~OtkLabel()
{
}

void OtkLabel::update(void)
{
  if (_dirty) {
    const BFont &ft = getStyle()->getFont();
    unsigned int bevel = getStyle()->getBevelWidth();

    std::string t = _text; // the actual text to draw
    int x = bevel;         // x coord for the text

    // find a string that will fit inside the area for text
    int max_length = width() - getBevelWidth() * 2;
    if (max_length <= 0) {
      t = ""; // can't fit anything
    } else {
      size_t text_len = t.size();
      int length;
      
      do {
        t.resize(text_len);
        length = ft.measureString(t);
      } while (length > max_length && text_len-- > 0);

      // justify the text
      switch (getStyle()->textJustify()) {
      case Style::RightJustify:
        x += max_length - length;
        break;
      case Style::CenterJustify:
        x += (max_length - length) / 2;
        break;
      case Style::LeftJustify:
        break;
      }
    }

    OtkWidget::update();

    ft.drawString(getWindow(), x, bevel, *getStyle()->getTextUnfocus(), t);
  } else
    OtkWidget::update();
}

}