Files
scummvm-cursorfix/engines/bagel/spacebar/boflib/gui/window.h
2026-02-02 04:50:13 +01:00

481 lines
12 KiB
C++

/* 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef BAGEL_BOFLIB_GUI_WINDOW_H
#define BAGEL_BOFLIB_GUI_WINDOW_H
#include "common/list.h"
#include "common/events.h"
#include "bagel/spacebar/boflib/array.h"
#include "bagel/boflib/stdinc.h"
#include "bagel/boflib/error.h"
#include "bagel/boflib/object.h"
#include "bagel/boflib/point.h"
#include "bagel/boflib/rect.h"
#include "bagel/boflib/size.h"
#include "bagel/spacebar/boflib/timer.h"
#include "bagel/boflib/llist.h"
#include "bagel/spacebar/boflib/gfx/bitmap.h"
#include "bagel/boflib/palette.h"
#include "bagel/spacebar/boflib/gfx/text.h"
namespace Bagel {
class CBofString;
namespace SpaceBar {
#define MAX_TITLE 64
#define USE_DEFAULT (-1)
class CBofBitmap;
class CBofTimerPacket;
class CBofWindow : public CLList, public CBofObject, public CBofError {
private:
bool _visible = true;
bool _enabled = true;
Common::List<WindowTimer> _timers;
uint32 _lastLButtonTime = 0, _lastRButtonTime = 0;
/**
* Handles translating from a ScummVM event structure to
* a code used by the game engine
*/
uint32 translateKey(const Common::Event &event) const;
protected:
/**
* Checks window timers for expiry
*/
void checkTimers();
public:
/**
* Default constructor
*/
CBofWindow();
/**
* Constructor for CBofWindow
* @param pszName Name of window
* @param x X position
* @param y Y position
* @param nWidth Width of window to create (optional)
* @param nHeight Height of window to create (optional)
* @param pParent Parent of this window (optional)
*/
CBofWindow(const char *pszName, int x, int y, int nWidth, int nHeight, CBofWindow *pParent);
/**
* Destructor
*/
virtual ~CBofWindow();
static ErrorCode initialize();
static ErrorCode shutdown();
static Common::Point getMousePos();
/**
* Creates a window
* @param pszName Name of window
* @param x X position of upper-left corner
* @param y Y position of upper-left corner
* @param nWidth Width of window to create (optional)
* @param nHeight Height of window to create (optional)
* @param pParent Parent of this window (optional)
* @param nControlID User defined ID of this window
* @return Error return code
*/
virtual ErrorCode create(const char *pszName, int x, int y, int nWidth, int nHeight, CBofWindow *pParent, uint32 nControlID = 0);
/**
* Creates a window
* @param pszName Name of window
* @param pRect Rectangle for window placement
* @param pParent Parent of this window (optional)
* @param nControlID User defined ID of this window
* @return Error return code
*/
virtual ErrorCode create(const char *pszName, CBofRect *pRect, CBofWindow *pParent, uint32 nControlID = 0);
/**
* Destroys the Window attached to this CBofWindow (if any)
*/
virtual void destroy();
virtual void destroyWindow() {
destroy();
}
/**
* Shows current window (if hidden)
*/
void show();
void select();
/**
* Hides current window (if shown)
*/
void hide();
/**
* Centers current window in parent window or in screen
*/
void center();
/**
* Moves current window to specified location in parent
* @param x New upper left corner X position
* @param y New upper left corner Y position
* @param bRepaint true if should update the window
*/
void move(int x, int y, bool bRepaint = false);
/**
* Resizes current window to specified area
* @param pRect New area for window
* @param bRepaint Optional repaint after resize
*/
void reSize(CBofRect *pRect, bool bRepaint = false);
virtual ErrorCode close() {
onClose();
return ERR_NONE;
}
/**
* Posts a message
* @param nMessage Message to post
* @param lParam1 User info
* @param lParam2 More user info
*/
void postMessage(uint32 nMessage, uint32 lParam1, uint32 lParam2);
/**
* Posts a user defined message
*/
void postUserMessage(uint32 lMessage, uint32 lExtraInfo);
/**
* Sets a timer which calls specified callback (or onTimer)
* @param nID ID of timer to set
* @param nInterval Number of milliseconds till event
* @param pCallBack Function to call when time is up
*/
void setTimer(uint32 nID, uint32 nInterval, BofCallback pCallBack = nullptr);
/**
* Stops specified timer
* @param nID ID of timer to stop
*/
void killTimer(uint32 nID);
/**
* Stops all timers associated with current window
*/
void killMyTimers();
/**
* Returns the parent window element, if any
*/
CBofWindow *getParent() const {
return _parent;
}
/**
* Causes all parent windows to have valid paint regions
* @param pRect Area to validate
*/
void validateAnscestors(CBofRect *pRect = nullptr);
static CBofWindow *getActiveWindow() {
return _pActiveWindow;
}
void setActive() {
_pActiveWindow = this;
}
static CBofWindow *getWindowList() {
return _pWindowList;
}
CBofRect getWindowRect() const {
return _cWindowRect;
}
CBofRect getClientRect();
CBofRect getRect() const {
return _cRect;
}
int width() const {
return _cRect.width();
}
int height() const {
return _cRect.height();
}
void screenToClient(CBofPoint *pPoint);
/**
* Selects and Realizes specified palette into current DC
* @param pPal Palette to select
*/
void selectPalette(CBofPalette *pPal);
/**
* Associates a new background bitmap to this window
* @param pNewBitmap New background bitmap
* @param bRefresh true if should repaint now
* @return Error return code
*/
ErrorCode setBackdrop(CBofBitmap *pNewBitmap, bool bRefresh = false);
/**
* Associates a new background bitmap to this window
* @param pszFileName new background bitmap from file
* @param bRefresh true if should repaint now
* @return Error return code
*/
ErrorCode setBackdrop(const char *pszFileName, bool bRefresh = false);
void clearBackdrop() {
_pBackdrop = nullptr;
}
CBofBitmap *getBackdrop() const {
return _pBackdrop;
}
bool hasBackdrop() const {
return _pBackdrop != nullptr;
}
/**
* Deletes the background bitmap associated with this window
*/
void killBackdrop();
/**
* Updates the specified section of the background bitmap
* @param pRect Area of bitmap to update on screen
* @param nTransparentColor Color index used for transparency (-1 = none)
* @return Error return code
*/
ErrorCode paintBackdrop(CBofRect *pRect = nullptr, int nTransparentColor = -1);
void setControlID(uint32 nID) {
_nID = nID;
}
uint32 getControlID() const {
return _nID;
}
void setBkColor(COLORREF cColor) {
_cBkColor = cColor;
}
COLORREF getBkColor() const {
return _cBkColor;
}
void setFgColor(COLORREF cColor) {
_cFgColor = cColor;
}
COLORREF getFgColor() const {
return _cFgColor;
}
void setPrevMouseDown(CBofPoint p) {
_cPrevMouseDown = p;
}
CBofPoint getPrevMouseDown() const {
return _cPrevMouseDown;
}
/**
* Sets mouse capture for this window
*/
void setCapture();
/**
* Release mouse capture for this window
*/
void releaseCapture();
/**
* Returns true if the control is capturing mouse events
*/
bool hasCapture() const;
/**
* Sets the focus on a control for keyboard input
*/
void setFocus();
/**
* Releases focus from an edit control
*/
void releaseFocus();
/**
* Returns true if the control has focus
*/
bool hasFocus() const;
void flushAllMessages();
/**
* Adds specified rectangle to dirty rect list for this window
* @param pRect Rectangle to add to dirty list
*/
void validateRect(const CBofRect *pRect);
/**
* Removes specified rectangle from dirty rect for this window
* @param pRect Rectangle to remove from dirty list
*/
void invalidateRect(const CBofRect *pRect);
virtual void onBofButton(CBofObject *pButton, int nExtraInfo);
virtual void onBofScrollBar(CBofObject *pButton, int nNewPos);
virtual void onBofListBox(CBofObject *pListBox, int nItemIndex);
virtual void onMainLoop();
virtual void onSoundNotify(CBofObject *pObject, uint32 lParam2);
virtual void onMovieNotify(uint32 lParam1, uint32 lParam2);
virtual void onMCINotify(uint32 wParam, uint32 lParam);
virtual void onTimer(uint32 nTimerId);
/**
* Handles a pending ScummVM event
* @param event Event to process
*/
virtual void handleEvent(const Common::Event &event);
Graphics::ManagedSurface *getSurface();
bool isCreated() const {
return _surface != nullptr;
}
virtual void enable() {
_enabled = true;
updateWindow();
}
virtual void disable() {
_enabled = false;
updateWindow();
}
bool isVisible() const {
return _visible;
}
bool isEnabled() const {
return _enabled;
}
void updateWindow();
void setParent(CBofWindow *parent);
/**
* Handle all pending ScummVM events
*/
void handleEvents();
virtual void onKeyHit(uint32 lKey, uint32 lRepCount);
void fillWindow(byte iColor);
void fillRect(CBofRect *pRect, byte iColor);
ErrorCode paintBeveledText(CBofRect *rect, const CBofString &string, int size, int weight, COLORREF color, int justify, uint32 format);
protected:
CBofWindow *_parent = nullptr; // Pointer to parent window
Array<CBofWindow *> _children; // Child element pointers
virtual void onMouseMove(uint32 nFlags, CBofPoint *pPoint, void * = nullptr);
virtual void onLButtonDown(uint32 nFlags, CBofPoint *pPoint, void * = nullptr);
virtual void onLButtonUp(uint32 nFlags, CBofPoint *pPoint, void * = nullptr);
virtual void onLButtonDblClk(uint32 nFlags, CBofPoint *pPoint);
virtual void onRButtonDown(uint32 nFlags, CBofPoint *pPoint);
virtual void onRButtonUp(uint32 nFlags, CBofPoint *pPoint);
virtual void onRButtonDblClk(uint32 nFlags, CBofPoint *pPoint);
virtual void onReSize(CBofSize *pSize);
virtual void onPaint(CBofRect *pRect);
virtual void onClose();
virtual void onUserMessage(uint32 nMessage, uint32 lParam);
virtual void onActivate();
virtual void onDeActivate();
// Window Data
char _szTitle[MAX_TITLE] = { 0 }; // Title of window
CBofRect _cWindowRect; // Screen based area of this window
CBofRect _cRect; // Window-based area of this window
CBofBitmap *_pBackdrop = nullptr; // Backdrop bitmap
uint32 _nID = 0; // ID of this window
COLORREF _cBkColor = RGB(255, 255, 255);
COLORREF _cFgColor = RGB(0, 0, 0);
bool _bCaptured = false;
Graphics::ManagedSurface *_surface = nullptr;
static CBofWindow *_pWindowList;
static CBofWindow *_pActiveWindow;
static CBofTimerPacket *_pTimerList;
CBofPoint _cPrevMouseDown;
static int _mouseX;
static int _mouseY;
};
class CBofMessage : public CBofObject {
public:
CBofWindow *_pWindow; // destination window for message
uint32 _nMessage; // message to send (usually WM_USER)
uint32 _lParam1; // user defined info
uint32 _lParam2; // more user defined info
};
class CBofTimerPacket : public CBofObject, public CLList {
public:
CBofWindow *_pOwnerWindow;
BofCallback _pCallBack;
uint32 _nID;
uint32 _nInterval;
};
extern CBofWindow *g_hackWindow;
} // namespace SpaceBar
} // namespace Bagel
#endif