mirror of
https://github.com/aseprite/aseprite.git
synced 2025-01-16 22:18:30 +00:00
84 lines
2.1 KiB
C++
84 lines
2.1 KiB
C++
// Aseprite UI Library
|
|
// Copyright (C) 2023 Igara Studio S.A.
|
|
// Copyright (C) 2001-2015 David Capello
|
|
//
|
|
// This file is released under the terms of the MIT license.
|
|
// Read LICENSE.txt for more information.
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include "ui/scroll_bar.h"
|
|
|
|
namespace ui {
|
|
|
|
void setup_scrollbars(const gfx::Size& scrollableSize,
|
|
gfx::Rect& viewportArea,
|
|
Widget& parent,
|
|
ScrollBar& hbar,
|
|
ScrollBar& vbar)
|
|
{
|
|
#define NEED_BAR(w, h) \
|
|
((scrollableSize.w > viewportArea.w) && \
|
|
(vbar.getBarWidth() < fullViewportArea.w) && \
|
|
(hbar.getBarWidth() < fullViewportArea.h))
|
|
|
|
const gfx::Rect fullViewportArea = viewportArea;
|
|
|
|
hbar.setSize(scrollableSize.w);
|
|
vbar.setSize(scrollableSize.h);
|
|
|
|
if (hbar.parent()) parent.removeChild(&hbar);
|
|
if (vbar.parent()) parent.removeChild(&vbar);
|
|
|
|
if (NEED_BAR(w, h)) {
|
|
viewportArea.h -= hbar.getBarWidth();
|
|
parent.addChild(&hbar);
|
|
|
|
if (NEED_BAR(h, w)) {
|
|
viewportArea.w -= vbar.getBarWidth();
|
|
if (NEED_BAR(w, h))
|
|
parent.addChild(&vbar);
|
|
else {
|
|
viewportArea.w += vbar.getBarWidth();
|
|
viewportArea.h += hbar.getBarWidth();
|
|
parent.removeChild(&hbar);
|
|
}
|
|
}
|
|
}
|
|
else if (NEED_BAR(h, w)) {
|
|
viewportArea.w -= vbar.getBarWidth();
|
|
parent.addChild(&vbar);
|
|
|
|
if (NEED_BAR(w, h)) {
|
|
viewportArea.h -= hbar.getBarWidth();
|
|
if (NEED_BAR(h, w))
|
|
parent.addChild(&hbar);
|
|
else {
|
|
viewportArea.w += vbar.getBarWidth();
|
|
viewportArea.h += hbar.getBarWidth();
|
|
parent.removeChild(&vbar);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (parent.hasChild(&hbar)) {
|
|
hbar.setBounds(gfx::Rect(viewportArea.x, viewportArea.y2(),
|
|
viewportArea.w, hbar.getBarWidth()));
|
|
hbar.setVisible(true);
|
|
}
|
|
else
|
|
hbar.setVisible(false);
|
|
|
|
if (parent.hasChild(&vbar)) {
|
|
vbar.setBounds(gfx::Rect(viewportArea.x2(), viewportArea.y,
|
|
vbar.getBarWidth(), viewportArea.h));
|
|
vbar.setVisible(true);
|
|
}
|
|
else
|
|
vbar.setVisible(false);
|
|
}
|
|
|
|
} // namespace ui
|