From: <au...@us...> - 2009-08-26 20:06:00
|
Revision: 3923 http://supertuxkart.svn.sourceforge.net/supertuxkart/?rev=3923&view=rev Author: auria Date: 2009-08-26 20:05:51 +0000 (Wed, 26 Aug 2009) Log Message: ----------- Fixed keyboard navigation on kart selection screen (still 1-p only though) Modified Paths: -------------- main/branches/irrlicht/data/gui/karts.stkgui main/branches/irrlicht/src/guiengine/screen.cpp main/branches/irrlicht/src/guiengine/screen_loader.cpp main/branches/irrlicht/src/guiengine/widget.cpp main/branches/irrlicht/src/guiengine/widget.hpp main/branches/irrlicht/src/guiengine/widgets/spinner_widget.cpp main/branches/irrlicht/src/input/input_manager.cpp main/branches/irrlicht/src/states_screens/kart_selection.cpp main/branches/irrlicht/src/states_screens/kart_selection.hpp Modified: main/branches/irrlicht/data/gui/karts.stkgui =================================================================== --- main/branches/irrlicht/data/gui/karts.stkgui 2009-08-26 19:29:20 UTC (rev 3922) +++ main/branches/irrlicht/data/gui/karts.stkgui 2009-08-26 20:05:51 UTC (rev 3923) @@ -3,9 +3,9 @@ <label width="100%" height="25" text="Choose a Kart (more players can join by pressing 'fire' now)" align="center" text_align="center" /> - <div id="playerskarts" width="100%" proportion="4"> + <placeholder id="playerskarts" width="100%" proportion="4"> <!-- Contents is added programatically --> - </div> + </placeholder> <spacer height="15" width="25"/> Modified: main/branches/irrlicht/src/guiengine/screen.cpp =================================================================== --- main/branches/irrlicht/src/guiengine/screen.cpp 2009-08-26 19:29:20 UTC (rev 3922) +++ main/branches/irrlicht/src/guiengine/screen.cpp 2009-08-26 20:05:51 UTC (rev 3923) @@ -258,9 +258,9 @@ const unsigned short widgets_amount = widgets.size(); // ------- add widgets - for(int n=0; n<widgets_amount; n++) + for (int n=0; n<widgets_amount; n++) { - if(widgets[n].m_type == WTYPE_DIV) + if (widgets[n].m_type == WTYPE_DIV) { addWidgetsRecursively(widgets[n].m_children, &widgets[n]); } Modified: main/branches/irrlicht/src/guiengine/screen_loader.cpp =================================================================== --- main/branches/irrlicht/src/guiengine/screen_loader.cpp 2009-08-26 19:29:20 UTC (rev 3922) +++ main/branches/irrlicht/src/guiengine/screen_loader.cpp 2009-08-26 20:05:51 UTC (rev 3923) @@ -60,6 +60,12 @@ w->m_type = WTYPE_DIV; append_to.push_back(w); } + else if (!strcmp("placeholder", xml->getNodeName())) + { + Widget* w = new Widget(true); + w->m_type = WTYPE_DIV; + append_to.push_back(w); + } else if (!strcmp("box", xml->getNodeName())) { Widget* w = new Widget(); @@ -181,6 +187,8 @@ return; if (!strcmp("box", xml->getNodeName())) return; + if (!strcmp("placeholder", xml->getNodeName())) + return; // we're done parsing this 'ribbon', return one step back in the recursive call if (!strcmp("ribbon", xml->getNodeName()) || Modified: main/branches/irrlicht/src/guiengine/widget.cpp =================================================================== --- main/branches/irrlicht/src/guiengine/widget.cpp 2009-08-26 19:29:20 UTC (rev 3922) +++ main/branches/irrlicht/src/guiengine/widget.cpp 2009-08-26 20:05:51 UTC (rev 3923) @@ -56,9 +56,16 @@ { return id_counter_2++; } - +/** When switching to a new screen, this function will be called to reset ID counters + * (so we start again from ID 0, and don't grow to big numbers) */ +void Widget::resetIDCounters() +{ + id_counter = 0; + id_counter_2 = 1000; +} + // ----------------------------------------------------------------------------- -Widget::Widget() +Widget::Widget(bool reserve_id) { x = -1; y = -1; @@ -71,16 +78,17 @@ m_event_handler = NULL; m_show_bounding_box = false; m_parent = NULL; + + if (reserve_id) + { + m_reserved_id = getNewID(); + } + else + { + m_reserved_id = -1; + } } // ----------------------------------------------------------------------------- -/** When switching to a new screen, this function will be called to reset ID counters - * (so we start again from ID 0, and don't grow to big numbers) */ -void Widget::resetIDCounters() -{ - id_counter = 0; - id_counter_2 = 1000; -} -// ----------------------------------------------------------------------------- /** * Receives as string the raw property value retrieved from XML file. * Will try to make sense of it, as an absolute value or a percentage. @@ -109,6 +117,7 @@ return true; } } + void Widget::move(const int x, const int y, const int w, const int h) { this->x = x; Modified: main/branches/irrlicht/src/guiengine/widget.hpp =================================================================== --- main/branches/irrlicht/src/guiengine/widget.hpp 2009-08-26 19:29:20 UTC (rev 3922) +++ main/branches/irrlicht/src/guiengine/widget.hpp 2009-08-26 20:05:51 UTC (rev 3923) @@ -182,8 +182,15 @@ /** Whether to show a bounding box around this widget (used for sections) */ bool m_show_bounding_box; + /** Used in two cases : + 1) For 'placeholder' divisions; at the time the layout is created, there is nothing to + place there yet, but we know there eventually will. So in this case pass 'true' to the + Widget constructor and it will reserve a widget ID and store it here. + 2) Theorically, in 'add()', derivded widgets should checked if this value is set, and use + it instead of creating a new ID if it is. In practice, it's not widely implemented (FIXME) */ + int m_reserved_id; - Widget(); + Widget(bool reserve_id = false); virtual ~Widget() {} /** Modified: main/branches/irrlicht/src/guiengine/widgets/spinner_widget.cpp =================================================================== --- main/branches/irrlicht/src/guiengine/widgets/spinner_widget.cpp 2009-08-26 19:29:20 UTC (rev 3922) +++ main/branches/irrlicht/src/guiengine/widgets/spinner_widget.cpp 2009-08-26 20:05:51 UTC (rev 3923) @@ -65,8 +65,19 @@ m_children.push_back( new Widget() ); } + int widgetID; + + if (m_reserved_id != -1) + { + widgetID = m_reserved_id; + } + else + { + widgetID = getNewID(); + } + rect<s32> widget_size = rect<s32>(x, y, x + w, y + h); - IGUIButton * btn = GUIEngine::getGUIEnv()->addButton(widget_size, m_parent, getNewID(), L""); + IGUIButton * btn = GUIEngine::getGUIEnv()->addButton(widget_size, m_parent, widgetID, L""); m_element = btn; m_element->setTabOrder( m_element->getID() ); @@ -82,7 +93,7 @@ m_children[0].id = m_children[0].m_element->getID(); // label - if(m_graphical) + if (m_graphical) { std::ostringstream icon_stream; icon_stream << file_manager->getDataDir() << "/" << m_properties[PROP_ICON]; Modified: main/branches/irrlicht/src/input/input_manager.cpp =================================================================== --- main/branches/irrlicht/src/input/input_manager.cpp 2009-08-26 19:29:20 UTC (rev 3922) +++ main/branches/irrlicht/src/input/input_manager.cpp 2009-08-26 20:05:51 UTC (rev 3923) @@ -309,7 +309,7 @@ device = m_device_manager->getGamePadFromIrrID(deviceID); if (device != NULL) - KartSelectionScreen::playerJoin( device ); + KartSelectionScreen::playerJoin( device, false ); } return; // we're done here, ignore devices that aren't associated with players } Modified: main/branches/irrlicht/src/states_screens/kart_selection.cpp =================================================================== --- main/branches/irrlicht/src/states_screens/kart_selection.cpp 2009-08-26 19:29:20 UTC (rev 3922) +++ main/branches/irrlicht/src/states_screens/kart_selection.cpp 2009-08-26 20:05:51 UTC (rev 3923) @@ -68,12 +68,13 @@ int player_name_x, player_name_y, player_name_w, player_name_h; int model_x, model_y, model_w, model_h; int kart_name_x, kart_name_y, kart_name_w, kart_name_h; - + int m_irrlicht_widget_ID; + int target_x, target_y, target_w, target_h; LabelWidget *getPlayerIDLabel() {return playerIDLabel;} - PlayerKartWidget(ActivePlayer* associatedPlayer, Widget* area, const int playerID) : Widget() + PlayerKartWidget(ActivePlayer* associatedPlayer, Widget* area, const int playerID, const int irrlichtWidgetID=-1) : Widget() { m_associatedPlayer = associatedPlayer; x_speed = 1.0f; @@ -81,6 +82,8 @@ w_speed = 1.0f; h_speed = 1.0f; + m_irrlicht_widget_ID = irrlichtWidgetID; + this->playerID = playerID; // FIXME : if a player removes itself, all IDs need to be updated @@ -195,7 +198,11 @@ virtual void add() { playerIDLabel->add(); + + // the first player will have an ID of its own to allow for keyboard navigation despite this widget being added last + if (m_irrlicht_widget_ID != -1) playerName->m_reserved_id = m_irrlicht_widget_ID; playerName->add(); + modelView->add(); kartName->add(); @@ -430,7 +437,7 @@ KartHoverListener* karthoverListener = NULL; // Return true if event was handled successfully -bool playerJoin(InputDevice* device) +bool playerJoin(InputDevice* device, bool firstPlayer) { std::cout << "playerJoin() ==========\n"; @@ -455,7 +462,12 @@ ActivePlayer *aplayer = StateManager::get()->getActivePlayer(id); // FIXME : player ID needs to be synced with active player list - PlayerKartWidget* newPlayer = new PlayerKartWidget(aplayer, &rightarea, g_player_karts.size()); + PlayerKartWidget* newPlayer; + if (firstPlayer) + newPlayer = new PlayerKartWidget(aplayer, &rightarea, g_player_karts.size(), rightarea.m_reserved_id); + else + newPlayer = new PlayerKartWidget(aplayer, &rightarea, g_player_karts.size()); + getCurrentScreen()->manualAddWidget(newPlayer); newPlayer->add(); @@ -567,7 +579,7 @@ //Widget* area = getCurrentScreen()->getWidget("playerskarts"); - if(!getCurrentScreen()->m_inited) + if (!getCurrentScreen()->m_inited) { // Build kart list const int kart_amount = kart_properties_manager->getNumberOfKarts(); @@ -623,7 +635,7 @@ } else // For now this is what will happen { - playerJoin( input_manager->getDeviceList()->getLatestUsedDevice() ); + playerJoin( input_manager->getDeviceList()->getLatestUsedDevice(), true ); w->updateItemDisplay(); } Modified: main/branches/irrlicht/src/states_screens/kart_selection.hpp =================================================================== --- main/branches/irrlicht/src/states_screens/kart_selection.hpp 2009-08-26 19:29:20 UTC (rev 3922) +++ main/branches/irrlicht/src/states_screens/kart_selection.hpp 2009-08-26 20:05:51 UTC (rev 3923) @@ -28,7 +28,7 @@ namespace KartSelectionScreen { - bool playerJoin(InputDevice* device); + bool playerJoin(InputDevice* device, bool firstPlayer); bool playerQuit(ActivePlayer* player); void kartSelectionUpdate(float delta); void renumberKarts(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |