/* 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 .
*
*/
/*
* Copyright (C) 2006-2010 - Frictional Games
*
* This file is part of HPL1 Engine.
*/
#ifndef HPL_GUI_SET_H
#define HPL_GUI_SET_H
#include "common/list.h"
#include "hpl1/engine/graphics/GraphicsTypes.h"
#include "hpl1/engine/gui/GuiTypes.h"
#include "hpl1/std/multiset.h"
#include "hpl1/std/set.h"
namespace hpl {
//---------------------------------------------
class cResources;
class cGraphics;
class cSound;
class cScene;
class FontData;
class cGui;
class cGuiSkin;
class iGuiMaterial;
class iGuiPopUp;
class iWidget;
class cWidgetWindow;
class cWidgetFrame;
class cWidgetButton;
class cWidgetLabel;
class cWidgetSlider;
class cWidgetTextBox;
class cWidgetCheckBox;
class cWidgetImage;
class cWidgetListBox;
class cWidgetComboBox;
//---------------------------------------------
typedef Common::List tGuiPopUpList;
typedef tGuiPopUpList::iterator tGuiPopUpListIt;
//---------------------------------------------
class cGuiClipRegion;
class cGuiRenderObject {
public:
cGuiGfxElement *mpGfx;
cVector3f mvPos;
cVector2f mvSize;
cColor mColor;
iGuiMaterial *mpCustomMaterial;
cGuiClipRegion *mpClipRegion;
};
class cGuiRenderObjectCompare {
public:
bool operator()(const cGuiRenderObject &aObjectA, const cGuiRenderObject &aObjectB) const;
};
typedef Hpl1::Std::multiset tGuiRenderObjectSet;
typedef tGuiRenderObjectSet::iterator tGuiRenderObjectSetIt;
//-----------------------------------------------
typedef Common::List tGuiClipRegionList;
typedef tGuiClipRegionList::iterator tGuiClipRegionListIt;
class cGuiClipRegion {
public:
cGuiClipRegion() : mRect(0, 0, -1, -1) {}
~cGuiClipRegion();
void Clear();
cGuiClipRegion *CreateChild(const cVector3f &avPos, const cVector2f &avSize);
// tGuiRenderObjectSet m_setObjects;
cRect2f mRect;
tGuiClipRegionList mlstChildren;
};
//-----------------------------------------------
class cGuiSet {
public:
cGuiSet(const tString &asName, cGui *apGui, cGuiSkin *apSkin,
cResources *apResources, cGraphics *apGraphics,
cSound *apSound, cScene *apScene);
~cGuiSet();
////////////////////////////////////
// General
void Update(float afTimeStep);
void DrawAll(float afTimeStep);
bool SendMessage(eGuiMessage aMessage, cGuiMessageData &aData);
////////////////////////////////////
// Rendering
void Render();
void SetDrawOffset(const cVector3f &avOffset) { mvDrawOffset = avOffset; }
void SetCurrentClipRegion(cGuiClipRegion *apRegion) { mpCurrentClipRegion = apRegion; }
void DrawGfx(cGuiGfxElement *apGfx,
const cVector3f &avPos,
const cVector2f &avSize = -1,
const cColor &aColor = cColor(1, 1),
eGuiMaterial aMaterial = eGuiMaterial_LastEnum);
void DrawFont(const tWString &asText,
FontData *apFont, const cVector3f &avPos,
const cVector2f &avSize, const cColor &aColor,
eFontAlign aAlign = eFontAlign_Left,
eGuiMaterial aMaterial = eGuiMaterial_FontNormal);
////////////////////////////////////
// Widget Creation
cWidgetWindow *CreateWidgetWindow(const cVector3f &avLocalPos = 0,
const cVector2f &avSize = 0,
const tWString &asText = {},
iWidget *apParent = NULL,
const tString &asName = "");
cWidgetFrame *CreateWidgetFrame(const cVector3f &avLocalPos = 0,
const cVector2f &avSize = 0,
bool abDrawFrame = false,
iWidget *apParent = NULL,
const tString &asName = "");
cWidgetButton *CreateWidgetButton(const cVector3f &avLocalPos = 0,
const cVector2f &avSize = 0,
const tWString &asText = {},
iWidget *apParent = NULL,
const tString &asName = "");
cWidgetLabel *CreateWidgetLabel(const cVector3f &avLocalPos = 0,
const cVector2f &avSize = 0,
const tWString &asText = {},
iWidget *apParent = NULL,
const tString &asName = "");
cWidgetSlider *CreateWidgetSlider(eWidgetSliderOrientation aOrientation,
const cVector3f &avLocalPos = 0,
const cVector2f &avSize = 0,
int alMaxValue = 10,
iWidget *apParent = NULL,
const tString &asName = "");
cWidgetTextBox *CreateWidgetTextBox(const cVector3f &avLocalPos = 0,
const cVector2f &avSize = 0,
const tWString &asText = {},
iWidget *apParent = NULL,
const tString &asName = "");
cWidgetCheckBox *CreateWidgetCheckBox(const cVector3f &avLocalPos = 0,
const cVector2f &avSize = 0,
const tWString &asText = {},
iWidget *apParent = NULL,
const tString &asName = "");
cWidgetImage *CreateWidgetImage(const tString &asFile = "",
const cVector3f &avLocalPos = 0,
const cVector2f &avSize = -1,
eGuiMaterial aMaterial = eGuiMaterial_Alpha,
bool abAnimate = false,
iWidget *apParent = NULL,
const tString &asName = "");
cWidgetListBox *CreateWidgetListBox(const cVector3f &avLocalPos = 0,
const cVector2f &avSize = 0,
iWidget *apParent = NULL,
const tString &asName = "");
cWidgetComboBox *CreateWidgetComboBox(const cVector3f &avLocalPos = 0,
const cVector2f &avSize = 0,
const tWString &asText = {},
iWidget *apParent = NULL,
const tString &asName = "");
iWidget *GetWidgetFromName(const tString &asName);
void DestroyWidget(iWidget *apWidget);
////////////////////////////////////
// Popup
void CreatePopUpMessageBox(const tWString &asLabel, const tWString &asText,
const tWString &asButton1, const tWString &asButton2,
void *apCallbackObject, tGuiCallbackFunc apCallback);
void DestroyPopUp(iGuiPopUp *apPopUp);
////////////////////////////////////
// Properties
void SetActive(bool abX);
bool IsActive() { return mbActive; }
cGui *GetGui() { return mpGui; }
void SetDrawMouse(bool abX);
bool GetDrawMouse() { return mbDrawMouse; }
void SetMouseZ(float afZ) { mfMouseZ = afZ; }
float GetMouse() { return mfMouseZ; }
void SetRootWidgetClips(bool abX);
bool GetRootWidgetClips();
void SetVirtualSize(const cVector2f &avSize, float afMinZ, float afMaxZ);
const cVector2f &GetVirtualSize() { return mvVirtualSize; }
void SetFocusedWidget(iWidget *apWidget);
iWidget *GetFocusedWidget() { return mpFocusedWidget; }
void SetAttentionWidget(iWidget *apWidget);
iWidget *GetAttentionWidget() { return mpAttentionWidget; }
void SetIs3D(bool abX);
bool Is3D() { return mbIs3D; }
int GetDrawPriority() { return mlDrawPrio; }
void SetDrawPriority(int alPrio) { mlDrawPrio = alPrio; }
void SetCurrentPointer(cGuiGfxElement *apGfx);
cGuiGfxElement *GetCurrentPointer() { return mpGfxCurrentPointer; }
void Set3DSize(const cVector3f &avSize);
cVector3f Get3DSize() { return mv3DSize; }
void SetCullBackface(bool abX) { mbCullBackface = abX; }
bool GetCullBackface() { return mbCullBackface; }
void Set3DTransform(const cMatrixf &a_mtxTransform);
cMatrixf Get3DTransform() { return m_mtx3DTransform; }
bool HasFocus();
void SetSkin(cGuiSkin *apSkin);
cGuiSkin *GetSkin() { return mpSkin; }
cResources *GetResources() { return mpResources; }
bool IsDestroyingSet() { return mbDestroyingSet; }
private:
void RenderClipRegion();
void AddWidget(iWidget *apWidget, iWidget *apParent);
bool OnMouseMove(cGuiMessageData &aData);
bool OnMouseDown(cGuiMessageData &aData);
bool OnMouseUp(cGuiMessageData &aData);
bool OnMouseDoubleClick(cGuiMessageData &aData);
bool OnKeyPress(cGuiMessageData &aData);
bool DrawMouse(iWidget *apWidget, cGuiMessageData &aData);
kGuiCalllbackDeclarationEnd(DrawMouse);
cGui *mpGui;
cGuiSkin *mpSkin;
tString msName;
cResources *mpResources;
cGraphics *mpGraphics;
cSound *mpSound;
cScene *mpScene;
iWidget *mpAttentionWidget;
iWidget *mpFocusedWidget;
iWidget *mpWidgetRoot;
tWidgetList mlstWidgets;
tGuiRenderObjectSet m_setRenderObjects;
cVector2f mvVirtualSize;
float mfVirtualMinZ;
float mfVirtualMaxZ;
cVector3f mvDrawOffset;
bool mbCullBackface;
bool mbIs3D;
cVector3f mv3DSize;
cMatrixf m_mtx3DTransform;
int mlDrawPrio;
bool mbActive;
bool mbDrawMouse;
float mfMouseZ;
cGuiGfxElement *mpGfxCurrentPointer;
bool mvMouseDown[3];
cVector2f mvMousePos;
tGuiPopUpList mlstPopUps;
cGuiClipRegion mBaseClipRegion;
cGuiClipRegion *mpCurrentClipRegion;
bool mbDestroyingSet;
};
} // namespace hpl
#endif // HPL_GUI_SET_H