File indexing completed on 2024-05-05 05:40:24

0001 /***************************************************************************
0002  *  Copyright (C) 2019 by Renaud Guezennec                               *
0003  *   http://www.rolisteam.org/contact                                      *
0004  *                                                                         *
0005  *   This software is free software; you can redistribute it and/or modify *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  *                                                                         *
0010  *   This program is distributed in the hope that it will be useful,       *
0011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
0012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
0013  *   GNU General Public License for more details.                          *
0014  *                                                                         *
0015  *   You should have received a copy of the GNU General Public License     *
0016  *   along with this program; if not, write to the                         *
0017  *   Free Software Foundation, Inc.,                                       *
0018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
0019  ***************************************************************************/
0020 #include "controller/playercontroller.h"
0021 
0022 #include "controller/gamecontroller.h"
0023 #include "data/player.h"
0024 #include "model/charactermodel.h"
0025 #include "model/characterstatemodel.h"
0026 #include "model/playermodel.h"
0027 #include "undoCmd/addlocalcharactercommand.h"
0028 #include "undoCmd/removelocalcharactercommand.h"
0029 #include "updater/controller/playerupdater.h"
0030 #include "worker/characterfinder.h"
0031 #include <QtDebug>
0032 
0033 PlayerController::PlayerController(NetworkController* network, QObject* parent)
0034     : AbstractControllerInterface(parent)
0035     , m_model(new PlayerModel)
0036     , m_characterModel(new CharacterModel)
0037     , m_updater(new PlayerUpdater(network, this))
0038     , m_localPlayer(new Player)
0039 {
0040 
0041     m_characterModel->setSourceModel(m_model.get());
0042     CharacterFinder::setPcModel(m_characterModel.get());
0043 
0044     connect(m_model.get(), &PlayerModel::gameMasterIdChanged, this, &PlayerController::gameMasterIdChanged);
0045     connect(m_localPlayer, &Player::uuidChanged, this, &PlayerController::localPlayerIdChanged);
0046     connect(m_localPlayer, &Player::uuidChanged, m_model.get(), &PlayerModel::setLocalPlayerId);
0047 
0048     m_model->setLocalPlayerId(m_localPlayer->uuid());
0049 }
0050 
0051 PlayerController::~PlayerController()= default;
0052 
0053 void PlayerController::clear()
0054 {
0055     m_model->clear();
0056 }
0057 
0058 QString PlayerController::gameMasterId() const
0059 {
0060     return m_model->gameMasterId();
0061 }
0062 
0063 QString PlayerController::localPlayerId() const
0064 {
0065     if(nullptr == m_localPlayer)
0066         return {};
0067     return m_localPlayer->uuid();
0068 }
0069 
0070 QColor PlayerController::localColor() const
0071 {
0072     return (m_localPlayer) ? m_localPlayer->getColor() : QColor(Qt::black);
0073 }
0074 
0075 void PlayerController::setGameController(GameController* gameCtrl)
0076 {
0077     m_characterStateModel= gameCtrl->campaign()->stateModel();
0078     m_updater->setGameController(gameCtrl);
0079     emit characterStateModelChanged();
0080 }
0081 
0082 Player* PlayerController::localPlayer() const
0083 {
0084     return m_localPlayer;
0085 }
0086 
0087 PlayerModel* PlayerController::model() const
0088 {
0089     return m_model.get();
0090 }
0091 
0092 bool PlayerController::localIsGm() const
0093 {
0094     return (localPlayerId() == gameMasterId());
0095 }
0096 
0097 QAbstractItemModel* PlayerController::characterStateModel() const
0098 {
0099     return m_characterStateModel;
0100 }
0101 
0102 CharacterModel* PlayerController::characterModel() const
0103 {
0104     return m_characterModel.get();
0105 }
0106 
0107 void PlayerController::addPlayer(Player* player)
0108 {
0109     m_model->addPlayer(player);
0110 }
0111 
0112 void PlayerController::removePlayer(Player* player)
0113 {
0114     m_model->removePlayer(player);
0115 }
0116 
0117 void PlayerController::addLocalCharacter()
0118 {
0119     if(!m_characterStateModel || m_characterStateModel->rowCount() > 0)
0120         return;
0121     auto idState= m_characterStateModel->index(0, 0).data(CharacterStateModel::ID).toString();
0122     auto cmd= new AddLocalCharacterCommand(m_model.get(), idState, m_model->index(0, 0));
0123     emit performCommand(cmd);
0124 }
0125 
0126 void PlayerController::removeLocalCharacter(const QModelIndex& index)
0127 {
0128     auto cmd= new RemoveLocalCharacterCommand(m_model.get(), index);
0129     emit performCommand(cmd);
0130 }