Implemented a general text input dialog which can be used to get text input from the player. Used the text input dialog to implement the name dialog for the character creation.

actorid
Jan Borsodi 14 years ago
parent 85ded0edc3
commit 481734ee20

@ -35,6 +35,7 @@ source_group(apps\\openmw\\mwinput FILES ${GAMEINPUT} ${GAMEINPUT_HEADER})
set(GAMEGUI_HEADER set(GAMEGUI_HEADER
mwgui/layouts.hpp mwgui/layouts.hpp
mwgui/text_input.hpp
mwgui/race.hpp mwgui/race.hpp
mwgui/window_manager.hpp mwgui/window_manager.hpp
mwgui/console.hpp mwgui/console.hpp
@ -42,6 +43,7 @@ set(GAMEGUI_HEADER
set(GAMEGUI set(GAMEGUI
mwgui/window_manager.cpp mwgui/window_manager.cpp
mwgui/console.cpp mwgui/console.cpp
mwgui/text_input.cpp
mwgui/race.cpp mwgui/race.cpp
) )
source_group(apps\\openmw\\mwgui FILES ${GAMEGUI_HEADER} ${GAMEGUI}) source_group(apps\\openmw\\mwgui FILES ${GAMEGUI_HEADER} ${GAMEGUI})

@ -0,0 +1,45 @@
#include "text_input.hpp"
#include "../mwworld/environment.hpp"
#include "../mwworld/world.hpp"
using namespace MWGui;
TextInputDialog::TextInputDialog(MWWorld::Environment& environment, const std::string &label, bool showNext, MyGUI::IntSize size)
: Layout("openmw_text_input_layout.xml")
, environment(environment)
{
// Centre dialog
MyGUI::IntCoord coord = mMainWidget->getCoord();
coord.left = (size.width - coord.width)/2;
coord.top = (size.height - coord.height)/2;
mMainWidget->setCoord(coord);
setText("LabelT", label);
getWidget(textEdit, "TextEdit");
// textEdit->eventEditSelectAccept = newDelegate(this, &TextInputDialog::onTextAccepted);
// TODO: These buttons should be managed by a Dialog class
MyGUI::ButtonPtr okButton;
getWidget(okButton, "OKButton");
okButton->eventMouseButtonClick = MyGUI::newDelegate(this, &TextInputDialog::onOkClicked);
if (showNext)
{
okButton->setCaption("Next");
// Adjust back button when next is shown
okButton->setCoord(okButton->getCoord() + MyGUI::IntCoord(-18, 0, 18, 0));
}
}
// widget controls
void TextInputDialog::onOkClicked(MyGUI::Widget* _sender)
{
eventDone();
}
void TextInputDialog::onTextAccepted(MyGUI::Edit* _sender)
{
eventDone();
}

@ -0,0 +1,45 @@
#ifndef MWGUI_TEXT_INPUT_H
#define MWGUI_TEXT_INPUT_H
#include <openengine/gui/layout.hpp>
namespace MWWorld
{
class Environment;
}
/*
*/
namespace MWGui
{
using namespace MyGUI;
typedef delegates::CDelegate0 EventHandle_Void;
class TextInputDialog : public OEngine::GUI::Layout
{
public:
TextInputDialog(MWWorld::Environment& environment, const std::string &label, bool showNext, MyGUI::IntSize size);
std::string getTextInput() const { return textEdit ? textEdit->getOnlyText() : ""; }
void setTextInput(const std::string &text) { if (textEdit) textEdit->setOnlyText(text); }
// Events
/** Event : Dialog finished, OK button clicked.\n
signature : void method()\n
*/
EventHandle_Void eventDone;
protected:
void onOkClicked(MyGUI::Widget* _sender);
void onTextAccepted(MyGUI::Edit* _sender);
private:
MWWorld::Environment& environment;
MyGUI::EditPtr textEdit;
};
}
#endif

@ -1,5 +1,6 @@
#include "window_manager.hpp" #include "window_manager.hpp"
#include "layouts.hpp" #include "layouts.hpp"
#include "text_input.hpp"
#include "race.hpp" #include "race.hpp"
#include "../mwmechanics/mechanicsmanager.hpp" #include "../mwmechanics/mechanicsmanager.hpp"
@ -15,6 +16,7 @@ using namespace MWGui;
WindowManager::WindowManager(MyGUI::Gui *_gui, MWWorld::Environment& environment, WindowManager::WindowManager(MyGUI::Gui *_gui, MWWorld::Environment& environment,
const Compiler::Extensions& extensions, bool newGame) const Compiler::Extensions& extensions, bool newGame)
: environment(environment) : environment(environment)
, nameDialog(nullptr)
, raceDialog(nullptr) , raceDialog(nullptr)
, nameChosen(false) , nameChosen(false)
, raceChosen(false) , raceChosen(false)
@ -54,6 +56,7 @@ WindowManager::~WindowManager()
delete stats; delete stats;
delete inventory; delete inventory;
delete nameDialog;
delete raceDialog; delete raceDialog;
} }
@ -88,6 +91,15 @@ void WindowManager::updateVisible()
return; return;
} }
if (mode == GM_Name)
{
if (!nameDialog)
nameDialog = new TextInputDialog(environment, "Name", nameChosen, gui->getViewSize());
nameDialog->eventDone = MyGUI::newDelegate(this, &WindowManager::onNameDialogDone);
nameDialog->setVisible(true);
return;
}
if (mode == GM_Race) if (mode == GM_Race)
{ {
if (!raceDialog) if (!raceDialog)
@ -151,6 +163,25 @@ void WindowManager::updateCharacterGeneration()
} }
} }
void WindowManager::onNameDialogDone()
{
nameChosen = true;
if (nameDialog)
{
nameDialog->setVisible(false);
environment.mMechanicsManager->setPlayerName(nameDialog->getTextInput());
}
delete nameDialog;
nameDialog = nullptr;
updateCharacterGeneration();
if (reviewNext)
setMode(GM_Review);
else if (raceChosen)
setMode(GM_Race);
}
void WindowManager::onRaceDialogDone() void WindowManager::onRaceDialogDone()
{ {
raceChosen = true; raceChosen = true;

@ -39,6 +39,7 @@ namespace MWGui
class InventoryWindow; class InventoryWindow;
class Console; class Console;
class TextInputDialog;
class RaceDialog; class RaceDialog;
enum GuiMode enum GuiMode
@ -88,6 +89,7 @@ namespace MWGui
Console *console; Console *console;
// Character creation // Character creation
TextInputDialog *nameDialog;
RaceDialog *raceDialog; RaceDialog *raceDialog;
// Which dialogs have been shown, controls back/next/ok buttons // Which dialogs have been shown, controls back/next/ok buttons
@ -168,6 +170,10 @@ namespace MWGui
void updateCharacterGeneration(); void updateCharacterGeneration();
void checkCharacterGeneration(GuiMode mode); void checkCharacterGeneration(GuiMode mode);
// Character generation: Name dialog
void onNameDialogDone();
// Character generation: Race dialog
void onRaceDialogDone(); void onRaceDialogDone();
void onRaceDialogBack(); void onRaceDialogBack();
}; };

