[Scummvm-cvs-logs] SF.net SVN: scummvm:[54264] scummvm/trunk
fingolfin at users.sourceforge.net
fingolfin at users.sourceforge.net
Tue Nov 16 11:11:59 CET 2010
Revision: 54264
http://scummvm.svn.sourceforge.net/scummvm/?rev=54264&view=rev
Author: fingolfin
Date: 2010-11-16 10:11:57 +0000 (Tue, 16 Nov 2010)
Log Message:
-----------
GUI: Move major widgets to new directory gui/widgets
Also renamed the source/header files, now they are more closely
aligned to how we rename most other source files
Modified Paths:
--------------
scummvm/trunk/backends/keymapper/remap-dialog.cpp
scummvm/trunk/backends/platform/ds/arm9/source/dsoptions.cpp
scummvm/trunk/backends/platform/ds/arm9/source/dsoptions.h
scummvm/trunk/backends/platform/wii/options.h
scummvm/trunk/engines/dialogs.cpp
scummvm/trunk/engines/mohawk/dialogs.h
scummvm/trunk/engines/parallaction/saveload.cpp
scummvm/trunk/engines/scumm/dialogs.cpp
scummvm/trunk/engines/testbed/config.h
scummvm/trunk/gui/KeysDialog.h
scummvm/trunk/gui/browser.cpp
scummvm/trunk/gui/browser_osx.mm
scummvm/trunk/gui/chooser.cpp
scummvm/trunk/gui/console.cpp
scummvm/trunk/gui/dialog.cpp
scummvm/trunk/gui/launcher.cpp
scummvm/trunk/gui/massadd.cpp
scummvm/trunk/gui/module.mk
scummvm/trunk/gui/options.cpp
scummvm/trunk/gui/options.h
scummvm/trunk/gui/saveload.cpp
scummvm/trunk/gui/themebrowser.cpp
Added Paths:
-----------
scummvm/trunk/gui/widgets/
scummvm/trunk/gui/widgets/editable.cpp
scummvm/trunk/gui/widgets/editable.h
scummvm/trunk/gui/widgets/edittext.cpp
scummvm/trunk/gui/widgets/edittext.h
scummvm/trunk/gui/widgets/list.cpp
scummvm/trunk/gui/widgets/list.h
scummvm/trunk/gui/widgets/popup.cpp
scummvm/trunk/gui/widgets/popup.h
scummvm/trunk/gui/widgets/scrollbar.cpp
scummvm/trunk/gui/widgets/scrollbar.h
scummvm/trunk/gui/widgets/tab.cpp
scummvm/trunk/gui/widgets/tab.h
Removed Paths:
-------------
scummvm/trunk/gui/EditTextWidget.cpp
scummvm/trunk/gui/EditTextWidget.h
scummvm/trunk/gui/ListWidget.cpp
scummvm/trunk/gui/ListWidget.h
scummvm/trunk/gui/PopUpWidget.cpp
scummvm/trunk/gui/PopUpWidget.h
scummvm/trunk/gui/ScrollBarWidget.cpp
scummvm/trunk/gui/ScrollBarWidget.h
scummvm/trunk/gui/TabWidget.cpp
scummvm/trunk/gui/TabWidget.h
scummvm/trunk/gui/editable.cpp
scummvm/trunk/gui/editable.h
Modified: scummvm/trunk/backends/keymapper/remap-dialog.cpp
===================================================================
--- scummvm/trunk/backends/keymapper/remap-dialog.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/backends/keymapper/remap-dialog.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -27,8 +27,8 @@
#ifdef ENABLE_KEYMAPPER
#include "gui/GuiManager.h"
-#include "gui/PopUpWidget.h"
-#include "gui/ScrollBarWidget.h"
+#include "gui/widgets/popup.h"
+#include "gui/widgets/scrollbar.h"
#include "gui/ThemeEval.h"
#include "common/translation.h"
Modified: scummvm/trunk/backends/platform/ds/arm9/source/dsoptions.cpp
===================================================================
--- scummvm/trunk/backends/platform/ds/arm9/source/dsoptions.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/backends/platform/ds/arm9/source/dsoptions.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -27,12 +27,12 @@
#include "dsmain.h"
#include "gui/dialog.h"
#include "gui/GuiManager.h"
-#include "gui/ListWidget.h"
-#include "gui/TabWidget.h"
+#include "gui/widgets/list.h"
+#include "gui/widgets/tab.h"
#include "osystem_ds.h"
#include "engines/scumm/scumm.h"
#include "touchkeyboard.h"
-#include "gui/PopUpWidget.h"
+#include "gui/widgets/popup.h"
#include "common/translation.h"
Modified: scummvm/trunk/backends/platform/ds/arm9/source/dsoptions.h
===================================================================
--- scummvm/trunk/backends/platform/ds/arm9/source/dsoptions.h 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/backends/platform/ds/arm9/source/dsoptions.h 2010-11-16 10:11:57 UTC (rev 54264)
@@ -34,7 +34,7 @@
#include "gui/object.h"
#include "gui/widget.h"
#include "gui/dialog.h"
-#include "gui/TabWidget.h"
+#include "gui/widgets/tab.h"
#include "scumm/dialogs.h"
namespace DS {
Modified: scummvm/trunk/backends/platform/wii/options.h
===================================================================
--- scummvm/trunk/backends/platform/wii/options.h 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/backends/platform/wii/options.h 2010-11-16 10:11:57 UTC (rev 54264)
@@ -25,8 +25,8 @@
#include "common/str.h"
#include "gui/dialog.h"
-#include "gui/TabWidget.h"
-#include "gui/EditTextWidget.h"
+#include "gui/widgets/tab.h"
+#include "gui/widgets/edittext.h"
using namespace GUI;
Modified: scummvm/trunk/engines/dialogs.cpp
===================================================================
--- scummvm/trunk/engines/dialogs.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/engines/dialogs.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -35,7 +35,7 @@
#include "gui/about.h"
#include "gui/GuiManager.h"
#include "gui/launcher.h"
-#include "gui/ListWidget.h"
+#include "gui/widgets/list.h"
#include "gui/message.h"
#include "gui/options.h"
#include "gui/saveload.h"
Modified: scummvm/trunk/engines/mohawk/dialogs.h
===================================================================
--- scummvm/trunk/engines/mohawk/dialogs.h 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/engines/mohawk/dialogs.h 2010-11-16 10:11:57 UTC (rev 54264)
@@ -33,7 +33,7 @@
#include "gui/dialog.h"
#include "gui/options.h"
#include "gui/widget.h"
-#include "gui/ListWidget.h"
+#include "gui/widgets/list.h"
namespace Mohawk {
Modified: scummvm/trunk/engines/parallaction/saveload.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/saveload.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/engines/parallaction/saveload.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -29,7 +29,7 @@
#include "gui/dialog.h"
#include "gui/saveload.h"
#include "gui/widget.h"
-#include "gui/ListWidget.h"
+#include "gui/widgets/list.h"
#include "gui/message.h"
#include "parallaction/parallaction.h"
Modified: scummvm/trunk/engines/scumm/dialogs.cpp
===================================================================
--- scummvm/trunk/engines/scumm/dialogs.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/engines/scumm/dialogs.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -37,7 +37,7 @@
#include "gui/about.h"
#include "gui/GuiManager.h"
-#include "gui/ListWidget.h"
+#include "gui/widgets/list.h"
#include "gui/ThemeEval.h"
#include "scumm/dialogs.h"
Modified: scummvm/trunk/engines/testbed/config.h
===================================================================
--- scummvm/trunk/engines/testbed/config.h 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/engines/testbed/config.h 2010-11-16 10:11:57 UTC (rev 54264)
@@ -31,7 +31,7 @@
#include "common/str-array.h"
#include "common/tokenizer.h"
-#include "gui/ListWidget.h"
+#include "gui/widgets/list.h"
#include "gui/options.h"
#include "gui/ThemeEngine.h"
Deleted: scummvm/trunk/gui/EditTextWidget.cpp
===================================================================
--- scummvm/trunk/gui/EditTextWidget.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/EditTextWidget.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -1,118 +0,0 @@
-/* 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.
- *
- * $URL$
- * $Id$
- */
-
-#include "gui/EditTextWidget.h"
-#include "gui/dialog.h"
-#include "gui/GuiManager.h"
-
-#include "gui/ThemeEval.h"
-
-namespace GUI {
-
-EditTextWidget::EditTextWidget(GuiObject *boss, int x, int y, int w, int h, const String &text, const char *tooltip, uint32 cmd)
- : EditableWidget(boss, x, y - 1, w, h + 2, tooltip, cmd) {
- setFlags(WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS | WIDGET_WANT_TICKLE);
- _type = kEditTextWidget;
-
- setEditString(text);
-}
-
-EditTextWidget::EditTextWidget(GuiObject *boss, const String &name, const String &text, const char *tooltip, uint32 cmd)
- : EditableWidget(boss, name, tooltip, cmd) {
- setFlags(WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS | WIDGET_WANT_TICKLE);
- _type = kEditTextWidget;
-
- setEditString(text);
-}
-
-void EditTextWidget::setEditString(const String &str) {
- EditableWidget::setEditString(str);
- _backupString = str;
-}
-
-void EditTextWidget::reflowLayout() {
- _leftPadding = g_gui.xmlEval()->getVar("Globals.EditTextWidget.Padding.Left", 0);
- _rightPadding = g_gui.xmlEval()->getVar("Globals.EditTextWidget.Padding.Right", 0);
-
- EditableWidget::reflowLayout();
-}
-
-
-void EditTextWidget::handleMouseDown(int x, int y, int button, int clickCount) {
- // First remove caret
- if (_caretVisible)
- drawCaret(true);
-
- x += _editScrollOffset;
-
- int width = 0;
- uint i;
-
- for (i = 0; i < _editString.size(); ++i) {
- width += g_gui.theme()->getCharWidth(_editString[i], _font);
- if (width >= x)
- break;
- }
- if (setCaretPos(i))
- draw();
-}
-
-
-void EditTextWidget::drawWidget() {
- g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x+_w, _y+_h), 0, ThemeEngine::kWidgetBackgroundEditText);
-
- // Draw the text
- adjustOffset();
- g_gui.theme()->drawText(Common::Rect(_x+2+ _leftPadding,_y+2, _x+_leftPadding+getEditRect().width()+2, _y+_h-2), _editString, _state, Graphics::kTextAlignLeft, ThemeEngine::kTextInversionNone, -_editScrollOffset, false, _font);
-}
-
-Common::Rect EditTextWidget::getEditRect() const {
- Common::Rect r(2 + _leftPadding, 2, _w - 2 - _leftPadding - _rightPadding, _h-1);
-
- return r;
-}
-
-void EditTextWidget::receivedFocusWidget() {
-}
-
-void EditTextWidget::lostFocusWidget() {
- // If we loose focus, 'commit' the user changes
- _backupString = _editString;
- drawCaret(true);
-}
-
-void EditTextWidget::startEditMode() {
-}
-
-void EditTextWidget::endEditMode() {
- releaseFocus();
-}
-
-void EditTextWidget::abortEditMode() {
- setEditString(_backupString);
- sendCommand(_cmd, 0);
- releaseFocus();
-}
-
-} // End of namespace GUI
Deleted: scummvm/trunk/gui/EditTextWidget.h
===================================================================
--- scummvm/trunk/gui/EditTextWidget.h 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/EditTextWidget.h 2010-11-16 10:11:57 UTC (rev 54264)
@@ -1,69 +0,0 @@
-/* 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.
- *
- * $URL$
- * $Id$
- */
-
-#ifndef GUI_EDITTEXTWIDGET_H
-#define GUI_EDITTEXTWIDGET_H
-
-#include "gui/editable.h"
-#include "common/str.h"
-
-namespace GUI {
-
-/* EditTextWidget */
-class EditTextWidget : public EditableWidget {
-protected:
- typedef Common::String String;
-
- String _backupString;
-
- int _leftPadding;
- int _rightPadding;
-
-public:
- EditTextWidget(GuiObject *boss, int x, int y, int w, int h, const String &text, const char *tooltip = 0, uint32 cmd = 0);
- EditTextWidget(GuiObject *boss, const String &name, const String &text, const char *tooltp = 0, uint32 cmd = 0);
-
- void setEditString(const String &str);
-
- virtual void handleMouseDown(int x, int y, int button, int clickCount);
-
- virtual bool wantsFocus() { return true; }
-
- virtual void reflowLayout();
-
-protected:
- void drawWidget();
- void receivedFocusWidget();
- void lostFocusWidget();
-
- void startEditMode();
- void endEditMode();
- void abortEditMode();
-
- Common::Rect getEditRect() const;
-};
-
-} // End of namespace GUI
-
-#endif
Modified: scummvm/trunk/gui/KeysDialog.h
===================================================================
--- scummvm/trunk/gui/KeysDialog.h 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/KeysDialog.h 2010-11-16 10:11:57 UTC (rev 54264)
@@ -28,7 +28,7 @@
#include "gui/GuiManager.h"
#include "gui/dialog.h"
-#include "gui/ListWidget.h"
+#include "gui/widgets/list.h"
#include "common/str.h"
#include "common/translation.h"
Deleted: scummvm/trunk/gui/ListWidget.cpp
===================================================================
--- scummvm/trunk/gui/ListWidget.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/ListWidget.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -1,734 +0,0 @@
-/* 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.
- *
- * $URL$
- * $Id$
- */
-
-#include "common/system.h"
-#include "common/events.h"
-#include "common/frac.h"
-#include "common/tokenizer.h"
-
-#include "gui/ListWidget.h"
-#include "gui/ScrollBarWidget.h"
-#include "gui/dialog.h"
-#include "gui/GuiManager.h"
-
-#include "gui/ThemeEval.h"
-
-namespace GUI {
-
-ListWidget::ListWidget(Dialog *boss, const String &name, const char *tooltip, uint32 cmd)
- : EditableWidget(boss, name, tooltip), _cmd(cmd) {
-
- _scrollBar = NULL;
- _textWidth = NULL;
-
- // This ensures that _entriesPerPage is properly initialised.
- reflowLayout();
-
- _scrollBar = new ScrollBarWidget(this, _w - _scrollBarWidth + 1, 0, _scrollBarWidth, _h);
- _scrollBar->setTarget(this);
-
- setFlags(WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS | WIDGET_WANT_TICKLE);
- _type = kListWidget;
- _editMode = false;
- _numberingMode = kListNumberingOne;
- _currentPos = 0;
- _selectedItem = -1;
- _currentKeyDown = 0;
-
- _quickSelectTime = 0;
-
- // The item is selected, thus _bgcolor is used to draw the caret and _textcolorhi to erase it
- _caretInverse = true;
-
- // FIXME: This flag should come from widget definition
- _editable = true;
-
- _quickSelect = true;
- _editColor = ThemeEngine::kFontColorNormal;
-}
-
-ListWidget::ListWidget(Dialog *boss, int x, int y, int w, int h, const char *tooltip, uint32 cmd)
- : EditableWidget(boss, x, y, w, h, tooltip), _cmd(cmd) {
-
- _scrollBar = NULL;
- _textWidth = NULL;
-
- // This ensures that _entriesPerPage is properly initialised.
- reflowLayout();
-
- _scrollBar = new ScrollBarWidget(this, _w - _scrollBarWidth + 1, 0, _scrollBarWidth, _h);
- _scrollBar->setTarget(this);
-
- setFlags(WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS | WIDGET_WANT_TICKLE);
- _type = kListWidget;
- _editMode = false;
- _numberingMode = kListNumberingOne;
- _currentPos = 0;
- _selectedItem = -1;
- _currentKeyDown = 0;
-
- _quickSelectTime = 0;
-
- // The item is selected, thus _bgcolor is used to draw the caret and _textcolorhi to erase it
- _caretInverse = true;
-
- // FIXME: This flag should come from widget definition
- _editable = true;
-}
-
-ListWidget::~ListWidget() {
- delete[] _textWidth;
-}
-
-Widget *ListWidget::findWidget(int x, int y) {
- if (x >= _w - _scrollBarWidth)
- return _scrollBar;
-
- return this;
-}
-
-void ListWidget::setSelected(int item) {
- // HACK/FIXME: If our _listIndex has a non zero size,
- // we will need to look up, whether the user selected
- // item is present in that list
- if (_listIndex.size()) {
- int filteredItem = -1;
-
- for (uint i = 0; i < _listIndex.size(); ++i) {
- if (_listIndex[i] == item) {
- filteredItem = i;
- break;
- }
- }
-
- item = filteredItem;
- }
-
- assert(item >= -1 && item < (int)_list.size());
-
- // We only have to do something if the widget is enabled and the selection actually changes
- if (isEnabled() && _selectedItem != item) {
- if (_editMode)
- abortEditMode();
-
- _selectedItem = item;
-
- // Notify clients that the selection changed.
- sendCommand(kListSelectionChangedCmd, _selectedItem);
-
- _currentPos = _selectedItem - _entriesPerPage / 2;
- scrollToCurrent();
- draw();
- }
-}
-
-ThemeEngine::FontColor ListWidget::getSelectionColor() const {
- if (_listColors.empty())
- return ThemeEngine::kFontColorNormal;
-
- if (_filter.empty())
- return _listColors[_selectedItem];
- else
- return _listColors[_listIndex[_selectedItem]];
-}
-
-void ListWidget::setList(const StringArray &list, const ColorList *colors) {
- if (_editMode && _caretVisible)
- drawCaret(true);
-
- // Copy everything
- _dataList = list;
- _list = list;
- _filter.clear();
- _listIndex.clear();
- _listColors.clear();
-
- if (colors) {
- _listColors = *colors;
- assert(_listColors.size() == _dataList.size());
- }
-
- int size = list.size();
- if (_currentPos >= size)
- _currentPos = size - 1;
- if (_currentPos < 0)
- _currentPos = 0;
- _selectedItem = -1;
- _editMode = false;
- g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
- scrollBarRecalc();
-}
-
-void ListWidget::append(const String &s, ThemeEngine::FontColor color) {
- if (_dataList.size() == _listColors.size()) {
- // If the color list has the size of the data list, we append the color.
- _listColors.push_back(color);
- } else if (!_listColors.size() && color != ThemeEngine::kFontColorNormal) {
- // If it's the first entry to use a non default color, we will fill
- // up all other entries of the color list with the default color and
- // add the requested color for the new entry.
- for (uint i = 0; i < _dataList.size(); ++i)
- _listColors.push_back(ThemeEngine::kFontColorNormal);
- _listColors.push_back(color);
- }
-
- _dataList.push_back(s);
- _list.push_back(s);
-
- setFilter(_filter, false);
-
- scrollBarRecalc();
-}
-
-void ListWidget::scrollTo(int item) {
- int size = _list.size();
- if (item >= size)
- item = size - 1;
- if (item < 0)
- item = 0;
-
- if (_currentPos != item) {
- _currentPos = item;
- scrollBarRecalc();
- }
-}
-
-void ListWidget::scrollBarRecalc() {
- _scrollBar->_numEntries = _list.size();
- _scrollBar->_entriesPerPage = _entriesPerPage;
- _scrollBar->_currentPos = _currentPos;
- _scrollBar->recalc();
-}
-
-void ListWidget::handleTickle() {
- if (_editMode)
- EditableWidget::handleTickle();
-}
-
-void ListWidget::handleMouseDown(int x, int y, int button, int clickCount) {
- if (!isEnabled())
- return;
-
- // First check whether the selection changed
- int newSelectedItem = findItem(x, y);
-
- if (_selectedItem != newSelectedItem && newSelectedItem != -1) {
- if (_editMode)
- abortEditMode();
- _selectedItem = newSelectedItem;
- sendCommand(kListSelectionChangedCmd, _selectedItem);
- }
-
- // TODO: Determine where inside the string the user clicked and place the
- // caret accordingly.
- // See _editScrollOffset and EditTextWidget::handleMouseDown.
- draw();
-
-}
-
-void ListWidget::handleMouseUp(int x, int y, int button, int clickCount) {
- // If this was a double click and the mouse is still over
- // the selected item, send the double click command
- if (clickCount == 2 && (_selectedItem == findItem(x, y)) &&
- _selectedItem >= 0) {
- sendCommand(kListItemDoubleClickedCmd, _selectedItem);
- }
-}
-
-void ListWidget::handleMouseWheel(int x, int y, int direction) {
- _scrollBar->handleMouseWheel(x, y, direction);
-}
-
-
-int ListWidget::findItem(int x, int y) const {
- if (y < _topPadding) return -1;
- int item = (y - _topPadding) / kLineHeight + _currentPos;
- if (item >= _currentPos && item < _currentPos + _entriesPerPage &&
- item < (int)_list.size())
- return item;
- else
- return -1;
-}
-
-static int matchingCharsIgnoringCase(const char *x, const char *y, bool &stop) {
- int match = 0;
- while (*x && *y && tolower(*x) == tolower(*y)) {
- ++x;
- ++y;
- ++match;
- }
- stop = !*y || (*x && (tolower(*x) >= tolower(*y)));
- return match;
-}
-
-bool ListWidget::handleKeyDown(Common::KeyState state) {
- bool handled = true;
- bool dirty = false;
- int oldSelectedItem = _selectedItem;
-
- if (!_editMode && state.keycode <= Common::KEYCODE_z && isprint((unsigned char)state.ascii)) {
- // Quick selection mode: Go to first list item starting with this key
- // (or a substring accumulated from the last couple key presses).
- // Only works in a useful fashion if the list entries are sorted.
- uint32 time = g_system->getMillis();
- if (_quickSelectTime < time) {
- _quickSelectStr = (char)state.ascii;
- } else {
- _quickSelectStr += (char)state.ascii;
- }
- _quickSelectTime = time + 300; // TODO: Turn this into a proper constant (kQuickSelectDelay ?)
-
- if (_quickSelect) {
- // FIXME: This is bad slow code (it scans the list linearly each time a
- // key is pressed); it could be much faster. Only of importance if we have
- // quite big lists to deal with -- so for now we can live with this lazy
- // implementation :-)
- int newSelectedItem = 0;
- int bestMatch = 0;
- bool stop;
- for (StringArray::const_iterator i = _list.begin(); i != _list.end(); ++i) {
- const int match = matchingCharsIgnoringCase(i->c_str(), _quickSelectStr.c_str(), stop);
- if (match > bestMatch || stop) {
- _selectedItem = newSelectedItem;
- bestMatch = match;
- if (stop)
- break;
- }
- newSelectedItem++;
- }
-
- scrollToCurrent();
- } else {
- sendCommand(_cmd, 0);
- }
- } else if (_editMode) {
- // Class EditableWidget handles all text editing related key presses for us
- handled = EditableWidget::handleKeyDown(state);
- } else {
- // not editmode
-
- switch (state.keycode) {
- case Common::KEYCODE_RETURN:
- case Common::KEYCODE_KP_ENTER:
- if (_selectedItem >= 0) {
- // override continuous enter keydown
- if (_editable && (_currentKeyDown != Common::KEYCODE_RETURN && _currentKeyDown != Common::KEYCODE_KP_ENTER)) {
- dirty = true;
- startEditMode();
- } else
- sendCommand(kListItemActivatedCmd, _selectedItem);
- }
- break;
-
- // Keypad & special keys
- // - if num lock is set, we do not handle the keypress
- // - if num lock is not set, we either fall down to the special key case
- // or ignore the key press for 0, 4, 5 and 6
-
- case Common::KEYCODE_KP_PERIOD:
- if (state.flags & Common::KBD_NUM) {
- handled = false;
- break;
- }
- case Common::KEYCODE_BACKSPACE:
- case Common::KEYCODE_DELETE:
- if (_selectedItem >= 0) {
- if (_editable) {
- // Ignore delete and backspace when the list item is editable
- } else {
- sendCommand(kListItemRemovalRequestCmd, _selectedItem);
- }
- }
- break;
-
- case Common::KEYCODE_KP1:
- if (state.flags & Common::KBD_NUM) {
- handled = false;
- break;
- }
- case Common::KEYCODE_END:
- _selectedItem = _list.size() - 1;
- break;
-
-
- case Common::KEYCODE_KP2:
- if (state.flags & Common::KBD_NUM) {
- handled = false;
- break;
- }
- case Common::KEYCODE_DOWN:
- if (_selectedItem < (int)_list.size() - 1)
- _selectedItem++;
- break;
-
- case Common::KEYCODE_KP3:
- if (state.flags & Common::KBD_NUM) {
- handled = false;
- break;
- }
- case Common::KEYCODE_PAGEDOWN:
- _selectedItem += _entriesPerPage - 1;
- if (_selectedItem >= (int)_list.size() )
- _selectedItem = _list.size() - 1;
- break;
-
- case Common::KEYCODE_KP7:
- if (state.flags & Common::KBD_NUM) {
- handled = false;
- break;
- }
- case Common::KEYCODE_HOME:
- _selectedItem = 0;
- break;
-
- case Common::KEYCODE_KP8:
- if (state.flags & Common::KBD_NUM) {
- handled = false;
- break;
- }
- case Common::KEYCODE_UP:
- if (_selectedItem > 0)
- _selectedItem--;
- break;
-
- case Common::KEYCODE_KP9:
- if (state.flags & Common::KBD_NUM) {
- handled = false;
- break;
- }
- case Common::KEYCODE_PAGEUP:
- _selectedItem -= _entriesPerPage - 1;
- if (_selectedItem < 0)
- _selectedItem = 0;
- break;
-
- default:
- handled = false;
- }
-
- scrollToCurrent();
- }
-
- if (dirty || _selectedItem != oldSelectedItem)
- draw();
-
- if (_selectedItem != oldSelectedItem) {
- sendCommand(kListSelectionChangedCmd, _selectedItem);
- // also draw scrollbar
- _scrollBar->draw();
- }
-
- return handled;
-}
-
-bool ListWidget::handleKeyUp(Common::KeyState state) {
- if (state.keycode == _currentKeyDown)
- _currentKeyDown = 0;
- return true;
-}
-
-void ListWidget::receivedFocusWidget() {
- _inversion = ThemeEngine::kTextInversionFocus;
-
- // Redraw the widget so the selection color will change
- draw();
-}
-
-void ListWidget::lostFocusWidget() {
- _inversion = ThemeEngine::kTextInversion;
-
- // If we lose focus, we simply forget the user changes
- _editMode = false;
- g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
- drawCaret(true);
- draw();
-}
-
-void ListWidget::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
- switch (cmd) {
- case kSetPositionCmd:
- if (_currentPos != (int)data) {
- _currentPos = data;
- draw();
-
- // Scrollbar actions cause list focus (which triggers a redraw)
- // NOTE: ListWidget's boss is always GUI::Dialog
- ((GUI::Dialog *)_boss)->setFocusWidget(this);
- }
- break;
- }
-}
-
-void ListWidget::drawWidget() {
- int i, pos, len = _list.size();
- Common::String buffer;
-
- // Draw a thin frame around the list.
- g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x + _w, _y + _h), 0, ThemeEngine::kWidgetBackgroundBorder);
- const int scrollbarW = (_scrollBar && _scrollBar->isVisible()) ? _scrollBarWidth : 0;
-
- // Draw the list items
- for (i = 0, pos = _currentPos; i < _entriesPerPage && pos < len; i++, pos++) {
- const int y = _y + _topPadding + kLineHeight * i;
- const int fontHeight = kLineHeight;
- ThemeEngine::TextInversionState inverted = ThemeEngine::kTextInversionNone;
-
- // Draw the selected item inverted, on a highlighted background.
- if (_selectedItem == pos)
- inverted = _inversion;
-
- Common::Rect r(getEditRect());
- int pad = _leftPadding;
-
- // If in numbering mode, we first print a number prefix
- if (_numberingMode != kListNumberingOff) {
- char temp[10];
- sprintf(temp, "%2d. ", (pos + _numberingMode));
- buffer = temp;
- g_gui.theme()->drawText(Common::Rect(_x, y, _x + r.left + _leftPadding, y + fontHeight - 2),
- buffer, _state, Graphics::kTextAlignLeft, inverted, _leftPadding, true);
- pad = 0;
- }
-
- int width;
-
- ThemeEngine::FontColor color = ThemeEngine::kFontColorNormal;
-
- if (!_listColors.empty()) {
- if (_filter.empty() || _selectedItem == -1)
- color = _listColors[pos];
- else
- color = _listColors[_listIndex[pos]];
- }
-
- if (_selectedItem == pos && _editMode) {
- buffer = _editString;
- color = _editColor;
- adjustOffset();
- width = _w - r.left - _hlRightPadding - _leftPadding - scrollbarW;
- g_gui.theme()->drawText(Common::Rect(_x + r.left, y, _x + r.left + width, y + fontHeight - 2), buffer, _state,
- Graphics::kTextAlignLeft, inverted, pad, true, ThemeEngine::kFontStyleBold, color);
- } else {
- buffer = _list[pos];
- width = _w - r.left - scrollbarW;
- g_gui.theme()->drawText(Common::Rect(_x + r.left, y, _x + r.left + width, y + fontHeight - 2), buffer, _state,
- Graphics::kTextAlignLeft, inverted, pad, true, ThemeEngine::kFontStyleBold, color);
- }
-
- _textWidth[i] = width;
- }
-}
-
-Common::Rect ListWidget::getEditRect() const {
- Common::Rect r(_hlLeftPadding, 0, _w - _hlLeftPadding - _hlRightPadding, kLineHeight - 1);
- const int offset = (_selectedItem - _currentPos) * kLineHeight + _topPadding;
- r.top += offset;
- r.bottom += offset;
-
- if (_numberingMode != kListNumberingOff) {
- char temp[10];
- // FIXME: Assumes that all digits have the same width.
- sprintf(temp, "%2d. ", (_list.size() - 1 + _numberingMode));
- r.left += g_gui.getStringWidth(temp) + _leftPadding;
- }
-
- return r;
-}
-
-void ListWidget::scrollToCurrent() {
- // Only do something if the current item is not in our view port
- if (_selectedItem < _currentPos) {
- // it's above our view
- _currentPos = _selectedItem;
- } else if (_selectedItem >= _currentPos + _entriesPerPage ) {
- // it's below our view
- _currentPos = _selectedItem - _entriesPerPage + 1;
- }
-
- if (_currentPos < 0 || _entriesPerPage > (int)_list.size())
- _currentPos = 0;
- else if (_currentPos + _entriesPerPage > (int)_list.size())
- _currentPos = _list.size() - _entriesPerPage;
-
- _scrollBar->_currentPos = _currentPos;
- _scrollBar->recalc();
-}
-
-void ListWidget::scrollToEnd() {
- if (_currentPos + _entriesPerPage < (int)_list.size()) {
- _currentPos = _list.size() - _entriesPerPage;
- } else {
- return;
- }
-
- _scrollBar->_currentPos = _currentPos;
- _scrollBar->recalc();
- _scrollBar->draw();
-}
-
-void ListWidget::startEditMode() {
- if (_editable && !_editMode && _selectedItem >= 0) {
- _editMode = true;
- setEditString(_list[_selectedItem]);
- if (_listColors.empty()) {
- _editColor = ThemeEngine::kFontColorNormal;
- } else {
- if (_filter.empty())
- _editColor = _listColors[_selectedItem];
- else
- _editColor = _listColors[_listIndex[_selectedItem]];
- }
- draw();
- g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true);
- }
-}
-
-void ListWidget::endEditMode() {
- if (!_editMode)
- return;
- // send a message that editing finished with a return/enter key press
- _editMode = false;
- _list[_selectedItem] = _editString;
- g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
- sendCommand(kListItemActivatedCmd, _selectedItem);
-}
-
-void ListWidget::abortEditMode() {
- // undo any changes made
- assert(_selectedItem >= 0);
- _editMode = false;
- //drawCaret(true);
- //draw();
- g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
-}
-
-void ListWidget::reflowLayout() {
- Widget::reflowLayout();
-
- _leftPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.Padding.Left", 0);
- _rightPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.Padding.Right", 0);
- _topPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.Padding.Top", 0);
- _bottomPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.Padding.Bottom", 0);
- _hlLeftPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.hlLeftPadding", 0);
- _hlRightPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.hlRightPadding", 0);
-
- _scrollBarWidth = g_gui.xmlEval()->getVar("Globals.Scrollbar.Width", 0);
-
- // HACK: Once we take padding into account, there are times where
- // integer rounding leaves a big chunk of white space in the bottom
- // of the list.
- // We do a rough rounding on the decimal places of Entries Per Page,
- // to add another entry even if it goes a tad over the padding.
- frac_t entriesPerPage = intToFrac(_h - _topPadding - _bottomPadding) / kLineHeight;
-
- // Our threshold before we add another entry is 0.9375 (0xF000 with FRAC_BITS being 16).
- const frac_t threshold = intToFrac(15) / 16;
-
- if ((frac_t)(entriesPerPage & FRAC_LO_MASK) >= threshold)
- entriesPerPage += FRAC_ONE;
-
- _entriesPerPage = fracToInt(entriesPerPage);
- assert(_entriesPerPage > 0);
-
- delete[] _textWidth;
- _textWidth = new int[_entriesPerPage];
-
- for (int i = 0; i < _entriesPerPage; i++)
- _textWidth[i] = 0;
-
- if (_scrollBar) {
- _scrollBar->resize(_w - _scrollBarWidth + 1, 0, _scrollBarWidth, _h);
- scrollBarRecalc();
- scrollToCurrent();
- }
-}
-
-void ListWidget::setFilter(const String &filter, bool redraw) {
- // FIXME: This method does not deal correctly with edit mode!
- // Until we fix that, let's make sure it isn't called while editing takes place
- assert(!_editMode);
-
- String filt = filter;
- filt.toLowercase();
-
- if (_filter == filt) // Filter was not changed
- return;
-
- _filter = filt;
-
- if (_filter.empty()) {
- // No filter -> display everything
- _list = _dataList;
- _listIndex.clear();
- } else {
- // Restrict the list to everything which contains all words in _filter
- // as substrings, ignoring case.
-
- Common::StringTokenizer tok(_filter);
- String tmp;
- int n = 0;
-
- _list.clear();
- _listIndex.clear();
-
- for (StringArray::iterator i = _dataList.begin(); i != _dataList.end(); ++i, ++n) {
- tmp = *i;
- tmp.toLowercase();
- bool matches = true;
- tok.reset();
- while (!tok.empty()) {
- if (!tmp.contains(tok.nextToken())) {
- matches = false;
- break;
- }
- }
-
- if (matches) {
- _list.push_back(*i);
- _listIndex.push_back(n);
- }
- }
- }
-
- _currentPos = 0;
- _selectedItem = -1;
-
- if (redraw) {
- scrollBarRecalc();
- // Redraw the whole dialog. This is annoying, as this might be rather
- // expensive when really only the list widget and its scroll bar area
- // to be redrawn. However, since the scrollbar might change its
- // visibility status, and the list its width, we cannot just redraw
- // the two.
- // TODO: A more efficient (and elegant?) way to handle this would be to
- // introduce a kind of "BoxWidget" or "GroupWidget" which defines a
- // rectangular region and subwidgets can be placed within it.
- // Such a widget could also (optionally) draw a border (or even different
- // kinds of borders) around the objects it groups; and also a 'title'
- // (I am borrowing these "ideas" from the NSBox class in Cocoa :).
- _boss->draw();
- }
-}
-
-} // End of namespace GUI
Deleted: scummvm/trunk/gui/ListWidget.h
===================================================================
--- scummvm/trunk/gui/ListWidget.h 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/ListWidget.h 2010-11-16 10:11:57 UTC (rev 54264)
@@ -1,157 +0,0 @@
-/* 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.
- *
- * $URL$
- * $Id$
- */
-
-#ifndef GUI_LISTWIDGET_H
-#define GUI_LISTWIDGET_H
-
-#include "gui/editable.h"
-#include "common/str.h"
-
-#include "gui/ThemeEngine.h"
-
-namespace GUI {
-
-class ScrollBarWidget;
-
-enum NumberingMode {
- kListNumberingOff = -1,
- kListNumberingZero = 0,
- kListNumberingOne = 1
-};
-
-/// Some special commands
-enum {
- kListItemDoubleClickedCmd = 'LIdb', ///< double click on item - 'data' will be item index
- kListItemActivatedCmd = 'LIac', ///< item activated by return/enter - 'data' will be item index
- kListItemRemovalRequestCmd = 'LIrm', ///< request to remove the item with the delete/backspace keys - 'data' will be item index
- kListSelectionChangedCmd = 'Lsch' ///< selection changed - 'data' will be item index
-};
-
-/* ListWidget */
-class ListWidget : public EditableWidget {
-public:
- typedef Common::String String;
- typedef Common::Array<Common::String> StringArray;
- typedef Common::Array<ThemeEngine::FontColor> ColorList;
-protected:
- StringArray _list;
- StringArray _dataList;
- ColorList _listColors;
- Common::Array<int> _listIndex;
- bool _editable;
- bool _editMode;
- NumberingMode _numberingMode;
- int _currentPos;
- int _entriesPerPage;
- int _selectedItem;
- ScrollBarWidget *_scrollBar;
- int _currentKeyDown;
-
- String _quickSelectStr;
- uint32 _quickSelectTime;
-
- int _hlLeftPadding;
- int _hlRightPadding;
- int _leftPadding;
- int _rightPadding;
- int _topPadding;
- int _bottomPadding;
- int _scrollBarWidth;
-
- String _filter;
- bool _quickSelect;
-
- uint32 _cmd;
-
- ThemeEngine::FontColor _editColor;
-
-public:
- ListWidget(Dialog *boss, const String &name, const char *tooltip = 0, uint32 cmd = 0);
- ListWidget(Dialog *boss, int x, int y, int w, int h, const char *tooltip = 0, uint32 cmd = 0);
- virtual ~ListWidget();
-
- virtual Widget *findWidget(int x, int y);
-
- void setList(const StringArray &list, const ColorList *colors = 0);
- const StringArray &getList() const { return _dataList; }
-
- void append(const String &s, ThemeEngine::FontColor color = ThemeEngine::kFontColorNormal);
-
- void setSelected(int item);
- int getSelected() const { return (_filter.empty() || _selectedItem == -1) ? _selectedItem : _listIndex[_selectedItem]; }
-
- const String &getSelectedString() const { return _list[_selectedItem]; }
- ThemeEngine::FontColor getSelectionColor() const;
-
- void setNumberingMode(NumberingMode numberingMode) { _numberingMode = numberingMode; }
-
- void scrollTo(int item);
- void scrollToEnd();
-
- void enableQuickSelect(bool enable) { _quickSelect = enable; }
- String getQuickSelectString() const { return _quickSelectStr; }
-
- bool isEditable() const { return _editable; }
- void setEditable(bool editable) { _editable = editable; }
- void setEditColor(ThemeEngine::FontColor color) { _editColor = color; }
-
- // Made startEditMode/endEditMode for SaveLoadChooser
- void startEditMode();
- void endEditMode();
-
- void setFilter(const String &filter, bool redraw = true);
-
- virtual void handleTickle();
- virtual void handleMouseDown(int x, int y, int button, int clickCount);
- virtual void handleMouseUp(int x, int y, int button, int clickCount);
- virtual void handleMouseWheel(int x, int y, int direction);
- virtual bool handleKeyDown(Common::KeyState state);
- virtual bool handleKeyUp(Common::KeyState state);
- virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data);
-
- virtual void reflowLayout();
-
- virtual bool wantsFocus() { return true; }
-
-protected:
- void drawWidget();
-
- /// Finds the item at position (x,y). Returns -1 if there is no item there.
- int findItem(int x, int y) const;
- void scrollBarRecalc();
-
- void abortEditMode();
-
- Common::Rect getEditRect() const;
-
- void receivedFocusWidget();
- void lostFocusWidget();
- void scrollToCurrent();
-
- int *_textWidth;
-};
-
-} // End of namespace GUI
-
-#endif
Deleted: scummvm/trunk/gui/PopUpWidget.cpp
===================================================================
--- scummvm/trunk/gui/PopUpWidget.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/PopUpWidget.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -1,463 +0,0 @@
-/* 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.
- *
- * $URL$
- * $Id$
- */
-
-#include "common/system.h"
-#include "common/events.h"
-#include "gui/dialog.h"
-#include "gui/GuiManager.h"
-#include "gui/PopUpWidget.h"
-#include "engines/engine.h"
-
-#include "gui/ThemeEval.h"
-
-namespace GUI {
-
-//
-// PopUpDialog
-//
-
-class PopUpDialog : public Dialog {
-protected:
- PopUpWidget *_popUpBoss;
- int _clickX, _clickY;
- byte *_buffer;
- int _selection;
- uint32 _openTime;
- bool _twoColumns;
- int _entriesPerColumn;
-
- int _leftPadding;
- int _rightPadding;
-
-public:
- PopUpDialog(PopUpWidget *boss, int clickX, int clickY);
-
- void drawDialog();
-
- void handleMouseUp(int x, int y, int button, int clickCount);
- void handleMouseWheel(int x, int y, int direction); // Scroll through entries with scroll wheel
- void handleMouseMoved(int x, int y, int button); // Redraw selections depending on mouse position
- void handleKeyDown(Common::KeyState state); // Scroll through entries with arrow keys etc.
-
-protected:
- void drawMenuEntry(int entry, bool hilite);
-
- int findItem(int x, int y) const;
- void setSelection(int item);
- bool isMouseDown();
-
- void moveUp();
- void moveDown();
-};
-
-PopUpDialog::PopUpDialog(PopUpWidget *boss, int clickX, int clickY)
- : Dialog(0, 0, 16, 16),
- _popUpBoss(boss) {
-
- // Copy the selection index
- _selection = _popUpBoss->_selectedItem;
-
- // Calculate real popup dimensions
- _x = _popUpBoss->getAbsX();
- _y = _popUpBoss->getAbsY() - _popUpBoss->_selectedItem * kLineHeight;
- _h = _popUpBoss->_entries.size() * kLineHeight + 2;
- _w = _popUpBoss->_w - kLineHeight + 2;
-
- _leftPadding = _popUpBoss->_leftPadding;
- _rightPadding = _popUpBoss->_rightPadding;
-
- // Perform clipping / switch to scrolling mode if we don't fit on the screen
- // FIXME - OSystem should send out notification messages when the screen
- // resolution changes... we could generalize CommandReceiver and CommandSender.
-
- const int screenH = g_system->getOverlayHeight();
-
- // HACK: For now, we do not do scrolling. Instead, we draw the dialog
- // in two columns if it's too tall.
-
- if (_h >= screenH) {
- const int screenW = g_system->getOverlayWidth();
-
- _twoColumns = true;
- _entriesPerColumn = _popUpBoss->_entries.size() / 2;
-
- if (_popUpBoss->_entries.size() & 1)
- _entriesPerColumn++;
-
- _h = _entriesPerColumn * kLineHeight + 2;
- _w = 0;
-
- for (uint i = 0; i < _popUpBoss->_entries.size(); i++) {
- int width = g_gui.getStringWidth(_popUpBoss->_entries[i].name);
-
- if (width > _w)
- _w = width;
- }
-
- _w = 2 * _w + 10;
-
- if (!(_w & 1))
- _w++;
-
- if (_popUpBoss->_selectedItem >= _entriesPerColumn) {
- _x -= _w / 2;
- _y = _popUpBoss->getAbsY() - (_popUpBoss->_selectedItem - _entriesPerColumn) * kLineHeight;
- }
-
- if (_w >= screenW)
- _w = screenW - 1;
- if (_x < 0)
- _x = 0;
- if (_x + _w >= screenW)
- _x = screenW - 1 - _w;
- } else
- _twoColumns = false;
-
- if (_h >= screenH)
- _h = screenH - 1;
- if (_y < 0)
- _y = 0;
- else if (_y + _h >= screenH)
- _y = screenH - 1 - _h;
-
- // TODO - implement scrolling if we had to move the menu, or if there are too many entries
-
- // Remember original mouse position
- _clickX = clickX - _x;
- _clickY = clickY - _y;
-
- _openTime = 0;
-}
-
-void PopUpDialog::drawDialog() {
- // Draw the menu border
- g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x+_w, _y+_h), 0);
-
- /*if (_twoColumns)
- g_gui.vLine(_x + _w / 2, _y, _y + _h - 2, g_gui._color);*/
-
- // Draw the entries
- int count = _popUpBoss->_entries.size();
- for (int i = 0; i < count; i++) {
- drawMenuEntry(i, i == _selection);
- }
-
- // The last entry may be empty. Fill it with black.
- /*if (_twoColumns && (count & 1)) {
- g_gui.fillRect(_x + 1 + _w / 2, _y + 1 + kLineHeight * (_entriesPerColumn - 1), _w / 2 - 1, kLineHeight, g_gui._bgcolor);
- }*/
-
- if (_openTime == 0) {
- // Time the popup was opened
- _openTime = g_system->getMillis();
- }
-}
-
-void PopUpDialog::handleMouseUp(int x, int y, int button, int clickCount) {
- // Mouse was released. If it wasn't moved much since the original mouse down,
- // let the popup stay open. If it did move, assume the user made his selection.
- int dist = (_clickX - x) * (_clickX - x) + (_clickY - y) * (_clickY - y);
- if (dist > 3 * 3 || g_system->getMillis() - _openTime > 300) {
- setResult(_selection);
- close();
- }
- _clickX = -1;
- _clickY = -1;
- _openTime = (uint32)-1;
-}
-
-void PopUpDialog::handleMouseWheel(int x, int y, int direction) {
- if (direction < 0)
- moveUp();
- else if (direction > 0)
- moveDown();
-}
-
-void PopUpDialog::handleMouseMoved(int x, int y, int button) {
- // Compute over which item the mouse is...
- int item = findItem(x, y);
-
- if (item >= 0 && _popUpBoss->_entries[item].name.size() == 0)
- item = -1;
-
- if (item == -1 && !isMouseDown()) {
- setSelection(_popUpBoss->_selectedItem);
- return;
- }
-
- // ...and update the selection accordingly
- setSelection(item);
-}
-
-void PopUpDialog::handleKeyDown(Common::KeyState state) {
- if (state.keycode == Common::KEYCODE_ESCAPE) {
- // Don't change the previous selection
- setResult(-1);
- close();
- return;
- }
-
- if (isMouseDown())
- return;
-
- switch (state.keycode) {
-
- case Common::KEYCODE_RETURN:
- case Common::KEYCODE_KP_ENTER:
- setResult(_selection);
- close();
- break;
-
- // Keypad & special keys
- // - if num lock is set, we ignore the keypress
- // - if num lock is not set, we fall down to the special key case
-
- case Common::KEYCODE_KP1:
- if (state.flags & Common::KBD_NUM)
- break;
- case Common::KEYCODE_END:
- setSelection(_popUpBoss->_entries.size()-1);
- break;
-
- case Common::KEYCODE_KP2:
- if (state.flags & Common::KBD_NUM)
- break;
- case Common::KEYCODE_DOWN:
- moveDown();
- break;
-
- case Common::KEYCODE_KP7:
- if (state.flags & Common::KBD_NUM)
- break;
- case Common::KEYCODE_HOME:
- setSelection(0);
- break;
-
- case Common::KEYCODE_KP8:
- if (state.flags & Common::KBD_NUM)
- break;
- case Common::KEYCODE_UP:
- moveUp();
- break;
-
- default:
- break;
- }
-}
-
-int PopUpDialog::findItem(int x, int y) const {
- if (x >= 0 && x < _w && y >= 0 && y < _h) {
- if (_twoColumns) {
- uint entry = (y - 2) / kLineHeight;
- if (x > _w / 2) {
- entry += _entriesPerColumn;
-
- if (entry >= _popUpBoss->_entries.size())
- return -1;
- }
- return entry;
- }
- return (y - 2) / kLineHeight;
- }
- return -1;
-}
-
-void PopUpDialog::setSelection(int item) {
- if (item != _selection) {
- // Undraw old selection
- if (_selection >= 0)
- drawMenuEntry(_selection, false);
-
- // Change selection
- _selection = item;
-
- // Draw new selection
- if (item >= 0)
- drawMenuEntry(item, true);
- }
-}
-
-bool PopUpDialog::isMouseDown() {
- // TODO/FIXME - need a way to determine whether any mouse buttons are pressed or not.
- // Sure, we could just count mouse button up/down events, but that is cumbersome and
- // error prone. Would be much nicer to add an API to OSystem for this...
-
- return false;
-}
-
-void PopUpDialog::moveUp() {
- if (_selection < 0) {
- setSelection(_popUpBoss->_entries.size() - 1);
- } else if (_selection > 0) {
- int item = _selection;
- do {
- item--;
- } while (item >= 0 && _popUpBoss->_entries[item].name.size() == 0);
- if (item >= 0)
- setSelection(item);
- }
-}
-
-void PopUpDialog::moveDown() {
- int lastItem = _popUpBoss->_entries.size() - 1;
-
- if (_selection < 0) {
- setSelection(0);
- } else if (_selection < lastItem) {
- int item = _selection;
- do {
- item++;
- } while (item <= lastItem && _popUpBoss->_entries[item].name.size() == 0);
- if (item <= lastItem)
- setSelection(item);
- }
-}
-
-void PopUpDialog::drawMenuEntry(int entry, bool hilite) {
- // Draw one entry of the popup menu, including selection
- assert(entry >= 0);
- int x, y, w;
-
- if (_twoColumns) {
- int n = _popUpBoss->_entries.size() / 2;
-
- if (_popUpBoss->_entries.size() & 1)
- n++;
-
- if (entry >= n) {
- x = _x + 1 + _w / 2;
- y = _y + 1 + kLineHeight * (entry - n);
- } else {
- x = _x + 1;
- y = _y + 1 + kLineHeight * entry;
- }
-
- w = _w / 2 - 1;
- } else {
- x = _x + 1;
- y = _y + 1 + kLineHeight * entry;
- w = _w - 2;
- }
-
- Common::String &name(_popUpBoss->_entries[entry].name);
-
- if (name.size() == 0) {
- // Draw a separator
- g_gui.theme()->drawLineSeparator(Common::Rect(x, y, x+w, y+kLineHeight));
- } else {
- g_gui.theme()->drawText(Common::Rect(x+1, y+2, x+w, y+2+kLineHeight), name, hilite ? ThemeEngine::kStateHighlight : ThemeEngine::kStateEnabled,
- Graphics::kTextAlignLeft, ThemeEngine::kTextInversionNone, _leftPadding);
- }
-}
-
-
-#pragma mark -
-
-//
-// PopUpWidget
-//
-
-PopUpWidget::PopUpWidget(GuiObject *boss, const String &name, const char *tooltip)
- : Widget(boss, name, tooltip), CommandSender(boss) {
- setFlags(WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS | WIDGET_IGNORE_DRAG);
- _type = kPopUpWidget;
-
- _selectedItem = -1;
-}
-
-void PopUpWidget::handleMouseDown(int x, int y, int button, int clickCount) {
- if (isEnabled()) {
- PopUpDialog popupDialog(this, x + getAbsX(), y + getAbsY());
- int newSel = popupDialog.runModal();
- if (newSel != -1 && _selectedItem != newSel) {
- _selectedItem = newSel;
- sendCommand(kPopUpItemSelectedCmd, _entries[_selectedItem].tag);
- }
- }
-}
-
-void PopUpWidget::handleMouseWheel(int x, int y, int direction) {
- int newSelection = _selectedItem + direction;
-
- // Skip separator entries
- while ((newSelection >= 0) && (newSelection < (int)_entries.size()) &&
- _entries[newSelection].name.equals("")) {
- newSelection += direction;
- }
-
- // Just update the selected item when we're in range
- if ((newSelection >= 0) && (newSelection < (int)_entries.size()) &&
- (newSelection != _selectedItem)) {
- _selectedItem = newSelection;
- draw();
- }
-}
-
-void PopUpWidget::reflowLayout() {
- _leftPadding = g_gui.xmlEval()->getVar("Globals.PopUpWidget.Padding.Left", 0);
- _rightPadding = g_gui.xmlEval()->getVar("Globals.PopUpWidget.Padding.Right", 0);
-
- Widget::reflowLayout();
-}
-
-void PopUpWidget::appendEntry(const String &entry, uint32 tag) {
- Entry e;
- e.name = entry;
- e.tag = tag;
- _entries.push_back(e);
-}
-
-void PopUpWidget::clearEntries() {
- _entries.clear();
- _selectedItem = -1;
-}
-
-void PopUpWidget::setSelected(int item) {
- if (item != _selectedItem) {
- if (item >= 0 && item < (int)_entries.size()) {
- _selectedItem = item;
- } else {
- _selectedItem = -1;
- }
- }
-}
-
-void PopUpWidget::setSelectedTag(uint32 tag) {
- uint item;
- for (item = 0; item < _entries.size(); ++item) {
- if (_entries[item].tag == tag) {
- setSelected(item);
- return;
- }
- }
-}
-
-void PopUpWidget::drawWidget() {
- Common::String sel;
- if (_selectedItem >= 0)
- sel = _entries[_selectedItem].name;
- g_gui.theme()->drawPopUpWidget(Common::Rect(_x, _y, _x + _w, _y + _h), sel, _leftPadding, _state, Graphics::kTextAlignLeft);
-}
-
-} // End of namespace GUI
Deleted: scummvm/trunk/gui/PopUpWidget.h
===================================================================
--- scummvm/trunk/gui/PopUpWidget.h 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/PopUpWidget.h 2010-11-16 10:11:57 UTC (rev 54264)
@@ -1,91 +0,0 @@
-/* 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.
- *
- * $URL$
- * $Id$
- */
-
-#ifndef POPUPWIDGET_H
-#define POPUPWIDGET_H
-
-#include "gui/widget.h"
-#include "common/str.h"
-#include "common/array.h"
-
-namespace GUI {
-
-enum {
- kPopUpItemSelectedCmd = 'POPs'
-};
-
-/**
- * Popup or dropdown widget which, when clicked, "pop up" a list of items and
- * lets the user pick on of them.
- *
- * Implementation wise, when the user selects an item, then a kPopUpItemSelectedCmd
- * is broadcast, with data being equal to the tag value of the selected entry.
- */
-class PopUpWidget : public Widget, public CommandSender {
- friend class PopUpDialog;
- typedef Common::String String;
-
- struct Entry {
- String name;
- uint32 tag;
- };
- typedef Common::Array<Entry> EntryList;
-protected:
- EntryList _entries;
- int _selectedItem;
-
- int _leftPadding;
- int _rightPadding;
-
-public:
- PopUpWidget(GuiObject *boss, const String &name, const char *tooltip = 0);
-
- void handleMouseDown(int x, int y, int button, int clickCount);
- void handleMouseWheel(int x, int y, int direction);
-
- void appendEntry(const String &entry, uint32 tag = (uint32)-1);
- void clearEntries();
- int numEntries() { return _entries.size(); }
-
- /** Select the entry at the given index. */
- void setSelected(int item);
-
- /** Select the first entry matching the given tag. */
- void setSelectedTag(uint32 tag);
-
- int getSelected() const { return _selectedItem; }
- uint32 getSelectedTag() const { return (_selectedItem >= 0) ? _entries[_selectedItem].tag : (uint32)-1; }
-// const String& getSelectedString() const { return (_selectedItem >= 0) ? _entries[_selectedItem].name : String::emptyString; }
-
- void handleMouseEntered(int button) { setFlags(WIDGET_HILITED); draw(); }
- void handleMouseLeft(int button) { clearFlags(WIDGET_HILITED); draw(); }
-
- virtual void reflowLayout();
-protected:
- void drawWidget();
-};
-
-} // End of namespace GUI
-
-#endif
Deleted: scummvm/trunk/gui/ScrollBarWidget.cpp
===================================================================
--- scummvm/trunk/gui/ScrollBarWidget.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/ScrollBarWidget.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -1,233 +0,0 @@
-/* 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.
- *
- * $URL$
- * $Id$
- */
-
-#include "ScrollBarWidget.h"
-#include "gui/dialog.h"
-#include "gui/GuiManager.h"
-
-#include "common/timer.h"
-
-namespace GUI {
-
-#define UP_DOWN_BOX_HEIGHT (_w+1)
-
-ScrollBarWidget::ScrollBarWidget(GuiObject *boss, int x, int y, int w, int h)
- : Widget (boss, x, y, w, h), CommandSender(boss) {
- setFlags(WIDGET_ENABLED | WIDGET_TRACK_MOUSE | WIDGET_CLEARBG | WIDGET_WANT_TICKLE);
- _type = kScrollBarWidget;
-
- _part = kNoPart;
- _sliderHeight = 0;
- _sliderPos = 0;
-
- _draggingPart = kNoPart;
- _sliderDeltaMouseDownPos = 0;
-
- _numEntries = 0;
- _entriesPerPage = 0;
- _currentPos = 0;
-}
-
-static void upArrowRepeater(void *ref) {
- ScrollBarWidget *sb = (ScrollBarWidget *)ref;
- int old_pos = sb->_currentPos;
-
- sb->_currentPos -= 3;
- sb->checkBounds(old_pos);
-
- g_system->getTimerManager()->removeTimerProc(&upArrowRepeater);
- g_system->getTimerManager()->installTimerProc(&upArrowRepeater, 1000000/10, ref);
-}
-
-static void downArrowRepeater(void *ref) {
- ScrollBarWidget *sb = (ScrollBarWidget *)ref;
- int old_pos = sb->_currentPos;
-
- sb->_currentPos += 3;
- sb->checkBounds(old_pos);
-
- g_system->getTimerManager()->removeTimerProc(&downArrowRepeater);
- g_system->getTimerManager()->installTimerProc(&downArrowRepeater, 1000000/10, ref);
-}
-
-void ScrollBarWidget::handleMouseDown(int x, int y, int button, int clickCount) {
- int old_pos = _currentPos;
-
- // Do nothing if there are less items than fit on one page
- if (_numEntries <= _entriesPerPage)
- return;
-
- if (y <= UP_DOWN_BOX_HEIGHT) {
- // Up arrow
- _currentPos--;
- _draggingPart = kUpArrowPart;
- g_system->getTimerManager()->installTimerProc(&upArrowRepeater, 1000000/2, this);
- } else if (y >= _h - UP_DOWN_BOX_HEIGHT) {
- // Down arrow
- _currentPos++;
- _draggingPart = kDownArrowPart;
- g_system->getTimerManager()->installTimerProc(&downArrowRepeater, 1000000/2, this);
- } else if (y < _sliderPos) {
- _currentPos -= _entriesPerPage - 1;
- } else if (y >= _sliderPos + _sliderHeight) {
- _currentPos += _entriesPerPage - 1;
- } else {
- _draggingPart = kSliderPart;
- _sliderDeltaMouseDownPos = y - _sliderPos;
- }
-
- // Make sure that _currentPos is still inside the bounds
- checkBounds(old_pos);
-}
-
-void ScrollBarWidget::handleMouseUp(int x, int y, int button, int clickCount) {
- _draggingPart = kNoPart;
-
- g_system->getTimerManager()->removeTimerProc(&upArrowRepeater);
- g_system->getTimerManager()->removeTimerProc(&downArrowRepeater);
-}
-
-void ScrollBarWidget::handleMouseWheel(int x, int y, int direction) {
- int old_pos = _currentPos;
-
- if (_numEntries < _entriesPerPage)
- return;
-
- if (direction < 0) {
- _currentPos--;
- } else {
- _currentPos++;
- }
-
- // Make sure that _currentPos is still inside the bounds
- checkBounds(old_pos);
-}
-
-void ScrollBarWidget::handleMouseMoved(int x, int y, int button) {
- // Do nothing if there are less items than fit on one page
- if (_numEntries <= _entriesPerPage)
- return;
-
- if (_draggingPart == kSliderPart) {
- int old_pos = _currentPos;
- _sliderPos = y - _sliderDeltaMouseDownPos;
-
- if (_sliderPos < UP_DOWN_BOX_HEIGHT)
- _sliderPos = UP_DOWN_BOX_HEIGHT;
-
- if (_sliderPos > _h - UP_DOWN_BOX_HEIGHT - _sliderHeight)
- _sliderPos = _h - UP_DOWN_BOX_HEIGHT - _sliderHeight;
-
- _currentPos =
- (_sliderPos - UP_DOWN_BOX_HEIGHT) * (_numEntries - _entriesPerPage) / (_h - 2 * UP_DOWN_BOX_HEIGHT - _sliderHeight);
- checkBounds(old_pos);
- } else {
- int old_part = _part;
-
- if (y <= UP_DOWN_BOX_HEIGHT) // Up arrow
- _part = kUpArrowPart;
- else if (y >= _h - UP_DOWN_BOX_HEIGHT) // Down arrow
- _part = kDownArrowPart;
- else if (y < _sliderPos)
- _part = kPageUpPart;
- else if (y >= _sliderPos + _sliderHeight)
- _part = kPageDownPart;
- else
- _part = kSliderPart;
-
- if (old_part != _part)
- draw();
- }
-}
-
-void ScrollBarWidget::handleTickle() {
-/*
- // FIXME/TODO - this code is supposed to allow for "click-repeat" (like key repeat),
- // i.e. if you click on one of the arrows and keep clicked, it will scroll
- // continuously. However, just like key repeat, this requires two delays:
- // First an "initial" delay that has to pass before repeating starts (otherwise
- // it is near to impossible to achieve single clicks). Secondly, a repeat delay
- // that determines how often per second a click is simulated.
- int old_pos = _currentPos;
-
- if (_draggingPart == kUpArrowPart)
- _currentPos--;
- else if (_draggingPart == kDownArrowPart)
- _currentPos++;
-
- // Make sure that _currentPos is still inside the bounds
- checkBounds(old_pos);
-*/
-}
-
-void ScrollBarWidget::checkBounds(int old_pos) {
- if (_numEntries <= _entriesPerPage || _currentPos < 0)
- _currentPos = 0;
- else if (_currentPos > _numEntries - _entriesPerPage)
- _currentPos = _numEntries - _entriesPerPage;
-
- if (old_pos != _currentPos) {
- recalc();
- draw();
- sendCommand(kSetPositionCmd, _currentPos);
- }
-}
-
-void ScrollBarWidget::recalc() {
- if (_numEntries > _entriesPerPage) {
- _sliderHeight = (_h - 2 * UP_DOWN_BOX_HEIGHT) * _entriesPerPage / _numEntries;
- if (_sliderHeight < UP_DOWN_BOX_HEIGHT)
- _sliderHeight = UP_DOWN_BOX_HEIGHT;
-
- _sliderPos =
- UP_DOWN_BOX_HEIGHT + (_h - 2 * UP_DOWN_BOX_HEIGHT - _sliderHeight) * _currentPos / (_numEntries - _entriesPerPage);
- if (_sliderPos < 0)
- _sliderPos = 0;
- setVisible(true);
- } else {
- _sliderHeight = _h - 2 * UP_DOWN_BOX_HEIGHT;
- _sliderPos = UP_DOWN_BOX_HEIGHT;
- setVisible(false);
- }
-}
-
-void ScrollBarWidget::drawWidget() {
- if (_draggingPart != kNoPart)
- _part = _draggingPart;
-
- ThemeEngine::ScrollbarState state = ThemeEngine::kScrollbarStateNo;
- if (_numEntries <= _entriesPerPage) {
- state = ThemeEngine::kScrollbarStateSinglePage;
- } else if (_part == kUpArrowPart) {
- state = ThemeEngine::kScrollbarStateUp;
- } else if (_part == kDownArrowPart) {
- state = ThemeEngine::kScrollbarStateDown;
- } else if (_part == kSliderPart) {
- state = ThemeEngine::kScrollbarStateSlider;
- }
-
- g_gui.theme()->drawScrollbar(Common::Rect(_x, _y, _x+_w, _y+_h), _sliderPos, _sliderHeight, state, _state);
-}
-
-} // End of namespace GUI
Deleted: scummvm/trunk/gui/ScrollBarWidget.h
===================================================================
--- scummvm/trunk/gui/ScrollBarWidget.h 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/ScrollBarWidget.h 2010-11-16 10:11:57 UTC (rev 54264)
@@ -1,84 +0,0 @@
-/* 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.
- *
- * $URL$
- * $Id$
- */
-
-#ifndef SCROLLBARWIDGET_H
-#define SCROLLBARWIDGET_H
-
-#include "gui/widget.h"
-
-namespace GUI {
-
-enum {
- kSetPositionCmd = 'SETP'
-};
-
-
-class ScrollBarWidget : public Widget, public CommandSender {
-protected:
- typedef enum {
- kNoPart,
- kUpArrowPart,
- kDownArrowPart,
- kSliderPart,
- kPageUpPart,
- kPageDownPart
- } Part;
-
- Part _part;
- int _sliderHeight;
- int _sliderPos;
-
- Part _draggingPart;
- int _sliderDeltaMouseDownPos;
-
-public:
- int _numEntries;
- int _entriesPerPage;
- int _currentPos;
-
-public:
- ScrollBarWidget(GuiObject *boss, int x, int y, int w, int h);
-
- void handleMouseDown(int x, int y, int button, int clickCount);
- void handleMouseUp(int x, int y, int button, int clickCount);
- void handleMouseWheel(int x, int y, int direction);
- void handleMouseMoved(int x, int y, int button);
- void handleMouseEntered(int button) { setFlags(WIDGET_HILITED); }
- void handleMouseLeft(int button) { clearFlags(WIDGET_HILITED); _part = kNoPart; draw(); }
- void handleTickle();
-
- // FIXME - this should be private, but then we also have to add accessors
- // for _numEntries, _entriesPerPage and _currentPos. This again leads to the question:
- // should these accessors force a redraw?
- void recalc();
-
- void checkBounds(int old_pos);
-
-protected:
- void drawWidget();
-};
-
-} // End of namespace GUI
-
-#endif
Deleted: scummvm/trunk/gui/TabWidget.cpp
===================================================================
--- scummvm/trunk/gui/TabWidget.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/TabWidget.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -1,320 +0,0 @@
-/* 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.
- *
- * $URL$
- * $Id$
- */
-
-#include "common/util.h"
-#include "gui/TabWidget.h"
-#include "gui/dialog.h"
-#include "gui/GuiManager.h"
-
-#include "gui/ThemeEval.h"
-
-namespace GUI {
-
-enum {
- kCmdLeft = 'LEFT',
- kCmdRight = 'RGHT'
-};
-
-TabWidget::TabWidget(GuiObject *boss, int x, int y, int w, int h)
- : Widget(boss, x, y, w, h), _bodyBackgroundType(GUI::ThemeEngine::kDialogBackgroundDefault) {
- init();
-}
-
-TabWidget::TabWidget(GuiObject *boss, const String &name)
- : Widget(boss, name), _bodyBackgroundType(GUI::ThemeEngine::kDialogBackgroundDefault) {
- init();
-}
-
-void TabWidget::init() {
- setFlags(WIDGET_ENABLED);
- _type = kTabWidget;
- _activeTab = -1;
- _firstVisibleTab = 0;
-
- _tabWidth = g_gui.xmlEval()->getVar("Globals.TabWidget.Tab.Width");
- _tabHeight = g_gui.xmlEval()->getVar("Globals.TabWidget.Tab.Height");
- _titleVPad = g_gui.xmlEval()->getVar("Globals.TabWidget.Tab.Padding.Top");
-
- _bodyTP = g_gui.xmlEval()->getVar("Globals.TabWidget.Body.Padding.Top");
- _bodyBP = g_gui.xmlEval()->getVar("Globals.TabWidget.Body.Padding.Bottom");
- _bodyLP = g_gui.xmlEval()->getVar("Globals.TabWidget.Body.Padding.Left");
- _bodyRP = g_gui.xmlEval()->getVar("Globals.TabWidget.Body.Padding.Right");
-
- _butRP = g_gui.xmlEval()->getVar("Globals.TabWidget.NavButtonPadding.Right", 0);
- _butTP = g_gui.xmlEval()->getVar("Globals.TabWidget.NavButton.Padding.Top", 0);
- _butW = g_gui.xmlEval()->getVar("Globals.TabWidget.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 = new ButtonWidget(this, x, y, _butW, _butH, "<", 0, kCmdLeft);
- _navRight = new ButtonWidget(this, x + _butW + 2, y, _butW, _butH, ">", 0, kCmdRight);
-}
-
-TabWidget::~TabWidget() {
- _firstWidget = 0;
- for (uint i = 0; i < _tabs.size(); ++i) {
- delete _tabs[i].firstWidget;
- _tabs[i].firstWidget = 0;
- }
- _tabs.clear();
- delete _navRight;
-}
-
-int16 TabWidget::getChildY() const {
- return getAbsY() + _tabHeight;
-}
-
-int TabWidget::addTab(const String &title) {
- // Add a new tab page
- Tab newTab;
- newTab.title = title;
- newTab.firstWidget = 0;
-
- _tabs.push_back(newTab);
-
- int numTabs = _tabs.size();
-
- // HACK: Nintendo DS uses a custom config dialog. This dialog does not work with
- // our default "Globals.TabWidget.Tab.Width" setting.
- //
- // TODO: Add proper handling in the theme layout for such cases.
- //
- // There are different solutions to this problem:
- // - offer a "Tab.Width" setting per tab widget and thus let the Ninteno DS
- // backend set a default value for its special dialog.
- //
- // - change our themes to use auto width calculaction by default
- //
- // - change "Globals.TabWidget.Tab.Width" to be the minimal tab width setting and
- // rename it accordingly.
- // Actually this solution is pretty similar to our HACK for the Nintendo DS
- // backend. This hack enables auto width calculation by default with the
- // "Globals.TabWidget.Tab.Width" value as minimal width for the tab buttons.
- //
- // - we might also consider letting every tab button having its own width.
- //
- // - other solutions you can think of, which are hopefully less evil ;-).
- //
- // Of course also the Ninteno DS' dialog should be in our layouting engine, instead
- // of being hard coded like it is right now.
- //
- // There are checks for __DS__ all over this source file to take care of the
- // aforemnetioned problem.
-#ifdef __DS__
- if (true) {
-#else
- if (g_gui.xmlEval()->getVar("Globals.TabWidget.Tab.Width") == 0) {
-#endif
- if (_tabWidth == 0)
- _tabWidth = 40;
- // Determine the new tab width
- int newWidth = g_gui.getStringWidth(title) + 2 * 3;
- if (_tabWidth < newWidth)
- _tabWidth = newWidth;
- int maxWidth = _w / numTabs;
- if (_tabWidth > maxWidth)
- _tabWidth = maxWidth;
- }
-
- // Activate the new tab
- setActiveTab(numTabs - 1);
-
- return _activeTab;
-}
-
-void TabWidget::removeTab(int tabID) {
- assert(0 <= tabID && tabID < (int)_tabs.size());
-
- // Deactive the tab if it's currently the active one
- if (tabID == _activeTab) {
- _tabs[tabID].firstWidget = _firstWidget;
- releaseFocus();
- _firstWidget = 0;
- }
-
- // Dispose the widgets in that tab and then the tab itself
- delete _tabs[tabID].firstWidget;
- _tabs.remove_at(tabID);
-
- // Adjust _firstVisibleTab if necessary
- if (_firstVisibleTab >= (int)_tabs.size()) {
- _firstVisibleTab = MAX(0, (int)_tabs.size() - 1);
- }
-
- // The active tab was removed, so select a new active one (if any remains)
- if (tabID == _activeTab) {
- _activeTab = -1;
- if (tabID >= (int)_tabs.size())
- tabID = _tabs.size() - 1;
- if (tabID >= 0)
- setActiveTab(tabID);
- }
-
- // Finally trigger a redraw
- _boss->draw();
-}
-
-void TabWidget::setActiveTab(int tabID) {
- assert(0 <= tabID && tabID < (int)_tabs.size());
- if (_activeTab != tabID) {
- // Exchange the widget lists, and switch to the new tab
- if (_activeTab != -1) {
- _tabs[_activeTab].firstWidget = _firstWidget;
- releaseFocus();
- }
- _activeTab = tabID;
- _firstWidget = _tabs[tabID].firstWidget;
- _boss->draw();
- }
-}
-
-
-void TabWidget::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
- Widget::handleCommand(sender, cmd, data);
-
- switch (cmd) {
- case kCmdLeft:
- if (_firstVisibleTab) {
- _firstVisibleTab--;
- draw();
- }
- break;
-
- case kCmdRight:
- if (_firstVisibleTab + _w / _tabWidth < (int)_tabs.size()) {
- _firstVisibleTab++;
- draw();
- }
- break;
- }
-}
-
-void TabWidget::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 TabWidget::handleKeyDown(Common::KeyState state) {
- // TODO: maybe there should be a way to switch between tabs
- // using the keyboard? E.g. Alt-Shift-Left/Right-Arrow or something
- // like that.
- return Widget::handleKeyDown(state);
-}
-
-void TabWidget::reflowLayout() {
- 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 TabWidget::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()->drawTab(Common::Rect(_x, _y, _x+_w, _y+_h), _tabHeight, _tabWidth, tabs, _activeTab - _firstVisibleTab, 0, _titleVPad);
-}
-
-void TabWidget::draw() {
- Widget::draw();
-
- if (_tabWidth * _tabs.size() > _w) {
- _navLeft->draw();
- _navRight->draw();
- }
-}
-
-Widget *TabWidget::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);
- }
-}
-
-} // End of namespace GUI
Deleted: scummvm/trunk/gui/TabWidget.h
===================================================================
--- scummvm/trunk/gui/TabWidget.h 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/TabWidget.h 2010-11-16 10:11:57 UTC (rev 54264)
@@ -1,118 +0,0 @@
-/* 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.
- *
- * $URL$
- * $Id$
- */
-
-#ifndef TABWIDGET_H
-#define TABWIDGET_H
-
-#include "widget.h"
-#include "common/str.h"
-#include "common/array.h"
-
-namespace GUI {
-
-class TabWidget : public Widget {
- typedef Common::String String;
- struct Tab {
- String title;
- Widget *firstWidget;
- };
- typedef Common::Array<Tab> TabList;
-
-protected:
- int _activeTab;
- int _firstVisibleTab;
- TabList _tabs;
- int _tabWidth;
- int _tabHeight;
-
- int _bodyRP, _bodyTP, _bodyLP, _bodyBP;
- ThemeEngine::DialogBackground _bodyBackgroundType;
-
- int _titleVPad;
-
- int _butRP, _butTP, _butW, _butH;
-
- ButtonWidget *_navLeft, *_navRight;
-
-public:
- TabWidget(GuiObject *boss, int x, int y, int w, int h);
- TabWidget(GuiObject *boss, const String &name);
- ~TabWidget();
-
- void init();
-
- /**
- * Add a new tab with the given title. Returns a unique ID which can be used
- * to identify the tab (to remove it / activate it etc.).
- */
- int addTab(const String &title);
-
- /**
- * Remove the tab with the given tab ID. Disposes all child widgets of that tab.
- * TODO: This code is *unfinished*. In particular, it changes the
- * tabIDs, so that they are not unique anymore! This is bad.
- * If we need to, we could fix this by changing the tab IDs from being an index
- * into the _tabs array to a real "unique" ID, which gets stored in the Tab struct.
- * It won't be difficult to implement this, but since currently no code seems to make
- * use of the feature...
- */
- void removeTab(int tabID);
-
- int getActiveTab() {
- return _activeTab;
- }
-
- /**
- * Set the active tab by specifying a valid tab ID.
- * setActiveTab changes the value of _firstWidget. This means new
- * Widgets are always added to the active tab.
- */
- void setActiveTab(int tabID);
-
- void setTabTitle(int tabID, const String &title) {
- assert(0 <= tabID && tabID < (int)_tabs.size());
- _tabs[tabID].title = title;
- }
-
- virtual void handleMouseDown(int x, int y, int button, int clickCount);
- virtual bool handleKeyDown(Common::KeyState state);
- virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data);
-
- virtual void reflowLayout();
-
- virtual void draw();
-
-protected:
- // We overload getChildY to make sure child widgets are positioned correctly.
- // Essentially this compensates for the space taken up by the tab title header.
- virtual int16 getChildY() const;
-
- virtual void drawWidget();
-
- virtual Widget *findWidget(int x, int y);
-};
-
-} // End of namespace GUI
-
-#endif
Modified: scummvm/trunk/gui/browser.cpp
===================================================================
--- scummvm/trunk/gui/browser.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/browser.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -24,7 +24,7 @@
#include "gui/browser.h"
#include "gui/GuiManager.h"
-#include "gui/ListWidget.h"
+#include "gui/widgets/list.h"
#include "common/config-manager.h"
#include "common/system.h"
Modified: scummvm/trunk/gui/browser_osx.mm
===================================================================
--- scummvm/trunk/gui/browser_osx.mm 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/browser_osx.mm 2010-11-16 10:11:57 UTC (rev 54264)
@@ -26,8 +26,6 @@
#define FORBIDDEN_SYMBOL_ALLOW_ALL
#include "gui/browser.h"
-#include "gui/GuiManager.h"
-#include "gui/ListWidget.h"
#include "common/config-manager.h"
#include "common/system.h"
Modified: scummvm/trunk/gui/chooser.cpp
===================================================================
--- scummvm/trunk/gui/chooser.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/chooser.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -26,7 +26,7 @@
#include "common/translation.h"
#include "gui/chooser.h"
#include "gui/GuiManager.h"
-#include "gui/ListWidget.h"
+#include "gui/widgets/list.h"
namespace GUI {
Modified: scummvm/trunk/gui/console.cpp
===================================================================
--- scummvm/trunk/gui/console.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/console.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -23,7 +23,7 @@
*/
#include "gui/console.h"
-#include "gui/ScrollBarWidget.h"
+#include "gui/widgets/scrollbar.h"
#include "gui/ThemeEval.h"
#include "engines/engine.h"
Modified: scummvm/trunk/gui/dialog.cpp
===================================================================
--- scummvm/trunk/gui/dialog.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/dialog.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -27,7 +27,7 @@
#include "gui/GuiManager.h"
#include "gui/dialog.h"
#include "gui/widget.h"
-#include "gui/PopUpWidget.h"
+#include "gui/widgets/popup.h"
#include "common/system.h"
Deleted: scummvm/trunk/gui/editable.cpp
===================================================================
--- scummvm/trunk/gui/editable.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/editable.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -1,304 +0,0 @@
-/* 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.
- *
- * $URL$
- * $Id$
- */
-
-#include "common/events.h"
-#include "gui/editable.h"
-#include "gui/GuiManager.h"
-
-namespace GUI {
-
-EditableWidget::EditableWidget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip, uint32 cmd)
- : Widget(boss, x, y, w, h, tooltip), CommandSender(boss), _cmd(cmd) {
- init();
-}
-
-EditableWidget::EditableWidget(GuiObject *boss, const String &name, const char *tooltip, uint32 cmd)
- : Widget(boss, name, tooltip), CommandSender(boss), _cmd(cmd) {
- init();
-}
-
-void EditableWidget::init() {
- _caretVisible = false;
- _caretTime = 0;
- _caretPos = 0;
-
- _caretInverse = false;
-
- _editScrollOffset = 0;
-
- _font = ThemeEngine::kFontStyleBold;
- _inversion = ThemeEngine::kTextInversionNone;
-}
-
-EditableWidget::~EditableWidget() {
-}
-
-void EditableWidget::reflowLayout() {
- Widget::reflowLayout();
-
- _editScrollOffset = g_gui.getStringWidth(_editString, _font) - getEditRect().width();
- if (_editScrollOffset < 0)
- _editScrollOffset = 0;
-}
-
-void EditableWidget::setEditString(const String &str) {
- // TODO: We probably should filter the input string here,
- // e.g. using tryInsertChar.
- _editString = str;
- _caretPos = 0;
-}
-
-bool EditableWidget::tryInsertChar(byte c, int pos) {
- if ((c >= 32 && c <= 127) || c >= 160) {
- _editString.insertChar(c, pos);
- return true;
- }
- return false;
-}
-
-void EditableWidget::handleTickle() {
- uint32 time = g_system->getMillis();
- if (_caretTime < time) {
- _caretTime = time + kCaretBlinkTime;
- drawCaret(_caretVisible);
- }
-}
-
-bool EditableWidget::handleKeyDown(Common::KeyState state) {
- bool handled = true;
- bool dirty = false;
- bool forcecaret = false;
-
- // First remove caret
- if (_caretVisible)
- drawCaret(true);
-
- switch (state.keycode) {
- case Common::KEYCODE_RETURN:
- case Common::KEYCODE_KP_ENTER:
- // confirm edit and exit editmode
- endEditMode();
- dirty = true;
- break;
-
- case Common::KEYCODE_ESCAPE:
- abortEditMode();
- dirty = true;
- break;
-
- case Common::KEYCODE_BACKSPACE:
- if (_caretPos > 0) {
- _caretPos--;
- _editString.deleteChar(_caretPos);
- dirty = true;
-
- sendCommand(_cmd, 0);
- }
- forcecaret = true;
- break;
-
- // Keypad & special keys
- // - if num lock is set, we always go to the default case
- // - if num lock is not set, we either fall down to the special key case
- // or ignore the key press in case of 0 (INSERT), 2 (DOWN), 3 (PGDWN)
- // 5, 8 (UP) and 9 (PGUP)
-
- case Common::KEYCODE_KP0:
- case Common::KEYCODE_KP2:
- case Common::KEYCODE_KP3:
- case Common::KEYCODE_KP5:
- case Common::KEYCODE_KP8:
- case Common::KEYCODE_KP9:
- if (state.flags & Common::KBD_NUM)
- defaultKeyDownHandler(state, dirty, forcecaret, handled);
- break;
-
- case Common::KEYCODE_KP_PERIOD:
- if (state.flags & Common::KBD_NUM) {
- defaultKeyDownHandler(state, dirty, forcecaret, handled);
- break;
- }
- case Common::KEYCODE_DELETE:
- if (_caretPos < (int)_editString.size()) {
- _editString.deleteChar(_caretPos);
- dirty = true;
-
- sendCommand(_cmd, 0);
- }
- forcecaret = true;
- break;
-
- case Common::KEYCODE_KP1:
- if (state.flags & Common::KBD_NUM) {
- defaultKeyDownHandler(state, dirty, forcecaret, handled);
- break;
- }
- case Common::KEYCODE_END:
- dirty = setCaretPos(_editString.size());
- forcecaret = true;
- break;
-
- case Common::KEYCODE_KP4:
- if (state.flags & Common::KBD_NUM) {
- defaultKeyDownHandler(state, dirty, forcecaret, handled);
- break;
- }
- case Common::KEYCODE_LEFT:
- if (_caretPos > 0) {
- dirty = setCaretPos(_caretPos - 1);
- }
- forcecaret = true;
- dirty = true;
- break;
-
- case Common::KEYCODE_KP6:
- if (state.flags & Common::KBD_NUM) {
- defaultKeyDownHandler(state, dirty, forcecaret, handled);
- break;
- }
- case Common::KEYCODE_RIGHT:
- if (_caretPos < (int)_editString.size()) {
- dirty = setCaretPos(_caretPos + 1);
- }
- forcecaret = true;
- dirty = true;
- break;
-
- case Common::KEYCODE_KP7:
- if (state.flags & Common::KBD_NUM) {
- defaultKeyDownHandler(state, dirty, forcecaret, handled);
- break;
- }
- case Common::KEYCODE_HOME:
- dirty = setCaretPos(0);
- forcecaret = true;
- break;
-
- default:
- defaultKeyDownHandler(state, dirty, forcecaret, handled);
- }
-
- if (dirty)
- draw();
-
- if (forcecaret)
- makeCaretVisible();
-
- return handled;
-}
-
-void EditableWidget::defaultKeyDownHandler(Common::KeyState &state, bool &dirty, bool &forcecaret, bool &handled) {
- if (state.ascii < 256 && tryInsertChar((byte)state.ascii, _caretPos)) {
- _caretPos++;
- dirty = true;
- forcecaret = true;
-
- sendCommand(_cmd, 0);
- } else {
- handled = false;
- }
-}
-
-int EditableWidget::getCaretOffset() const {
- int caretpos = 0;
- for (int i = 0; i < _caretPos; i++)
- caretpos += g_gui.getCharWidth(_editString[i], _font);
-
- caretpos -= _editScrollOffset;
-
- return caretpos;
-}
-
-void EditableWidget::drawCaret(bool erase) {
- // Only draw if item is visible
- if (!isVisible() || !_boss->isVisible())
- return;
-
- Common::Rect editRect = getEditRect();
-
- int x = editRect.left;
- int y = editRect.top;
-
- x += getCaretOffset();
-
- if (y < 0 || y + editRect.height() - 2 >= _h)
- return;
-
- x += getAbsX();
- y += getAbsY();
-
- g_gui.theme()->drawCaret(Common::Rect(x, y, x + 1, y + editRect.height() - 2), erase);
-
- if (erase) {
- if ((uint)_caretPos < _editString.size()) {
- GUI::EditableWidget::String chr(_editString[_caretPos]);
- int chrWidth = g_gui.getCharWidth(_editString[_caretPos], _font);
- g_gui.theme()->drawText(Common::Rect(x, y, x + chrWidth, y + editRect.height() - 2), chr, _state, Graphics::kTextAlignLeft, _inversion, 0, false, _font);
- }
- }
-
- _caretVisible = !erase;
-}
-
-bool EditableWidget::setCaretPos(int newPos) {
- assert(newPos >= 0 && newPos <= (int)_editString.size());
- _caretPos = newPos;
- return adjustOffset();
-}
-
-bool EditableWidget::adjustOffset() {
- // check if the caret is still within the textbox; if it isn't,
- // adjust _editScrollOffset
-
- int caretpos = getCaretOffset();
- const int editWidth = getEditRect().width();
-
- if (caretpos < 0) {
- // scroll left
- _editScrollOffset += caretpos;
- return true;
- } else if (caretpos >= editWidth) {
- // scroll right
- _editScrollOffset -= (editWidth - caretpos);
- return true;
- } else if (_editScrollOffset > 0) {
- const int strWidth = g_gui.getStringWidth(_editString, _font);
- if (strWidth - _editScrollOffset < editWidth) {
- // scroll right
- _editScrollOffset = (strWidth - editWidth);
- if (_editScrollOffset < 0)
- _editScrollOffset = 0;
- }
- }
-
- return false;
-}
-
-void EditableWidget::makeCaretVisible() {
- _caretTime = g_system->getMillis() + kCaretBlinkTime;
- _caretVisible = true;
- drawCaret(false);
-}
-
-} // End of namespace GUI
Deleted: scummvm/trunk/gui/editable.h
===================================================================
--- scummvm/trunk/gui/editable.h 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/editable.h 2010-11-16 10:11:57 UTC (rev 54264)
@@ -1,95 +0,0 @@
-/* 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.
- *
- * $URL$
- * $Id$
- */
-
-#ifndef GUI_EDITABLE_H
-#define GUI_EDITABLE_H
-
-#include "common/str.h"
-#include "common/rect.h"
-#include "gui/widget.h"
-#include "gui/GuiManager.h"
-
-namespace GUI {
-
-/**
- * Base class for widgets which need to edit text, like ListWidget and
- * EditTextWidget.
- */
-class EditableWidget : public Widget, public CommandSender {
-public:
- typedef Common::String String;
-protected:
- String _editString;
-
- uint32 _cmd;
-
- bool _caretVisible;
- uint32 _caretTime;
- int _caretPos;
-
- bool _caretInverse;
-
- int _editScrollOffset;
-
- ThemeEngine::FontStyle _font;
-
- ThemeEngine::TextInversionState _inversion;
-
-public:
- EditableWidget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip = 0, uint32 cmd = 0);
- EditableWidget(GuiObject *boss, const String &name, const char *tooltip = 0, uint32 cmd = 0);
- virtual ~EditableWidget();
-
- void init();
-
- virtual void setEditString(const String &str);
- virtual const String &getEditString() const { return _editString; }
-
- virtual void handleTickle();
- virtual bool handleKeyDown(Common::KeyState state);
-
- virtual void reflowLayout();
-
-protected:
- virtual void startEditMode() = 0;
- virtual void endEditMode() = 0;
- virtual void abortEditMode() = 0;
-
- virtual Common::Rect getEditRect() const = 0;
- virtual int getCaretOffset() const;
- void drawCaret(bool erase);
- bool setCaretPos(int newPos);
- bool adjustOffset();
- void makeCaretVisible();
-
- void defaultKeyDownHandler(Common::KeyState &state, bool &dirty, bool &forcecaret, bool &handled);
-
- void setFontStyle(ThemeEngine::FontStyle font) { _font = font; }
-
- virtual bool tryInsertChar(byte c, int pos);
-};
-
-} // End of namespace GUI
-
-#endif
Modified: scummvm/trunk/gui/launcher.cpp
===================================================================
--- scummvm/trunk/gui/launcher.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/launcher.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -41,10 +41,10 @@
#include "gui/GuiManager.h"
#include "gui/options.h"
#include "gui/saveload.h"
-#include "gui/EditTextWidget.h"
-#include "gui/ListWidget.h"
-#include "gui/TabWidget.h"
-#include "gui/PopUpWidget.h"
+#include "gui/widgets/edittext.h"
+#include "gui/widgets/list.h"
+#include "gui/widgets/tab.h"
+#include "gui/widgets/popup.h"
#include "gui/ThemeEval.h"
#include "graphics/cursorman.h"
Modified: scummvm/trunk/gui/massadd.cpp
===================================================================
--- scummvm/trunk/gui/massadd.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/massadd.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -33,7 +33,7 @@
#include "gui/massadd.h"
#include "gui/GuiManager.h"
#include "gui/widget.h"
-#include "gui/ListWidget.h"
+#include "gui/widgets/list.h"
namespace GUI {
Modified: scummvm/trunk/gui/module.mk
===================================================================
--- scummvm/trunk/gui/module.mk 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/module.mk 2010-11-16 10:11:57 UTC (rev 54264)
@@ -6,27 +6,27 @@
console.o \
debugger.o \
dialog.o \
- editable.o \
error.o \
- EditTextWidget.o \
GuiManager.o \
launcher.o \
- ListWidget.o \
massadd.o \
message.o \
object.o \
options.o \
- PopUpWidget.o \
saveload.o \
- ScrollBarWidget.o \
- TabWidget.o \
themebrowser.o \
ThemeEngine.o \
ThemeEval.o \
ThemeLayout.o \
ThemeParser.o \
Tooltip.o \
- widget.o
+ widget.o \
+ widgets/editable.o \
+ widgets/edittext.o \
+ widgets/list.o \
+ widgets/popup.o \
+ widgets/scrollbar.o \
+ widgets/tab.o
ifdef MACOSX
MODULE_OBJS += \
Modified: scummvm/trunk/gui/options.cpp
===================================================================
--- scummvm/trunk/gui/options.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/options.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -29,8 +29,8 @@
#include "gui/GuiManager.h"
#include "gui/ThemeEval.h"
#include "gui/options.h"
-#include "gui/PopUpWidget.h"
-#include "gui/TabWidget.h"
+#include "gui/widgets/popup.h"
+#include "gui/widgets/tab.h"
#include "common/fs.h"
#include "common/config-manager.h"
Modified: scummvm/trunk/gui/options.h
===================================================================
--- scummvm/trunk/gui/options.h 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/options.h 2010-11-16 10:11:57 UTC (rev 54264)
@@ -26,7 +26,6 @@
#define OPTIONS_DIALOG_H
#include "gui/dialog.h"
-#include "gui/TabWidget.h"
#include "common/str.h"
#include "sound/musicplugin.h"
@@ -42,6 +41,7 @@
class SliderWidget;
class StaticTextWidget;
class ListWidget;
+class TabWidget;
class OptionsDialog : public Dialog {
public:
Modified: scummvm/trunk/gui/saveload.cpp
===================================================================
--- scummvm/trunk/gui/saveload.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/saveload.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -25,7 +25,7 @@
#include "common/config-manager.h"
#include "common/translation.h"
-#include "gui/ListWidget.h"
+#include "gui/widgets/list.h"
#include "gui/message.h"
#include "gui/saveload.h"
#include "gui/ThemeEval.h"
Modified: scummvm/trunk/gui/themebrowser.cpp
===================================================================
--- scummvm/trunk/gui/themebrowser.cpp 2010-11-16 09:54:11 UTC (rev 54263)
+++ scummvm/trunk/gui/themebrowser.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -23,7 +23,7 @@
*/
#include "gui/themebrowser.h"
-#include "gui/ListWidget.h"
+#include "gui/widgets/list.h"
#include "gui/widget.h"
#include "common/translation.h"
Copied: scummvm/trunk/gui/widgets/editable.cpp (from rev 54260, scummvm/trunk/gui/editable.cpp)
===================================================================
--- scummvm/trunk/gui/widgets/editable.cpp (rev 0)
+++ scummvm/trunk/gui/widgets/editable.cpp 2010-11-16 10:11:57 UTC (rev 54264)
@@ -0,0 +1,304 @@
+/* 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.
+ *
+ * $URL$
+ * $Id$
+ */
+
+#include "common/events.h"
+#include "gui/widgets/editable.h"
+#include "gui/GuiManager.h"
+
+namespace GUI {
+
+EditableWidget::EditableWidget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip, uint32 cmd)
+ : Widget(boss, x, y, w, h, tooltip), CommandSender(boss), _cmd(cmd) {
+ init();
+}
+
+EditableWidget::EditableWidget(GuiObject *boss, const String &name, const char *tooltip, uint32 cmd)
+ : Widget(boss, name, tooltip), CommandSender(boss), _cmd(cmd) {
+ init();
+}
+
+void EditableWidget::init() {
+ _caretVisible = false;
+ _caretTime = 0;
+ _caretPos = 0;
+
+ _caretInverse = false;
+
+ _editScrollOffset = 0;
+
+ _font = ThemeEngine::kFontStyleBold;
+ _inversion = ThemeEngine::kTextInversionNone;
+}
+
+EditableWidget::~EditableWidget() {
+}
+
+void EditableWidget::reflowLayout() {
+ Widget::reflowLayout();
+
+ _editScrollOffset = g_gui.getStringWidth(_editString, _font) - getEditRect().width();
+ if (_editScrollOffset < 0)
+ _editScrollOffset = 0;
+}
+
+void EditableWidget::setEditString(const String &str) {
+ // TODO: We probably should filter the input string here,
+ // e.g. using tryInsertChar.
+ _editString = str;
+ _caretPos = 0;
+}
+
+bool EditableWidget::tryInsertChar(byte c, int pos) {
+ if ((c >= 32 && c <= 127) || c >= 160) {
+ _editString.insertChar(c, pos);
+ return true;
+ }
+ return false;
+}
+
+void EditableWidget::handleTickle() {
+ uint32 time = g_system->getMillis();
+ if (_caretTime < time) {
+ _caretTime = time + kCaretBlinkTime;
+ drawCaret(_caretVisible);
+ }
+}
+
+bool EditableWidget::handleKeyDown(Common::KeyState state) {
+ bool handled = true;
+ bool dirty = false;
+ bool forcecaret = false;
+
+ // First remove caret
+ if (_caretVisible)
+ drawCaret(true);
+
+ switch (state.keycode) {
+ case Common::KEYCODE_RETURN:
+ case Common::KEYCODE_KP_ENTER:
+ // confirm edit and exit editmode
+ endEditMode();
+ dirty = true;
+ break;
+
+ case Common::KEYCODE_ESCAPE:
+ abortEditMode();
+ dirty = true;
+ break;
+
+ case Common::KEYCODE_BACKSPACE:
+ if (_caretPos > 0) {
+ _caretPos--;
+ _editString.deleteChar(_caretPos);
+ dirty = true;
+
+ sendCommand(_cmd, 0);
+ }
+ forcecaret = true;
+ break;
+
+ // Keypad & special keys
+ // - if num lock is set, we always go to the default case
+ // - if num lock is not set, we either fall down to the special key case
+ // or ignore the key press in case of 0 (INSERT), 2 (DOWN), 3 (PGDWN)
+ // 5, 8 (UP) and 9 (PGUP)
+
+ case Common::KEYCODE_KP0:
+ case Common::KEYCODE_KP2:
+ case Common::KEYCODE_KP3:
+ case Common::KEYCODE_KP5:
+ case Common::KEYCODE_KP8:
+ case Common::KEYCODE_KP9:
+ if (state.flags & Common::KBD_NUM)
+ defaultKeyDownHandler(state, dirty, forcecaret, handled);
+ break;
+
+ case Common::KEYCODE_KP_PERIOD:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state, dirty, forcecaret, handled);
+ break;
+ }
+ case Common::KEYCODE_DELETE:
+ if (_caretPos < (int)_editString.size()) {
+ _editString.deleteChar(_caretPos);
+ dirty = true;
+
+ sendCommand(_cmd, 0);
+ }
+ forcecaret = true;
+ break;
+
+ case Common::KEYCODE_KP1:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state, dirty, forcecaret, handled);
+ break;
+ }
+ case Common::KEYCODE_END:
+ dirty = setCaretPos(_editString.size());
+ forcecaret = true;
+ break;
+
+ case Common::KEYCODE_KP4:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state, dirty, forcecaret, handled);
+ break;
+ }
+ case Common::KEYCODE_LEFT:
+ if (_caretPos > 0) {
+ dirty = setCaretPos(_caretPos - 1);
+ }
+ forcecaret = true;
+ dirty = true;
+ break;
+
+ case Common::KEYCODE_KP6:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state, dirty, forcecaret, handled);
+ break;
+ }
+ case Common::KEYCODE_RIGHT:
+ if (_caretPos < (int)_editString.size()) {
+ dirty = setCaretPos(_caretPos + 1);
+ }
+ forcecaret = true;
+ dirty = true;
+ break;
+
+ case Common::KEYCODE_KP7:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state, dirty, forcecaret, handled);
+ break;
+ }
+ case Common::KEYCODE_HOME:
+ dirty = setCaretPos(0);
+ forcecaret = true;
+ break;
+
+ default:
+ defaultKeyDownHandler(state, dirty, forcecaret, handled);
+ }
+
+ if (dirty)
+ draw();
+
+ if (forcecaret)
+ makeCaretVisible();
+
+ return handled;
+}
+
+void EditableWidget::defaultKeyDownHandler(Common::KeyState &state, bool &dirty, bool &forcecaret, bool &handled) {
+ if (state.ascii < 256 && tryInsertChar((byte)state.ascii, _caretPos)) {
+ _caretPos++;
+ dirty = true;
+ forcecaret = true;
+
+ sendCommand(_cmd, 0);
+ } else {
+ handled = false;
+ }
+}
+
+int EditableWidget::getCaretOffset() const {
+ int caretpos = 0;
+ for (int i = 0; i < _caretPos; i++)
+ caretpos += g_gui.getCharWidth(_editString[i], _font);
+
+ caretpos -= _editScrollOffset;
+
+ return caretpos;
+}
+
+void EditableWidget::drawCaret(bool erase) {
+ // Only draw if item is visible
+ if (!isVisible() || !_boss->isVisible())
+ return;
+
+ Common::Rect editRect = getEditRect();
+
+ int x = editRect.left;
+ int y = editRect.top;
+
+ x += getCaretOffset();
+
+ if (y < 0 || y + editRect.height() - 2 >= _h)
+ return;
+
+ x += getAbsX();
+ y += getAbsY();
+
+ g_gui.theme()->drawCaret(Common::Rect(x, y, x + 1, y + editRect.height() - 2), erase);
+
+ if (erase) {
+ if ((uint)_caretPos < _editString.size()) {
+ GUI::EditableWidget::String chr(_editString[_caretPos]);
+ int chrWidth = g_gui.getCharWidth(_editString[_caretPos], _font);
+ g_gui.theme()->drawText(Common::Rect(x, y, x + chrWidth, y + editRect.height() - 2), chr, _state, Graphics::kTextAlignLeft, _inversion, 0, false, _font);
+ }
+ }
+
+ _caretVisible = !erase;
+}
+
+bool EditableWidget::setCaretPos(int newPos) {
+ assert(newPos >= 0 && newPos <= (int)_editString.size());
+ _caretPos = newPos;
+ return adjustOffset();
+}
+
+bool EditableWidget::adjustOffset() {
+ // check if the caret is still within the textbox; if it isn't,
+ // adjust _editScrollOffset
+
+ int caretpos = getCaretOffset();
+ const int editWidth = getEditRect().width();
+
+ if (caretpos < 0) {
+ // scroll left
+ _editScrollOffset += caretpos;
+ return true;
+ } else if (caretpos >= editWidth) {
+ // scroll right
+ _editScrollOffset -= (editWidth - caretpos);
+ return true;
+ } else if (_editScrollOffset > 0) {
+ const int strWidth = g_gui.getStringWidth(_editString, _font);
+ if (strWidth - _editScrollOffset < editWidth) {
+ // scroll right
+ _editScrollOffset = (strWidth - editWidth);
+ if (_editScrollOffset < 0)
+ _editScrollOffset = 0;
+ }
+ }
+
+ return false;
+}
+
+void EditableWidget::makeCaretVisible() {
+ _caretTime = g_system->getMillis() + kCaretBlinkTime;
+ _caretVisible = true;
+ drawCaret(false);
+}
+
+} // End of namespace GUI
Copied: scummvm/trunk/gui/widgets/editable.h (from rev 54260, scummvm/trunk/gui/editable.h)
===================================================================
--- scummvm/trunk/gui/widgets/editable.h (rev 0)
+++ scummvm/trunk/gui/widgets/editable.h 2010-11-16 10:11:57 UTC (rev 54264)
@@ -0,0 +1,95 @@
+/* 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
@@ Diff output truncated at 100000 characters. @@
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list