scummvm/gui/widgets/scrollcontainer.cpp

237 lines
6.4 KiB
C++
Raw Normal View History

2016-06-21 14:36:21 +06:00
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "common/util.h"
#include "gui/widgets/scrollcontainer.h"
#include "gui/gui-manager.h"
#include "gui/ThemeEval.h"
namespace GUI {
ScrollContainerWidget::ScrollContainerWidget(GuiObject *boss, int x, int y, int w, int h)
: Widget(boss, x, y, w, h) {
init();
}
ScrollContainerWidget::ScrollContainerWidget(GuiObject *boss, const Common::String &name)
: Widget(boss, name) {
init();
}
void ScrollContainerWidget::init() {
setFlags(WIDGET_ENABLED);
_type = kScrollContainerWidget;
_verticalScroll = nullptr;
_verticalScroll = new ScrollBarWidget(this, _w-16, 0, 16, _h);
_verticalScroll->setTarget(this);
//_navRight = new ButtonWidget(this, x + _butW + 2, y, _butW, _butH, ">", 0, kCmdRight);
_scrolledX = 0;
_scrolledY = 0;
_limitH = 140;
_clippingArea = Common::Rect(0, 0, _w, _h);
recalc();
}
void ScrollContainerWidget::recalc() {
_verticalScroll->_numEntries = _h;
_verticalScroll->_currentPos = _scrolledY;
_verticalScroll->_entriesPerPage = _limitH;
_verticalScroll->setPos(_w - 16, _scrolledY);
_verticalScroll->setSize(16, _limitH);
debug("%d %d", _boss->getHeight(), _h);
}
ScrollContainerWidget::~ScrollContainerWidget() {
_firstWidget = 0;
//delete _navRight;
}
int16 ScrollContainerWidget::getChildX() const {
return getAbsX() - _scrolledX;// +_tabHeight;
}
int16 ScrollContainerWidget::getChildY() const {
return getAbsY() - _scrolledY;// +_tabHeight;
}
uint16 ScrollContainerWidget::getWidth() const {
return (_boss ? _boss->getWidth() : _w);
}
uint16 ScrollContainerWidget::getHeight() const {
return _limitH;
}
void ScrollContainerWidget::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
Widget::handleCommand(sender, cmd, data);
switch (cmd) {
case kSetPositionCmd:
_scrolledY = _verticalScroll->_currentPos;
recalc();
draw();
break;
/*
case kCmdLeft:
if (_firstVisibleTab) {
_firstVisibleTab--;
draw();
}
break;
case kCmdRight:
if (_firstVisibleTab + _w / _tabWidth < (int)_tabs.size()) {
_firstVisibleTab++;
draw();
}
break;
*/
}
}
void ScrollContainerWidget::handleMouseDown(int x, int y, int button, int clickCount) {
/*
assert(y < _tabHeight);
// Determine which tab was clicked
int tabID = -1;
if (x >= 0 && (x % _tabWidth) < _tabWidth) {
tabID = x / _tabWidth;
if (tabID >= (int)_tabs.size())
tabID = -1;
}
// If a tab was clicked, switch to that pane
if (tabID >= 0 && tabID + _firstVisibleTab < (int)_tabs.size()) {
setActiveTab(tabID + _firstVisibleTab);
}
*/
}
bool ScrollContainerWidget::handleKeyDown(Common::KeyState state) {
/*
if (state.hasFlags(Common::KBD_SHIFT) && state.keycode == Common::KEYCODE_TAB)
adjustTabs(kTabBackwards);
else if (state.keycode == Common::KEYCODE_TAB)
adjustTabs(kTabForwards);
*/
return Widget::handleKeyDown(state);
}
void ScrollContainerWidget::reflowLayout() {
_clippingArea = Common::Rect(0, 0, _w, _h);
recalc();
Widget::reflowLayout();
/*
for (uint i = 0; i < _tabs.size(); ++i) {
Widget *w = _tabs[i].firstWidget;
while (w) {
w->reflowLayout();
w = w->next();
}
}
_tabHeight = g_gui.xmlEval()->getVar("Globals.TabWidget.Tab.Height");
_tabWidth = g_gui.xmlEval()->getVar("Globals.TabWidget.Tab.Width");
_titleVPad = g_gui.xmlEval()->getVar("Globals.TabWidget.Tab.Padding.Top");
if (_tabWidth == 0) {
_tabWidth = 40;
#ifdef __DS__
}
if (true) {
#endif
int maxWidth = _w / _tabs.size();
for (uint i = 0; i < _tabs.size(); ++i) {
// Determine the new tab width
int newWidth = g_gui.getStringWidth(_tabs[i].title) + 2 * 3;
if (_tabWidth < newWidth)
_tabWidth = newWidth;
if (_tabWidth > maxWidth)
_tabWidth = maxWidth;
}
}
_butRP = g_gui.xmlEval()->getVar("Globals.TabWidget.NavButton.PaddingRight", 0);
_butTP = g_gui.xmlEval()->getVar("Globals.TabWidget.NavButton.Padding.Top", 0);
_butW = g_gui.xmlEval()->getVar("GlobalsTabWidget.NavButton.Width", 10);
_butH = g_gui.xmlEval()->getVar("Globals.TabWidget.NavButton.Height", 10);
int x = _w - _butRP - _butW * 2 - 2;
int y = _butTP - _tabHeight;
_navLeft->resize(x, y, _butW, _butH);
_navRight->resize(x + _butW + 2, y, _butW, _butH);
*/
}
void ScrollContainerWidget::drawWidget() {
/*
Common::Array<Common::String> tabs;
for (int i = _firstVisibleTab; i < (int)_tabs.size(); ++i) {
tabs.push_back(_tabs[i].title);
}
g_gui.theme()->drawDialogBackground(Common::Rect(_x + _bodyLP, _y + _bodyTP, _x+_w-_bodyRP, _y+_h-_bodyBP), _bodyBackgroundType);
*/
g_gui.theme()->drawDialogBackground(Common::Rect(_x, _y, _x + _w, _y + getHeight()), ThemeEngine::kDialogBackgroundDefault);
//g_gui.theme()->addDirtyRect(Common::Rect(_x, _y, _x + _w, _y + getHeight()));
/*
g_gui.theme()->drawTab(Common::Rect(_x, _y, _x+_w, _y+_h), _tabHeight, _tabWidth, tabs, _activeTab - _firstVisibleTab, 0, _titleVPad);
*/
}
void ScrollContainerWidget::draw() {
Widget::draw();
/*
if (_tabWidth * _tabs.size() > _w) {
_navLeft->draw();
_navRight->draw();
}
*/
}
Widget *ScrollContainerWidget::findWidget(int x, int y) {
/*
if (y < _tabHeight) {
if (_tabWidth * _tabs.size() > _w) {
if (y >= _butTP && y < _butTP + _butH) {
if (x >= _w - _butRP - _butW * 2 - 2 && x < _w - _butRP - _butW - 2)
return _navLeft;
if (x >= _w - _butRP - _butW && x < _w - _butRP)
return _navRight;
}
}
// Click was in the tab area
return this;
} else {
// Iterate over all child widgets and find the one which was clicked
return Widget::findWidgetInChain(_firstWidget, x, y - _tabHeight);
}
*/
return Widget::findWidgetInChain(_firstWidget, x + _scrolledX, y + _scrolledY);
}
} // End of namespace GUI