@ -34,12 +34,14 @@ configure_file("${SDIR}/mwgui.png" "${DDIR}/mwgui.png" COPYONLY)
configure_file("${SDIR}/openmw_box.skin.xml" "${DDIR}/openmw_box.skin.xml" COPYONLY) configure_file("${SDIR}/openmw_box.skin.xml" "${DDIR}/openmw_box.skin.xml" COPYONLY)
configure_file("${SDIR}/openmw_button.skin.xml" "${DDIR}/openmw_button.skin.xml" COPYONLY) configure_file("${SDIR}/openmw_button.skin.xml" "${DDIR}/openmw_button.skin.xml" COPYONLY)
configure_file("${SDIR}/openmw_list.skin.xml" "${DDIR}/openmw_list.skin.xml" COPYONLY) configure_file("${SDIR}/openmw_list.skin.xml" "${DDIR}/openmw_list.skin.xml" COPYONLY)
configure_file("${SDIR}/openmw_edit.skin.xml" "${DDIR}/openmw_edit.skin.xml" COPYONLY)
configure_file("${SDIR}/openmw_console_layout.xml" "${DDIR}/openmw_console_layout.xml" COPYONLY) configure_file("${SDIR}/openmw_console_layout.xml" "${DDIR}/openmw_console_layout.xml" COPYONLY)
configure_file("${SDIR}/openmw_console.skin.xml" "${DDIR}/openmw_console.skin.xml" COPYONLY) configure_file("${SDIR}/openmw_console.skin.xml" "${DDIR}/openmw_console.skin.xml" COPYONLY)
configure_file("${SDIR}/openmw.font.xml" "${DDIR}/openmw.font.xml" COPYONLY) configure_file("${SDIR}/openmw.font.xml" "${DDIR}/openmw.font.xml" COPYONLY)
configure_file("${SDIR}/openmw_hud_box.skin.xml" "${DDIR}/openmw_hud_box.skin.xml" COPYONLY) configure_file("${SDIR}/openmw_hud_box.skin.xml" "${DDIR}/openmw_hud_box.skin.xml" COPYONLY)
configure_file("${SDIR}/openmw_hud_energybar.skin.xml" "${DDIR}/openmw_hud_energybar.skin.xml" COPYONLY) configure_file("${SDIR}/openmw_hud_energybar.skin.xml" "${DDIR}/openmw_hud_energybar.skin.xml" COPYONLY)
configure_file("${SDIR}/openmw_hud_layout.xml" "${DDIR}/openmw_hud_layout.xml" COPYONLY) configure_file("${SDIR}/openmw_hud_layout.xml" "${DDIR}/openmw_hud_layout.xml" COPYONLY)
configure_file("${SDIR}/openmw_text_input_layout.xml" "${DDIR}/openmw_text_input_layout.xml" COPYONLY)
configure_file("${SDIR}/openmw_chargen_race_layout.xml" "${DDIR}/openmw_chargen_race_layout.xml" COPYONLY) configure_file("${SDIR}/openmw_chargen_race_layout.xml" "${DDIR}/openmw_chargen_race_layout.xml" COPYONLY)
configure_file("${SDIR}/openmw_inventory_window_layout.xml" "${DDIR}/openmw_inventory_window_layout.xml" COPYONLY) configure_file("${SDIR}/openmw_inventory_window_layout.xml" "${DDIR}/openmw_inventory_window_layout.xml" COPYONLY)
configure_file("${SDIR}/openmw_layers.xml" "${DDIR}/openmw_layers.xml" COPYONLY) configure_file("${SDIR}/openmw_layers.xml" "${DDIR}/openmw_layers.xml" COPYONLY)

