/*******************************************************************************
This file is Part of the Gewi GUI Library for ZEngine.
Gewi and ZEngine Copyright (C) 2002, 2003 James Turk
Licensed under a BSD-style license. (see licensing.txt)
The maintainer of this library is James Turk (james@conceptofzero.net)
this library is found at the home of ZEngine http://zengine.sourceforge.net
*******************************************************************************/
/*!
\file GewiEngine.cpp
\brief Implementation of GewiEngine.
Implementation of GewiEngine, core engine for Gewi GUI control.
$Id: GewiEngine.cpp,v 1.9 2003/06/16 04:47:54 cozman Exp $
\author James Turk
**/
#include "GewiWidget.h"
#include "GewiEngine.h"
namespace Gewi
{
VersionInfo GewiEngine::Version(0,2,0);
VersionInfo GewiEngine::MinZEVersion(0,8,4); //important to keep this accurate
GewiEngine *GewiEngine::sInstance=NULL;
GewiEngine::GewiEngine()
{
ZE::ZEngine *ze = ZE::ZEngine::GetInstance();
//check version of ZEngine
if(ZE::ZEngine::Version < GewiEngine::MinZEVersion)
ze->WriteLog(ZE::FormatStr("Gewi %s requires ZEngine %s or greater, ZEngine %s in use.",
GewiEngine::Version.GetString().c_str(),
GewiEngine::MinZEVersion.GetString().c_str(),
ZE::ZEngine::Version.GetString().c_str()));
ze->SetEventFilter((SDL_EventFilter)GewiEngine::EventFilter);
SDL_EnableUNICODE(1); //needed for the key translation
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL); //more like typing, less like game
}
GewiEngine* GewiEngine::GetInstance()
{
if(!sInstance)
sInstance = new GewiEngine;
return sInstance;
}
void GewiEngine::ReleaseInstance()
{
if(sInstance)
{
sInstance->FreeResources();
sInstance->mWidgetList.DeleteWidgets();
delete sInstance;
sInstance = NULL;
//set everything back to default
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_INTERVAL,SDL_DEFAULT_REPEAT_INTERVAL);
SDL_EnableUNICODE(0);
ZE::ZEngine::GetInstance()->SetEventFilter(NULL);
}
}
int GewiEngine::EventFilter(SDL_Event *event)
{
static char noChar = '\0';
GewiEngine *gewi = GewiEngine::GetInstance();
char ch;
//called inside ZEngine::CheckEvents
switch(event->type)
{
case SDL_MOUSEBUTTONDOWN:
if(event->button.button == SDL_BUTTON_LEFT)
gewi->SendMessage(event,GE_LDOWN,event->button.x,event->button.y,noChar);
if(event->button.button == SDL_BUTTON_RIGHT)
gewi->SendMessage(event,GE_RDOWN,event->button.x,event->button.y,noChar);
break;
case SDL_MOUSEBUTTONUP:
if(event->button.button == SDL_BUTTON_LEFT)
gewi->SendMessage(event,GE_LUP,event->button.x,event->button.y,noChar);
if(event->button.button == SDL_BUTTON_RIGHT)
gewi->SendMessage(event,GE_RUP,event->button.x,event->button.y,noChar);
break;
case SDL_KEYDOWN:
ch = TranslateKey(event->key.keysym);
gewi->SendMessage(event,GE_KDOWN,0,0,ch);
break;
case SDL_KEYUP:
ch = TranslateKey(event->key.keysym);
gewi->SendMessage(event,GE_KUP,0,0,ch);
break;
default:
break;
}
return 1; //pass the event on, allowing ZEngine to do what it needs
}
char GewiEngine::TranslateKey(SDL_keysym key)
{
//this is why unicode must be enabled, without this it'd be one massive switch statement
if(key.unicode > 0 && key.unicode <= 255)
return static_cast(key.unicode);
else
return static_cast(127);
}
void GewiEngine::Display()
{
mWidgetList.ShowWidgets();
}
ResourceID GewiEngine::AddResource(ZE::ZImage *image)
{
mImageVec.push_back(image);
return static_cast(mImageVec.size()-1);
}
ResourceID GewiEngine::AddResource(ZE::ZFont *font)
{
mFontVec.push_back(font);
return static_cast(mFontVec.size()-1);
}
ZE::ZImage* GewiEngine::Image(ResourceID id)
{
//do range checking
if(id >= 0 && id < mImageVec.size())
return mImageVec[id];
else
return NULL;
}
ZE::ZFont* GewiEngine::Font(ResourceID id)
{
//do range checking
if(id >= 0 && id < mFontVec.size())
return mFontVec[id];
else
return NULL;
}
void GewiEngine::FreeResources()
{
for(ResourceID i=0; i < mImageVec.size(); i++)
{
if(mImageVec[i])
mImageVec[i]->Release();
}
for(ResourceID i=0; i < mFontVec.size(); i++)
{
if(mFontVec[i])
mFontVec[i]->Release();
}
}
void GewiEngine::Register(GWidget *widget)
{
WidgetNode *node = new WidgetNode;
node->widget = widget;
mWidgetList.AddWidget(node);
}
void GewiEngine::SendMessage(SDL_Event *rawEvent, GewiEvent event, Uint16 mouseX, Uint16 mouseY, char ch)
{
mWidgetList.Message(rawEvent,event,mouseX,mouseY,ch);
}
void GewiEngine::DeleteWidget(GWidget *widget) //finds + frees memory of widget
{
mWidgetList.DeleteWidget(widget);
}
void GewiEngine::InsertWidget(WidgetNode *node) //insert at front
{
mWidgetList.AddWidget(node);
}
}