forked from teamnwah/openmw-tes3coop
[Client] Add custom windows
parent
e657934cef
commit
382f56178c
@ -0,0 +1,307 @@
|
||||
//
|
||||
// Created by koncord on 07.11.17.
|
||||
//
|
||||
|
||||
#include "GUICustomWindow.hpp"
|
||||
|
||||
#include <components/openmw-mp/Log.hpp>
|
||||
|
||||
#include "apps/openmw/mwbase/environment.hpp"
|
||||
#include "apps/openmw/mwgui/windowmanagerimp.hpp"
|
||||
#include "apps/openmw/mwgui/widgets.hpp"
|
||||
|
||||
#include <MyGUI_EditBox.h>
|
||||
#include <MyGUI_Button.h>
|
||||
#include <MyGUI_ListBox.h>
|
||||
#include <MyGUI_Common.h>
|
||||
#include <MyGUI_LayoutManager.h>
|
||||
#include <components/openmw-mp/Base/BasePlayer.hpp>
|
||||
#include <components/openmw-mp/NetworkMessages.hpp>
|
||||
#include <apps/openmw/mwmp/Main.hpp>
|
||||
#include <apps/openmw/mwmp/Networking.hpp>
|
||||
#include <apps/openmw/mwmp/LocalPlayer.hpp>
|
||||
|
||||
using namespace mwmp;
|
||||
using namespace std;
|
||||
|
||||
GUICustomWindow::GUICustomWindow(const BasePlayer::GUIWindow &guiMessageBox) : WindowModal("tes3mp_custom.layout")
|
||||
{
|
||||
center();
|
||||
mMainWidget->setSize(guiMessageBox.width, guiMessageBox.height);
|
||||
id = guiMessageBox.id;
|
||||
|
||||
//setTitle(title);
|
||||
|
||||
{
|
||||
MyGUI::Button *button;
|
||||
getWidget(button, "SendButton");
|
||||
auto bsize = button->getSize();
|
||||
auto wsize = mMainWidget->getSize();
|
||||
button->eventMouseButtonClick += MyGUI::newDelegate(this, &GUICustomWindow::mousePressed);
|
||||
//button->setCaptionWithReplacing(widget.name);
|
||||
button->setSize(button->getTextSize().width + 2 * 12, button->getTextSize().height + 2 * 4);
|
||||
button->setUserData(string("Send"));
|
||||
button->setPosition(wsize.width - bsize.width - 12, wsize.height - bsize.height - 12);
|
||||
}
|
||||
|
||||
for (auto &&widget : guiMessageBox.widgets)
|
||||
{
|
||||
switch (widget.type)
|
||||
{
|
||||
|
||||
case BasePlayer::GUIWindow::WidgetType::Button:
|
||||
addButton(widget);
|
||||
break;
|
||||
case BasePlayer::GUIWindow::WidgetType::Editbox:
|
||||
addEditBox(widget);
|
||||
break;
|
||||
case BasePlayer::GUIWindow::WidgetType::Label:
|
||||
addLabel(widget);
|
||||
break;
|
||||
case BasePlayer::GUIWindow::WidgetType::ListBoxActive:
|
||||
case BasePlayer::GUIWindow::WidgetType::ListBoxPassive:
|
||||
addListBox(widget);
|
||||
break;
|
||||
case BasePlayer::GUIWindow::WidgetType::Slider:
|
||||
addSlider(widget);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void GUICustomWindow::addPassiveData(vector<BasePlayer::GUIWindow::Widget> &widgets)
|
||||
{
|
||||
for (const auto &box : boxes)
|
||||
{
|
||||
auto name = box->getUserData<string>(false);
|
||||
if (name != nullptr)
|
||||
{
|
||||
BasePlayer::GUIWindow::Widget widget;
|
||||
widget.name = *name;
|
||||
widget.type = BasePlayer::GUIWindow::WidgetType::Editbox;
|
||||
widget.data.push_back(box->getCaption().asUTF8());
|
||||
widgets.push_back(widget);
|
||||
}
|
||||
}
|
||||
|
||||
for (auto &&list : lists)
|
||||
{
|
||||
size_t selected = list->getIndexSelected();
|
||||
if (selected != MyGUI::ITEM_NONE)
|
||||
{
|
||||
auto name = list->getUserData<string>(false);
|
||||
if(name != nullptr)
|
||||
{
|
||||
BasePlayer::GUIWindow::Widget widget;
|
||||
widget.name = *name;
|
||||
widget.type = BasePlayer::GUIWindow::WidgetType::ListBoxPassive;
|
||||
widget.data.push_back(list->getItemNameAt(selected).asUTF8());
|
||||
widgets.push_back(widget);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto &&slider : sliders)
|
||||
{
|
||||
auto name = slider->getUserData<string>(false);
|
||||
if(name != nullptr)
|
||||
{
|
||||
BasePlayer::GUIWindow::Widget widget;
|
||||
widget.name = *name;
|
||||
widget.type = BasePlayer::GUIWindow::WidgetType::Slider;
|
||||
widget.data.push_back(to_string(slider->getScrollPosition()));
|
||||
widgets.push_back(widget);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GUICustomWindow::mousePressed(MyGUI::Widget *pressed)
|
||||
{
|
||||
setVisible(false);
|
||||
MWBase::Environment::get().getWindowManager()->popGuiMode();
|
||||
|
||||
auto value = pressed->getUserData<string>(false);
|
||||
|
||||
if (value != nullptr)
|
||||
{
|
||||
BasePlayer::GUIWindow::Widget pressedButton;
|
||||
|
||||
pressedButton.name = *value;
|
||||
pressedButton.type = BasePlayer::GUIWindow::WidgetType::Button;
|
||||
send(pressedButton);
|
||||
/*printf("Ret Value: %s\n", value->c_str());
|
||||
|
||||
for (auto &&list : lists)
|
||||
{
|
||||
size_t selected = list->getIndexSelected();
|
||||
if (selected != MyGUI::ITEM_NONE)
|
||||
{
|
||||
auto value2 = list->getUserData<string>(false);
|
||||
printf("RetList: %s %s\n", value2->c_str(), list->getItemNameAt(selected).asUTF8_c_str());
|
||||
}
|
||||
}
|
||||
|
||||
for (auto &&box : boxes)
|
||||
{
|
||||
auto value2 = box->getUserData<string>(false);
|
||||
if (value2 != nullptr)
|
||||
{
|
||||
printf("\tRetEdit: %s %s\n", value2->c_str(), box->getCaption().asUTF8_c_str());
|
||||
}
|
||||
}
|
||||
|
||||
for (auto &&slider : sliders)
|
||||
{
|
||||
printf("Slider: %zu\n", slider->getScrollPosition());
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
void GUICustomWindow::itemActivated(MyGUI::ListPtr sender, size_t index)
|
||||
{
|
||||
/*printf("---------Item Activated---------\n");
|
||||
auto str = sender->getUserData<string>(false);
|
||||
if(str != nullptr)
|
||||
printf("ID: %s\n", str->c_str());
|
||||
printf("item: %zu\n", index);
|
||||
printf("value of item: %s\n", sender->getItemNameAt(index).asUTF8_c_str());
|
||||
printf("--------------------------------\n");*/
|
||||
|
||||
auto str = sender->getUserData<string>(false);
|
||||
if(str != nullptr)
|
||||
{
|
||||
BasePlayer::GUIWindow::Widget pressedListBox;
|
||||
pressedListBox.name = *str;
|
||||
pressedListBox.type = BasePlayer::GUIWindow::WidgetType::ListBoxActive;
|
||||
pressedListBox.data.push_back(sender->getItemNameAt(index).asUTF8());
|
||||
send(pressedListBox);
|
||||
}
|
||||
}
|
||||
|
||||
void GUICustomWindow::send(const BasePlayer::GUIWindow::Widget &widget)
|
||||
{
|
||||
auto networking = mwmp::Main::get().getNetworking();
|
||||
auto player = networking->getLocalPlayer();
|
||||
|
||||
player->guiWindow.widgets.clear();
|
||||
player->guiWindow.widgets.push_back(widget);
|
||||
addPassiveData(player->guiWindow.widgets);
|
||||
|
||||
player->guiWindow.id = id;
|
||||
player->guiWindow.width = 0;
|
||||
player->guiWindow.height = 0;
|
||||
auto packet = networking->getPlayerPacket(ID_GUI_WINDOW);
|
||||
packet->setPlayer(player);
|
||||
packet->Send();
|
||||
|
||||
setVisible(false);
|
||||
MWBase::Environment::get().getWindowManager()->popGuiMode();
|
||||
}
|
||||
|
||||
void GUICustomWindow::onFrame(float frameDuration)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void GUICustomWindow::addButton(const BasePlayer::GUIWindow::Widget &widget)
|
||||
{
|
||||
MyGUI::IntCoord dummyCoord(0, 0, 0, 0);
|
||||
|
||||
auto *button = mMainWidget->createWidget<MyGUI::Button>(
|
||||
MyGUI::WidgetStyle::Child,
|
||||
string("MW_Button"),
|
||||
dummyCoord,
|
||||
MyGUI::Align::Default);
|
||||
|
||||
button->eventMouseButtonClick += MyGUI::newDelegate(this, &GUICustomWindow::mousePressed);
|
||||
button->setPosition(widget.posX, widget.posY);
|
||||
button->setCaptionWithReplacing(widget.name);
|
||||
button->setSize(button->getTextSize().width + 2 * 12, button->getTextSize().height + 2 * 4);
|
||||
button->setUserData(widget.name);
|
||||
button->setEnabled(!widget.disabled);
|
||||
|
||||
}
|
||||
|
||||
void GUICustomWindow::addEditBox(const BasePlayer::GUIWindow::Widget &widget)
|
||||
{
|
||||
MyGUI::IntCoord dummyCoord(0, 0, 0, 0);
|
||||
auto *editBox = mMainWidget->createWidget<MyGUI::EditBox>(
|
||||
MyGUI::WidgetStyle::Child,
|
||||
string("MW_TextEdit"),
|
||||
dummyCoord,
|
||||
MyGUI::Align::Default
|
||||
);
|
||||
|
||||
editBox->setCaption(widget.name);
|
||||
|
||||
editBox->setPosition(widget.posX, widget.posY);
|
||||
editBox->setSize(widget.width, widget.height);
|
||||
editBox->setUserData(string(widget.name)); // ID
|
||||
editBox->setEnabled(!widget.disabled);
|
||||
if(!widget.disabled)
|
||||
boxes.push_back(editBox);
|
||||
}
|
||||
|
||||
void GUICustomWindow::addLabel(const BasePlayer::GUIWindow::Widget &widget)
|
||||
{
|
||||
MyGUI::IntCoord dummyCoord(0, 0, 0, 0);
|
||||
auto *textBox = mMainWidget->createWidget<MyGUI::TextBox>(
|
||||
MyGUI::WidgetStyle::Child,
|
||||
string("ProgressText"),
|
||||
dummyCoord,
|
||||
MyGUI::Align::Default
|
||||
);
|
||||
|
||||
textBox->setCaption(widget.name);
|
||||
|
||||
textBox->setPosition(widget.posX, widget.posY);
|
||||
|
||||
textBox->setSize(textBox->getTextSize().width, textBox->getTextSize().height);
|
||||
}
|
||||
|
||||
void GUICustomWindow::addListBox(const BasePlayer::GUIWindow::Widget &widget)
|
||||
{
|
||||
MyGUI::IntCoord dummyCoord(0, 0, 0, 0);
|
||||
auto *lbox = mMainWidget->createWidget<MyGUI::ListBox>(
|
||||
MyGUI::WidgetStyle::Child,
|
||||
string("MW_List"),
|
||||
dummyCoord,
|
||||
MyGUI::Align::Default
|
||||
);
|
||||
|
||||
for(const auto & item : widget.data)
|
||||
lbox->addItem(item);
|
||||
|
||||
lbox->setUserData(widget.name);
|
||||
lbox->setScrollPosition(0);
|
||||
lbox->setPosition(widget.posX, widget.posY);
|
||||
lbox->setSize(widget.width, widget.height);
|
||||
lbox->setEnabled(!widget.disabled);
|
||||
|
||||
if(!widget.disabled)
|
||||
{
|
||||
if (widget.type == BasePlayer::GUIWindow::WidgetType::ListBoxPassive)
|
||||
lists.push_back(lbox);
|
||||
else
|
||||
lbox->eventListMouseItemActivate += MyGUI::newDelegate(this, &GUICustomWindow::itemActivated);
|
||||
}
|
||||
}
|
||||
|
||||
void GUICustomWindow::addSlider(const BasePlayer::GUIWindow::Widget &widget)
|
||||
{
|
||||
MyGUI::IntCoord dummyCoord(0, 0, 0, 0);
|
||||
|
||||
auto *slider = mMainWidget->createWidget<MWGui::Widgets::MWScrollBar>(
|
||||
MyGUI::WidgetStyle::Child,
|
||||
string("MW_HScroll"),
|
||||
dummyCoord,
|
||||
MyGUI::Align::Default
|
||||
);
|
||||
|
||||
slider->setPosition(widget.posX, widget.posY);
|
||||
slider->setSize(widget.width, widget.height);
|
||||
|
||||
slider->setScrollRange(10000);
|
||||
slider->setScrollPage(300);
|
||||
sliders.push_back(slider);
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
//
|
||||
// Created by koncord on 07.11.17.
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
#include <components/openmw-mp/Base/BasePlayer.hpp>
|
||||
#include <apps/openmw/mwgui/widgets.hpp>
|
||||
#include "apps/openmw/mwgui/windowbase.hpp"
|
||||
|
||||
namespace mwmp
|
||||
{
|
||||
|
||||
class GUICustomWindow : public MWGui::WindowModal
|
||||
{
|
||||
public:
|
||||
explicit GUICustomWindow(const BasePlayer::GUIWindow &guiMessageBox);
|
||||
void mousePressed(MyGUI::Widget *_widget);
|
||||
void itemActivated(MyGUI::ListPtr sender, size_t index);
|
||||
void onFrame(float frameDuration);
|
||||
|
||||
void addButton(const BasePlayer::GUIWindow::Widget &widget);
|
||||
void addEditBox(const BasePlayer::GUIWindow::Widget &widget);
|
||||
void addLabel(const BasePlayer::GUIWindow::Widget &widget);
|
||||
void addListBox(const BasePlayer::GUIWindow::Widget &widget);
|
||||
void addSlider(const BasePlayer::GUIWindow::Widget &widget);
|
||||
|
||||
private:
|
||||
std::vector<MyGUI::ListBox*> lists;
|
||||
std::vector<MyGUI::EditBox*> boxes;
|
||||
std::vector<MWGui::Widgets::MWScrollBar*> sliders;
|
||||
int id;
|
||||
|
||||
void addPassiveData(std::vector<BasePlayer::GUIWindow::Widget> &widgets);
|
||||
void send(const BasePlayer::GUIWindow::Widget &widget);
|
||||
};
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
//
|
||||
// Created by koncord on 24.11.17.
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "../PlayerProcessor.hpp"
|
||||
|
||||
namespace mwmp
|
||||
{
|
||||
class ProcessorGUIWindow : public PlayerProcessor
|
||||
{
|
||||
public:
|
||||
ProcessorGUIWindow()
|
||||
{
|
||||
BPP_INIT(ID_GUI_WINDOW)
|
||||
}
|
||||
|
||||
virtual void Do(PlayerPacket &packet, BasePlayer *player)
|
||||
{
|
||||
if (isLocal())
|
||||
{
|
||||
LOG_MESSAGE_SIMPLE(Log::LOG_TRACE, "ID_GUI_WINDOW, ID %d", player->guiWindow.id);
|
||||
|
||||
Main::get().getGUIController()->showCustomWindow(player->guiWindow);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<MyGUI type="Layout">
|
||||
<Widget type="Window" skin="MW_Dialog" position="0 0 500 500" align="Center" layer="Windows" name="_Main">
|
||||
<Widget type="AutoSizedButton" skin="MW_Button" name="SendButton">
|
||||
<Property key="Caption" value="Send"/>
|
||||
</Widget>
|
||||
</Widget>
|
||||
</MyGUI>
|
Loading…
Reference in New Issue