mirror of https://github.com/stella-emu/stella.git
155 lines
4.8 KiB
C++
155 lines
4.8 KiB
C++
//============================================================================
|
|
//
|
|
// 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-2018 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 "bspf.hxx"
|
|
#include "Control.hxx"
|
|
#include "Dialog.hxx"
|
|
#include "EventHandler.hxx"
|
|
#include "OSystem.hxx"
|
|
#include "EditTextWidget.hxx"
|
|
#include "PopUpWidget.hxx"
|
|
#include "Widget.hxx"
|
|
#include "Font.hxx"
|
|
#include "ComboDialog.hxx"
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
ComboDialog::ComboDialog(GuiObject* boss, const GUI::Font& font,
|
|
const VariantList& combolist)
|
|
: Dialog(boss->instance(), boss->parent()),
|
|
myComboEvent(Event::NoType)
|
|
{
|
|
const int lineHeight = font.getLineHeight(),
|
|
fontWidth = font.getMaxCharWidth(),
|
|
fontHeight = font.getFontHeight(),
|
|
buttonWidth = font.getStringWidth("Defaults") + 20,
|
|
buttonHeight = font.getLineHeight() + 4;
|
|
int xpos, ypos;
|
|
WidgetArray wid;
|
|
|
|
// Set real dimensions
|
|
_w = 35 * fontWidth + 10;
|
|
_h = 11 * (lineHeight + 4) + 10;
|
|
xpos = ypos = 5;
|
|
|
|
// Get maximum width of popupwidget
|
|
int pwidth = 0;
|
|
for(const auto& s: combolist)
|
|
pwidth = std::max(font.getStringWidth(s.first), pwidth);
|
|
|
|
// Label for dialog, indicating which combo is being changed
|
|
myComboName = new StaticTextWidget(this, font, xpos, ypos, _w - xpos - 10,
|
|
fontHeight, "", TextAlign::Center);
|
|
ypos += (lineHeight + 4) + 5;
|
|
|
|
// Add event popup for 8 events
|
|
auto ADD_EVENT_POPUP = [&](int idx, const string& label)
|
|
{
|
|
myEvents[idx] = new PopUpWidget(this, font, xpos, ypos,
|
|
pwidth, lineHeight, combolist, label);
|
|
wid.push_back(myEvents[idx]);
|
|
ypos += lineHeight + 4;
|
|
};
|
|
|
|
xpos = 10;
|
|
myEvents[0] = nullptr; ADD_EVENT_POPUP(0, "Event 1 ");
|
|
myEvents[1] = nullptr; ADD_EVENT_POPUP(1, "Event 2 ");
|
|
myEvents[2] = nullptr; ADD_EVENT_POPUP(2, "Event 3 ");
|
|
myEvents[3] = nullptr; ADD_EVENT_POPUP(3, "Event 4 ");
|
|
myEvents[4] = nullptr; ADD_EVENT_POPUP(4, "Event 5 ");
|
|
myEvents[5] = nullptr; ADD_EVENT_POPUP(5, "Event 6 ");
|
|
myEvents[6] = nullptr; ADD_EVENT_POPUP(6, "Event 7 ");
|
|
myEvents[7] = nullptr; ADD_EVENT_POPUP(7, "Event 8 ");
|
|
|
|
// Add Defaults, OK and Cancel buttons
|
|
ButtonWidget* b;
|
|
b = new ButtonWidget(this, font, 10, _h - buttonHeight - 10,
|
|
buttonWidth, buttonHeight, "Defaults", GuiObject::kDefaultsCmd);
|
|
wid.push_back(b);
|
|
addOKCancelBGroup(wid, font);
|
|
|
|
addToFocusList(wid);
|
|
}
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
void ComboDialog::show(Event::Type event, const string& name)
|
|
{
|
|
// Make sure the event is allowed
|
|
if(event >= Event::Combo1 && event <= Event::Combo16)
|
|
{
|
|
myComboEvent = event;
|
|
myComboName->setLabel("Add events for " + name);
|
|
open();
|
|
}
|
|
else
|
|
myComboEvent = Event::NoType;
|
|
}
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
void ComboDialog::loadConfig()
|
|
{
|
|
StringList events = instance().eventHandler().getComboListForEvent(myComboEvent);
|
|
|
|
uInt32 size = std::min(uInt32(events.size()), 8u);
|
|
for(uInt32 i = 0; i < size; ++i)
|
|
myEvents[i]->setSelected("", events[i]);
|
|
|
|
// Fill any remaining items to 'None'
|
|
if(size < 8)
|
|
for(uInt32 i = size; i < 8; ++i)
|
|
myEvents[i]->setSelected("None", "-1");
|
|
}
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
void ComboDialog::saveConfig()
|
|
{
|
|
StringList events;
|
|
for(int i = 0; i < 8; ++i)
|
|
events.push_back(myEvents[i]->getSelectedTag().toString());
|
|
|
|
instance().eventHandler().setComboListForEvent(myComboEvent, events);
|
|
}
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
void ComboDialog::setDefaults()
|
|
{
|
|
for(int i = 0; i < 8; ++i)
|
|
myEvents[i]->setSelected("None", "-1");
|
|
|
|
_dirty = true;
|
|
}
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
void ComboDialog::handleCommand(CommandSender* sender, int cmd,
|
|
int data, int id)
|
|
{
|
|
switch(cmd)
|
|
{
|
|
case GuiObject::kOKCmd:
|
|
saveConfig();
|
|
close();
|
|
break;
|
|
|
|
case GuiObject::kDefaultsCmd:
|
|
setDefaults();
|
|
break;
|
|
|
|
default:
|
|
Dialog::handleCommand(sender, cmd, data, 0);
|
|
break;
|
|
}
|
|
}
|