Files
2025-09-18 17:55:52 -04:00

310 lines
7.7 KiB
C++

/**
* RobloxTeamCreateWidget.h
* Copyright (c) 2015 ROBLOX Corp. All Rights Reserved.
*/
#pragma once
//this will make sure that we can use qt with boost (else moc compiler errors)
#ifndef QT_NO_KEYWORDS
#define QT_NO_KEYWORDS
#endif
#include <QTreeWidget>
#include "ui_TeamCreate.h"
#include "rbx/signal.h"
#include "Util/HttpAsync.h"
#include "PlayersDataManager.h"
namespace RBX {
class Instance;
class DataModel;
}
namespace QtUtilities {
class StackedWidgetAnimator;
}
class PlayersDataManager;
class RobloxTeamCreateWidget;
typedef QMap<int, bool> CreatorsCollection;
enum eTeamType
{
TEAM_USERS = 0,
TEAM_GROUP
};
struct PlaceCreatorDetails
{
QString ownerName;
int ownerId;
eTeamType teamType;
PlaceCreatorDetails()
: ownerId(-1), teamType(TEAM_USERS)
{
}
};
class GroupItem: public QObject, public QTreeWidgetItem
{
Q_OBJECT
public:
GroupItem(int groupId);
int getGroupId() { return m_GroupId;}
private Q_SLOTS:
void groupDataLoaded(RBX::HttpFuture future);
void groupThumbnailLoaded(RBX::HttpFuture future);
private:
int m_GroupId;
};
class CreatorItem: public QObject, public QTreeWidgetItem
{
Q_OBJECT
public:
CreatorItem(int playerId, bool isAdmin = false)
: m_PlayerId(playerId)
, m_IsAdmin(isAdmin)
{;}
int getPlayerId() { return m_PlayerId;}
private Q_SLOTS:
void updatePlayerAvatar(const QImage& playerImage);
void updatePlayerName(int playerId, const QString& userName);
private:
int m_PlayerId;
bool m_IsAdmin;
};
class CreatorsListLoader : public QObject
{
Q_OBJECT
public:
CreatorsListLoader(QObject* parent, int universeId);
bool hasFinishedLoading() { return m_bFinishedLoading; }
CreatorsCollection& getCreators() { return m_Creators; }
void reload();
Q_SIGNALS:
void finishedLoading();
private:
void loadPage(int pageToLoad);
void doneLoading();
Q_INVOKABLE void creatorsListLoaded(int pageLoaded, RBX::HttpFuture future);
CreatorsCollection m_Creators;
int m_UniverseId;
bool m_bFinishedLoading;
};
class FriendsInfoLoader : public QObject
{
Q_OBJECT
public:
FriendsInfoLoader(QObject* parent, int playerId);
bool hasFinishedLoading() { return m_bFinishedLoading; }
PlayersInfoCollection& getFriendsInfo() { return m_FriendsInfo; }
Q_SIGNALS:
void finishedLoading();
private:
void loadPage(int pageToLoad);
void doneLoading();
Q_INVOKABLE void friendsDataLoaded(int pageLoaded, RBX::HttpFuture future);
PlayersInfoCollection m_FriendsInfo;
int m_PlayerId;
bool m_bFinishedLoading;
};
class CreatorsListWidget : public QTreeWidget
{
Q_OBJECT
public:
CreatorsListWidget(QWidget* parent, shared_ptr<RBX::DataModel> dataModel, shared_ptr<PlayersDataManager> dataManager);
using QTreeWidget::itemFromIndex;
virtual void addOwnerDetails(const PlaceCreatorDetails& creatorDetails) = 0;
virtual bool canDeleteSelectedCreator() = 0;
void addCreatorItem(int playerId, const QString& playerName, const QString& subLabel);
CreatorItem* getCreatorItem(int playerId);
CreatorItem* getCreatorItem(const QString& playerName);
Q_SIGNALS:
void removeCloudEditorRequested(int playerId);
void finishedLoading();
private Q_SLOTS:
virtual void onPlayerAddRequsted(int playerId) = 0;
virtual void onPlayerRemoveRequested(int playerId) = 0;
protected:
void onPlayerAdded(boost::shared_ptr<RBX::Instance> player);
void onPlayerRemoving(boost::shared_ptr<RBX::Instance> player);
bool isPlayerPresent(int playerId);
QString getPlayerName(int playerId);
void mousePressEvent(QMouseEvent *evt) override;
rbx::signals::scoped_connection m_cPlayerAdded;
rbx::signals::scoped_connection m_cPlayerRemoving;
boost::shared_ptr<RBX::DataModel> m_pDataModel;
boost::shared_ptr<PlayersDataManager> m_pPlayersDataManager;
};
class UserPlaceCreatorsListWidget: public CreatorsListWidget
{
Q_OBJECT
public:
UserPlaceCreatorsListWidget(QWidget* parent, shared_ptr<RBX::DataModel> dataModel, shared_ptr<PlayersDataManager> dataManager);
void addOwnerDetails(const PlaceCreatorDetails& creatorDetails) override;
private Q_SLOTS:
void onPlayerAddRequsted(int playerId) override;
void onPlayerRemoveRequested(int playerId) override;
void onCreatorsListLoaded();
private:
void contextMenuEvent(QContextMenuEvent * evt) override;
bool canDeleteSelectedCreator() override;
void removeRemovedCreators();
void addAddedCreators();
CreatorsListLoader* m_pCreatorsListLoader;
int m_PlaceOwnerId;
};
class GroupPlaceCreatorsListWidget: public CreatorsListWidget
{
Q_OBJECT
public:
GroupPlaceCreatorsListWidget(QWidget* parent, shared_ptr<RBX::DataModel> dataModel, shared_ptr<PlayersDataManager> dataManager);
void addOwnerDetails(const PlaceCreatorDetails& creatorDetails) override;
private Q_SLOTS:
void onPlayerAddRequsted(int playerId) override;
void onPlayerRemoveRequested(int playerId) override;
private:
bool canDeleteSelectedCreator() override { return false; }
};
class RobloxTeamCreateWidget : public QWidget, public Ui::TeamCreate
{
Q_OBJECT
public:
RobloxTeamCreateWidget(QWidget* parent);
void setDataModel(boost::shared_ptr<RBX::DataModel> dataModel, boost::shared_ptr<PlayersDataManager> pPlayersDataManager);
PlaceCreatorDetails getPlaceCreatorDetails();
private Q_SLOTS:
void onAuthenticationChanged(bool);
void onLoginButtonClicked();
void onPublishButtonClicked();
void onPublishDialogFinished(int status);
void onTurnOnButtonClicked();
void onBottomMoreButtonClicked();
void onFriendsInviteEditReturnPressed();
void onCompleterPopupMenuItemClicked(const QModelIndex& clickedIndex);
void onRemoveCloudEditorRequested(int userId);
void onRemoveCloudEditConfirm();
void onRemoveCloudEditCancel();
void updatePlayerFriendsInfo();
private:
enum eMainStackedWidgetPage
{
EMPTY_PAGE = 0,
PUBLISH_PAGE,
PUBLISHING_MESSAGE_PAGE,
OPTIONS_PAGE,
USER_REMOVE_CONFIRM_PAGE
};
enum eOptionsStackedWidgetPage
{
LOGIN_PAGE = 0,
USER_PLACE_OPTIONS_PAGE,
GROUP_PLACE_OPTIONS_PAGE,
};
enum eUserPlaceOptionsStackedWidgetPage
{
USER_PLACE_TURN_ON_PAGE = 0,
USER_PLACE_SAVE_MESSAGE_PAGE,
USER_PLACE_CREATORS_LIST_PAGE
};
enum eGroupPlaceOptionsStackedWidgetPage
{
GROUP_PLACE_TURN_ON_PAGE = 0,
GROUP_PLACE_NON_ADMIN_MESSAGE_PAGE,
GROUP_PLACE_SAVE_MESSAGE_PAGE,
GROUP_PLACE_CREATORS_LIST_PAGE
};
void addCreatorsListWidget(eTeamType creatorType);
Q_INVOKABLE void updateCurrentWidgetInStack();
void onPlaceIdChanged(const RBX::Reflection::PropertyDescriptor* desc);
void enableFriendsInviteEdit(bool state);
void loadFriendsList();
void updatePlaceDetails(RBX::HttpFuture future);
eTeamType getCreatorType();
void updatePlaceManageStatus(RBX::HttpFuture future);
bool canManageCurrentPlace();
bool addCloudEditor(int playerId);
bool removeCloudEditor(int playerId);
bool canLaunchCloudEdit(int &universeId);
Q_INVOKABLE void resetDataModel();
std::string doPost(const std::string& postUrl);
boost::shared_future<void> m_PlaceDetailsQuery;
boost::shared_future<void> m_PlaceManageStatusQuery;
boost::shared_ptr<RBX::DataModel> m_pDataModel;
boost::shared_ptr<PlayersDataManager> m_pPlayersDataManager;
rbx::signals::scoped_connection m_cPlaceIdChange;
CreatorsListWidget* m_pCreatorsListWidget;
QtUtilities::StackedWidgetAnimator* m_pMainStackedWidgetAnimator;
FriendsInfoLoader* m_pFriendsInfoLoader;
PlaceCreatorDetails m_PlaceCreatorDetails;
bool m_bCanManageCurrentPlace;
bool m_bLoginButtonClicked;
};