missing files added to project

RadioButtonGroup added
This commit is contained in:
thrust26 2017-11-24 14:25:34 +01:00
parent 5d0bc45a09
commit 1a7dff416a
2 changed files with 268 additions and 0 deletions

View File

@ -0,0 +1,191 @@
//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2017 by Bradford W. Mott, Stephen Anthony
// and the Stella Team
//
// See the file "License.txt" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//============================================================================
#include "FBSurface.hxx"
#include "Font.hxx"
#include "Dialog.hxx"
#include "RadioButtonWidget.hxx"
/* Radiobutton bitmaps */
static uInt32 radio_img_outercircle[14] =
{
0b00001111110000,
0b00111111111100,
0b01110000001110,
0b01100000000110,
0b11000000000011,
0b11000000000011,
0b11000000000011,
0b11000000000011,
0b11000000000011,
0b11000000000011,
0b01100000000110,
0b01110000001110,
0b00111111111100,
0b00001111110000
};
static uInt32 radio_img_innercircle[10] =
{
0b0011111100,
0b0111111110,
0b1111111111,
0b1111111111,
0b1111111111,
0b1111111111,
0b1111111111,
0b1111111111,
0b0111111110,
0b0011111100
};
static uInt32 radio_img_active[8] =
{
0b00111100,
0b01111110,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b01111110,
0b00111100
};
static uInt32 radio_img_inactive[8] =
{
0b00111100,
0b01111110,
0b11100111,
0b11000011,
0b11000011,
0b11100111,
0b01111110,
0b00111100
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
RadioButtonWidget::RadioButtonWidget(GuiObject* boss, const GUI::Font& font,
int x, int y, const string& label,
RadioButtonGroup* group,
int cmd)
: CheckboxWidget(boss, font, x, y, label, cmd),
myGroup(group)
{
_flags = WIDGET_ENABLED;
_bgcolor = _bgcolorhi = kWidColor;
_editable = true;
if(label == "")
_w = 14;
else
_w = font.getStringWidth(label) + 20;
_h = font.getFontHeight() < 14 ? 14 : font.getFontHeight();
// Depending on font size, either the font or box will need to be
// centered vertically
if(_h > 14) // center box
_boxY = (_h - 14) / 2;
else // center text
_textY = (14 - _font.getFontHeight()) / 2;
setFill(CheckboxWidget::Normal);
myGroup->addWidget(this);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void RadioButtonWidget::handleMouseUp(int x, int y, int button, int clickCount)
{
if(isEnabled() && _editable && x >= 0 && x < _w && y >= 0 && y < _h)
{
if(!_state)
{
setState(true);
// We only send a command when the widget has been changed interactively
sendCommand(_cmd, _state, _id);
}
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void RadioButtonWidget::setState(bool state, bool send)
{
if(_state != state)
{
_state = state;
setDirty();
if(send)
sendCommand(_cmd, _state, _id);
if (state)
myGroup->select(this);
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void RadioButtonWidget::setFill(FillType type)
{
switch(type)
{
case CheckboxWidget::Normal:
_img = radio_img_active;
break;
case CheckboxWidget::Inactive:
_img = radio_img_inactive;
break;
default:
break;
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void RadioButtonWidget::drawWidget(bool hilite)
{
FBSurface& s = _boss->dialog().surface();
// Draw the outer bounding circle
s.drawBitmap(radio_img_outercircle, _x, _y + _boxY, kShadowColor, 14, 14);
// Draw the inner bounding circle with enabled color
s.drawBitmap(radio_img_innercircle, _x + 2, _y + _boxY + 2, isEnabled() ? _bgcolor : kColor, 10, 10);
// draw state
if(_state)
s.drawBitmap(_img, _x + 3, _y + _boxY + 3, isEnabled() ? kCheckColor : kShadowColor);
// Finally draw the label
s.drawString(_font, _label, _x + 20, _y + _textY, _w,
isEnabled() ? kTextColor : kColor);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void RadioButtonGroup::addWidget(RadioButtonWidget* widget)
{
myWidgets.push_back(widget);
// set first button as default
widget->setState(myWidgets.size() == 1, false);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void RadioButtonGroup::select(RadioButtonWidget* widget)
{
for(const auto& w : myWidgets)
if(w != widget)
((RadioButtonWidget*)w)->setState(false);
}

View File

@ -0,0 +1,77 @@
//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2017 by Bradford W. Mott, Stephen Anthony
// and the Stella Team
//
// See the file "License.txt" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
//============================================================================
#ifndef RADIOBUTTON_WIDGET_HXX
#define RADIOBUTTON_WIDGET_HXX
#include "bspf.hxx"
#include "Widget.hxx"
class Dialog;
class RadioButtonGroup;
class RadioButtonWidget : public CheckboxWidget
{
public:
RadioButtonWidget(GuiObject* boss, const GUI::Font& font, int x, int y,
const string& label, RadioButtonGroup* group,
int cmd = 0);
void handleMouseUp(int x, int y, int button, int clickCount) override;
void setState(bool state, bool send = true);
protected:
void setFill(FillType type);
void drawWidget(bool hilite) override;
private:
RadioButtonGroup* myGroup;
private:
// Following constructors and assignment operators not supported
RadioButtonWidget() = delete;
RadioButtonWidget(const RadioButtonWidget&) = delete;
RadioButtonWidget(RadioButtonWidget&&) = delete;
RadioButtonWidget& operator=(const RadioButtonWidget&) = delete;
RadioButtonWidget& operator=(RadioButtonWidget&&) = delete;
};
class RadioButtonGroup
{
public:
RadioButtonGroup() {};
// add widget to group
void addWidget(RadioButtonWidget* widget);
// tell the group which widget was selected
void select(RadioButtonWidget* widget);
private:
WidgetArray myWidgets;
private:
// Following constructors and assignment operators not supported
RadioButtonGroup(const RadioButtonGroup&) = delete;
RadioButtonGroup(RadioButtonGroup&&) = delete;
RadioButtonGroup& operator=(const RadioButtonGroup&) = delete;
RadioButtonGroup& operator=(RadioButtonGroup&&) = delete;
};
#endif