each tab can now have a defined width (see DeveloperDialog)

This commit is contained in:
thrust26 2019-01-26 23:34:12 +01:00
parent 532b629a93
commit c3671ac095
3 changed files with 62 additions and 34 deletions

View File

@ -88,7 +88,7 @@ void DeveloperDialog::addEmulationTab(const GUI::Font& font)
int lineHeight = font.getLineHeight();
WidgetArray wid;
VariantList items;
int tabID = myTab->addTab("Emulation");
int tabID = myTab->addTab(" Emulation ", TabWidget::AUTO_WIDTH);
// settings set
mySettingsGroupEmulation = new RadioButtonGroup();
@ -188,7 +188,7 @@ void DeveloperDialog::addTiaTab(const GUI::Font& font)
int pwidth = font.getStringWidth("Faulty Cosmic Ark stars");
WidgetArray wid;
VariantList items;
int tabID = myTab->addTab("TIA");
int tabID = myTab->addTab(" TIA ", TabWidget::AUTO_WIDTH);
wid.clear();
@ -222,15 +222,15 @@ void DeveloperDialog::addTiaTab(const GUI::Font& font)
ypos += lineHeight + VGAP * 1;
myPlInvPhaseWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 3, ypos + 1,
"players");
"Players");
wid.push_back(myPlInvPhaseWidget);
myMsInvPhaseWidget = new CheckboxWidget(myTab, font, myPlInvPhaseWidget->getRight() + 20, ypos + 1,
"missiles");
"Missiles");
wid.push_back(myMsInvPhaseWidget);
myBlInvPhaseWidget = new CheckboxWidget(myTab, font, myMsInvPhaseWidget->getRight() + 20, ypos + 1,
"ball");
"Ball");
wid.push_back(myBlInvPhaseWidget);
ypos += lineHeight + VGAP * 1;
@ -239,11 +239,11 @@ void DeveloperDialog::addTiaTab(const GUI::Font& font)
wid.push_back(myPlayfieldLabel);
ypos += lineHeight + VGAP * 1;
myPFBitsWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 3, ypos + 1, "bits");
myPFBitsWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 3, ypos + 1, "Bits");
wid.push_back(myPFBitsWidget);
//ypos += lineHeight + VGAP * 1;
myPFColorWidget = new CheckboxWidget(myTab, font, myPFBitsWidget->getRight() + 20, ypos + 1, "color");
myPFColorWidget = new CheckboxWidget(myTab, font, myPFBitsWidget->getRight() + 20, ypos + 1, "Color");
wid.push_back(myPFColorWidget);
ypos += lineHeight + VGAP * 1;
@ -252,10 +252,10 @@ void DeveloperDialog::addTiaTab(const GUI::Font& font)
wid.push_back(mySwapLabel);
ypos += lineHeight + VGAP * 1;
myPlSwapWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 3, ypos + 1, "players");
myPlSwapWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 3, ypos + 1, "Players");
wid.push_back(myPlSwapWidget);
myBlSwapWidget = new CheckboxWidget(myTab, font, myPlSwapWidget->getRight() + 20, ypos + 1, "ball");
myBlSwapWidget = new CheckboxWidget(myTab, font, myPlSwapWidget->getRight() + 20, ypos + 1, "Ball");
wid.push_back(myBlSwapWidget);
// Add items for tab 2
@ -276,7 +276,7 @@ void DeveloperDialog::addVideoTab(const GUI::Font& font)
int pwidth = font.getMaxCharWidth() * 6;
WidgetArray wid;
VariantList items;
int tabID = myTab->addTab("Video");
int tabID = myTab->addTab(" Video ", TabWidget::AUTO_WIDTH);
wid.clear();
@ -411,7 +411,7 @@ void DeveloperDialog::addTimeMachineTab(const GUI::Font& font)
lwidth = fontWidth * 11;
WidgetArray wid;
VariantList items;
int tabID = myTab->addTab("Time Mach.");
int tabID = myTab->addTab(" Time Machine ", TabWidget::AUTO_WIDTH);
// settings set
mySettingsGroupTM = new RadioButtonGroup();
@ -475,7 +475,7 @@ void DeveloperDialog::addTimeMachineTab(const GUI::Font& font)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void DeveloperDialog::addDebuggerTab(const GUI::Font& font)
{
int tabID = myTab->addTab("Debugger");
int tabID = myTab->addTab(" Debugger ", TabWidget::AUTO_WIDTH);
WidgetArray wid;
#ifdef DEBUGGER_SUPPORT

View File

@ -63,20 +63,38 @@ int TabWidget::getChildY() const
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int TabWidget::addTab(const string& title)
int TabWidget::addTab(const string& title, int tabWidth)
{
// Add a new tab page
_tabs.push_back(Tab(title));
int newWidth = _font.getStringWidth(title) + 2 * kTabPadding;
if(tabWidth == AUTO_WIDTH)
_tabs.push_back(Tab(title, newWidth));
else
_tabs.push_back(Tab(title, tabWidth));
int numTabs = int(_tabs.size());
// Determine the new tab width
int newWidth = _font.getStringWidth(title) + 2 * kTabPadding;
if (_tabWidth < newWidth)
_tabWidth = newWidth;
int fixedWidth = 0, fixedTabs = 0;
for(int i = 0; i < int(_tabs.size()); ++i)
{
if(_tabs[i].tabWidth != NO_WIDTH)
{
fixedWidth += _tabs[i].tabWidth;
fixedTabs++;
}
}
int maxWidth = (_w - kTabLeftOffset) / numTabs - kTabLeftOffset;
if (_tabWidth > maxWidth)
_tabWidth = maxWidth;
if(tabWidth == NO_WIDTH)
if(_tabWidth < newWidth)
_tabWidth = newWidth;
if(numTabs - fixedTabs)
{
int maxWidth = (_w - kTabLeftOffset - fixedWidth) / (numTabs - fixedTabs) - kTabLeftOffset;
if(_tabWidth > maxWidth)
_tabWidth = maxWidth;
}
// Activate the new tab
setActiveTab(numTabs - 1);
@ -178,11 +196,16 @@ void TabWidget::handleMouseDown(int x, int y, MouseButton b, int clickCount)
// Determine which tab was clicked
int tabID = -1;
x -= kTabLeftOffset;
if (x >= 0 && x % (_tabWidth + kTabSpacing) < _tabWidth)
for(int i = 0; i < int(_tabs.size()); ++i)
{
tabID = x / (_tabWidth + kTabSpacing);
if (tabID >= int(_tabs.size()))
tabID = -1;
int tabWidth = _tabs[i].tabWidth ? _tabs[i].tabWidth : _tabWidth;
if(x >= 0 && x < tabWidth)
{
tabID = i;
break;
}
x -= (tabWidth + kTabSpacing);
}
// If a tab was clicked, switch to that pane
@ -264,24 +287,25 @@ void TabWidget::drawWidget(bool hilite)
int i, x = _x + kTabLeftOffset;
for (i = 0; i < int(_tabs.size()); ++i)
{
int tabWidth = _tabs[i].tabWidth ? _tabs[i].tabWidth : _tabWidth;
ColorId fontcolor = _tabs[i].enabled && onTop? kTextColor : kColor;
int yOffset = (i == _activeTab) ? 0 : 1;
s.fillRect(x, _y + 1, _tabWidth, _tabHeight - 1,
s.fillRect(x, _y + 1, tabWidth, _tabHeight - 1,
(i == _activeTab)
? onTop ? kDlgColor : kBGColorLo
: onTop ? kBGColorHi : kDlgColor); // ? kWidColor : kDlgColor
s.drawString(_font, _tabs[i].title, x + kTabPadding + yOffset,
_y + yOffset + (_tabHeight - _fontHeight - 1),
_tabWidth - 2 * kTabPadding, fontcolor, TextAlign::Center);
tabWidth - 2 * kTabPadding, fontcolor, TextAlign::Center);
if(i == _activeTab)
{
s.hLine(x, _y, x + _tabWidth - 1, onTop ? kWidColor : kDlgColor);
s.vLine(x + _tabWidth, _y + 1, _y + _tabHeight - 1, onTop ? kBGColorLo : kColor);
s.hLine(x, _y, x + tabWidth - 1, onTop ? kWidColor : kDlgColor);
s.vLine(x + tabWidth, _y + 1, _y + _tabHeight - 1, onTop ? kBGColorLo : kColor);
}
else
s.hLine(x, _y + _tabHeight, x + _tabWidth, onTop ? kWidColor : kDlgColor);
s.hLine(x, _y + _tabHeight, x + tabWidth, onTop ? kWidColor : kDlgColor);
x += _tabWidth + kTabSpacing;
x += tabWidth + kTabSpacing;
}
// fill empty right space

View File

@ -26,6 +26,9 @@
class TabWidget : public Widget, public CommandSender
{
public:
static const int NO_WIDTH = 0;
static const int AUTO_WIDTH = -1;
enum {
kTabChangedCmd = 'TBCH'
};
@ -40,7 +43,7 @@ class TabWidget : public Widget, public CommandSender
// First off, widget should allow non-dialog bosses, (i.e. also other widgets)
// Could add a common base class for Widgets and Dialogs.
// Then you add tabs using the following method, which returns a unique ID
int addTab(const string& title);
int addTab(const string& title, int tabWidth = NO_WIDTH);
// Maybe we need to remove tabs again? Hm
//void removeTab(int tabID);
// Setting the active tab:
@ -76,10 +79,11 @@ class TabWidget : public Widget, public CommandSender
Widget* firstWidget;
Widget* parentWidget;
bool enabled;
int tabWidth;
Tab(const string& t = "", Widget* first = nullptr, Widget* parent = nullptr,
bool e = true)
: title(t), firstWidget(first), parentWidget(parent), enabled(e) { }
Tab(const string& t, int tw = NO_WIDTH,
Widget* first = nullptr, Widget* parent = nullptr, bool e = true)
: title(t), firstWidget(first), parentWidget(parent), enabled(e), tabWidth(tw) { }
};
using TabList = vector<Tab>;