From a4c8a839a3decc54e515fd110710195eca23fd2b Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 10 Feb 2003 02:27:58 +0000 Subject: [PATCH] layout fixes, give widgets a default texture, etc. --- otk/appwidget.cc | 16 +++------ otk/appwidget.hh | 2 -- otk/label.cc | 9 ++++- otk/label.hh | 2 +- otk/widget.cc | 87 ++++++++++++++++++++++++++++++++++++++++-------- otk/widget.hh | 4 +-- 6 files changed, 88 insertions(+), 32 deletions(-) diff --git a/otk/appwidget.cc b/otk/appwidget.cc index 113998fe..8b157225 100644 --- a/otk/appwidget.cc +++ b/otk/appwidget.cc @@ -30,26 +30,18 @@ AppWidget::~AppWidget() { } -void AppWidget::render() -{ - XSetWindowBackground(**display, window(), - RenderStyle::style(screen())-> - titlebarUnfocusBackground()->color().pixel()); - Widget::render(); -} - void AppWidget::show() { - Widget::show(true); - + if (!visible()) _application->_appwidget_count++; + Widget::show(true); } void AppWidget::hide() { + if (visible()) + _application->_appwidget_count--; Widget::hide(); - - _application->_appwidget_count--; } void AppWidget::clientMessageHandler(const XClientMessageEvent &e) diff --git a/otk/appwidget.hh b/otk/appwidget.hh index b2ea44aa..5595e88e 100644 --- a/otk/appwidget.hh +++ b/otk/appwidget.hh @@ -14,8 +14,6 @@ public: AppWidget(Application *app, Direction direction = Horizontal, int bevel = 0); virtual ~AppWidget(); - virtual void render(); - virtual void show(); virtual void hide(); diff --git a/otk/label.cc b/otk/label.cc index 43d06f77..587e3212 100644 --- a/otk/label.cc +++ b/otk/label.cc @@ -55,7 +55,14 @@ void Label::setText(const ustring &text) std::string::size_type p = 0; while (p != std::string::npos) { std::string::size_type p2 = s.find('\n', p); - _parsedtext.push_back(s.substr(p, (p2==std::string::npos?p2:p2-p))); + std::string s(s.substr(p, (p2==std::string::npos?p2:p2-p))); + + // turn tabs into spaces (multiples of 8) + std::string::size_type t; + while ((t = s.find('\t')) != std::string::npos) + s.replace(t, 1, std::string(8 - t % 8, ' ')); + + _parsedtext.push_back(s); _parsedtext.back().setUtf8(utf); p = (p2==std::string::npos?p2:p2+1); } diff --git a/otk/label.hh b/otk/label.hh index b3e9c166..3bb931d6 100644 --- a/otk/label.hh +++ b/otk/label.hh @@ -17,7 +17,7 @@ public: Label(Widget *parent); virtual ~Label(); - inline const ustring& getText(void) const { return _text; } + inline const ustring& text(void) const { return _text; } void setText(const ustring &text); virtual inline bool isHighlighted() const { return _highlight; } diff --git a/otk/widget.cc b/otk/widget.cc index 75c3a2ab..30b03bc8 100644 --- a/otk/widget.cc +++ b/otk/widget.cc @@ -37,6 +37,7 @@ Widget::Widget(int screen, EventDispatcher *ed, Direction direction, int bevel, { createWindow(overrideredir); _dispatcher->registerHandler(_window, this); + styleChanged(*RenderStyle::style(_screen)); } Widget::Widget(Widget *parent, Direction direction, int bevel) @@ -63,6 +64,7 @@ Widget::Widget(Widget *parent, Direction direction, int bevel) parent->addChild(this); if (parent->visible()) parent->layout(); _dispatcher->registerHandler(_window, this); + styleChanged(*RenderStyle::style(_screen)); } Widget::~Widget() @@ -86,6 +88,10 @@ void Widget::show(bool children) } if (!_visible) { _visible = true; + if (_parent) _parent->calcDefaultSizes(); + else { + resize(_min_size); + } XMapWindow(**display, _window); update(); } @@ -96,7 +102,10 @@ void Widget::hide() if (_visible) { _visible = false; XUnmapWindow(**display, _window); - if (_parent) _parent->layout(); + if (_parent) { + _parent->calcDefaultSizes(); + _parent->layout(); + } } } @@ -110,9 +119,10 @@ void Widget::update() { if (!_visible) return; _dirty = true; - if (parent()) - parent()->layout(); // relay-out us and our siblings - else { + if (_parent) { + _parent->calcDefaultSizes(); + _parent->layout(); // relay-out us and our siblings + } else { render(); layout(); } @@ -121,8 +131,8 @@ void Widget::update() void Widget::moveresize(const Rect &r) { int w, h; - w = std::min(std::max(r.width(), minSize().width()), maxSize().width()); - h = std::min(std::max(r.height(), minSize().height()), maxSize().height()); + w = std::max(std::min(r.width(), maxSize().width()), minSize().width()); + h = std::max(std::min(r.height(), maxSize().height()), minSize().height()); if (r.x() == area().x() && r.y() == area().y() && w == area().width() && h == area().height()) { @@ -140,9 +150,15 @@ void Widget::internal_moveresize(int x, int y, int w, int h) assert(h > 0); assert(_borderwidth >= 0); _dirty = true; - XMoveResizeWindow(**display, _window, x, y, - w - _borderwidth * 2, - h - _borderwidth * 2); + if (!(x == _area.x() && y == _area.y())) { + if (!(w == _area.width() && h == _area.height())) + XMoveResizeWindow(**display, _window, x, y, + w - _borderwidth * 2, + h - _borderwidth * 2); + else + XMoveWindow(**display, _window, x, y); + } else + XResizeWindow(**display, _window, w - _borderwidth*2, h - _borderwidth*2); _ignore_config++; _area = Rect(x, y, w, h); @@ -185,6 +201,48 @@ void Widget::createWindow(bool overrideredir) ++_ignore_config; } +void Widget::calcDefaultSizes() +{ + std::list::const_iterator it, end = _children.end(); + int min_biggest = 0, max_biggest = 0; + int min_sum = _bevel + _borderwidth * 2; + int max_sum = _bevel + _borderwidth * 2; + bool fullmax = false; + + for (it = _children.begin(); it != end; ++it) { + const otk::Size &min = (*it)->minSize(); + const otk::Size &max = (*it)->maxSize(); + if (_direction == Horizontal) { + if (min.height() > min_biggest) min_biggest = min.height(); + if (max.height() > max_biggest) max_biggest = max.height(); + min_sum += _bevel + min.width(); + if (max.width() == INT_MAX) + fullmax = true; + else if (!fullmax) + max_sum += _bevel + max.width(); + } else { + if (min.width() > min_biggest) min_biggest = min.width(); + if (max.width() > max_biggest) max_biggest = max.width(); + min_sum += _bevel + min.height(); + if (max.height() == INT_MAX) + fullmax = true; + else if (!fullmax) + max_sum += _bevel + max.height(); + } + } + if (_direction == Horizontal) { + _min_size = otk::Size(min_sum, min_biggest + (_bevel + _borderwidth) * 2); + _max_size = otk::Size((fullmax ? INT_MAX : + max_sum + (_bevel + _borderwidth) * 2), + max_biggest); + } else { + _min_size = otk::Size(min_biggest, min_sum + (_bevel + _borderwidth) * 2); + _max_size = otk::Size(max_biggest, (fullmax ? INT_MAX : max_sum + + (_bevel + _borderwidth) * 2)); + } + update(); +} + void Widget::setBorderWidth(int w) { assert(w >= 0); @@ -427,11 +485,7 @@ void Widget::layoutVert() void Widget::render() { - if (!_dirty) return; - if (!_texture) { - XSetWindowBackgroundPixmap(**display, _window, ParentRelative); - return; - } + if (!_texture || !_dirty) return; if (_borderwidth * 2 > _area.width() || _borderwidth * 2 > _area.height()) return; // no surface to draw on @@ -460,6 +514,11 @@ void Widget::renderChildren() (*it)->render(); } +void Widget::styleChanged(const RenderStyle &style) +{ + _texture = style.titlebarUnfocusBackground(); +} + void Widget::exposeHandler(const XExposeEvent &e) { EventHandler::exposeHandler(e); diff --git a/otk/widget.hh b/otk/widget.hh index 31103deb..c56b4a56 100644 --- a/otk/widget.hh +++ b/otk/widget.hh @@ -77,7 +77,7 @@ public: virtual void exposeHandler(const XExposeEvent &e); virtual void configureHandler(const XConfigureEvent &e); - virtual void styleChanged(const RenderStyle &) {} + virtual void styleChanged(const RenderStyle &style); protected: virtual void addChild(Widget *w) { assert(w); _children.push_back(w); } @@ -85,7 +85,7 @@ protected: //! Find the default min/max sizes for the widget. Useful after the in-use //! style has changed. - virtual void calcDefaultSizes() {}; + virtual void calcDefaultSizes(); virtual void setMinSize(const Size &s); -- 2.45.2