Added mouse click functions to image button

Added destructor for images
Deleting listener now on exit
This commit is contained in:
andreja6
2018-04-24 12:39:53 -07:00
parent 9ffe37c21a
commit d1a1ebd016
11 changed files with 121 additions and 52 deletions

View File

@@ -1,20 +1,34 @@
#include "BaseButtonInstance.h" #include "BaseButtonInstance.h"
bool floatBottom; bool floatBottom = false;
bool floatRight; bool floatRight = false;
bool floatCenter; bool floatCenter = false;
bool disabled; bool disabled = false;
ButtonListener* listener = NULL;
BaseButtonInstance::BaseButtonInstance(void) BaseButtonInstance::BaseButtonInstance(void)
{ {
listener = NULL;
} }
BaseButtonInstance::~BaseButtonInstance(void) BaseButtonInstance::~BaseButtonInstance(void)
{ {
delete listener;
} }
void BaseButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseDown){} void BaseButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseDown){}
bool BaseButtonInstance::mouseInButton(float mousex, float mousey, RenderDevice* rd){return false;}
void BaseButtonInstance::onMouseClick()
{
if(listener != NULL)
{
listener->onButton1MouseClick(this);
}
}
bool BaseButtonInstance::mouseInArea(float point1x, float point1y, float point2x, float point2y, float mousex, float mousey) bool BaseButtonInstance::mouseInArea(float point1x, float point1y, float point2x, float point2y, float mousex, float mousey)
{ {

View File

@@ -1,16 +1,20 @@
#pragma once #pragma once
#include "instance.h" #include "instance.h"
#pragma once
#include "ButtonListener.h"
class BaseButtonInstance : public Instance class BaseButtonInstance : public Instance
{ {
public: public:
BaseButtonInstance(void); BaseButtonInstance(void);
~BaseButtonInstance(void); virtual ~BaseButtonInstance(void);
virtual void drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseDown); virtual void drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseDown);
virtual bool mouseInButton(float, float, RenderDevice* rd);
virtual void onMouseClick();
bool floatBottom; bool floatBottom;
bool floatRight; bool floatRight;
bool floatCenter; bool floatCenter;
bool disabled; bool disabled;
protected: protected:
bool mouseInArea(float, float, float, float, float, float); bool mouseInArea(float, float, float, float, float, float);
class ButtonListener* listener;
}; };

View File

@@ -1,5 +1,6 @@
#include "ButtonListener.h" #include "ButtonListener.h"
ButtonListener::ButtonListener(void) ButtonListener::ButtonListener(void)
{ {
} }
@@ -8,7 +9,7 @@ ButtonListener::~ButtonListener(void)
{ {
} }
void ButtonListener::onButton1MouseClick(TextButtonInstance* button) void ButtonListener::onButton1MouseClick(BaseButtonInstance* button)
{ {
} }

View File

