diff --git a/data/gui/karts.stkgui b/data/gui/karts.stkgui
index fb471a4e6..db78d3b5a 100644
--- a/data/gui/karts.stkgui
+++ b/data/gui/karts.stkgui
@@ -22,11 +22,15 @@
+
+
+
diff --git a/data/gui/tracks.stkgui b/data/gui/tracks.stkgui
index 5c6f456a0..346784a1c 100644
--- a/data/gui/tracks.stkgui
+++ b/data/gui/tracks.stkgui
@@ -21,11 +21,8 @@
-
-
-
-
-
+
+
diff --git a/src/guiengine/widgets/ribbon_widget.cpp b/src/guiengine/widgets/ribbon_widget.cpp
index 6db220a0e..bf843e6a6 100644
--- a/src/guiengine/widgets/ribbon_widget.cpp
+++ b/src/guiengine/widgets/ribbon_widget.cpp
@@ -101,6 +101,7 @@ void RibbonWidget::add()
const int widget_x = one_button_space*(i+1) - one_button_space/2;
+ // ---- tab ribbons
if (getRibbonType() == RIBBON_TABS)
{
IGUIButton * subbtn = NULL;
@@ -160,7 +161,7 @@ void RibbonWidget::add()
m_children[i].m_element = subbtn;
}
- // ---- non-tabs ribbons
+ // ---- icon ribbons
else if (m_children[i].m_type == WTYPE_ICON_BUTTON)
{
// find how much space to keep for the label under the button.
diff --git a/src/states_screens/kart_selection.cpp b/src/states_screens/kart_selection.cpp
index 03e3be64d..db1fce67e 100644
--- a/src/states_screens/kart_selection.cpp
+++ b/src/states_screens/kart_selection.cpp
@@ -697,6 +697,24 @@ KartHoverListener* karthoverListener = NULL;
KartSelectionScreen::KartSelectionScreen() : Screen("karts.stkgui")
{
g_dispatcher = new FocusDispatcher(this);
+
+ // Dynamically add tabs
+ // FIXME: it's not very well documented that RibbonWidgets can have dynamically generated contents
+ RibbonWidget* tabs = this->getWidget("kartgroups");
+ assert( tabs != NULL );
+
+ tabs->m_children.clearAndDeleteAll();
+
+ const std::vector& groups = kart_properties_manager->getAllGroups();
+
+ const int amount = groups.size();
+ for (int n=0; nm_text = groups[n].c_str(); // FIXME: i18n ?
+ item->m_properties[PROP_ID] = groups[n];
+ tabs->m_children.push_back(item);
+ }
}
// -----------------------------------------------------------------------------
void KartSelectionScreen::forgetWhatWasLoaded()
diff --git a/src/states_screens/tracks_screen.cpp b/src/states_screens/tracks_screen.cpp
index 134bbb3c0..245bca634 100644
--- a/src/states_screens/tracks_screen.cpp
+++ b/src/states_screens/tracks_screen.cpp
@@ -31,6 +31,23 @@ using namespace irr::video;
TracksScreen::TracksScreen() : Screen("tracks.stkgui")
{
+ // Dynamically add tabs
+ // FIXME: it's not very well documented that RibbonWidgets can have dynamically generated contents
+ RibbonWidget* tabs = this->getWidget("trackgroups");
+ assert( tabs != NULL );
+
+ tabs->m_children.clearAndDeleteAll();
+
+ const std::vector& groups = track_manager->getAllGroups();
+
+ const int amount = groups.size();
+ for (int n=0; nm_text = groups[n].c_str(); // FIXME: i18n ?
+ item->m_properties[PROP_ID] = groups[n];
+ tabs->m_children.push_back(item);
+ }
}
@@ -79,6 +96,28 @@ void TracksScreen::init()
DynamicRibbonWidget* w = this->getWidget("tracks");
assert( w != NULL );
+ RibbonWidget* tabs = this->getWidget("trackgroups");
+ assert( tabs != NULL );
+
+ /*
+ tracks->m_children.clearAndDeleteAll();
+
+ ButtonWidget* item1 = new ButtonWidget();
+ item1->m_text = _("Standard");
+ item1->m_proeprties[PROP_ID] = "stdtracks";
+ tracks->m_children.push_back(item1);
+
+ ButtonWidget* item2 = new ButtonWidget();
+ item2->m_text = _("Add-Ons");
+ item2->m_proeprties[PROP_ID] = "addontracks";
+ tracks->m_children.push_back(item2);
+*/
+ //tabs->clearItems();
+ //tabs->addItem( _("Standard"), "stdtracks", "" /* image */);
+ //tabs->addItem( _("Add-Ons"), "stdtracks", "" /* image */);
+ //tabs->addItem( _("Special"), "stdtracks", "" /* image */);
+ //tabs->updateItemDisplay();
+
// Re-build track list everytime (accounts for locking changes, etc.)
w->clearItems();