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