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

0001 /***************************************************************************
0002  *  Copyright (C) 2021 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 "data/campaignmanager.h"
0021 
0022 #include "data/media.h"
0023 #include "model/characterstatemodel.h"
0024 #include "model/dicealiasmodel.h"
0025 #include "undoCmd/importdatamedia.h"
0026 #include "undoCmd/importmedia.h"
0027 #include "worker/fileserializer.h"
0028 #include "worker/modelhelper.h"
0029 
0030 #include "data/campaigneditor.h"
0031 #include "updater/media/campaignupdater.h"
0032 
0033 #include <QDir>
0034 #include <QLoggingCategory>
0035 #include <QUrl>
0036 
0037 namespace campaign
0038 {
0039 Q_LOGGING_CATEGORY(CampaignCat, "campaign")
0040 CampaignManager::CampaignManager(DiceRoller* diceparser, QObject* parent)
0041     : QObject(parent)
0042     , m_editor(new CampaignEditor)
0043     , m_campaignUpdater(new CampaignUpdater(diceparser, m_editor->campaign()))
0044 {
0045     connect(m_editor.get(), &CampaignEditor::importedFile, this, &CampaignManager::fileImported);
0046     connect(m_editor.get(), &CampaignEditor::campaignLoaded, this, &CampaignManager::campaignLoaded);
0047     connect(this, &CampaignManager::campaignLoaded, m_campaignUpdater.get(), &CampaignUpdater::updateDiceAliases);
0048 }
0049 
0050 CampaignManager::~CampaignManager()= default;
0051 
0052 bool CampaignManager::createCampaign(const QUrl& dirUrl)
0053 {
0054     auto dirPath= dirUrl.toLocalFile();
0055     if(!m_campaignUpdater->createCampaignTemplate(dirPath))
0056     {
0057         emit errorOccured(tr("Impossible to create campaign template at %1").arg(dirPath));
0058         return false;
0059     }
0060 
0061     m_editor.reset(new CampaignEditor());
0062     connect(m_editor.get(), &CampaignEditor::importedFile, this, &CampaignManager::fileImported);
0063     connect(m_editor.get(), &CampaignEditor::campaignLoaded, this, &CampaignManager::campaignLoaded);
0064     m_editor->open(dirPath);
0065     m_campaignUpdater->setCampaign(m_editor->campaign());
0066     emit campaignChanged(dirPath);
0067     return true;
0068 }
0069 
0070 QString CampaignManager::importFile(const QUrl& urlPath)
0071 {
0072     if(!m_editor)
0073         return {};
0074 
0075     auto path= urlPath.toLocalFile();
0076     auto const name= QFileInfo(path).baseName();
0077     auto campaign= m_editor->campaign();
0078 
0079     auto destPath= QString("%1/%2").arg(campaign->directory(Campaign::Place::MEDIA_ROOT), m_editor->currentDir());
0080 
0081     auto cmd= new commands::ImportMedia(m_editor->campaign(), name, path, destPath);
0082     auto res= cmd->destination();
0083     m_editor->doCommand(cmd);
0084     return res;
0085 }
0086 
0087 QString CampaignManager::createFileFromData(const QString& name, const QByteArray& data)
0088 {
0089     if(!m_editor)
0090         return {};
0091 
0092     auto campaign= m_editor->campaign();
0093 
0094     auto cmd= new commands::ImportDataMedia(m_editor->campaign(), name, data,
0095                                             campaign->directory(Campaign::Place::MEDIA_ROOT));
0096     auto res= cmd->destination();
0097     m_editor->doCommand(cmd);
0098 
0099     return res;
0100 }
0101 
0102 void CampaignManager::removeFile(const QString& file)
0103 {
0104     if(m_editor)
0105         m_editor->removeMedia(file);
0106 }
0107 
0108 void CampaignManager::saveCampaign()
0109 {
0110     if(!m_editor)
0111         return;
0112     m_campaignUpdater->save();
0113 }
0114 
0115 void CampaignManager::reload()
0116 {
0117     if(m_editor)
0118         openCampaign(m_editor->campaignDir());
0119 }
0120 
0121 void CampaignManager::copyCampaign(const QUrl& dir)
0122 {
0123     if(!m_editor)
0124         return;
0125     m_campaignUpdater->saveCampaignTo(dir.toLocalFile());
0126 }
0127 
0128 void CampaignManager::openCampaign(const QUrl& dir)
0129 {
0130     auto path= dir.toLocalFile();
0131     if(!m_campaignUpdater->createCampaignTemplate(path))
0132     {
0133         emit errorOccured(tr("Campaign Template creation failed on this location: %1").arg(path));
0134     }
0135     m_editor->open(path);
0136     emit campaignChanged(path);
0137 }
0138 
0139 Campaign* CampaignManager::campaign() const
0140 {
0141     return m_editor->campaign();
0142 }
0143 
0144 CampaignEditor* CampaignManager::editor() const
0145 {
0146     return m_editor.get();
0147 }
0148 
0149 DiceRoller* CampaignManager::diceparser() const
0150 {
0151     return m_campaignUpdater->diceParser();
0152 }
0153 
0154 QString CampaignManager::placeDirectory(campaign::Campaign::Place place) const
0155 {
0156     if(!m_editor || !m_editor->campaign())
0157         return {};
0158 
0159     return m_editor->campaign()->directory(place);
0160 }
0161 
0162 QString CampaignManager::campaignDir() const
0163 {
0164     return m_editor->campaignDir();
0165 }
0166 void CampaignManager::shareModels()
0167 {
0168     m_campaignUpdater->updateDiceModel();
0169     m_campaignUpdater->updateStateModel();
0170 }
0171 
0172 void CampaignManager::setLocalIsGM(bool b)
0173 {
0174     m_campaignUpdater->setLocalIsGM(b);
0175 }
0176 
0177 void CampaignManager::importDataFrom(const QString& source, const QVector<Core::CampaignDataCategory>& categories)
0178 {
0179     if(!m_editor)
0180         return;
0181 
0182     auto makeSource= [source](const QString& file) { return QString("%1/%2").arg(source, file); };
0183 
0184     for(auto const& cat : categories)
0185     {
0186         switch(cat)
0187         {
0188         case Core::CampaignDataCategory::AudioPlayer1:
0189             m_editor->mergeAudioFile(makeSource(FIRST_AUDIO_PLAYER_FILE),
0190                                      placeDirectory(Campaign::Place::FIRST_AUDIO_PLAYER_FILE));
0191             break;
0192         case Core::CampaignDataCategory::AudioPlayer2:
0193             m_editor->mergeAudioFile(makeSource(SECOND_AUDIO_PLAYER_FILE),
0194                                      placeDirectory(Campaign::Place::SECOND_AUDIO_PLAYER_FILE));
0195             break;
0196         case Core::CampaignDataCategory::AudioPlayer3:
0197             m_editor->mergeAudioFile(makeSource(THIRD_AUDIO_PLAYER_FILE),
0198                                      placeDirectory(Campaign::Place::THIRD_AUDIO_PLAYER_FILE));
0199             break;
0200         case Core::CampaignDataCategory::AntagonistList:
0201             m_editor->loadNpcData(makeSource(CHARACTER_MODEL), makeSource(CHARACTER_ROOT),
0202                                   placeDirectory(Campaign::Place::NPC_MODEL),
0203                                   placeDirectory(Campaign::Place::NPC_ROOT));
0204             break;
0205         case Core::CampaignDataCategory::Images:
0206             m_editor->copyMedia(makeSource(MEDIA_ROOT), placeDirectory(Campaign::Place::MEDIA_ROOT),
0207                                 Core::MediaType::ImageFile);
0208             break;
0209         case Core::CampaignDataCategory::Maps:
0210             m_editor->copyMedia(makeSource(MEDIA_ROOT), placeDirectory(Campaign::Place::MEDIA_ROOT),
0211                                 Core::MediaType::MapFile);
0212             break;
0213         case Core::CampaignDataCategory::MindMaps:
0214             m_editor->copyMedia(makeSource(MEDIA_ROOT), placeDirectory(Campaign::Place::MEDIA_ROOT),
0215                                 Core::MediaType::MindmapFile);
0216             break;
0217         case Core::CampaignDataCategory::WebLink:
0218             m_editor->copyMedia(makeSource(MEDIA_ROOT), placeDirectory(Campaign::Place::MEDIA_ROOT),
0219                                 Core::MediaType::WebpageFile);
0220             break;
0221         case Core::CampaignDataCategory::PDFDoc:
0222             m_editor->copyMedia(makeSource(MEDIA_ROOT), placeDirectory(Campaign::Place::MEDIA_ROOT),
0223                                 Core::MediaType::PdfFile);
0224             break;
0225         case Core::CampaignDataCategory::CharacterSheets:
0226             m_editor->copyMedia(makeSource(MEDIA_ROOT), placeDirectory(Campaign::Place::MEDIA_ROOT),
0227                                 Core::MediaType::CharacterSheetFile);
0228             break;
0229         case Core::CampaignDataCategory::Notes:
0230             m_editor->copyMedia(makeSource(MEDIA_ROOT), placeDirectory(Campaign::Place::MEDIA_ROOT),
0231                                 Core::MediaType::TextFile);
0232             break;
0233         case Core::CampaignDataCategory::DiceAlias:
0234         {
0235             // auto dest= placeDirectory(Campaign::Place::DICE_MODEL);
0236 
0237             m_editor->loadDiceAlias(makeSource(DICE_ALIAS_MODEL));
0238         }
0239         break;
0240         case Core::CampaignDataCategory::CharacterStates:
0241             // m_editor->loadDiceAlias(makeSource(STATE_MODEL));
0242             m_editor->loadStates(makeSource(STATE_MODEL), makeSource(STATE_ROOT),
0243                                  placeDirectory(Campaign::Place::STATE_MODEL),
0244                                  placeDirectory(Campaign::Place::STATE_ROOT));
0245             break;
0246         case Core::CampaignDataCategory::Themes:
0247             m_editor->copyTheme(makeSource(THEME_FILE), placeDirectory(Campaign::Place::THEME_FILE));
0248             break;
0249         }
0250         //, Maps, MindMaps, Notes, WebLink, PDFDoc, DiceAlias, CharacterStates, Themes, CharacterSheets,
0251     }
0252 }
0253 
0254 void CampaignManager::performAction(const QList<QPair<QString, Core::CampaignAction>>& actions)
0255 {
0256     std::for_each(std::begin(actions), std::end(actions),
0257                   [this](const QPair<QString, Core::CampaignAction>& pair)
0258                   {
0259                       // action == 0 => forget file
0260                       auto path= pair.first;
0261                       auto abPath= m_editor->mediaFullPath(path);
0262 
0263                       switch(pair.second)
0264                       {
0265                       case Core::CampaignAction::NoneAction:
0266                           break;
0267                       case Core::CampaignAction::ForgetAction:
0268                           m_editor->removeMedia(abPath);
0269                           break;
0270                       case Core::CampaignAction::DeleteAction:
0271                           m_editor->removeFile(path);
0272                           break;
0273                       case Core::CampaignAction::CreateAction:
0274                           emit createBlankFile(path, FileSerializer::typeFromExtention(path));
0275                           break;
0276                       case Core::CampaignAction::ManageAction:
0277                           m_editor->addMedia(QUuid::createUuid().toString(QUuid::WithoutBraces), path, {});
0278                           break;
0279                       }
0280 
0281                       // action == 1 => create document
0282                   });
0283 }
0284 
0285 } // namespace campaign