WAGE: Started window resize implementation
This commit is contained in:
parent
ca4a948240
commit
b4a2361bf7
5 changed files with 59 additions and 26 deletions
|
@ -190,10 +190,10 @@ Gui::Gui(WageEngine *engine) {
|
|||
|
||||
_menu = new Menu(this);
|
||||
|
||||
_sceneWindow = _wm.add(false);
|
||||
_sceneWindow = _wm.add(false, false);
|
||||
_sceneWindow->setCallback(sceneWindowCallback, this);
|
||||
|
||||
_consoleWindow = _wm.add(true);
|
||||
_consoleWindow = _wm.add(true, true);
|
||||
_consoleWindow->setCallback(consoleWindowCallback, this);
|
||||
}
|
||||
|
||||
|
@ -393,6 +393,13 @@ bool Gui::processConsoleEvents(WindowClick click, Common::Event &event) {
|
|||
return false;
|
||||
}
|
||||
|
||||
if (click == kBorderResizeButton) {
|
||||
_consoleDirty = true;
|
||||
_consoleFullRedraw = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (click == kBorderInner) {
|
||||
if (event.type == Common::EVENT_LBUTTONDOWN) {
|
||||
startMarking(event.mouse.x, event.mouse.y);
|
||||
|
|
|
@ -54,7 +54,8 @@
|
|||
|
||||
namespace Wage {
|
||||
|
||||
MacWindow::MacWindow(int id, bool scrollable) : _scrollable(scrollable), _id(id) {
|
||||
MacWindow::MacWindow(int id, bool scrollable, bool resizable) :
|
||||
_scrollable(scrollable), _id(id), _resizable(resizable) {
|
||||
_active = false;
|
||||
_borderIsDirty = true;
|
||||
_contentIsDirty = true;
|
||||
|
@ -67,6 +68,7 @@ MacWindow::MacWindow(int id, bool scrollable) : _scrollable(scrollable), _id(id)
|
|||
_dataPtr = 0;
|
||||
|
||||
_beingDragged = false;
|
||||
_beingResized = false;
|
||||
}
|
||||
|
||||
MacWindow::~MacWindow() {
|
||||
|
@ -277,34 +279,35 @@ void MacWindow::fillRect(Graphics::ManagedSurface *g, int x, int y, int w, int h
|
|||
g->fillRect(r, color);
|
||||
}
|
||||
|
||||
static WindowClick isInBorder(Common::Rect &rect, int x, int y) {
|
||||
if (rect.contains(x, y))
|
||||
WindowClick MacWindow::isInBorder(int x, int y) {
|
||||
if (_innerDims.contains(x, y))
|
||||
return kBorderInner;
|
||||
|
||||
if (x >= rect.left - kBorderWidth && x < rect.left && y >= rect.top - kBorderWidth && y < rect.top)
|
||||
if (x >= _innerDims.left - kBorderWidth && x < _innerDims.left && y >= _innerDims.top - kBorderWidth && y < _innerDims.top)
|
||||
return kBorderCloseButton;
|
||||
|
||||
if (y >= rect.top - kBorderWidth && y < rect.top)
|
||||
return kBorderHeader;
|
||||
if (_resizable)
|
||||
if (x >= _innerDims.right && x < _innerDims.right + kBorderWidth && y >= _innerDims.bottom && y < _innerDims.bottom + kBorderWidth)
|
||||
return kBorderResizeButton;
|
||||
|
||||
if (x >= rect.right && x < rect.right + kBorderWidth) {
|
||||
if (y < rect.top - kBorderWidth)
|
||||
return kBorderNone;
|
||||
if (_scrollable && x >= _innerDims.right && x < _innerDims.right + kBorderWidth) {
|
||||
if (y < _innerDims.top - kBorderWidth)
|
||||
return kBorderBorder;
|
||||
|
||||
if (y >= rect.bottom + kBorderWidth)
|
||||
return kBorderNone;
|
||||
if (y >= _innerDims.bottom + kBorderWidth)
|
||||
return kBorderBorder;
|
||||
|
||||
if (y >= rect.top + rect.height() / 2)
|
||||
if (y >= _innerDims.top + _innerDims.height() / 2)
|
||||
return kBorderScrollDown;
|
||||
|
||||
return kBorderScrollUp;
|
||||
}
|
||||
|
||||
return kBorderNone;
|
||||
return kBorderBorder;
|
||||
}
|
||||
|
||||
bool MacWindow::processEvent(Common::Event &event) {
|
||||
WindowClick click = isInBorder(_innerDims, event.mouse.x, event.mouse.y);
|
||||
WindowClick click = isInBorder(event.mouse.x, event.mouse.y);
|
||||
|
||||
switch (event.type) {
|
||||
case Common::EVENT_MOUSEMOVE:
|
||||
|
@ -317,21 +320,40 @@ bool MacWindow::processEvent(Common::Event &event) {
|
|||
|
||||
((WageEngine *)g_engine)->_gui->_wm.setFullRefresh(true);
|
||||
}
|
||||
|
||||
if (_beingResized) {
|
||||
_dims.setWidth(MAX(kBorderWidth * 4, _dims.width() + event.mouse.x - _draggedX));
|
||||
_dims.setHeight(MAX(kBorderWidth * 4, _dims.height() + event.mouse.y - _draggedY));
|
||||
updateInnerDims();
|
||||
|
||||
_draggedX = event.mouse.x;
|
||||
_draggedY = event.mouse.y;
|
||||
|
||||
((WageEngine *)g_engine)->_gui->_wm.setFullRefresh(true);
|
||||
(*_callback)(click, event, _dataPtr);
|
||||
}
|
||||
break;
|
||||
case Common::EVENT_LBUTTONDOWN:
|
||||
setHighlight(click);
|
||||
|
||||
if (click == kBorderHeader) {
|
||||
if (click == kBorderBorder) {
|
||||
_beingDragged = true;
|
||||
|
||||
_draggedX = event.mouse.x;
|
||||
_draggedY = event.mouse.y;
|
||||
}
|
||||
|
||||
if (click == kBorderResizeButton) {
|
||||
_beingResized = true;
|
||||
|
||||
_draggedX = event.mouse.x;
|
||||
_draggedY = event.mouse.y;
|
||||
}
|
||||
|
||||
break;
|
||||
case Common::EVENT_LBUTTONUP:
|
||||
if (_beingDragged)
|
||||
_beingDragged = false;
|
||||
_beingResized = false;
|
||||
|
||||
setHighlight(kBorderNone);
|
||||
break;
|
||||
|
|
|
@ -67,12 +67,13 @@ enum WindowClick {
|
|||
kBorderScrollDown,
|
||||
kBorderCloseButton,
|
||||
kBorderInner,
|
||||
kBorderHeader
|
||||
kBorderBorder,
|
||||
kBorderResizeButton
|
||||
};
|
||||
|
||||
class MacWindow {
|
||||
public:
|
||||
MacWindow(int id, bool scrollable);
|
||||
MacWindow(int id, bool scrollable, bool resizable);
|
||||
~MacWindow();
|
||||
void move(int x, int y);
|
||||
void resize(int w, int h);
|
||||
|
@ -89,6 +90,7 @@ public:
|
|||
bool processEvent(Common::Event &event);
|
||||
void setCallback(bool (*callback)(WindowClick, Common::Event &, void *), void *data) { _callback = callback; _dataPtr = data; }
|
||||
bool beingDragged() { return _beingDragged; }
|
||||
bool beingResized() { return _beingResized; }
|
||||
|
||||
private:
|
||||
void drawBorder();
|
||||
|
@ -97,18 +99,20 @@ private:
|
|||
const Graphics::Font *getTitleFont();
|
||||
bool builtInFonts();
|
||||
void updateInnerDims();
|
||||
WindowClick isInBorder(int x, int y);
|
||||
|
||||
private:
|
||||
Graphics::ManagedSurface _surface;
|
||||
Graphics::ManagedSurface _borderSurface;
|
||||
Graphics::ManagedSurface _composeSurface;
|
||||
bool _scrollable;
|
||||
bool _resizable;
|
||||
bool _active;
|
||||
bool _borderIsDirty;
|
||||
bool _contentIsDirty;
|
||||
int _id;
|
||||
|
||||
bool _beingDragged;
|
||||
bool _beingDragged, _beingResized;
|
||||
int _draggedX, _draggedY;
|
||||
|
||||
WindowClick _highlightedPart;
|
||||
|
|
|
@ -71,8 +71,8 @@ MacWindowManager::~MacWindowManager() {
|
|||
delete _windows[i];
|
||||
}
|
||||
|
||||
MacWindow *MacWindowManager::add(bool scrollable) {
|
||||
MacWindow *w = new MacWindow(_lastId, scrollable);
|
||||
MacWindow *MacWindowManager::add(bool scrollable, bool resizable) {
|
||||
MacWindow *w = new MacWindow(_lastId, scrollable, resizable);
|
||||
|
||||
_windows.push_back(w);
|
||||
_windowStack.push_back(w);
|
||||
|
@ -128,7 +128,7 @@ bool MacWindowManager::processEvent(Common::Event &event) {
|
|||
it--;
|
||||
MacWindow *w = *it;
|
||||
|
||||
if (w->beingDragged() || w->getDimensions().contains(event.mouse.x, event.mouse.y)) {
|
||||
if (w->beingDragged() || w->beingResized() || w->getDimensions().contains(event.mouse.x, event.mouse.y)) {
|
||||
if (event.type == Common::EVENT_LBUTTONDOWN || event.type == Common::EVENT_LBUTTONUP)
|
||||
setActive(w->getId());
|
||||
|
||||
|
|
|
@ -59,7 +59,7 @@ public:
|
|||
|
||||
void setScreen(Graphics::ManagedSurface *screen) { _screen = screen; }
|
||||
|
||||
MacWindow *add(bool scrollable);
|
||||
MacWindow *add(bool scrollable, bool resizable);
|
||||
void setActive(int id);
|
||||
|
||||
void setFullRefresh(bool redraw) { _fullRefresh = true; }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue