all repos — openbox @ d4d15160fe81353a9f7958c1feb1821abe179a70

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "label.hh"

namespace otk {

OtkLabel::OtkLabel(OtkWidget *parent)
  : OtkWidget(parent), _text(""), _dirty(false)
{
  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();

  _dirty = false;
}

int OtkLabel::exposeHandler(const XExposeEvent &e)
{
  _dirty = true;
  return OtkWidget::exposeHandler(e);
}

int OtkLabel::configureHandler(const XConfigureEvent &e)
{
  if (!(e.width == width() && e.height == height()))
    _dirty = true;
  return OtkWidget::configureHandler(e);
}

}