mirror of https://github.com/stella-emu/stella.git
Part 2 of the changes for #600 (UI fonts)
This commit is contained in:
parent
15ead58aa7
commit
17354af0f3
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 ");
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue