aboutsummaryrefslogtreecommitdiff
path: root/graphics/macgui/macwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/macgui/macwindow.cpp')
-rw-r--r--graphics/macgui/macwindow.cpp120
1 files changed, 102 insertions, 18 deletions
diff --git a/graphics/macgui/macwindow.cpp b/graphics/macgui/macwindow.cpp
index 350878446b..e754f3c593 100644
--- a/graphics/macgui/macwindow.cpp
+++ b/graphics/macgui/macwindow.cpp
@@ -50,6 +50,7 @@
#include "common/events.h"
#include "graphics/macgui/macwindowmanager.h"
#include "graphics/macgui/macwindow.h"
+#include "image/bmp.h"
namespace Graphics {
@@ -99,6 +100,8 @@ void MacWindow::setActive(bool active) {
_borderIsDirty = true;
}
+bool MacWindow::isActive() { return _active; }
+
void MacWindow::resize(int w, int h) {
if (_surface.w == w && _surface.h == h)
return;
@@ -177,13 +180,14 @@ static void drawPixelInverted(int x, int y, int color, void *data) {
}
void MacWindow::updateInnerDims() {
- _innerDims = _dims;
if (_macBorder.hasBorder(_active) && _macBorder.hasOffsets()) {
- int maxW = _innerDims.width() - _macBorder.getBorderOffset(kBorderOffsetLeft) - _macBorder.getBorderOffset(kBorderOffsetRight);
- int maxH = _innerDims.width() - _macBorder.getBorderOffset(kBorderOffsetTop) - _macBorder.getBorderOffset(kBorderOffsetBottom);
- _innerDims.clip(maxW, maxH);
- _innerDims.translate(_macBorder.getBorderOffset(kBorderOffsetLeft), _macBorder.getBorderOffset(kBorderOffsetTop));
+ _innerDims = Common::Rect(
+ _dims.left + _macBorder.getOffset(kBorderOffsetLeft),
+ _dims.top + _macBorder.getOffset(kBorderOffsetTop),
+ _dims.right - _macBorder.getOffset(kBorderOffsetRight),
+ _dims.bottom - _macBorder.getOffset(kBorderOffsetBottom));
} else {
+ _innerDims = _dims;
_innerDims.grow(-kBorderWidth);
}
}
@@ -192,12 +196,11 @@ void MacWindow::drawBorder() {
_borderIsDirty = false;
ManagedSurface *g = &_borderSurface;
- prepareBorderSurface(g);
-
- if (_macBorder.hasBorder(_active))
+ if (_macBorder.hasBorder(_active)) {
drawBorderFromSurface(g);
- else
+ } else {
drawSimpleBorder(g);
+ }
}
void MacWindow::prepareBorderSurface(ManagedSurface *g) {
@@ -211,6 +214,11 @@ void MacWindow::prepareBorderSurface(ManagedSurface *g) {
}
void MacWindow::drawBorderFromSurface(ManagedSurface *g) {
+ g->clear(kColorGreen2);
+ Common::Rect inside = _innerDims;
+ inside.moveTo(_macBorder.getOffset(kBorderOffsetLeft), _macBorder.getOffset(kBorderOffsetTop));
+ g->fillRect(inside, kColorGreen);
+
_macBorder.blitBorderInto(_borderSurface, _active);
}
@@ -223,6 +231,8 @@ void MacWindow::drawSimpleBorder(ManagedSurface *g) {
int width = _borderSurface.w;
int height = _borderSurface.h;
+ prepareBorderSurface(g);
+
drawBox(g, x, y, size, size);
drawBox(g, x + width - size - 1, y, size, size);
drawBox(g, x + width - size - 1, y + height - size - 1, size, size);
@@ -304,14 +314,33 @@ void MacWindow::setHighlight(WindowClick highlightedPart) {
_borderIsDirty = true;
}
- void MacWindow::setBorder(TransparentSurface &border, bool active, int lo, int ro, int to, int bo) {
+ void MacWindow::loadBorder(Common::SeekableReadStream &file, bool active, int lo, int ro, int to, int bo) {
+
+ Image::BitmapDecoder bmpDecoder;
+ Graphics::Surface source;
+ Graphics::TransparentSurface *surface = new Graphics::TransparentSurface();
+
+ bmpDecoder.loadStream(file);
+ source = *(bmpDecoder.getSurface());
+
+ source.convertToInPlace(surface->getSupportedPixelFormat(), bmpDecoder.getPalette());
+ surface->create(source.w, source.h, source.format);
+ surface->copyFrom(source);
+ surface->applyColorKey(255, 0, 255, false);
+
if (active)
- _macBorder.addActiveBorder(border);
+ _macBorder.addActiveBorder(*surface);
else
- _macBorder.addInactiveBorder(border);
+ _macBorder.addInactiveBorder(*surface);
if (!_macBorder.hasOffsets())
- _macBorder.setBorderOffsets(lo, ro, to, bo);
+ _macBorder.setOffsets(lo, ro, to, bo);
+
+ updateInnerDims();
+ }
+
+ void MacWindow::setCloseable(bool closeable) {
+ _closeable = closeable;
}
void MacWindow::drawBox(ManagedSurface *g, int x, int y, int w, int h) {
@@ -331,18 +360,56 @@ WindowClick MacWindow::isInBorder(int x, int y) {
if (_innerDims.contains(x, y))
return kBorderInner;
- if (x >= _innerDims.left - _borderWidth && x < _innerDims.left && y >= _innerDims.top - _borderWidth && y < _innerDims.top)
+ if (isInCloseButton(x, y))
return kBorderCloseButton;
if (_resizable)
- if (x >= _innerDims.right && x < _innerDims.right + _borderWidth && y >= _innerDims.bottom && y < _innerDims.bottom + _borderWidth)
+ if (isInResizeButton(x, y))
return kBorderResizeButton;
- if (_scrollable && x >= _innerDims.right && x < _innerDims.right + _borderWidth) {
- if (y < _innerDims.top - _borderWidth)
+ if (_scrollable)
+ return isInScroll(x, y);
+
+ return kBorderBorder;
+}
+
+bool MacWindow::isInCloseButton(int x, int y) {
+ int bLeft = kBorderWidth;
+ int bTop = kBorderWidth;
+ if (_macBorder.hasOffsets()) {
+ bLeft = _macBorder.getOffset(kBorderOffsetLeft);
+ bTop = _macBorder.getOffset(kBorderOffsetTop);
+ }
+ return (x >= _innerDims.left - bLeft && x < _innerDims.left && y >= _innerDims.top - bTop && y < _innerDims.top);
+}
+
+bool MacWindow::isInResizeButton(int x, int y) {
+ int bRight = kBorderWidth;
+ int bBottom = kBorderWidth;
+ if (_macBorder.hasOffsets()) {
+ bRight = _macBorder.getOffset(kBorderOffsetRight);
+ bBottom = _macBorder.getOffset(kBorderOffsetBottom);
+ }
+ return (x >= _innerDims.right && x < _innerDims.right + bRight && y >= _innerDims.bottom && y < _innerDims.bottom + bBottom);
+}
+
+WindowClick MacWindow::isInScroll(int x, int y) {
+ int bLeft = kBorderWidth;
+ int bTop = kBorderWidth;
+ int bRight = kBorderWidth;
+ int bBottom = kBorderWidth;
+ if (_macBorder.hasOffsets()) {
+ bLeft = _macBorder.getOffset(kBorderOffsetLeft);
+ bTop = _macBorder.getOffset(kBorderOffsetTop);
+ bRight = _macBorder.getOffset(kBorderOffsetRight);
+ bBottom = _macBorder.getOffset(kBorderOffsetBottom);
+ }
+
+ if (x >= _innerDims.right && x < _innerDims.right + bRight) {
+ if (y < _innerDims.top - bTop)
return kBorderBorder;
- if (y >= _innerDims.bottom + _borderWidth)
+ if (y >= _innerDims.bottom + bBottom)
return kBorderBorder;
if (y >= _innerDims.top + _innerDims.height() / 2)
@@ -351,6 +418,19 @@ WindowClick MacWindow::isInBorder(int x, int y) {
return kBorderScrollUp;
}
+ if (y >= _innerDims.bottom && y < _innerDims.bottom + bBottom) {
+ if (x < _innerDims.left - bTop)
+ return kBorderBorder;
+
+ if (x >= _innerDims.right + bRight)
+ return kBorderBorder;
+
+ if (x >= _innerDims.left + _innerDims.width() / 2)
+ return kBorderScrollRight;
+
+ return kBorderScrollLeft;
+ }
+
return kBorderBorder;
}
@@ -397,6 +477,10 @@ bool MacWindow::processEvent(Common::Event &event) {
_draggedY = event.mouse.y;
}
+ if (click == kBorderCloseButton && _closeable) {
+ _wm->removeWindow(this);
+ }
+
break;
case Common::EVENT_LBUTTONUP:
_beingDragged = false;