]> Dogcows Code - chaz/openbox/blob - src/labelwidget.cc
9ff45298a834f59a5bcc4f17c91169f217e33b5f
[chaz/openbox] / src / labelwidget.cc
1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
2 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
3
4 #ifdef HAVE_CONFIG_H
5 # include "../config.h"
6 #endif
7
8 #include "otk/screeninfo.hh"
9 #include "otk/display.hh"
10 #include "labelwidget.hh"
11
12 namespace ob {
13
14 LabelWidget::LabelWidget(otk::Widget *parent, WidgetBase::WidgetType type)
15 : otk::Widget(parent),
16 WidgetBase(type)
17 {
18 const otk::ScreenInfo *info = otk::Display::screenInfo(_screen);
19 _xftdraw = XftDrawCreate(otk::Display::display, _window, info->visual(),
20 info->colormap());
21 }
22
23
24 LabelWidget::~LabelWidget()
25 {
26 XftDrawDestroy(_xftdraw);
27 }
28
29
30 void LabelWidget::setText(const std::string &text)
31 {
32 _text = text;
33 _dirty = true;
34 }
35
36
37 void LabelWidget::setTextures()
38 {
39 if (_focused) {
40 setTexture(_style->getLabelFocus());
41 _text_color = _style->getTextFocus();
42 } else {
43 setTexture(_style->getLabelUnfocus());
44 _text_color = _style->getTextUnfocus();
45 }
46 }
47
48
49 void LabelWidget::setStyle(otk::Style *style)
50 {
51 otk::Widget::setStyle(style);
52 setTextures();
53 _font = style->getFont();
54 assert(_font);
55 _sidemargin = style->getBevelWidth() * 2;
56 _justify = style->textJustify();
57 }
58
59
60 void LabelWidget::focus()
61 {
62 otk::Widget::focus();
63 setTextures();
64 }
65
66
67 void LabelWidget::unfocus()
68 {
69 otk::Widget::unfocus();
70 setTextures();
71 }
72
73
74 void LabelWidget::update()
75 {
76 bool draw = _dirty;
77
78 otk::Widget::update();
79
80 if (draw) {
81 std::string t = _text;
82 int x = _sidemargin; // x coord for the text
83
84 // find a string that will fit inside the area for text
85 int max_length = width() - _sidemargin * 2;
86 if (max_length <= 0) {
87 t = ""; // can't fit anything
88 } else {
89 size_t text_len = t.size();
90 int length;
91
92 do {
93 t.resize(text_len);
94 length = _font->measureString(t);
95 } while (length > max_length && text_len-- > 0);
96
97 // justify the text
98 switch (_justify) {
99 case otk::Style::RightJustify:
100 x += max_length - length;
101 break;
102 case otk::Style::CenterJustify:
103 x += (max_length - length) / 2;
104 break;
105 case otk::Style::LeftJustify:
106 break;
107 }
108 }
109
110 _font->drawString(_xftdraw, x, 0, *_text_color, t);
111 }
112 }
113
114
115 void LabelWidget::adjust()
116 {
117 // nothing to adjust. no children.
118 }
119
120 }
This page took 0.042503 seconds and 3 git commands to generate.