207 lines
6.5 KiB
C++
207 lines
6.5 KiB
C++
/*
|
|
This file is part of Warzone 2100.
|
|
Copyright (C) 1999-2004 Eidos Interactive
|
|
Copyright (C) 2005-2013 Warzone 2100 Project
|
|
|
|
Warzone 2100 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.
|
|
|
|
Warzone 2100 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 Warzone 2100; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/** @file
|
|
* Definitions for the basic widget types.
|
|
*/
|
|
|
|
#ifndef __INCLUDED_LIB_WIDGET_WIDGBASE_H__
|
|
#define __INCLUDED_LIB_WIDGET_WIDGBASE_H__
|
|
|
|
#include "lib/framework/frame.h"
|
|
#include "lib/ivis_opengl/piedef.h"
|
|
#include "lib/ivis_opengl/textdraw.h"
|
|
#include <QtCore/QRect>
|
|
#include <QtCore/QObject>
|
|
|
|
|
|
/* Forward definitions */
|
|
class WIDGET;
|
|
struct W_CONTEXT;
|
|
class W_FORM;
|
|
struct W_INIT;
|
|
struct W_SCREEN;
|
|
class W_EDITBOX;
|
|
class W_BARGRAPH;
|
|
class W_BUTTON;
|
|
class W_LABEL;
|
|
class W_SLIDER;
|
|
class StateButton;
|
|
class ListWidget;
|
|
|
|
/* The display function prototype */
|
|
typedef void (*WIDGET_DISPLAY)(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset);
|
|
|
|
/* The optional user callback function */
|
|
typedef void (*WIDGET_CALLBACK)(WIDGET *psWidget, W_CONTEXT *psContext);
|
|
typedef void (*WIDGET_AUDIOCALLBACK)(int AudioID);
|
|
|
|
|
|
/* The different base types of widget */
|
|
enum WIDGET_TYPE
|
|
{
|
|
WIDG_FORM,
|
|
WIDG_LABEL,
|
|
WIDG_BUTTON,
|
|
WIDG_EDITBOX,
|
|
WIDG_BARGRAPH,
|
|
WIDG_SLIDER,
|
|
WIDG_UNSPECIFIED_TYPE,
|
|
};
|
|
|
|
/* The keys that can be used to press a button */
|
|
enum WIDGET_KEY
|
|
{
|
|
WKEY_NONE,
|
|
WKEY_PRIMARY,
|
|
WKEY_SECONDARY,
|
|
};
|
|
|
|
enum
|
|
{
|
|
WIDG_HIDDEN = 0x8000, ///< The widget is initially hidden
|
|
};
|
|
|
|
/* The base widget data type */
|
|
class WIDGET : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
typedef std::vector<WIDGET *> Children;
|
|
|
|
WIDGET(W_INIT const *init, WIDGET_TYPE type);
|
|
WIDGET(WIDGET *parent, WIDGET_TYPE type = WIDG_UNSPECIFIED_TYPE);
|
|
virtual ~WIDGET();
|
|
|
|
void deleteLater(); ///< Like "delete this;", but safe to call from display/run callbacks.
|
|
|
|
virtual void widgetLost(WIDGET *);
|
|
|
|
virtual void clicked(W_CONTEXT *, WIDGET_KEY = WKEY_PRIMARY) {}
|
|
virtual void released(W_CONTEXT *, WIDGET_KEY = WKEY_PRIMARY) {}
|
|
virtual void highlight(W_CONTEXT *) {}
|
|
virtual void highlightLost() {}
|
|
virtual void focusLost() {}
|
|
virtual void run(W_CONTEXT *) {}
|
|
virtual void display(int, int) {}
|
|
virtual void geometryChanged() {}
|
|
|
|
virtual unsigned getState();
|
|
virtual void setState(unsigned state);
|
|
virtual void setFlash(bool enable);
|
|
virtual QString getString() const;
|
|
virtual void setString(QString string);
|
|
virtual void setTip(QString string);
|
|
|
|
void show(bool doShow = true) { style = (style & ~WIDG_HIDDEN) | (!doShow*WIDG_HIDDEN); }
|
|
void hide() { show(false); }
|
|
bool visible() { return (style & WIDG_HIDDEN) == 0; }
|
|
|
|
void setString(char const *stringUtf8) { setString(QString::fromUtf8(stringUtf8)); }
|
|
void setTip(char const *stringUtf8) { setTip(QString::fromUtf8(stringUtf8)); }
|
|
|
|
WIDGET *parent() { return parentWidget; }
|
|
Children const &children() { return childWidgets; }
|
|
QRect const &geometry() const { return dim; }
|
|
int x() const { return dim.x(); }
|
|
int y() const { return dim.y(); }
|
|
int width() const { return dim.width(); }
|
|
int height() const { return dim.height(); }
|
|
void move(int x, int y) { setGeometry(QRect(x, y, width(), height())); }
|
|
void setGeometry(int x, int y, int w, int h) { setGeometry(QRect(x, y, w, h)); }
|
|
void setGeometry(QRect const &r);
|
|
|
|
void attach(WIDGET *widget);
|
|
void detach(WIDGET *widget);
|
|
|
|
UDWORD id; ///< The user set ID number for the widget. This is returned when e.g. a button is pressed.
|
|
WIDGET_TYPE type; ///< The widget type
|
|
UDWORD style; ///< The style of the widget
|
|
WIDGET_DISPLAY displayFunction; ///< Override function to display the widget.
|
|
WIDGET_CALLBACK callback; ///< User callback (if any)
|
|
void *pUserData; ///< Pointer to a user data block (if any)
|
|
UDWORD UserData; ///< User data (if any)
|
|
W_SCREEN * screenPointer; ///< Pointer to screen the widget is on (if attached).
|
|
|
|
private:
|
|
void setScreenPointer(W_SCREEN *screen); ///< Set screen pointer for us and all children.
|
|
public:
|
|
void processClickRecursive(W_CONTEXT *psContext, WIDGET_KEY key, bool wasPressed);
|
|
void runRecursive(W_CONTEXT *psContext);
|
|
void processCallbacksRecursive(W_CONTEXT *psContext);
|
|
void displayRecursive(int xOffset, int yOffset); ///< Display this widget, and all visible children.
|
|
private:
|
|
|
|
WIDGET * parentWidget; ///< Parent widget.
|
|
std::vector<WIDGET *> childWidgets; ///< Child widgets. Will be deleted if we are deleted.
|
|
|
|
QRect dim;
|
|
|
|
private:
|
|
#ifdef WZ_CXX11
|
|
WIDGET(WIDGET const &) = delete;
|
|
WIDGET &operator =(WIDGET const &) = delete;
|
|
#else
|
|
WIDGET(WIDGET const &); // Non-copyable.
|
|
WIDGET &operator =(WIDGET const &); // Non-copyable.
|
|
#endif
|
|
};
|
|
|
|
|
|
struct WidgetTrigger
|
|
{
|
|
WIDGET *widget;
|
|
};
|
|
typedef std::vector<WidgetTrigger> WidgetTriggers;
|
|
|
|
/* The screen structure which stores all info for a widget screen */
|
|
struct W_SCREEN
|
|
{
|
|
W_SCREEN();
|
|
~W_SCREEN();
|
|
|
|
void setFocus(WIDGET *widget); ///< Sets psFocus, notifying the old widget, if any.
|
|
void setReturn(WIDGET *psWidget); ///< Adds psWidget to retWidgets.
|
|
|
|
W_FORM *psForm; ///< The root form of the screen
|
|
WIDGET *psFocus; ///< The widget that has keyboard focus
|
|
WIDGET * lastHighlight; ///< The last widget to be highlighted. This is used to track when the mouse moves off something.
|
|
iV_fonts TipFontID; ///< ID of the IVIS font to use for tool tips.
|
|
WidgetTriggers retWidgets; ///< The widgets to be returned by widgRunScreen.
|
|
|
|
private:
|
|
#ifdef WZ_CXX11
|
|
W_SCREEN(W_SCREEN const &) = delete;
|
|
W_SCREEN &operator =(W_SCREEN const &) = delete;
|
|
#else
|
|
W_SCREEN(W_SCREEN const &); // Non-copyable.
|
|
W_SCREEN &operator =(W_SCREEN const &); // Non-copyable.
|
|
#endif
|
|
};
|
|
|
|
/* Context information to pass into the widget functions */
|
|
struct W_CONTEXT
|
|
{
|
|
SDWORD xOffset, yOffset; // Screen offset of the parent form
|
|
SDWORD mx, my; // mouse position on the form
|
|
};
|
|
|
|
#endif // __INCLUDED_LIB_WIDGET_WIDGBASE_H__
|