@ -12,6 +12,7 @@
<List file="openmw_windows.skin.xml" group="General"/> <List file="openmw_windows.skin.xml" group="General"/>
<List file="openmw_button.skin.xml" group="General"/> <List file="openmw_button.skin.xml" group="General"/>
<List file="openmw_list.skin.xml" group="General"/> <List file="openmw_list.skin.xml" group="General"/>
<List file="openmw_edit.skin.xml" group="General"/>
<List file="openmw_box.skin.xml" group="General"/> <List file="openmw_box.skin.xml" group="General"/>
<List file="openmw_progress.skin.xml" group="General"/> <List file="openmw_progress.skin.xml" group="General"/>
<List file="openmw_hud_energybar.skin.xml" group="General"/> <List file="openmw_hud_energybar.skin.xml" group="General"/>

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<MyGUI type="Skin">
<!-- Text edit widget -->
<Skin name = "MW_TextEditClient" size = "10 10">
<Property key="FontName" value = "MyGUI_CoreFont.18"/>
<Property key="FontHeight" value = "18" />
<Property key="AlignText" value = "ALIGN_LEFT ALIGN_VCENTER" />
<Property key="Colour" value = "0.6 0.6 0.6" />
<BasisSkin type="EditText" offset = "0 0 10 10" align = "Stretch"/>
</Skin>
<Skin name = "MW_TextEdit" size = "512 20" texture="mwgui.png">
<BasisSkin type="SubSkin" offset = "0 0 512 2" align = "ALIGN_TOP ALIGN_HSTRETCH">
<State name="normal" offset = "2 2 512 2"/>
</BasisSkin>
<BasisSkin type="SubSkin" offset = "0 2 2 16" align = "ALIGN_LEFT ALIGN_VSTRETCH">
<State name="normal" offset = "2 4 2 16"/>
</BasisSkin>
<BasisSkin type="SubSkin" offset = "510 2 2 16" align = "ALIGN_RIGHT ALIGN_VSTRETCH">
<State name="normal" offset = "512 4 2 16"/>
</BasisSkin>
<BasisSkin type="SubSkin" offset = "0 18 512 2" align = "ALIGN_BOTTOM ALIGN_HSTRETCH">
<State name="normal" offset = "2 20 512 2"/>
</BasisSkin>
<Child type="Widget" skin="MW_TextEditClient" offset = "2 2 508 18" align = "Stretch" name = "Client"/>
</Skin>
</MyGUI>

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<MyGUI type="Layout">
<!-- correct size is 320 97, adjust when skin is changed to a dialog -->
<Widget type="Window" skin="MW_Window" layer="Windows" position="0 0 328 127" name="_Main">
<!-- Appearance -->
<Widget type="StaticText" skin="ProgressText" position="10 12 300 18" name="LabelT" align="ALIGN_LEFT ALIGN_TOP">
<Property key="Widget_AlignText" value="ALIGN_LEFT ALIGN_TOP"/>
</Widget>
<Widget type="Edit" skin="MW_TextEdit" position="10 28 300 30" name="TextEdit" align="ALIGN_LEFT ALIGN_TOP"/>
<!-- Dialog buttons -->
<Widget type="Button" skin="MW_Button" position="264 60 42 23" name="OKButton">
<Property key="Widget_Caption" value="OK"/>
</Widget>
</Widget>
</MyGUI>
Loading…
Cancel
Save