Part 2 of the changes for #600 (UI fonts)

This commit is contained in:
thrust26 2020-04-29 23:49:00 +02:00
parent 15ead58aa7
commit 17354af0f3
17 changed files with 314 additions and 172 deletions

View File

@ -307,7 +307,7 @@ FBInitStatus FrameBuffer::createDisplay(const string& title,
} }
if(!myMsg.surface) if(!myMsg.surface)
myMsg.surface = allocateSurface(FBMinimum::Width, font().getFontHeight()+10); myMsg.surface = allocateSurface(FBMinimum::Width, font().getFontHeight() * 1.5);
#endif #endif
// Print initial usage message, but only print it later if the status has changed // Print initial usage message, but only print it later if the status has changed
@ -493,14 +493,20 @@ void FrameBuffer::showMessage(const string& message, MessagePosition position,
if(myMsg.surface == nullptr || !(force || myOSystem.settings().getBool("uimessages"))) if(myMsg.surface == nullptr || !(force || myOSystem.settings().getBool("uimessages")))
return; return;
const int fontWidth = font().getMaxCharWidth(),
fontHeight = font().getFontHeight();
const int VBORDER = fontHeight / 4;
const int HBORDER = fontWidth * 1.25 / 2.0;
// Precompute the message coordinates // Precompute the message coordinates
myMsg.text = message; myMsg.text = message;
myMsg.counter = uInt32(myOSystem.frameRate()) << 1; // Show message for 2 seconds myMsg.counter = uInt32(myOSystem.frameRate()) << 1; // Show message for 2 seconds
if(myMsg.counter == 0) myMsg.counter = 60; if(myMsg.counter == 0) myMsg.counter = 60;
myMsg.color = kBtnTextColor; myMsg.color = kBtnTextColor;
myMsg.w = font().getStringWidth(myMsg.text) + 10; myMsg.w = font().getStringWidth(myMsg.text) + HBORDER * 2;
myMsg.h = font().getFontHeight() + 8; myMsg.h = fontHeight + VBORDER * 2;
myMsg.surface->setSrcSize(myMsg.w, myMsg.h); myMsg.surface->setSrcSize(myMsg.w, myMsg.h);
myMsg.surface->setDstSize(myMsg.w * hidpiScaleFactor(), myMsg.h * hidpiScaleFactor()); myMsg.surface->setDstSize(myMsg.w * hidpiScaleFactor(), myMsg.h * hidpiScaleFactor());
myMsg.position = position; myMsg.position = position;
@ -619,6 +625,10 @@ inline bool FrameBuffer::drawMessage()
// Draw the bounded box and text // Draw the bounded box and text
const Common::Rect& dst = myMsg.surface->dstRect(); const Common::Rect& dst = myMsg.surface->dstRect();
const int fontWidth = font().getMaxCharWidth(),
fontHeight = font().getFontHeight();
const int VBORDER = fontHeight / 4;
const int HBORDER = fontWidth * 1.25 / 2.0;
switch(myMsg.position) switch(myMsg.position)
{ {
@ -669,10 +679,10 @@ inline bool FrameBuffer::drawMessage()
} }
myMsg.surface->setDstPos(myMsg.x + myImageRect.x(), myMsg.y + myImageRect.y()); myMsg.surface->setDstPos(myMsg.x + myImageRect.x(), myMsg.y + myImageRect.y());
myMsg.surface->fillRect(1, 1, myMsg.w-2, myMsg.h-2, kBtnColor); myMsg.surface->fillRect(1, 1, myMsg.w - 2, myMsg.h - 2, kBtnColor);
myMsg.surface->frameRect(0, 0, myMsg.w, myMsg.h, kColor); myMsg.surface->frameRect(0, 0, myMsg.w, myMsg.h, kColor);
myMsg.surface->drawString(font(), myMsg.text, 5, 4, myMsg.surface->drawString(font(), myMsg.text, HBORDER, VBORDER,
myMsg.w, myMsg.color, TextAlign::Left); myMsg.w, myMsg.color);
myMsg.surface->render(); myMsg.surface->render();
myMsg.counter--; myMsg.counter--;
#endif #endif

View File

@ -42,13 +42,19 @@ BrowserDialog::BrowserDialog(GuiObject* boss, const GUI::Font& font,
_h = max_h; _h = max_h;
const int lineHeight = font.getLineHeight(), const int lineHeight = font.getLineHeight(),
buttonWidth = font.getStringWidth("Defaults") + 20, fontWidth = font.getMaxCharWidth(),
buttonHeight = font.getLineHeight() + 4, fontHeight = font.getFontHeight(),
selectHeight = lineHeight + 12; buttonHeight = font.getLineHeight() * 1.25,
buttonWidth = font.getStringWidth("Base Dir") + fontWidth * 2.5;
const int VBORDER = fontHeight / 2;
const int HBORDER = fontWidth * 1.25;
const int VGAP = fontHeight / 4;
const int BUTTON_GAP = fontWidth;
const int selectHeight = lineHeight + VGAP * 3;
int xpos, ypos; int xpos, ypos;
ButtonWidget* b; ButtonWidget* b;
xpos = 10; ypos = 4 + _th; xpos = HBORDER; ypos = VBORDER + _th;
// Current path - TODO: handle long paths ? // Current path - TODO: handle long paths ?
StaticTextWidget* t = new StaticTextWidget(this, font, xpos, ypos + 2, "Path "); StaticTextWidget* t = new StaticTextWidget(this, font, xpos, ypos + 2, "Path ");
@ -56,14 +62,14 @@ BrowserDialog::BrowserDialog(GuiObject* boss, const GUI::Font& font,
_w - t->getWidth() - 2 * xpos, lineHeight); _w - t->getWidth() - 2 * xpos, lineHeight);
_currentPath->setEditable(false); _currentPath->setEditable(false);
// Add file list // Add file list
ypos += lineHeight + 8; ypos += lineHeight + VGAP * 2;
_fileList = new FileListWidget(this, font, xpos, ypos, _w - 2 * xpos, _fileList = new FileListWidget(this, font, xpos, ypos, _w - 2 * xpos,
_h - selectHeight - buttonHeight - ypos - 20); _h - selectHeight - buttonHeight - ypos - VBORDER * 2);
_fileList->setEditable(false); _fileList->setEditable(false);
addFocusWidget(_fileList); addFocusWidget(_fileList);
// Add currently selected item // Add currently selected item
ypos += _fileList->getHeight() + 8; ypos += _fileList->getHeight() + VGAP * 2;
_type = new StaticTextWidget(this, font, xpos, ypos + 2, "Name "); _type = new StaticTextWidget(this, font, xpos, ypos + 2, "Name ");
_selected = new EditTextWidget(this, font, xpos + _type->getWidth(), ypos, _selected = new EditTextWidget(this, font, xpos + _type->getWidth(), ypos,
@ -71,30 +77,30 @@ BrowserDialog::BrowserDialog(GuiObject* boss, const GUI::Font& font,
_selected->setEditable(false); _selected->setEditable(false);
// Buttons // Buttons
_goUpButton = new ButtonWidget(this, font, 10, _h - buttonHeight - 10, _goUpButton = new ButtonWidget(this, font, xpos, _h - buttonHeight - VBORDER,
buttonWidth, buttonHeight, "Go up", kGoUpCmd); buttonWidth, buttonHeight, "Go up", kGoUpCmd);
addFocusWidget(_goUpButton); addFocusWidget(_goUpButton);
_basedirButton = _basedirButton =
new ButtonWidget(this, font, 15 + buttonWidth, _h - buttonHeight - 10, new ButtonWidget(this, font, _goUpButton->getRight() + BUTTON_GAP, _h - buttonHeight - VBORDER,
buttonWidth, buttonHeight, "Base Dir", kBaseDirCmd); buttonWidth, buttonHeight, "Base Dir", kBaseDirCmd);
addFocusWidget(_basedirButton); addFocusWidget(_basedirButton);
#ifndef BSPF_MACOS #ifndef BSPF_MACOS
b = new ButtonWidget(this, font, _w - 2 * (buttonWidth + 7), _h - buttonHeight - 10, b = new ButtonWidget(this, font, _w - (2 * buttonWidth + BUTTON_GAP + HBORDER), _h - buttonHeight - VBORDER,
buttonWidth, buttonHeight, "Choose", kChooseCmd); buttonWidth, buttonHeight, "Choose", kChooseCmd);
addFocusWidget(b); addFocusWidget(b);
addOKWidget(b); addOKWidget(b);
b = new ButtonWidget(this, font, _w - (buttonWidth + 10), _h - buttonHeight - 10, b = new ButtonWidget(this, font, _w - (buttonWidth + HBORDER), _h - buttonHeight - VBORDER,
buttonWidth, buttonHeight, "Cancel", GuiObject::kCloseCmd); buttonWidth, buttonHeight, "Cancel", GuiObject::kCloseCmd);
addFocusWidget(b); addFocusWidget(b);
addCancelWidget(b); addCancelWidget(b);
#else #else
b = new ButtonWidget(this, font, _w - 2 * (buttonWidth + 7), _h - buttonHeight - 10, b = new ButtonWidget(this, font, _w - (2 * buttonWidth + BUTTON_GAP + HBORDER), _h - buttonHeight - VBORDER,
buttonWidth, buttonHeight, "Cancel", GuiObject::kCloseCmd); buttonWidth, buttonHeight, "Cancel", GuiObject::kCloseCmd);
addFocusWidget(b); addFocusWidget(b);
addCancelWidget(b); addCancelWidget(b);
b = new ButtonWidget(this, font, _w - (buttonWidth + 10), _h - buttonHeight - 10, b = new ButtonWidget(this, font, _w - (buttonWidth + HBORDER), _h - buttonHeight - VBORDER,
buttonWidth, buttonHeight, "Choose", kChooseCmd); buttonWidth, buttonHeight, "Choose", kChooseCmd);
addFocusWidget(b); addFocusWidget(b);
addOKWidget(b); addOKWidget(b);

View File

@ -32,7 +32,14 @@ ComboDialog::ComboDialog(GuiObject* boss, const GUI::Font& font,
: Dialog(boss->instance(), boss->parent(), font, "Add...") : Dialog(boss->instance(), boss->parent(), font, "Add...")
{ {
const int lineHeight = font.getLineHeight(), const int lineHeight = font.getLineHeight(),
fontWidth = font.getMaxCharWidth(); fontWidth = font.getMaxCharWidth(),
fontHeight = font.getFontHeight(),
buttonHeight = font.getLineHeight() * 1.25;
const int VBORDER = fontHeight / 2;
const int HBORDER = fontWidth * 1.25;
const int INDENT = fontWidth * 2;
const int VGAP = fontHeight / 4;
int xpos, ypos; int xpos, ypos;
WidgetArray wid; WidgetArray wid;
@ -42,10 +49,10 @@ ComboDialog::ComboDialog(GuiObject* boss, const GUI::Font& font,
pwidth = std::max(font.getStringWidth(s.first), pwidth); pwidth = std::max(font.getStringWidth(s.first), pwidth);
// Set real dimensions // Set real dimensions
_w = 11 * fontWidth + pwidth-4 + 10 * 2; _w = 8 * fontWidth + pwidth + PopUpWidget::dropDownWidth(font) + HBORDER * 2;
_h = 10 * (lineHeight + 4) + 10 + _th; _h = 8 * (lineHeight + VGAP) + VGAP + buttonHeight + VBORDER * 2 + _th;
xpos = 10; xpos = HBORDER;
ypos = 10 + _th; ypos = VBORDER + _th;
// Add event popup for 8 events // Add event popup for 8 events
myEvents.fill(nullptr); myEvents.fill(nullptr);
@ -54,7 +61,7 @@ ComboDialog::ComboDialog(GuiObject* boss, const GUI::Font& font,
myEvents[idx] = new PopUpWidget(this, font, xpos, ypos, myEvents[idx] = new PopUpWidget(this, font, xpos, ypos,
pwidth, lineHeight, combolist, label); pwidth, lineHeight, combolist, label);
wid.push_back(myEvents[idx]); wid.push_back(myEvents[idx]);
ypos += lineHeight + 4; ypos += lineHeight + VGAP;
}; };
ADD_EVENT_POPUP(0, "Event 1 "); ADD_EVENT_POPUP(0, "Event 1 ");
ADD_EVENT_POPUP(1, "Event 2 "); ADD_EVENT_POPUP(1, "Event 2 ");

View File

@ -40,9 +40,8 @@ CommandDialog::CommandDialog(OSystem& osystem, DialogContainer& parent)
buttonWidth = _font.getStringWidth("Time Machine On") + fontWidth * 2; buttonWidth = _font.getStringWidth("Time Machine On") + fontWidth * 2;
const int VBORDER = fontHeight / 2; const int VBORDER = fontHeight / 2;
const int HBORDER = fontWidth * 1.25; const int HBORDER = fontWidth * 1.25;
const int INDENT = fontWidth * 2;
const int VGAP = fontHeight / 4; const int VGAP = fontHeight / 4;
const int HGAP = VGAP * 2; const int HGAP = fontWidth;
const int rowHeight = buttonHeight + VGAP; const int rowHeight = buttonHeight + VGAP;
// Set real dimensions // Set real dimensions

View File

@ -23,6 +23,7 @@
#include "Dialog.hxx" #include "Dialog.hxx"
#include "DialogContainer.hxx" #include "DialogContainer.hxx"
#include "ScrollBarWidget.hxx" #include "ScrollBarWidget.hxx"
#include "PopUpWidget.hxx"
#include "ContextMenu.hxx" #include "ContextMenu.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -35,6 +36,7 @@ ContextMenu::ContextMenu(GuiObject* boss, const GUI::Font& font,
_maxWidth(width) _maxWidth(width)
{ {
addItems(items); addItems(items);
setArrows();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -49,7 +51,7 @@ void ContextMenu::addItems(const VariantList& items)
maxwidth = std::max(maxwidth, _font.getStringWidth(e.first)); maxwidth = std::max(maxwidth, _font.getStringWidth(e.first));
_x = _y = 0; _x = _y = 0;
_w = maxwidth + 23; _w = maxwidth + PopUpWidget::dropDownWidth(_font); // 23;
_h = 1; // recalculate this in ::recalc() _h = 1; // recalculate this in ::recalc()
_scrollUpColor = _firstEntry > 0 ? kScrollColor : kColor; _scrollUpColor = _firstEntry > 0 ? kScrollColor : kColor;
@ -509,7 +511,7 @@ void ContextMenu::scrollDown(int distance)
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ContextMenu::drawDialog() void ContextMenu::setArrows()
{ {
static constexpr std::array<uInt32, 8> up_arrow = { static constexpr std::array<uInt32, 8> up_arrow = {
0b00011000, 0b00011000,
@ -532,6 +534,55 @@ void ContextMenu::drawDialog()
0b00011000 0b00011000
}; };
static constexpr std::array<uInt32, 12> up_arrow_large = {
0b000001100000,
0b000001100000,
0b000011110000,
0b000011110000,
0b000111111000,
0b000111111000,
0b001111111100,
0b001111111100,
0b011111111110,
0b011111111110,
0b111111111111,
0b111111111111
};
static constexpr std::array<uInt32, 12> down_arrow_large = {
0b111111111111,
0b111111111111,
0b011111111110,
0b011111111110,
0b001111111100,
0b001111111100,
0b000111111000,
0b000111111000,
0b000011110000,
0b000011110000,
0b000001100000,
0b000001100000
};
if(_font.getFontHeight() < 24)
{
_textOfs = 2;
_arrowSize = 8;
_upImg = up_arrow.data();
_downImg = down_arrow.data();
}
else
{
_textOfs = 4;
_arrowSize = 12;
_upImg = up_arrow_large.data();
_downImg = down_arrow_large.data();
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ContextMenu::drawDialog()
{
// Normally we add widgets and let Dialog::draw() take care of this // Normally we add widgets and let Dialog::draw() take care of this
// logic. But for some reason, this Dialog was written differently // logic. But for some reason, this Dialog was written differently
// by the ScummVM guys, so I'm not going to mess with it. // by the ScummVM guys, so I'm not going to mess with it.
@ -549,7 +600,7 @@ void ContextMenu::drawDialog()
if(_showScroll) if(_showScroll)
{ {
s.hLine(x, y+_rowHeight-1, w+2, kColor); s.hLine(x, y+_rowHeight-1, w+2, kColor);
s.drawBitmap(up_arrow.data(), ((_w-_x)>>1)-4, (_rowHeight>>1)+y-4, _scrollUpColor, 8); s.drawBitmap(_upImg, ((_w-_x)>>1)-4, (_rowHeight>>1)+y-4, _scrollUpColor, _arrowSize);
y += _rowHeight; y += _rowHeight;
offset--; offset--;
} }
@ -558,7 +609,7 @@ void ContextMenu::drawDialog()
{ {
bool hilite = offset == current; bool hilite = offset == current;
if(hilite) s.fillRect(x, y, w, _rowHeight, kTextColorHi); if(hilite) s.fillRect(x, y, w, _rowHeight, kTextColorHi);
s.drawString(_font, _entries[i].first, x + 1, y + 2, w, s.drawString(_font, _entries[i].first, x + _textOfs, y + 2, w,
!hilite ? kTextColor : kTextColorInv); !hilite ? kTextColor : kTextColorInv);
y += _rowHeight; y += _rowHeight;
} }
@ -567,7 +618,7 @@ void ContextMenu::drawDialog()
if(_showScroll) if(_showScroll)
{ {
s.hLine(x, y, w+2, kColor); s.hLine(x, y, w+2, kColor);
s.drawBitmap(down_arrow.data(), ((_w-_x)>>1)-4, (_rowHeight>>1)+y-4, _scrollDnColor, 8); s.drawBitmap(_downImg, ((_w-_x)>>1)-4, (_rowHeight>>1)+y-4, _scrollDnColor, _arrowSize);
} }
setDirty(); setDirty();

View File

@ -95,6 +95,7 @@ class ContextMenu : public Dialog, public CommandSender
bool handleJoyHat(int stick, int hat, JoyHatDir vahdirlue, int button) override; bool handleJoyHat(int stick, int hat, JoyHatDir vahdirlue, int button) override;
void handleEvent(Event::Type e); void handleEvent(Event::Type e);
void setArrows();
void drawDialog() override; void drawDialog() override;
void recalc(const Common::Rect& image); void recalc(const Common::Rect& image);
@ -129,6 +130,11 @@ class ContextMenu : public Dialog, public CommandSender
uInt32 _xorig{0}, _yorig{0}; uInt32 _xorig{0}, _yorig{0};
uInt32 _maxWidth{0}; uInt32 _maxWidth{0};
int _textOfs{0};
int _arrowSize{0};
const uInt32* _upImg{nullptr};
const uInt32* _downImg{nullptr};
private: private:
// Following constructors and assignment operators not supported // Following constructors and assignment operators not supported
ContextMenu() = delete; ContextMenu() = delete;

View File

@ -45,14 +45,14 @@ EventMappingWidget::EventMappingWidget(GuiObject* boss, const GUI::Font& font,
const int fontHeight = font.getFontHeight(), const int fontHeight = font.getFontHeight(),
lineHeight = font.getLineHeight(), lineHeight = font.getLineHeight(),
fontWidth = font.getMaxCharWidth(), fontWidth = font.getMaxCharWidth(),
buttonWidth = font.getStringWidth("Defaults") + 10, buttonWidth = font.getStringWidth("Defaults") + fontWidth * 1.25,
buttonHeight = font.getLineHeight() * 1.25; buttonHeight = font.getLineHeight() * 1.25;
const int VBORDER = fontHeight / 2; const int VBORDER = fontHeight / 2;
const int HBORDER = fontWidth * 1.25; const int HBORDER = fontWidth * 1.25;
const int VGAP = fontHeight / 4; const int VGAP = fontHeight / 4;
const int ACTION_LINES = 2; const int ACTION_LINES = 2;
int xpos = HBORDER, ypos = VBORDER; int xpos = HBORDER, ypos = VBORDER;
const int listWidth = _w - buttonWidth - HBORDER * 2 - 8; const int listWidth = _w - buttonWidth - HBORDER * 2 - fontWidth;
int listHeight = _h - (2 + ACTION_LINES) * lineHeight - VBORDER + 2; int listHeight = _h - (2 + ACTION_LINES) * lineHeight - VBORDER + 2;
if(mode == EventMode::kEmulationMode) if(mode == EventMode::kEmulationMode)
@ -72,8 +72,8 @@ EventMappingWidget::EventMappingWidget(GuiObject* boss, const GUI::Font& font,
VarList::push_back(items, "Debug", Event::Group::Debug); VarList::push_back(items, "Debug", Event::Group::Debug);
myFilterPopup = new PopUpWidget(boss, font, xpos, ypos, myFilterPopup = new PopUpWidget(boss, font, xpos, ypos,
listWidth - font.getStringWidth("Events ") - 23, lineHeight, listWidth - font.getStringWidth("Events ") - PopUpWidget::dropDownWidth(font),
items, "Events ", 0, kFilterCmd); lineHeight, items, "Events ", 0, kFilterCmd);
myFilterPopup->setTarget(this); myFilterPopup->setTarget(this);
addFocusWidget(myFilterPopup); addFocusWidget(myFilterPopup);
ypos += lineHeight * 1.5; ypos += lineHeight * 1.5;
@ -136,7 +136,7 @@ EventMappingWidget::EventMappingWidget(GuiObject* boss, const GUI::Font& font,
fontHeight, "Action", TextAlign::Left); fontHeight, "Action", TextAlign::Left);
myKeyMapping = new EditTextWidget(boss, font, xpos + t->getWidth() + fontWidth, ypos, myKeyMapping = new EditTextWidget(boss, font, xpos + t->getWidth() + fontWidth, ypos,
_w - xpos - t->getWidth() - fontWidth - HBORDER, _w - xpos - t->getWidth() - fontWidth - HBORDER + 2,
lineHeight + font.getFontHeight() * (ACTION_LINES - 1), ""); lineHeight + font.getFontHeight() * (ACTION_LINES - 1), "");
myKeyMapping->setEditable(false, true); myKeyMapping->setEditable(false, true);
myKeyMapping->clearFlags(Widget::FLAG_RETAIN_FOCUS); myKeyMapping->clearFlags(Widget::FLAG_RETAIN_FOCUS);

View File

@ -36,20 +36,25 @@ GlobalPropsDialog::GlobalPropsDialog(GuiObject* boss, const GUI::Font& font)
const int lineHeight = font.getLineHeight(), const int lineHeight = font.getLineHeight(),
fontWidth = font.getMaxCharWidth(), fontWidth = font.getMaxCharWidth(),
fontHeight = font.getFontHeight(), fontHeight = font.getFontHeight(),
buttonHeight = font.getLineHeight() + 4; buttonHeight = lineHeight * 1.25;
const int VBORDER = fontHeight / 2;
const int HBORDER = fontWidth * 1.25;
const int INDENT = fontWidth * 2;
const int VGAP = fontHeight / 4;
int xpos, ypos; int xpos, ypos;
int lwidth = font.getStringWidth("Right difficulty "), int lwidth = font.getStringWidth("Right difficulty "),
pwidth = font.getStringWidth("CM (SpectraVideo CompuMate)"); pwidth = font.getStringWidth("CM (SpectraVideo CompuMate)");
const int VGAP = 4;
WidgetArray wid; WidgetArray wid;
VariantList items; VariantList items;
const GUI::Font& infofont = instance().frameBuffer().infoFont(); const GUI::Font& infofont = instance().frameBuffer().infoFont();
// Set real dimensions // Set real dimensions
_w = lwidth + pwidth + fontWidth*3 + 15; _w = HBORDER * 2 + std::max(lwidth + pwidth + PopUpWidget::dropDownWidth(font),
_h = 15 * (lineHeight + 4) + buttonHeight + 16 + _th; 49 * infofont.getMaxCharWidth());
_h = _th + 11 * (lineHeight + VGAP) + 3 * infofont.getLineHeight() + VGAP * 12 + buttonHeight + VBORDER * 2;
xpos = 10; ypos = 10 + _th; xpos = HBORDER; ypos = VBORDER + _th;
// Bankswitch type // Bankswitch type
new StaticTextWidget(this, font, xpos, ypos+1, "Bankswitch type"); new StaticTextWidget(this, font, xpos, ypos+1, "Bankswitch type");
@ -112,12 +117,12 @@ GlobalPropsDialog::GlobalPropsDialog(GuiObject* boss, const GUI::Font& font)
"(automatically released shortly after start)"); "(automatically released shortly after start)");
// Start with console joystick direction/buttons held down // Start with console joystick direction/buttons held down
xpos = 32; ypos += infofont.getLineHeight() + VGAP * 2; xpos = fontWidth * 4; ypos += infofont.getLineHeight() + VGAP * 2;
ypos = addHoldWidgets(font, xpos, ypos, wid); ypos = addHoldWidgets(font, xpos, ypos, wid);
// Add message concerning usage // Add message concerning usage
xpos = 10; ypos += 2 * fontHeight; xpos = HBORDER;
ypos = _h - fontHeight * 2 - infofont.getLineHeight() - 24; ypos = _h - VBORDER - buttonHeight - VGAP * 3 - infofont.getLineHeight() * 2;
new StaticTextWidget(this, infofont, xpos, ypos, new StaticTextWidget(this, infofont, xpos, ypos,
"(*) These options are not saved, but apply to all"); "(*) These options are not saved, but apply to all");
ypos += infofont.getLineHeight(); ypos += infofont.getLineHeight();
@ -134,21 +139,24 @@ GlobalPropsDialog::GlobalPropsDialog(GuiObject* boss, const GUI::Font& font)
int GlobalPropsDialog::addHoldWidgets(const GUI::Font& font, int x, int y, int GlobalPropsDialog::addHoldWidgets(const GUI::Font& font, int x, int y,
WidgetArray& wid) WidgetArray& wid)
{ {
int xpos = x, ypos = y; const int fontWidth = font.getMaxCharWidth(),
const int VGAP = 4; fontHeight = font.getFontHeight();
const int VGAP = fontHeight / 4;
int xpos = x, ypos = y, xdiff = CheckboxWidget::boxSize(font) - 9;
// Left joystick // Left joystick
StaticTextWidget* t = new StaticTextWidget(this, font, xpos, ypos+2, "Left joy"); StaticTextWidget* t = new StaticTextWidget(this, font, xpos, ypos + 2, "Left joy");
xpos += t->getWidth()/2 - 7; ypos += t->getHeight() + VGAP; xpos += t->getWidth()/2 - xdiff - 2; ypos += t->getHeight() + VGAP;
myJoy[kJ0Up] = new CheckboxWidget(this, font, xpos, ypos, "", kJ0Up); myJoy[kJ0Up] = new CheckboxWidget(this, font, xpos, ypos, "", kJ0Up);
ypos += myJoy[kJ0Up]->getHeight() * 2 + VGAP * 2; ypos += myJoy[kJ0Up]->getHeight() * 2 + VGAP * 2;
myJoy[kJ0Down] = new CheckboxWidget(this, font, xpos, ypos, "", kJ0Down); myJoy[kJ0Down] = new CheckboxWidget(this, font, xpos, ypos, "", kJ0Down);
xpos -= myJoy[kJ0Up]->getWidth() + 5; xpos -= myJoy[kJ0Up]->getWidth() + xdiff;
ypos -= myJoy[kJ0Up]->getHeight() + VGAP; ypos -= myJoy[kJ0Up]->getHeight() + VGAP;
myJoy[kJ0Left] = new CheckboxWidget(this, font, xpos, ypos, "", kJ0Left); myJoy[kJ0Left] = new CheckboxWidget(this, font, xpos, ypos, "", kJ0Left);
xpos += (myJoy[kJ0Up]->getWidth() + 5) * 2; xpos += (myJoy[kJ0Up]->getWidth() + xdiff) * 2;
myJoy[kJ0Right] = new CheckboxWidget(this, font, xpos, ypos, "", kJ0Right); myJoy[kJ0Right] = new CheckboxWidget(this, font, xpos, ypos, "", kJ0Right);
xpos -= (myJoy[kJ0Up]->getWidth() + 5) * 2; xpos -= (myJoy[kJ0Up]->getWidth() + xdiff) * 2;
ypos += myJoy[kJ0Down]->getHeight() * 2 + VGAP * 2; ypos += myJoy[kJ0Down]->getHeight() * 2 + VGAP * 2;
myJoy[kJ0Fire] = new CheckboxWidget(this, font, xpos, ypos, "Fire", kJ0Fire); myJoy[kJ0Fire] = new CheckboxWidget(this, font, xpos, ypos, "Fire", kJ0Fire);
@ -157,20 +165,20 @@ int GlobalPropsDialog::addHoldWidgets(const GUI::Font& font, int x, int y,
// Right joystick // Right joystick
t = new StaticTextWidget(this, font, xpos, ypos + 2, "Right joy"); t = new StaticTextWidget(this, font, xpos, ypos + 2, "Right joy");
xpos += t->getWidth()/2 - 7; ypos += t->getHeight() + VGAP; xpos += t->getWidth()/2 - xdiff - 2; ypos += t->getHeight() + VGAP;
myJoy[kJ1Up] = new CheckboxWidget(this, font, xpos, ypos, "", kJ1Up); myJoy[kJ1Up] = new CheckboxWidget(this, font, xpos, ypos, "", kJ1Up);
ypos += myJoy[kJ1Up]->getHeight() * 2 + VGAP * 2; ypos += myJoy[kJ1Up]->getHeight() * 2 + VGAP * 2;
myJoy[kJ1Down] = new CheckboxWidget(this, font, xpos, ypos, "", kJ1Down); myJoy[kJ1Down] = new CheckboxWidget(this, font, xpos, ypos, "", kJ1Down);
xpos -= myJoy[kJ1Up]->getWidth() + 5; xpos -= myJoy[kJ1Up]->getWidth() + xdiff;
ypos -= myJoy[kJ1Up]->getHeight() + VGAP; ypos -= myJoy[kJ1Up]->getHeight() + VGAP;
myJoy[kJ1Left] = new CheckboxWidget(this, font, xpos, ypos, "", kJ1Left); myJoy[kJ1Left] = new CheckboxWidget(this, font, xpos, ypos, "", kJ1Left);
xpos += (myJoy[kJ1Up]->getWidth() + 5) * 2; xpos += (myJoy[kJ1Up]->getWidth() + xdiff) * 2;
myJoy[kJ1Right] = new CheckboxWidget(this, font, xpos, ypos, "", kJ1Right); myJoy[kJ1Right] = new CheckboxWidget(this, font, xpos, ypos, "", kJ1Right);
xpos -= (myJoy[kJ1Up]->getWidth() + 5) * 2; xpos -= (myJoy[kJ1Up]->getWidth() + xdiff) * 2;
ypos += myJoy[kJ1Down]->getHeight() * 2 + VGAP * 2; ypos += myJoy[kJ1Down]->getHeight() * 2 + VGAP * 2;
myJoy[kJ1Fire] = new CheckboxWidget(this, font, xpos, ypos, "Fire", kJ1Fire); myJoy[kJ1Fire] = new CheckboxWidget(this, font, xpos, ypos, "Fire", kJ1Fire);
xpos = 2 * _w / 3 + 8; ypos = y; xpos = 2 * _w / 3 + fontWidth; ypos = y;
// Console Select/Reset // Console Select/Reset
t = new StaticTextWidget(this, font, xpos, ypos+2, "Console"); t = new StaticTextWidget(this, font, xpos, ypos+2, "Console");

View File

@ -50,15 +50,20 @@ InputTextDialog::InputTextDialog(GuiObject* boss, const GUI::Font& lfont,
void InputTextDialog::initialize(const GUI::Font& lfont, const GUI::Font& nfont, void InputTextDialog::initialize(const GUI::Font& lfont, const GUI::Font& nfont,
const StringList& labels) const StringList& labels)
{ {
const int fontWidth = lfont.getMaxCharWidth(), const int lineHeight = lfont.getLineHeight(),
fontHeight = lfont.getFontHeight(), fontWidth = lfont.getMaxCharWidth(),
lineHeight = lfont.getLineHeight(); fontHeight = lfont.getFontHeight(),
buttonHeight = lfont.getLineHeight() * 1.25;
const int VBORDER = fontHeight / 2;
const int HBORDER = fontWidth * 1.25;
const int VGAP = fontHeight / 4;
uInt32 xpos, ypos, i, lwidth = 0, maxIdx = 0; uInt32 xpos, ypos, i, lwidth = 0, maxIdx = 0;
WidgetArray wid; WidgetArray wid;
// Calculate real dimensions // Calculate real dimensions
_w = fontWidth * 41; _w = HBORDER * 2 + fontWidth * 39;
_h = lineHeight * 4 + int(labels.size()) * (lineHeight + 5) + _th; _h = buttonHeight + lineHeight + VGAP + int(labels.size()) * (lineHeight + VGAP) + _th + VBORDER * 2;
// Determine longest label // Determine longest label
for(i = 0; i < labels.size(); ++i) for(i = 0; i < labels.size(); ++i)
@ -72,25 +77,25 @@ void InputTextDialog::initialize(const GUI::Font& lfont, const GUI::Font& nfont,
lwidth = lfont.getStringWidth(labels[maxIdx]); lwidth = lfont.getStringWidth(labels[maxIdx]);
// Create editboxes for all labels // Create editboxes for all labels
ypos = lineHeight + _th; ypos = VBORDER + _th;
for(i = 0; i < labels.size(); ++i) for(i = 0; i < labels.size(); ++i)
{ {
xpos = 10; xpos = HBORDER;
new StaticTextWidget(this, lfont, xpos, ypos + 2, new StaticTextWidget(this, lfont, xpos, ypos + 2,
lwidth, fontHeight, lwidth, fontHeight,
labels[i], TextAlign::Left); labels[i], TextAlign::Left);
xpos += lwidth + fontWidth; xpos += lwidth + fontWidth;
EditTextWidget* w = new EditTextWidget(this, nfont, xpos, ypos, EditTextWidget* w = new EditTextWidget(this, nfont, xpos, ypos,
_w - xpos - 10, lineHeight, ""); _w - xpos - HBORDER, lineHeight, "");
wid.push_back(w); wid.push_back(w);
myInput.push_back(w); myInput.push_back(w);
ypos += lineHeight + 5; ypos += lineHeight + VGAP;
} }
xpos = 10; xpos = HBORDER; ypos += VGAP;
myMessage = new StaticTextWidget(this, lfont, xpos, ypos, _w - 2*xpos, fontHeight, myMessage = new StaticTextWidget(this, lfont, xpos, ypos, _w - 2 * xpos, fontHeight,
"", TextAlign::Left); "", TextAlign::Left);
myMessage->setTextColor(kTextColorEm); myMessage->setTextColor(kTextColorEm);

View File

@ -32,33 +32,40 @@ JoystickDialog::JoystickDialog(GuiObject* boss, const GUI::Font& font,
int xpos, ypos; int xpos, ypos;
WidgetArray wid; WidgetArray wid;
int buttonWidth = font.getStringWidth("Remove ") + 20, const int lineHeight = font.getLineHeight(),
buttonHeight = font.getLineHeight() + 4; fontWidth = font.getMaxCharWidth(),
fontHeight = font.getFontHeight(),
buttonWidth = font.getStringWidth("Remove") + fontWidth * 2.5,
buttonHeight = font.getLineHeight() * 1.25;
const int VBORDER = fontHeight / 2;
const int HBORDER = fontWidth * 1.25;
const int INDENT = fontWidth * 2;
const int VGAP = fontHeight / 4;
// Joystick list // Joystick list
xpos = 10; ypos = 10 + _th; xpos = HBORDER; ypos = VBORDER + _th;
int w = _w - 2 * xpos; int w = _w - 2 * xpos;
int h = _h - buttonHeight - ypos - 20; int h = _h - buttonHeight - ypos - VBORDER * 2;
myJoyList = new StringListWidget(this, font, xpos, ypos, w, h); myJoyList = new StringListWidget(this, font, xpos, ypos, w, h);
myJoyList->setEditable(false); myJoyList->setEditable(false);
wid.push_back(myJoyList); wid.push_back(myJoyList);
// Joystick ID // Joystick ID
ypos = _h - buttonHeight - 10; ypos = _h - VBORDER - (buttonHeight + lineHeight) / 2;
StaticTextWidget* t = new StaticTextWidget(this, font, xpos, ypos+2, "Joystick ID "); StaticTextWidget* t = new StaticTextWidget(this, font, xpos, ypos+2, "Joystick ID ");
xpos += t->getWidth() + 4; xpos += t->getWidth();
myJoyText = new EditTextWidget(this, font, xpos, ypos, myJoyText = new EditTextWidget(this, font, xpos, ypos,
font.getStringWidth("Unplugged")+8, font.getLineHeight(), ""); font.getStringWidth("Unplugged "), font.getLineHeight(), "");
myJoyText->setEditable(false); myJoyText->setEditable(false);
// Add buttons at bottom // Add buttons at bottom
xpos = _w - buttonWidth - 10; xpos = _w - buttonWidth - HBORDER;
ypos = _h - VBORDER - buttonHeight;
myCloseBtn = new ButtonWidget(this, font, xpos, ypos, myCloseBtn = new ButtonWidget(this, font, xpos, ypos,
buttonWidth, buttonHeight, "Close", GuiObject::kCloseCmd); buttonWidth, buttonHeight, "Close", GuiObject::kCloseCmd);
addOKWidget(myCloseBtn); addCancelWidget(myCloseBtn); addOKWidget(myCloseBtn); addCancelWidget(myCloseBtn);
buttonWidth = font.getStringWidth("Remove") + 20; xpos -= buttonWidth + fontWidth;
xpos -= buttonWidth + 8;
myRemoveBtn = new ButtonWidget(this, font, xpos, ypos, myRemoveBtn = new ButtonWidget(this, font, xpos, ypos,
buttonWidth, buttonHeight, "Remove", kRemoveCmd); buttonWidth, buttonHeight, "Remove", kRemoveCmd);
myRemoveBtn->clearFlags(Widget::FLAG_ENABLED); myRemoveBtn->clearFlags(Widget::FLAG_ENABLED);

View File

@ -60,25 +60,26 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent,
myUseMinimalUI = instance().settings().getBool("minimal_ui"); myUseMinimalUI = instance().settings().getBool("minimal_ui");
const GUI::Font& font = instance().frameBuffer().launcherFont(); const GUI::Font& font = instance().frameBuffer().launcherFont();
const int fontWidth = font.getMaxCharWidth(), const int fontWidth = font.getMaxCharWidth(),
fontHeight = font.getFontHeight(), fontHeight = font.getFontHeight(),
lineHeight = font.getLineHeight(), lineHeight = font.getLineHeight(),
bheight = myUseMinimalUI ? lineHeight - 4 : lineHeight + 4, HBORDER = fontWidth * 1.25,
LBL_GAP = fontWidth, VBORDER = fontHeight / 2,
HBORDER = 10,//fontWidth * 1.25,
BUTTON_GAP = fontWidth, BUTTON_GAP = fontWidth,
bwidth = (_w - 2 * HBORDER - BUTTON_GAP * (4 - 1)); LBL_GAP = fontWidth,
int xpos = 0, ypos = 0, lwidth = 0, lwidth2 = 0; VGAP = fontHeight / 4,
WidgetArray wid; buttonHeight = myUseMinimalUI ? lineHeight - VGAP * 2: lineHeight * 1.25,
buttonWidth = (_w - 2 * HBORDER - BUTTON_GAP * (4 - 1));
int xpos = HBORDER, ypos = VBORDER, lwidth = 0, lwidth2 = 0;
WidgetArray wid;
string lblRom = "Select a ROM from the list" + ELLIPSIS; string lblRom = "Select a ROM from the list" + ELLIPSIS;
const string& lblFilter = "Filter"; const string& lblFilter = "Filter";
const string& lblAllFiles = "Show all files"; const string& lblAllFiles = "Show all files";
const string& lblFound = "XXXX items found"; const string& lblFound = "XXXX items found";
lwidth = font.getStringWidth(lblRom); lwidth = font.getStringWidth(lblRom);
lwidth2 = font.getStringWidth(lblAllFiles) + 20; lwidth2 = font.getStringWidth(lblAllFiles) + CheckboxWidget::boxSize(font);
int lwidth3 = font.getStringWidth(lblFilter); int lwidth3 = font.getStringWidth(lblFilter);
int lwidth4 = font.getStringWidth(lblFound); int lwidth4 = font.getStringWidth(lblFound);
@ -97,14 +98,12 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent,
#if defined(RETRON77) #if defined(RETRON77)
ver << " for RetroN 77"; ver << " for RetroN 77";
#endif #endif
ypos += 8; new StaticTextWidget(this, font, 0, ypos, _w, fontHeight,
new StaticTextWidget(this, font, xpos, ypos, _w - 20, fontHeight,
ver.str(), TextAlign::Center); ver.str(), TextAlign::Center);
ypos += fontHeight - 4; ypos += lineHeight;
} }
// Show the header // Show the header
xpos += HBORDER; ypos += 8;
new StaticTextWidget(this, font, xpos, ypos, lblRom); new StaticTextWidget(this, font, xpos, ypos, lblRom);
// Shop the files counter // Shop the files counter
xpos = _w - HBORDER - lwidth4; xpos = _w - HBORDER - lwidth4;
@ -132,12 +131,12 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent,
// Add list with game titles // Add list with game titles
// Before we add the list, we need to know the size of the RomInfoWidget // Before we add the list, we need to know the size of the RomInfoWidget
int listHeight = _h - 43 - bheight - fontHeight - lineHeight; int listHeight = _h - VBORDER * 2 - buttonHeight - lineHeight * 2 - VGAP * 6;
float imgZoom = getRomInfoZoom(listHeight); float imgZoom = getRomInfoZoom(listHeight);
int romWidth = imgZoom * TIAConstants::viewableWidth; int romWidth = imgZoom * TIAConstants::viewableWidth;
if(romWidth > 0) romWidth += 10; if(romWidth > 0) romWidth += HBORDER;
int listWidth = _w - (romWidth > 0 ? romWidth+8 : 0) - 20; int listWidth = _w - (romWidth > 0 ? romWidth + fontWidth : 0) - HBORDER * 2;
xpos = HBORDER; ypos += lineHeight + 4; xpos = HBORDER; ypos += lineHeight + VGAP;
myList = new FileListWidget(this, font, xpos, ypos, listWidth, listHeight); myList = new FileListWidget(this, font, xpos, ypos, listWidth, listHeight);
myList->setEditable(false); myList->setEditable(false);
myList->setListMode(FilesystemNode::ListMode::All); myList->setListMode(FilesystemNode::ListMode::All);
@ -146,14 +145,14 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent,
// Add ROM info area (if enabled) // Add ROM info area (if enabled)
if(romWidth > 0) if(romWidth > 0)
{ {
xpos += myList->getWidth() + 8; xpos += myList->getWidth() + fontWidth;
// Initial surface size is the same as the viewable area // Initial surface size is the same as the viewable area
Common::Size imgSize(TIAConstants::viewableWidth*imgZoom, Common::Size imgSize(TIAConstants::viewableWidth*imgZoom,
TIAConstants::viewableHeight*imgZoom); TIAConstants::viewableHeight*imgZoom);
// Calculate font area, and in the process the font that can be used // Calculate font area, and in the process the font that can be used
Common::Size fontArea(romWidth - 16, myList->getHeight() - imgSize.h - 12); Common::Size fontArea(romWidth - fontWidth * 2, myList->getHeight() - imgSize.h - VGAP * 3);
setRomInfoFont(fontArea); setRomInfoFont(fontArea);
myRomInfoWidget = new RomInfoWidget(this, *myROMInfoFont, myRomInfoWidget = new RomInfoWidget(this, *myROMInfoFont,
@ -162,7 +161,7 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent,
// Add textfield to show current directory // Add textfield to show current directory
xpos = HBORDER; xpos = HBORDER;
ypos += myList->getHeight() + 8; ypos += myList->getHeight() + VGAP * 2;
lwidth = font.getStringWidth("Path") + LBL_GAP; lwidth = font.getStringWidth("Path") + LBL_GAP;
myDirLabel = new StaticTextWidget(this, font, xpos, ypos+2, lwidth, fontHeight, myDirLabel = new StaticTextWidget(this, font, xpos, ypos+2, lwidth, fontHeight,
"Path", TextAlign::Left); "Path", TextAlign::Left);
@ -174,43 +173,43 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent,
if(!myUseMinimalUI) if(!myUseMinimalUI)
{ {
// Add four buttons at the bottom // Add four buttons at the bottom
xpos = HBORDER; ypos += myDir->getHeight() + 8; xpos = HBORDER; ypos = _h - VBORDER - buttonHeight;
#ifndef BSPF_MACOS #ifndef BSPF_MACOS
myStartButton = new ButtonWidget(this, font, xpos, ypos, (bwidth + 0) / 4, bheight, myStartButton = new ButtonWidget(this, font, xpos, ypos, (buttonWidth + 0) / 4, buttonHeight,
"Select", kLoadROMCmd); "Select", kLoadROMCmd);
wid.push_back(myStartButton); wid.push_back(myStartButton);
xpos += (bwidth + 0) / 4 + BUTTON_GAP; xpos += (buttonWidth + 0) / 4 + BUTTON_GAP;
myPrevDirButton = new ButtonWidget(this, font, xpos, ypos, (bwidth + 1) / 4, bheight, myPrevDirButton = new ButtonWidget(this, font, xpos, ypos, (buttonWidth + 1) / 4, buttonHeight,
"Go Up", kPrevDirCmd); "Go Up", kPrevDirCmd);
wid.push_back(myPrevDirButton); wid.push_back(myPrevDirButton);
xpos += (bwidth + 1) / 4 + BUTTON_GAP; xpos += (buttonWidth + 1) / 4 + BUTTON_GAP;
myOptionsButton = new ButtonWidget(this, font, xpos, ypos, (bwidth + 3) / 4, bheight, myOptionsButton = new ButtonWidget(this, font, xpos, ypos, (buttonWidth + 3) / 4, buttonHeight,
"Options" + ELLIPSIS, kOptionsCmd); "Options" + ELLIPSIS, kOptionsCmd);
wid.push_back(myOptionsButton); wid.push_back(myOptionsButton);
xpos += (bwidth + 2) / 4 + BUTTON_GAP; xpos += (buttonWidth + 2) / 4 + BUTTON_GAP;
myQuitButton = new ButtonWidget(this, font, xpos, ypos, (bwidth + 4) / 4, bheight, myQuitButton = new ButtonWidget(this, font, xpos, ypos, (buttonWidth + 4) / 4, buttonHeight,
"Quit", kQuitCmd); "Quit", kQuitCmd);
wid.push_back(myQuitButton); wid.push_back(myQuitButton);
#else #else
myQuitButton = new ButtonWidget(this, font, xpos, ypos, (bwidth + 0) / 4, bheight, myQuitButton = new ButtonWidget(this, font, xpos, ypos, (buttonWidth + 0) / 4, buttonHeight,
"Quit", kQuitCmd); "Quit", kQuitCmd);
wid.push_back(myQuitButton); wid.push_back(myQuitButton);
xpos += (bwidth + 0) / 4 + BUTTON_GAP; xpos += (buttonWidth + 0) / 4 + BUTTON_GAP;
myOptionsButton = new ButtonWidget(this, font, xpos, ypos, (bwidth + 1) / 4, bheight, myOptionsButton = new ButtonWidget(this, font, xpos, ypos, (buttonWidth + 1) / 4, buttonHeight,
"Options" + ELLIPSIS, kOptionsCmd); "Options" + ELLIPSIS, kOptionsCmd);
wid.push_back(myOptionsButton); wid.push_back(myOptionsButton);
xpos += (bwidth + 1) / 4 + BUTTON_GAP; xpos += (buttonWidth + 1) / 4 + BUTTON_GAP;
myPrevDirButton = new ButtonWidget(this, font, xpos, ypos, (bwidth + 2) / 4, bheight, myPrevDirButton = new ButtonWidget(this, font, xpos, ypos, (buttonWidth + 2) / 4, buttonHeight,
"Go Up", kPrevDirCmd); "Go Up", kPrevDirCmd);
wid.push_back(myPrevDirButton); wid.push_back(myPrevDirButton);
xpos += (bwidth + 2) / 4 + BUTTON_GAP; xpos += (buttonWidth + 2) / 4 + BUTTON_GAP;
myStartButton = new ButtonWidget(this, font, xpos, ypos, (bwidth + 3) / 4, bheight, myStartButton = new ButtonWidget(this, font, xpos, ypos, (buttonWidth + 3) / 4, buttonHeight,
"Select", kLoadROMCmd); "Select", kLoadROMCmd);
wid.push_back(myStartButton); wid.push_back(myStartButton);
#endif #endif
@ -223,7 +222,7 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent,
addToFocusList(wid); addToFocusList(wid);
// Create (empty) context menu for ROM list options // Create (empty) context menu for ROM list options
myMenu = make_unique<ContextMenu>(this, osystem.frameBuffer().font(), EmptyVarList); myMenu = make_unique<ContextMenu>(this, osystem.frameBuffer().launcherFont(), EmptyVarList);
// Create global props dialog, which is used to temporarily override // Create global props dialog, which is used to temporarily override
// ROM properties // ROM properties
@ -363,28 +362,33 @@ float LauncherDialog::getRomInfoZoom(int listHeight) const
if(zoom > 0.F) if(zoom > 0.F)
{ {
// upper zoom limit - at least 24 launchers chars/line and 8 ROM info lines const GUI::Font& font = instance().frameBuffer().launcherFont();
if((_w - 58 - zoom * TIAConstants::viewableWidth) const GUI::Font& smallFont = instance().frameBuffer().smallFont();
/ instance().frameBuffer().launcherFont().getMaxCharWidth() < MIN_LAUNCHER_CHARS) const int fontWidth = font.getMaxCharWidth(),
HBORDER = fontWidth * 1.25;
// upper zoom limit - at least 24 launchers chars/line and 7 + 4 ROM info lines
if((_w - (HBORDER * 2 + fontWidth + 30) - zoom * TIAConstants::viewableWidth)
/ font.getMaxCharWidth() < MIN_LAUNCHER_CHARS)
{ {
zoom = float(_w - 58 - MIN_LAUNCHER_CHARS * instance().frameBuffer().launcherFont().getMaxCharWidth()) zoom = float(_w - (HBORDER * 2 + fontWidth + 30) - MIN_LAUNCHER_CHARS * font.getMaxCharWidth())
/ TIAConstants::viewableWidth; / TIAConstants::viewableWidth;
} }
if((listHeight - 12 - zoom * TIAConstants::viewableHeight) < if((listHeight - 12 - zoom * TIAConstants::viewableHeight) <
MIN_ROMINFO_ROWS * instance().frameBuffer().smallFont().getLineHeight() + MIN_ROMINFO_ROWS * smallFont.getLineHeight() +
MIN_ROMINFO_LINES * instance().frameBuffer().smallFont().getFontHeight()) MIN_ROMINFO_LINES * smallFont.getFontHeight())
{ {
zoom = float(listHeight - 12 - zoom = float(listHeight - 12 -
MIN_ROMINFO_ROWS * instance().frameBuffer().smallFont().getLineHeight() - MIN_ROMINFO_ROWS * smallFont.getLineHeight() -
MIN_ROMINFO_LINES * instance().frameBuffer().smallFont().getFontHeight()) MIN_ROMINFO_LINES * smallFont.getFontHeight())
/ TIAConstants::viewableHeight; / TIAConstants::viewableHeight;
} }
// lower zoom limit - at least 24 ROM info chars/line // lower zoom limit - at least 30 ROM info chars/line
if((zoom * TIAConstants::viewableWidth) if((zoom * TIAConstants::viewableWidth)
/ instance().frameBuffer().smallFont().getMaxCharWidth() < MIN_ROMINFO_CHARS + 6) / smallFont.getMaxCharWidth() < MIN_ROMINFO_CHARS + 6)
{ {
zoom = float(MIN_ROMINFO_CHARS * instance().frameBuffer().smallFont().getMaxCharWidth() + 6) zoom = float(MIN_ROMINFO_CHARS * smallFont.getMaxCharWidth() + 6)
/ TIAConstants::viewableWidth; / TIAConstants::viewableWidth;
} }
} }

View File

@ -79,21 +79,24 @@ MessageBox::MessageBox(GuiObject* boss, const GUI::Font& font,
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void MessageBox::addText(const GUI::Font& font, const StringList& text) void MessageBox::addText(const GUI::Font& font, const StringList& text)
{ {
const int fontWidth = font.getMaxCharWidth(), const int fontWidth = font.getMaxCharWidth(),
fontHeight = font.getFontHeight(); fontHeight = font.getFontHeight();
int xpos, ypos; const int VBORDER = fontHeight / 2;
const int HBORDER = fontWidth * 1.25;
int xpos, ypos;
// Set real dimensions // Set real dimensions
int str_w = 0; int str_w = 0;
for(const auto& s: text) for(const auto& s: text)
str_w = std::max(int(s.length()), str_w); str_w = std::max(int(s.length()), str_w);
_w = std::min(str_w * fontWidth + 20, _w); _w = std::min(str_w * fontWidth + HBORDER * 2, _w);
_h = std::min(uInt32((text.size() + 2) * fontHeight + 20 + _th), uInt32(_h)); _h = std::min(uInt32((text.size() + 2) * fontHeight + VBORDER * 2 + _th), uInt32(_h));
xpos = 10; ypos = 10 + _th; xpos = HBORDER; ypos = VBORDER + _th;
for(const auto& s: text) for(const auto& s: text)
{ {
new StaticTextWidget(this, font, xpos, ypos, _w - 20, new StaticTextWidget(this, font, xpos, ypos, _w - HBORDER * 2,
fontHeight, s, TextAlign::Left); fontHeight, s, TextAlign::Left);
ypos += fontHeight; ypos += fontHeight;
} }

View File

@ -58,14 +58,15 @@ OptionsDialog::OptionsDialog(OSystem& osystem, DialogContainer& parent,
fontWidth = _font.getMaxCharWidth(), fontWidth = _font.getMaxCharWidth(),
fontHeight = _font.getFontHeight(), fontHeight = _font.getFontHeight(),
buttonHeight = _font.getLineHeight() * 1.25, buttonHeight = _font.getLineHeight() * 1.25,
GAP = fontWidth / 2, VGAP = fontHeight / 4,
rowHeight = buttonHeight + GAP; HGAP = fontWidth,
rowHeight = buttonHeight + VGAP;
const int VBORDER = fontHeight / 2; const int VBORDER = fontHeight / 2;
const int HBORDER = fontWidth * 1.25; const int HBORDER = fontWidth * 1.25;
int buttonWidth = _font.getStringWidth("Game Properties" + ELLIPSIS) + GAP * 5; int buttonWidth = _font.getStringWidth("Game Properties" + ELLIPSIS) + fontWidth * 2.5;
_w = 2 * buttonWidth + HBORDER * 3; _w = 2 * buttonWidth + HBORDER * 2 + HGAP;
_h = 7 * rowHeight + VBORDER * 2 - GAP + _th; _h = 7 * rowHeight + VBORDER * 2 - VGAP + _th;
int xoffset = HBORDER, yoffset = VBORDER + _th; int xoffset = HBORDER, yoffset = VBORDER + _th;
WidgetArray wid; WidgetArray wid;
@ -76,8 +77,8 @@ OptionsDialog::OptionsDialog(OSystem& osystem, DialogContainer& parent,
ButtonWidget* bw = new ButtonWidget(this, _font, xoffset, yoffset, ButtonWidget* bw = new ButtonWidget(this, _font, xoffset, yoffset,
_w - HBORDER * 2, buttonHeight, "Use Basic Settings", kBasSetCmd); _w - HBORDER * 2, buttonHeight, "Use Basic Settings", kBasSetCmd);
wid.push_back(bw); wid.push_back(bw);
yoffset += rowHeight + GAP * 2; yoffset += rowHeight + VGAP * 2;
_h += rowHeight + GAP * 2; _h += rowHeight + VGAP * 2;
} }
auto ADD_OD_BUTTON = [&](const string& label, int cmd) auto ADD_OD_BUTTON = [&](const string& label, int cmd)
@ -111,8 +112,8 @@ OptionsDialog::OptionsDialog(OSystem& osystem, DialogContainer& parent,
wid.push_back(b); wid.push_back(b);
// Move to second column // Move to second column
xoffset += buttonWidth + HBORDER; xoffset += buttonWidth + HGAP;
yoffset = minSettings ? VBORDER + _th + rowHeight + GAP * 2 : VBORDER + _th; yoffset = minSettings ? VBORDER + _th + rowHeight + VGAP * 2 : VBORDER + _th;
myGameInfoButton = ADD_OD_BUTTON("Game Properties" + ELLIPSIS, kInfoCmd); myGameInfoButton = ADD_OD_BUTTON("Game Properties" + ELLIPSIS, kInfoCmd);
wid.push_back(myGameInfoButton); wid.push_back(myGameInfoButton);
@ -135,8 +136,8 @@ OptionsDialog::OptionsDialog(OSystem& osystem, DialogContainer& parent,
b = ADD_OD_BUTTON("About" + ELLIPSIS, kAboutCmd); b = ADD_OD_BUTTON("About" + ELLIPSIS, kAboutCmd);
wid.push_back(b); wid.push_back(b);
buttonWidth = _font.getStringWidth(" Close ") + GAP * 5; buttonWidth = _font.getStringWidth(" Close ") + fontWidth * 2.5;
xoffset -= (buttonWidth + HBORDER) / 2; xoffset -= (buttonWidth + HGAP) / 2;
b = ADD_OD_BUTTON("Close", kExitCmd); b = ADD_OD_BUTTON("Close", kExitCmd);
wid.push_back(b); wid.push_back(b);
addCancelWidget(b); addCancelWidget(b);

View File

@ -41,11 +41,13 @@ PopUpWidget::PopUpWidget(GuiObject* boss, const GUI::Font& font,
if(!_label.empty() && _labelWidth == 0) if(!_label.empty() && _labelWidth == 0)
_labelWidth = _font.getStringWidth(_label); _labelWidth = _font.getStringWidth(_label);
_w = w + _labelWidth + 23; setArrow();
_w = w + _labelWidth + dropDownWidth(font); // 23
// vertically center the arrows and text // vertically center the arrows and text
myTextY = (_h - _font.getFontHeight()) / 2; myTextY = (_h - _font.getFontHeight()) / 2;
myArrowsY = (_h - 8) / 2; myArrowsY = (_h - _arrowHeight) / 2;
myMenu = make_unique<ContextMenu>(this, font, list, cmd, w); myMenu = make_unique<ContextMenu>(this, font, list, cmd, w);
} }
@ -185,10 +187,10 @@ void PopUpWidget::handleCommand(CommandSender* sender, int cmd, int data, int id
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void PopUpWidget::drawWidget(bool hilite) void PopUpWidget::setArrow()
{ {
// Small down arrow // Small down arrow
static constexpr std::array<uInt32, 8> down_arrow = { static constexpr std::array<uInt32, 7> down_arrow = {
0b100000001, 0b100000001,
0b110000011, 0b110000011,
0b111000111, 0b111000111,
@ -196,24 +198,40 @@ void PopUpWidget::drawWidget(bool hilite)
0b001111100, 0b001111100,
0b000111000, 0b000111000,
0b000010000, 0b000010000,
0b000000000
}; };
// Large down arrow // Large down arrow
static constexpr std::array<uInt32, 11> down_arrow_large = { static constexpr std::array<uInt32, 10> down_arrow_large = {
0b00000000000, 0b1000000000001,
0b10000000001, 0b1100000000011,
0b11000000011, 0b1110000000111,
0b11100000111, 0b1111000001111,
0b11110001111, 0b0111100011110,
0b01111011110, 0b0011110111100,
0b00111111100, 0b0001111111000,
0b00011111000, 0b0000111110000,
0b00001110000, 0b0000011100000,
0b00000100000, 0b0000001000000
0b00000000000
}; };
if(_font.getFontHeight() < 24)
{
_textOfs = 3;
_arrowWidth = 9;
_arrowHeight = 7;
_arrowImg = down_arrow.data();
}
else
{
_textOfs = 5;
_arrowWidth = 13;
_arrowHeight = 10;
_arrowImg = down_arrow_large.data();
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void PopUpWidget::drawWidget(bool hilite)
{
//cerr << "PopUpWidget::drawWidget\n"; //cerr << "PopUpWidget::drawWidget\n";
FBSurface& s = dialog().surface(); FBSurface& s = dialog().surface();
bool onTop = _boss->dialog().isOnTop(); bool onTop = _boss->dialog().isOnTop();
@ -228,19 +246,22 @@ void PopUpWidget::drawWidget(bool hilite)
// Draw a thin frame around us. // Draw a thin frame around us.
s.frameRect(x, _y, w, _h, isEnabled() && hilite ? kWidColorHi : kColor); s.frameRect(x, _y, w, _h, isEnabled() && hilite ? kWidColorHi : kColor);
s.frameRect(x + w - 16, _y + 1, 15, _h - 2, isEnabled() && hilite ? kWidColorHi : kBGColorLo); s.frameRect(x + w - (_arrowWidth * 2 - 2), _y + 1, (_arrowWidth * 2 - 3), _h - 2,
isEnabled() && hilite ? kWidColorHi : kBGColorLo);
// Fill the background // Fill the background
s.fillRect(x + 1, _y + 1, w - 17, _h - 2, onTop ? _changed ? kDbgChangedColor : kWidColor : kDlgColor); s.fillRect(x + 1, _y + 1, w - (_arrowWidth * 2 - 1), _h - 2,
s.fillRect(x + w - 15, _y + 2, 13, _h - 4, onTop ? isEnabled() && hilite ? kWidColor : kBGColorHi : kBGColorLo); onTop ? _changed ? kDbgChangedColor : kWidColor : kDlgColor);
s.fillRect(x + w - (_arrowWidth * 2 - 3), _y + 2, (_arrowWidth * 2 - 5), _h - 4,
onTop ? isEnabled() && hilite ? kWidColor : kBGColorHi : kBGColorLo);
// Draw an arrow pointing down at the right end to signal this is a dropdown/popup // Draw an arrow pointing down at the right end to signal this is a dropdown/popup
s.drawBitmap(down_arrow.data(), x + w - 13, _y + myArrowsY + 1, s.drawBitmap(_arrowImg, x + w - (_arrowWidth * 1.5 - 1), _y + myArrowsY + 1,
!(isEnabled() && onTop) ? kColor : kTextColor, 9U, 8U); !(isEnabled() && onTop) ? kColor : kTextColor, _arrowWidth, _arrowHeight);
// Draw the selected entry, if any // Draw the selected entry, if any
const string& name = myMenu->getSelectedName(); const string& name = myMenu->getSelectedName();
TextAlign align = (_font.getStringWidth(name) > w-6) ? TextAlign align = (_font.getStringWidth(name) > w - 6) ?
TextAlign::Right : TextAlign::Left; TextAlign::Right : TextAlign::Left;
s.drawString(_font, name, x+2, _y+myTextY, w-6, s.drawString(_font, name, x + _textOfs, _y + myTextY, w - 6,
!(isEnabled() && onTop) ? kColor : _changed ? kDbgChangedTextColor : kTextColor, align); !(isEnabled() && onTop) ? kColor : _changed ? kDbgChangedTextColor : kTextColor, align);
} }

View File

@ -62,6 +62,10 @@ class PopUpWidget : public Widget, public CommandSender
const Variant& getSelectedTag() const; const Variant& getSelectedTag() const;
bool wantsFocus() const override { return true; } bool wantsFocus() const override { return true; }
static int dropDownWidth(const GUI::Font& font)
{
return font.getFontHeight() < 24 ? (9 * 2 + 3) : (13 * 2 + 7);
}
protected: protected:
void handleMouseDown(int x, int y, MouseButton b, int clickCount) override; void handleMouseDown(int x, int y, MouseButton b, int clickCount) override;
@ -70,6 +74,8 @@ class PopUpWidget : public Widget, public CommandSender
void handleMouseLeft() override; void handleMouseLeft() override;
bool handleEvent(Event::Type e) override; bool handleEvent(Event::Type e) override;
void handleCommand(CommandSender* sender, int cmd, int data, int id) override; void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
void setArrow();
void drawWidget(bool hilite) override; void drawWidget(bool hilite) override;
private: private:
@ -81,6 +87,11 @@ class PopUpWidget : public Widget, public CommandSender
int _labelWidth{0}; int _labelWidth{0};
bool _changed{false}; bool _changed{false};
int _textOfs{0};
int _arrowWidth{0};
int _arrowHeight{0};
const uInt32* _arrowImg{nullptr};
private: private:
// Following constructors and assignment operators not supported // Following constructors and assignment operators not supported
PopUpWidget() = delete; PopUpWidget() = delete;

View File

@ -31,20 +31,23 @@ ProgressDialog::ProgressDialog(GuiObject* boss, const GUI::Font& font,
{ {
const int fontWidth = font.getMaxCharWidth(), const int fontWidth = font.getMaxCharWidth(),
fontHeight = font.getFontHeight(), fontHeight = font.getFontHeight(),
lineHeight = font.getLineHeight(); lineHeight = font.getLineHeight(),
VBORDER = fontHeight / 2,
HBORDER = fontWidth * 1.25,
VGAP = fontHeight / 4;
int xpos, ypos, lwidth; int xpos, ypos, lwidth;
// Calculate real dimensions // Calculate real dimensions
lwidth = font.getStringWidth(message); lwidth = font.getStringWidth(message);
_w = lwidth + 2 * fontWidth; _w = HBORDER * 2 + lwidth;
_h = lineHeight * 5; _h = VBORDER * 2 + lineHeight * 2 + VGAP * 2;
xpos = fontWidth; ypos = lineHeight; xpos = HBORDER; ypos = VBORDER;
myMessage = new StaticTextWidget(this, font, xpos, ypos, lwidth, fontHeight, myMessage = new StaticTextWidget(this, font, xpos, ypos, lwidth, fontHeight,
message, TextAlign::Center); message, TextAlign::Center);
myMessage->setTextColor(kTextColorEm); myMessage->setTextColor(kTextColorEm);
xpos = fontWidth; ypos += 2 * lineHeight; xpos = HBORDER; ypos += lineHeight + VGAP * 2;
mySlider = new SliderWidget(this, font, xpos, ypos, lwidth, lineHeight, "", 0, 0); mySlider = new SliderWidget(this, font, xpos, ypos, lwidth, lineHeight, "", 0, 0);
mySlider->setMinValue(1); mySlider->setMinValue(1);
mySlider->setMaxValue(100); mySlider->setMaxValue(100);

View File

@ -38,7 +38,7 @@ class ScrollBarWidget : public Widget, public CommandSender
static int getWheelLines() { return _WHEEL_LINES; } static int getWheelLines() { return _WHEEL_LINES; }
static int scrollBarWidth(const GUI::Font& font) static int scrollBarWidth(const GUI::Font& font)
{ {
return ((int(font.getMaxCharWidth() * 1.67) >> 1) << 1) + 1; return font.getFontHeight() < 24 ? 15 : 23;
} }
private: private: