mirror of https://github.com/stella-emu/stella.git
RadioButtonWidget added
disabled CheckboxWidget still shows status
This commit is contained in:
parent
63f8605977
commit
44d6cf15a0
|
@ -133,13 +133,20 @@ void FBSurface::drawChar(const GUI::Font& font, uInt8 chr,
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void FBSurface::drawBitmap(uInt32* bitmap, uInt32 tx, uInt32 ty,
|
void FBSurface::drawBitmap(uInt32* bitmap, uInt32 tx, uInt32 ty,
|
||||||
uInt32 color, uInt32 h)
|
uInt32 color, uInt32 h)
|
||||||
|
{
|
||||||
|
drawBitmap(bitmap, tx, ty, color, h, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void FBSurface::drawBitmap(uInt32* bitmap, uInt32 tx, uInt32 ty,
|
||||||
|
uInt32 color, uInt32 w, uInt32 h)
|
||||||
{
|
{
|
||||||
uInt32* buffer = myPixels + ty * myPitch + tx;
|
uInt32* buffer = myPixels + ty * myPitch + tx;
|
||||||
|
|
||||||
for(uInt32 y = 0; y < h; ++y)
|
for(uInt32 y = 0; y < h; ++y)
|
||||||
{
|
{
|
||||||
uInt32 mask = 0xF0000000;
|
uInt32 mask = 1 << (w - 1);
|
||||||
for(uInt32 x = 0; x < 8; ++x, mask >>= 4)
|
for(uInt32 x = 0; x < w; ++x, mask >>= 1)
|
||||||
if(bitmap[y] & mask)
|
if(bitmap[y] & mask)
|
||||||
buffer[x] = uInt32(myPalette[color]);
|
buffer[x] = uInt32(myPalette[color]);
|
||||||
|
|
||||||
|
|
|
@ -128,6 +128,19 @@ class FBSurface
|
||||||
virtual void drawBitmap(uInt32* bitmap, uInt32 x, uInt32 y, uInt32 color,
|
virtual void drawBitmap(uInt32* bitmap, uInt32 x, uInt32 y, uInt32 color,
|
||||||
uInt32 h = 8);
|
uInt32 h = 8);
|
||||||
|
|
||||||
|
/**
|
||||||
|
This method should be called to draw the bitmap image.
|
||||||
|
|
||||||
|
@param bitmap The data to draw
|
||||||
|
@param x The x coordinate
|
||||||
|
@param y The y coordinate
|
||||||
|
@param color The color of the bitmap
|
||||||
|
@param w The width of the data image
|
||||||
|
@param h The height of the data image
|
||||||
|
*/
|
||||||
|
virtual void drawBitmap(uInt32* bitmap, uInt32 x, uInt32 y, uInt32 color,
|
||||||
|
uInt32 w, uInt32 h);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This method should be called to convert and copy a given row of pixel
|
This method should be called to convert and copy a given row of pixel
|
||||||
data into a FrameBuffer surface. The pixels must already be in the
|
data into a FrameBuffer surface. The pixels must already be in the
|
||||||
|
|
|
@ -520,24 +520,24 @@ void ContextMenu::scrollDown(int distance)
|
||||||
void ContextMenu::drawDialog()
|
void ContextMenu::drawDialog()
|
||||||
{
|
{
|
||||||
static uInt32 up_arrow[8] = {
|
static uInt32 up_arrow[8] = {
|
||||||
0x00011000,
|
0b00011000,
|
||||||
0x00011000,
|
0b00011000,
|
||||||
0x00111100,
|
0b00111100,
|
||||||
0x00111100,
|
0b00111100,
|
||||||
0x01111110,
|
0b01111110,
|
||||||
0x01111110,
|
0b01111110,
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x11111111
|
0b11111111
|
||||||
};
|
};
|
||||||
static uInt32 down_arrow[8] = {
|
static uInt32 down_arrow[8] = {
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x01111110,
|
0b01111110,
|
||||||
0x01111110,
|
0b01111110,
|
||||||
0x00111100,
|
0b00111100,
|
||||||
0x00111100,
|
0b00111100,
|
||||||
0x00011000,
|
0b00011000,
|
||||||
0x00011000
|
0b00011000
|
||||||
};
|
};
|
||||||
|
|
||||||
// Normally we add widgets and let Dialog::draw() take care of this
|
// Normally we add widgets and let Dialog::draw() take care of this
|
||||||
|
|
|
@ -25,14 +25,14 @@
|
||||||
|
|
||||||
// Little up/down arrow
|
// Little up/down arrow
|
||||||
static uInt32 up_down_arrows[8] = {
|
static uInt32 up_down_arrows[8] = {
|
||||||
0x00000000,
|
0b00000000,
|
||||||
0x00001000,
|
0b00001000,
|
||||||
0x00011100,
|
0b00011100,
|
||||||
0x00111110,
|
0b00111110,
|
||||||
0x00000000,
|
0b00000000,
|
||||||
0x00111110,
|
0b00111110,
|
||||||
0x00011100,
|
0b00011100,
|
||||||
0x00001000,
|
0b00001000,
|
||||||
};
|
};
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -32,26 +32,26 @@
|
||||||
|
|
||||||
// Up arrow
|
// Up arrow
|
||||||
static uInt32 up_arrow[8] = {
|
static uInt32 up_arrow[8] = {
|
||||||
0x00011000,
|
0b00011000,
|
||||||
0x00011000,
|
0b00011000,
|
||||||
0x00111100,
|
0b00111100,
|
||||||
0x00111100,
|
0b00111100,
|
||||||
0x01111110,
|
0b01111110,
|
||||||
0x01111110,
|
0b01111110,
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x11111111
|
0b11111111
|
||||||
};
|
};
|
||||||
|
|
||||||
// Down arrow
|
// Down arrow
|
||||||
static uInt32 down_arrow[8] = {
|
static uInt32 down_arrow[8] = {
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x01111110,
|
0b01111110,
|
||||||
0x01111110,
|
0b01111110,
|
||||||
0x00111100,
|
0b00111100,
|
||||||
0x00111100,
|
0b00111100,
|
||||||
0x00011000,
|
0b00011000,
|
||||||
0x00011000
|
0b00011000
|
||||||
};
|
};
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -424,38 +424,38 @@ void ButtonWidget::drawWidget(bool hilite)
|
||||||
/* 8x8 checkbox bitmap */
|
/* 8x8 checkbox bitmap */
|
||||||
static uInt32 checked_img_active[8] =
|
static uInt32 checked_img_active[8] =
|
||||||
{
|
{
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x11111111
|
0b11111111
|
||||||
};
|
};
|
||||||
|
|
||||||
static uInt32 checked_img_inactive[8] =
|
static uInt32 checked_img_inactive[8] =
|
||||||
{
|
{
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x11100111,
|
0b11100111,
|
||||||
0x11000011,
|
0b11000011,
|
||||||
0x11000011,
|
0b11000011,
|
||||||
0x11100111,
|
0b11100111,
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x11111111
|
0b11111111
|
||||||
};
|
};
|
||||||
|
|
||||||
static uInt32 checked_img_circle[8] =
|
static uInt32 checked_img_circle[8] =
|
||||||
{
|
{
|
||||||
0x00011000,
|
0b00011000,
|
||||||
0x01111110,
|
0b01111110,
|
||||||
0x01111110,
|
0b01111110,
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x11111111,
|
0b11111111,
|
||||||
0x01111110,
|
0b01111110,
|
||||||
0x01111110,
|
0b01111110,
|
||||||
0x00011000
|
0b00011000
|
||||||
};
|
};
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -559,14 +559,131 @@ void CheckboxWidget::drawWidget(bool hilite)
|
||||||
s.box(_x, _y + _boxY, 14, 14, kColor, kShadowColor);
|
s.box(_x, _y + _boxY, 14, 14, kColor, kShadowColor);
|
||||||
|
|
||||||
// Do we draw a square or cross?
|
// Do we draw a square or cross?
|
||||||
s.fillRect(_x + 2, _y + _boxY + 2, 10, 10, _bgcolor);
|
s.fillRect(_x + 2, _y + _boxY + 2, 10, 10, isEnabled() ? _bgcolor : kColor);
|
||||||
if(isEnabled())
|
|
||||||
{
|
|
||||||
if(_state)
|
if(_state)
|
||||||
s.drawBitmap(_img, _x + 3, _y + _boxY + 3, kCheckColor);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
/* 8x8 radiobutton bitmap */
|
||||||
|
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,
|
||||||
|
int cmd)
|
||||||
|
: CheckboxWidget(boss, font, x, y, label, cmd)
|
||||||
|
{
|
||||||
|
_flags = WIDGET_ENABLED;
|
||||||
|
_bgcolor = _bgcolorhi = kWidColor;
|
||||||
|
|
||||||
|
_editable = true;
|
||||||
|
|
||||||
|
if(label == "")
|
||||||
|
_w = 14;
|
||||||
else
|
else
|
||||||
s.fillRect(_x + 2, _y + _boxY + 2, 10, 10, kColor);
|
_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);
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
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
|
// Finally draw the label
|
||||||
s.drawString(_font, _label, _x + 20, _y + _textY, _w,
|
s.drawString(_font, _label, _x + 20, _y + _textY, _w,
|
||||||
|
|
|
@ -276,11 +276,11 @@ class CheckboxWidget : public ButtonWidget
|
||||||
|
|
||||||
uInt32* _img;
|
uInt32* _img;
|
||||||
uInt32 _fillColor;
|
uInt32 _fillColor;
|
||||||
|
|
||||||
private:
|
|
||||||
int _boxY;
|
int _boxY;
|
||||||
int _textY;
|
int _textY;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Following constructors and assignment operators not supported
|
// Following constructors and assignment operators not supported
|
||||||
CheckboxWidget() = delete;
|
CheckboxWidget() = delete;
|
||||||
|
@ -290,6 +290,25 @@ class CheckboxWidget : public ButtonWidget
|
||||||
CheckboxWidget& operator=(CheckboxWidget&&) = delete;
|
CheckboxWidget& operator=(CheckboxWidget&&) = delete;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class RadioButtonWidget : public CheckboxWidget
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RadioButtonWidget(GuiObject* boss, const GUI::Font& font, int x, int y,
|
||||||
|
const string& label, int cmd = 0);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void setFill(FillType type);
|
||||||
|
void drawWidget(bool hilite) override;
|
||||||
|
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* SliderWidget */
|
/* SliderWidget */
|
||||||
class SliderWidget : public ButtonWidget
|
class SliderWidget : public ButtonWidget
|
||||||
|
|
Loading…
Reference in New Issue