136 lines
4.3 KiB
C++
Executable File
136 lines
4.3 KiB
C++
Executable File
/*******************************************************************************
|
|
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 GewiSlider.cpp
|
|
\brief Implementation of GSlider, GHorizSlider and GVertSlider.
|
|
|
|
Implementation of GSlider, GHorizSlider and GVertSlider, the slide-select classes for Gewi.
|
|
<br>$Id: GewiSlider.cpp,v 1.5 2003/06/12 09:32:33 cozman Exp $<br>
|
|
\author James Turk
|
|
**/
|
|
|
|
#include "GewiSlider.h"
|
|
|
|
namespace Gewi
|
|
{
|
|
|
|
GSlider::GSlider(GContainer *parent) :
|
|
GWidget(parent),
|
|
rPressed(false),
|
|
rBackground(GewiEngine::InvalidID),
|
|
rSlider(GewiEngine::InvalidID),
|
|
rMin(0),
|
|
rMax(1),
|
|
rPos(0),
|
|
rIncrement(0)
|
|
{}
|
|
|
|
void GSlider::Create(float x, float y, float width, float height, ResourceID backgroundImg, ResourceID sliderImg,
|
|
float min, float max, int increment)
|
|
{
|
|
GWidget::Create(x,y,width,height);
|
|
rBackground = backgroundImg;
|
|
rSlider = sliderImg;
|
|
rMin = min;
|
|
rMax = max;
|
|
rIncrement = increment;
|
|
SetPos(rPos); //clamp inside
|
|
}
|
|
|
|
void GSlider::SetPos(float pos)
|
|
{
|
|
if(rIncrement)
|
|
{
|
|
int rounded;
|
|
|
|
if(pos - static_cast<int>(pos) < 0.5) //move to closest integer
|
|
rounded = static_cast<int>(floorf(pos)+rIncrement/2);
|
|
else
|
|
rounded = static_cast<int>(ceilf(pos)+rIncrement/2);
|
|
pos = static_cast<float>(rounded-rounded%rIncrement); //snap to a multiple of increment
|
|
}
|
|
|
|
//get within bounds
|
|
if(pos < rMin)
|
|
pos = rMin;
|
|
else if(pos > rMax)
|
|
pos = rMax;
|
|
rPos = pos;
|
|
}
|
|
|
|
float GSlider::GetPos()
|
|
{
|
|
return rPos;
|
|
}
|
|
|
|
void GHorizSlider::Message(SDL_Event *rawEvent, GewiEvent event, Uint16 mouseX, Uint16 mouseY, char ch)
|
|
{
|
|
//doesn't check if mouse is in widget because Show actually checks that for the drawing
|
|
if(event == GE_LDOWN)
|
|
rPressed = true;
|
|
else if(event == GE_LUP && rPressed)
|
|
{
|
|
//min + (Distance Past Rect.X / Rect.Width)
|
|
SetPos(rMin+((mouseX-rBoundRect.X())/rBoundRect.Width())*(rMax-rMin));
|
|
rPressed = false;
|
|
}
|
|
}
|
|
|
|
void GHorizSlider::Show()
|
|
{
|
|
float xPos;
|
|
|
|
if(rPressed && !rZE->LButtonPressed() || !MouseInWidget()) //dont allow them to drag pointer out of box
|
|
Message(NULL,GE_LUP,rZE->MouseX(),rZE->MouseY(),static_cast<char>(0)); //fake a message
|
|
|
|
//the slider is centered about the current position, altered if currently sliding
|
|
if(rPressed)
|
|
xPos = rZE->MouseX()-rGewi->Image(rSlider)->Width()/2.0f;
|
|
else
|
|
xPos = rBoundRect.X()+(((rPos-rMin)/(rMax-rMin))*rBoundRect.Width())-rGewi->Image(rSlider)->Width()/2.0f;
|
|
|
|
//draw from resources
|
|
rGewi->Image(rBackground)->Draw(rBoundRect.X(),rBoundRect.Y());
|
|
rGewi->Image(rSlider)->Draw(xPos,rBoundRect.Y());
|
|
}
|
|
|
|
void GVertSlider::Message(SDL_Event *rawEvent, GewiEvent event, Uint16 mouseX, Uint16 mouseY, char ch)
|
|
{
|
|
//doesn't check if mouse is in widget because Show actually checks that (to avoid being dragged outside)
|
|
if(event == GE_LDOWN)
|
|
rPressed = true;
|
|
else if(event == GE_LUP && rPressed)
|
|
{
|
|
SetPos(rMin+((mouseY-rBoundRect.Y())/rBoundRect.Height())*(rMax-rMin)); //clamp when they release the button
|
|
rPressed = false;
|
|
}
|
|
}
|
|
|
|
void GVertSlider::Show()
|
|
{
|
|
float yPos;
|
|
|
|
if(!rZE->LButtonPressed() || !MouseInWidget()) //dont allow them to drag pointer out of box
|
|
Message(NULL,GE_LUP,rZE->MouseX(),rZE->MouseY(),static_cast<char>(0)); //faking a message
|
|
|
|
//the slider is centered about the current position
|
|
if(rPressed)
|
|
yPos = rZE->MouseY()-rGewi->Image(rSlider)->Height()/2.0f;
|
|
else
|
|
yPos = rBoundRect.Y()+(((rPos-rMin)/(rMax-rMin))*rBoundRect.Height())-rGewi->Image(rSlider)->Height()/2.0f;
|
|
|
|
//draw from resources
|
|
rGewi->Image(rBackground)->Draw(rBoundRect.X(),rBoundRect.Y());
|
|
rGewi->Image(rSlider)->Draw(rBoundRect.X(),yPos);
|
|
}
|
|
|
|
}
|