From 1238d7422705e88097d21a3d0e34683262be4331 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 13 Jul 2002 18:32:09 +0000 Subject: took painelf's change, modified it a lot, and now here's the result :-) svn-id: r4540 --- gui/ListWidget.cpp | 4 ++-- gui/ListWidget.h | 4 ++-- gui/ScrollBarWidget.cpp | 9 ++++++--- gui/ScrollBarWidget.h | 7 ++++--- gui/dialog.cpp | 28 ++++++++++++++++++++++++---- gui/dialog.h | 12 +++++++----- gui/widget.cpp | 23 +++++++++++++++++++---- gui/widget.h | 13 +++++++++---- 8 files changed, 73 insertions(+), 27 deletions(-) (limited to 'gui') diff --git a/gui/ListWidget.cpp b/gui/ListWidget.cpp index ca501fe617..096c8cd1d5 100644 --- a/gui/ListWidget.cpp +++ b/gui/ListWidget.cpp @@ -83,7 +83,7 @@ ListWidget::~ListWidget() { } -void ListWidget::handleClick(int x, int y, int button) +void ListWidget::handleMouseDown(int x, int y, int button) { if (_flags & WIDGET_ENABLED) { _selectedItem = (y - 2) / LINE_HEIGHT + _currentPos; @@ -91,7 +91,7 @@ void ListWidget::handleClick(int x, int y, int button) } } -void ListWidget::handleKey(char key, int modifiers) +void ListWidget::handleKeyDown(char key, int modifiers) { } diff --git a/gui/ListWidget.h b/gui/ListWidget.h index 35a827e017..d3f7b7760d 100644 --- a/gui/ListWidget.h +++ b/gui/ListWidget.h @@ -51,8 +51,8 @@ public: int getSelected() const { return _selectedItem; } void setNumberingMode(int numberingMode) { _numberingMode = numberingMode; } - virtual void handleClick(int x, int y, int button); - virtual void handleKey(char key, int modifiers); + virtual void handleMouseDown(int x, int y, int button); + virtual void handleKeyDown(char key, int modifiers); virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); protected: diff --git a/gui/ScrollBarWidget.cpp b/gui/ScrollBarWidget.cpp index d5a9607f4c..79db84ca30 100644 --- a/gui/ScrollBarWidget.cpp +++ b/gui/ScrollBarWidget.cpp @@ -68,7 +68,7 @@ ScrollBarWidget::ScrollBarWidget(Dialog *boss, int x, int y, int w, int h) } -void ScrollBarWidget::handleClick(int x, int y, int button) +void ScrollBarWidget::handleMouseDown(int x, int y, int button) { int old_pos = _currentPos; @@ -97,11 +97,14 @@ void ScrollBarWidget::handleClick(int x, int y, int button) } } -void ScrollBarWidget::handleMouseMoved(int x, int y, int button) +void ScrollBarWidget::handleMouseUp(int x, int y, int button) { - if (button == 0) + if (_isDraggingSlider) _isDraggingSlider = false; +} +void ScrollBarWidget::handleMouseMoved(int x, int y, int button) +{ if (_isDraggingSlider) { int old_pos = _currentPos; _sliderPos = y - _sliderDeltaMouseDownPos; diff --git a/gui/ScrollBarWidget.h b/gui/ScrollBarWidget.h index 842e0e767d..c4b54b446c 100644 --- a/gui/ScrollBarWidget.h +++ b/gui/ScrollBarWidget.h @@ -54,13 +54,14 @@ public: int _currentPos; public: ScrollBarWidget(Dialog *boss, int x, int y, int w, int h); -// virtual ~ScrollBarWidget(); - void handleClick(int x, int y, int button); + void handleMouseDown(int x, int y, int button); + void handleMouseUp(int x, int y, int button); void handleMouseMoved(int x, int y, int button); void handleMouseEntered(int button) { setFlags(WIDGET_HILITED); } - void handleMouseLeft(int button) { clearFlags(WIDGET_HILITED); _part = kNoPart; _isDraggingSlider = false; draw(); } + void handleMouseLeft(int button) { clearFlags(WIDGET_HILITED); _part = kNoPart; draw(); } + // FIXME: Shouldn't these be private? void recalc(); protected: diff --git a/gui/dialog.cpp b/gui/dialog.cpp index 828a630168..52556d5fcf 100644 --- a/gui/dialog.cpp +++ b/gui/dialog.cpp @@ -80,25 +80,38 @@ void Dialog::draw() } } -void Dialog::handleClick(int x, int y, int button) +void Dialog::handleMouseDown(int x, int y, int button) +{ + // FIXME: If outside focused widget, widget loses focus + + Widget *w = findWidget(x - _x, y - _y); + if (w) + w->handleMouseDown(x - _x - w->_x, y - _y - w->_y, button); +} + +void Dialog::handleMouseUp(int x, int y, int button) { Widget *w = findWidget(x - _x, y - _y); if (w) - w->handleClick(x - _x - w->_x, y - _y - w->_y, button); + w->handleMouseUp(x - _x - w->_x, y - _y - w->_y, button); } -void Dialog::handleKey(char key, int modifiers) +void Dialog::handleKeyDown(char key, int modifiers) { // ESC closes all dialogs by default if (key == 27) close(); + // FIXME: Only if not focused widget + // Hotkey handling Widget *w = _firstWidget; key = toupper(key); while (w) { if (w->_type == kButtonWidget && key == toupper(((ButtonWidget *)w)->_hotkey)) { - w->handleClick(0, 0, 1); + // FIXME: Calling both handlers is bad style, but we don't really know which one we're supposed to call + w->handleMouseDown(0, 0, 1); + w->handleMouseUp(0, 0, 1); break; } w = w->_next; @@ -109,6 +122,11 @@ void Dialog::handleKey(char key, int modifiers) // and also for an editable list widget. } +void Dialog::handleKeyUp(char key, int modifiers) +{ + // FIXME: Focused widget recieves keyup +} + void Dialog::handleMouseMoved(int x, int y, int button) { Widget *w = findWidget(x - _x, y - _y); @@ -127,6 +145,8 @@ void Dialog::handleMouseMoved(int x, int y, int button) if (w->getFlags() & WIDGET_TRACK_MOUSE) { w->handleMouseMoved(x - _x - w->_x, y - _y - w->_y, button); } + + //FIXME: Focused widget recieves mouseup } diff --git a/gui/dialog.h b/gui/dialog.h index 29a4b76795..460fa6e0bf 100644 --- a/gui/dialog.h +++ b/gui/dialog.h @@ -53,8 +53,10 @@ public: virtual void draw(); //virtual void handleIdle(); // Called periodically - virtual void handleClick(int x, int y, int button); - virtual void handleKey(char key, int modifiers); // modifiers = alt/shift/ctrl etc. + virtual void handleMouseDown(int x, int y, int button); + virtual void handleMouseUp(int x, int y, int button); + virtual void handleKeyDown(char key, int modifiers); // modifiers = alt/shift/ctrl etc. + virtual void handleKeyUp(char key, int modifiers); // modifiers = alt/shift/ctrl etc. virtual void handleMouseMoved(int x, int y, int button); virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); @@ -102,14 +104,14 @@ class PauseDialog : public Dialog { public: PauseDialog(NewGui *gui); - virtual void handleClick(int x, int y, int button) + virtual void handleMouseDown(int x, int y, int button) { close(); } - virtual void handleKey(char key, int modifiers) + virtual void handleKeyDown(char key, int modifiers) { if (key == 32) close(); else - Dialog::handleKey(key, modifiers); + Dialog::handleKeyDown(key, modifiers); } }; diff --git a/gui/widget.cpp b/gui/widget.cpp index f170ddadc2..22bf54096c 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -127,7 +127,7 @@ ButtonWidget::~ButtonWidget() } } -void ButtonWidget::handleClick(int x, int y, int button) +void ButtonWidget::handleMouseDown(int x, int y, int button) { if (_flags & WIDGET_ENABLED) sendCommand(_cmd, 0); @@ -155,7 +155,7 @@ CheckboxWidget::CheckboxWidget(Dialog *boss, int x, int y, int w, int h, const c _type = kCheckboxWidget; } -void CheckboxWidget::handleClick(int x, int y, int button) +void CheckboxWidget::handleMouseDown(int x, int y, int button) { if (_flags & WIDGET_ENABLED) { _state = !_state; @@ -190,8 +190,8 @@ SliderWidget::SliderWidget(Dialog *boss, int x, int y, int w, int h, const char _type = kSliderWidget; } -void SliderWidget::handleMouseMoved(int x, int y, int state) { - if (state == 1) { +void SliderWidget::handleMouseMoved(int x, int y, int button) { + if (_isDragging) { int newvalue = x * 100 / _w; if (newvalue != _value) { @@ -217,3 +217,18 @@ void SliderWidget::drawWidget(bool hilite) // Draw the 'bar' gui->fillRect(_x + 2 + ((_w - 5) * _value / 100), _y + 2, 2, _h - 4, hilite ? gui->_textcolorhi : gui->_textcolor); } + +void SliderWidget::handleMouseDown(int x, int y, int button) { + int barx; + + barx=2 + ((_w - 5) * _old_value / 100); + + // only start dragging if mouse is over bar + if (x > (barx-3) && x < (barx+3)) + _isDragging=true; +} + +void SliderWidget::handleMouseUp(int x, int y, int button) { + if (_isDragging) + _isDragging=false; +} diff --git a/gui/widget.h b/gui/widget.h index b9fc92cc52..e237e24824 100644 --- a/gui/widget.h +++ b/gui/widget.h @@ -86,11 +86,13 @@ public: Widget(Dialog *boss, int x, int y, int w, int h); virtual ~Widget() {} - virtual void handleClick(int x, int y, int button) {} + virtual void handleMouseDown(int x, int y, int button) {} + virtual void handleMouseUp(int x, int y, int button) {} virtual void handleMouseEntered(int button) {} virtual void handleMouseLeft(int button) {} virtual void handleMouseMoved(int x, int y, int button) {} - virtual void handleKey(char key, int modifiers) {} + virtual void handleKeyDown(char key, int modifiers) {} + virtual void handleKeyUp(char key, int modifiers) {} void draw(); void setFlags(int flags) { _flags |= flags; } @@ -130,7 +132,7 @@ public: void setCmd(uint32 cmd) { _cmd = cmd; } uint32 getCmd() const { return _cmd; } - void handleClick(int x, int y, int button); + void handleMouseDown(int x, int y, int button); void handleMouseEntered(int button) { setFlags(WIDGET_HILITED); draw(); } void handleMouseLeft(int button) { clearFlags(WIDGET_HILITED); draw(); } }; @@ -144,7 +146,7 @@ public: void setState(bool state) { _state = state; } bool getState() const { return _state; } - void handleClick(int x, int y, int button); + void handleMouseDown(int x, int y, int button); virtual void handleMouseEntered(int button) {} virtual void handleMouseLeft(int button) {} @@ -156,12 +158,15 @@ protected: class SliderWidget : public ButtonWidget { protected: uint8 _value, _old_value; + bool _isDragging; public: SliderWidget(Dialog *boss, int x, int y, int w, int h, const char *label, uint32 cmd = 0, uint8 hotkey = 0); void setValue(uint8 value) { _value = value; } uint8 getValue() const { return _value; } void handleMouseMoved(int x, int y, int button); + void handleMouseDown(int x, int y, int button); + void handleMouseUp(int x, int y, int button); protected: void drawWidget(bool hilite); -- cgit v1.2.3