@@ -1,12 +1,12 @@
#pragma once #pragma once
#include "TextButtonInstance.h" #include "BaseButtonInstance.h"
class TextButtonInstance; class BaseButtonInstance;
class ButtonListener class ButtonListener
{ {
public: public:
ButtonListener(void); ButtonListener(void);
~ButtonListener(void); ~ButtonListener(void);
virtual void onButton1MouseClick(TextButtonInstance*); virtual void onButton1MouseClick(BaseButtonInstance*);
//virtual void onMouseOver(); //TODO //virtual void onMouseOver(); //TODO
//virtual void onMouseOut(); //TODO //virtual void onMouseOut(); //TODO
//virtual void onButton1MouseDown(); //TODO //virtual void onButton1MouseDown(); //TODO

View File

@@ -34,10 +34,51 @@ ImageButtonInstance::ImageButtonInstance(G3D::TextureRef newImage, G3D::TextureR
ImageButtonInstance::~ImageButtonInstance(void) ImageButtonInstance::~ImageButtonInstance(void)
{ {
//Delete everything on destruction
image.~ReferenceCountedPointer();
delete image.getPointer();
image_ovr.~ReferenceCountedPointer();
delete image_ovr.getPointer();
image_ds.~ReferenceCountedPointer();
delete image_ds.getPointer();
image_dn.~ReferenceCountedPointer();
delete image_dn.getPointer();
image = NULL;
image_ovr = NULL;
image_ds = NULL;
image_dn = NULL;
delete listener;
listener = NULL;
}
bool ImageButtonInstance::mouseInButton(float mousex, float mousey, RenderDevice* rd)
{
Vector2 positionRelative = position;
if(floatRight && floatBottom)
{
positionRelative = Vector2(rd->getWidth() + position.x, rd->getHeight() + position.y);
}
else if(floatBottom)
{
positionRelative = Vector2(position.x, rd->getHeight() + position.y);
}
else if(floatRight)
{
positionRelative = Vector2(rd->getWidth() + position.x, position.y);
}
if(mousex >= positionRelative.x && mousey >= positionRelative.y)
{
if(mousex < positionRelative.x + size.x && mousey < positionRelative.y + size.y)
{
return true;
}
}
return false;
} }
void ImageButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseDown) void ImageButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseDown)
{ {
bool drawDisabledBox = false;
Vector2 positionRelative = position; Vector2 positionRelative = position;
if(floatRight && floatBottom) if(floatRight && floatBottom)
{ {
@@ -56,6 +97,8 @@ void ImageButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouse
{ {
if(!image_ds.isNull()) if(!image_ds.isNull())
renderimage = openGLID_ds; renderimage = openGLID_ds;
else
drawDisabledBox = true;
} }
else if(mouseInArea(positionRelative.x, positionRelative.y, positionRelative.x + size.x, positionRelative.y + size.y, mousePos.x, mousePos.y)) else if(mouseInArea(positionRelative.x, positionRelative.y, positionRelative.x + size.x, positionRelative.y + size.y, mousePos.x, mousePos.y))
{ {
@@ -89,4 +132,8 @@ void ImageButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouse
glDisable( GL_TEXTURE_2D ); glDisable( GL_TEXTURE_2D );
rd->afterPrimitive(); rd->afterPrimitive();
rd->popState(); rd->popState();
if(drawDisabledBox)
{
Draw::box(Box(Vector3(positionRelative.x, positionRelative.y, 0), Vector3(positionRelative.x+size.x, positionRelative.y+size.y, 0)), rd, Color4(0.7,0.7,0.7,0.3), Color4::clear());
}
} }

View File

@@ -1,6 +1,5 @@
#pragma once #pragma once
#include "BaseButtonInstance.h" #include "BaseButtonInstance.h"
class ImageButtonInstance : public BaseButtonInstance class ImageButtonInstance : public BaseButtonInstance
{ {
public: public:
@@ -20,4 +19,5 @@ public:
int openGLID_dn; int openGLID_dn;
G3D::TextureRef image_ds; G3D::TextureRef image_ds;
int openGLID_ds; int openGLID_ds;
bool mouseInButton(float, float, RenderDevice*);
}; };

View File

@@ -4,12 +4,12 @@
std::string name; std::string name;
Instance* parent; Instance* parent;
static std::string className = "Instance"; static std::string className = "DataModel";
Instance::Instance(void) Instance::Instance(void)
{ {
name = "Default Game Instance"; name = "Default Game Instance";
className = "Part"; className = "DataModel";
} }
Instance::~Instance(void) Instance::~Instance(void)

View File

@@ -5,7 +5,7 @@ class Instance
{ {
public: public:
Instance(void); Instance(void);
~Instance(void); virtual ~Instance(void);
std::string name; std::string name;
Instance* parent; // Another pointer. Instance* parent; // Another pointer.
std::string className; std::string className;

View File

@@ -20,7 +20,6 @@ G3D::GFontRef* font;
int textSize; int textSize;
bool visible; bool visible;
ButtonListener* buttonListener;
TextButtonInstance::TextButtonInstance(void) TextButtonInstance::TextButtonInstance(void)
{ {
@@ -57,20 +56,6 @@ void TextButtonInstance::setAllColorsSame()
TextButtonInstance::~TextButtonInstance(void) TextButtonInstance::~TextButtonInstance(void)
{ {
delete buttonListener;
}
void TextButtonInstance::setButtonListener(ButtonListener* listener)
{
buttonListener = listener;
}
void TextButtonInstance::onClick()
{
if(buttonListener != NULL)
{
buttonListener->onButton1MouseClick(this);
}
} }
void TextButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseDown) void TextButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseDown)

View File

@@ -1,14 +1,11 @@
#pragma once #pragma once
#include "BaseButtonInstance.h" #include "BaseButtonInstance.h"
#pragma once
#include "ButtonListener.h"
class ButtonListener;
class TextButtonInstance : public BaseButtonInstance class TextButtonInstance : public BaseButtonInstance
{ {
public: public:
TextButtonInstance(void); TextButtonInstance(void);
~TextButtonInstance(void); ~TextButtonInstance(void);
void setAllColorsSame(void); void setAllColorsSame();
Vector2 boxBegin; Vector2 boxBegin;
Vector2 boxEnd; Vector2 boxEnd;
Vector2 fontLocationRelativeTo; Vector2 fontLocationRelativeTo;
@@ -30,6 +27,4 @@ public:
bool visible; bool visible;
int textSize; int textSize;
void drawObj(RenderDevice*, Vector2, bool); void drawObj(RenderDevice*, Vector2, bool);
void setButtonListener(ButtonListener*);
void onClick();
}; };

View File

@@ -391,6 +391,7 @@ void initGUI()
instance->floatRight = true; instance->floatRight = true;
instance->position = Vector2(-77, -90); instance->position = Vector2(-77, -90);
instance->parent = dataModel; instance->parent = dataModel;
instance->disabled = true;
instance = makeImageButton( instance = makeImageButton(
Texture::fromFile(GetFileInPath("/content/images/CameraZoomOut.png")), Texture::fromFile(GetFileInPath("/content/images/CameraZoomOut.png")),
@@ -737,6 +738,20 @@ void Demo::onUserInput(UserInput* ui) {
right = true; right = true;
} }
if(ui->keyReleased(SDL_LEFT_MOUSE_KEY))
{
for(size_t i = 0; i < instances_2D.size(); i++)
{
if(instances_2D.at(i)->className == "TextButton" || instances_2D.at(i)->className == "ImageButton")
{
BaseButtonInstance* button = (BaseButtonInstance*)instances_2D.at(i);
if(button->mouseInButton(ui->mouseXY().x, ui->mouseXY().y, app->renderDevice))
{
button->onMouseClick();
}
}
}
}
//readMouseGUIInput(); //readMouseGUIInput();
@@ -806,9 +821,9 @@ void drawButtons(RenderDevice* rd)
void drawOutline(Vector3 from, Vector3 to, RenderDevice* rd, LightingParameters lighting, Vector3 size, Vector3 pos) void drawOutline(Vector3 from, Vector3 to, RenderDevice* rd, LightingParameters lighting, Vector3 size, Vector3 pos)
{ {
rd->setLight(0, NULL); //rd->setLight(0, NULL);
rd->setAmbientLightColor(Color3(1,1,1)); //rd->setAmbientLightColor(Color3(1,1,1));
Color3 outline = Color3(0.098F,0.6F,1.0F); Color3 outline = Color3::cyan();//Color3(0.098F,0.6F,1.0F);
float offsetSize = 0.05F; float offsetSize = 0.05F;
//X //X
Draw::box(Box(Vector3(from.x - offsetSize, from.y + offsetSize, from.z + offsetSize), Vector3(to.x + offsetSize, from.y - offsetSize, from.z - offsetSize)), rd, outline, Color4::clear()); Draw::box(Box(Vector3(from.x - offsetSize, from.y + offsetSize, from.z + offsetSize), Vector3(to.x + offsetSize, from.y - offsetSize, from.z - offsetSize)), rd, outline, Color4::clear());
@@ -831,6 +846,8 @@ void drawOutline(Vector3 from, Vector3 to, RenderDevice* rd, LightingParameters
if(mode == ARROWS) if(mode == ARROWS)
{ {
rd->setLight(0, NULL);
rd->setAmbientLightColor(Color3(1,1,1));
float max = size.x; float max = size.x;
if(abs(size.y) > max) if(abs(size.y) > max)
max = size.y; max = size.y;
@@ -843,30 +860,35 @@ void drawOutline(Vector3 from, Vector3 to, RenderDevice* rd, LightingParameters
Draw::arrow(pos, Vector3(0, (-1)-max, 0), rd); Draw::arrow(pos, Vector3(0, (-1)-max, 0), rd);
Draw::arrow(pos, Vector3((-1)-max, 0, 0), rd); Draw::arrow(pos, Vector3((-1)-max, 0, 0), rd);
Draw::arrow(pos, Vector3(0, 0, (-1)-max), rd); Draw::arrow(pos, Vector3(0, 0, (-1)-max), rd);
rd->setAmbientLightColor(lighting.ambient);
rd->setLight(0, GLight::directional(lighting.lightDirection, lighting.lightColor));
} }
else if(mode == RESIZE) else if(mode == RESIZE)
{ {
rd->setLight(0, NULL);
rd->setAmbientLightColor(Color3(1,1,1));
Vector3 gamepoint = pos; Vector3 gamepoint = pos;
Vector3 camerapoint = rd->getCameraToWorldMatrix().translation; Vector3 camerapoint = rd->getCameraToWorldMatrix().translation;
float distance = pow(pow((double)gamepoint.x - (double)camerapoint.x, 2) + pow((double)gamepoint.y - (double)camerapoint.y, 2) + pow((double)gamepoint.z - (double)camerapoint.z, 2), 0.5); float distance = pow(pow((double)gamepoint.x - (double)camerapoint.x, 2) + pow((double)gamepoint.y - (double)camerapoint.y, 2) + pow((double)gamepoint.z - (double)camerapoint.z, 2), 0.5);
if(distance < 200) if(distance < 200)
{ {
Color3 sphereColor = outline; Color3 sphereColor = outline;
float multiplier = distance * 0.025F/2; float multiplier = distance * 0.025F/2;
if(multiplier < 0.25F) if(multiplier < 0.25F)
multiplier = 0.25F; multiplier = 0.25F;
Draw::sphere(Sphere(Vector3(pos.x, pos.y + (size.y/2 + 1), pos.z), multiplier), rd, sphereColor, Color4::clear()); Draw::sphere(Sphere(Vector3(pos.x, pos.y + (size.y/2 + 1), pos.z), multiplier), rd, sphereColor, Color4::clear());
Draw::sphere(Sphere(Vector3(pos.x, pos.y - (size.y/2 + 1), pos.z), multiplier), rd, sphereColor, Color4::clear()); Draw::sphere(Sphere(Vector3(pos.x, pos.y - (size.y/2 + 1), pos.z), multiplier), rd, sphereColor, Color4::clear());
Draw::sphere(Sphere(Vector3(pos.x + (size.x/2 + 1), pos.y, pos.z), multiplier), rd, sphereColor, Color4::clear()); Draw::sphere(Sphere(Vector3(pos.x + (size.x/2 + 1), pos.y, pos.z), multiplier), rd, sphereColor, Color4::clear());
Draw::sphere(Sphere(Vector3(pos.x - (size.x/2 + 1), pos.y, pos.z), multiplier), rd, sphereColor, Color4::clear()); Draw::sphere(Sphere(Vector3(pos.x - (size.x/2 + 1), pos.y, pos.z), multiplier), rd, sphereColor, Color4::clear());
Draw::sphere(Sphere(Vector3(pos.x, pos.y, pos.z + (size.z/2 + 1)), multiplier), rd, sphereColor, Color4::clear()); Draw::sphere(Sphere(Vector3(pos.x, pos.y, pos.z + (size.z/2 + 1)), multiplier), rd, sphereColor, Color4::clear());
Draw::sphere(Sphere(Vector3(pos.x, pos.y, pos.z - (size.z/2 + 1)), multiplier), rd, sphereColor, Color4::clear()); Draw::sphere(Sphere(Vector3(pos.x, pos.y, pos.z - (size.z/2 + 1)), multiplier), rd, sphereColor, Color4::clear());
} }
rd->setAmbientLightColor(lighting.ambient);
rd->setLight(0, GLight::directional(lighting.lightDirection, lighting.lightColor));
} }
rd->setAmbientLightColor(lighting.ambient);
rd->setLight(0, GLight::directional(lighting.lightDirection, lighting.lightColor));
} }
void Demo::onGraphics(RenderDevice* rd) { void Demo::onGraphics(RenderDevice* rd) {
@@ -1108,7 +1130,8 @@ int main(int argc, char** argv) {
settings.window.defaultIconFilename = GetFileInPath("/content/images/rico256c.png"); settings.window.defaultIconFilename = GetFileInPath("/content/images/rico256c.png");
settings.window.resizable = true; settings.window.resizable = true;
settings.writeLicenseFile = false; settings.writeLicenseFile = false;
settings.window.width = 841;
settings.window.height = 639;
//Using the damned SDL window now //Using the damned SDL window now
SDLWindow* wnd = new SDLWindow(settings.window); SDLWindow* wnd = new SDLWindow(settings.window);
//wnd->setInputCaptureCount(200); //wnd->setInputCaptureCount(200);