/****************************************************************************
Copyright (C) 2010-2012 the Office National des Forêts (ONF), France
and the Association de Recherche Technologie et Sciences (ARTS), Ecole Nationale Suprieure d'Arts et Métiers (ENSAM), Cluny, France.
All rights reserved.
Contact : alexandre.piboule@onf.fr
Developers : Michaël KREBS (ARTS/ENSAM)
This file is part of Computree version 2.0.
Computree is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Computree is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Computree. If not, see .
*****************************************************************************/
#ifndef DM_GUIMANAGER_H
#define DM_GUIMANAGER_H
#include
#include
#include "dm_context.h"
#include "dm_mainwindow.h"
#include "dm_documentmanagerview.h"
#include "dm_multipleitemdrawablemodelmanager.h"
#include "dm_actionsmanager.h"
#include "dm_itemdrawableconfigurationmanagerview.h"
#include "cdm_stepmanager.h"
#include "cdm_internationalization.h"
#include "tools/guimanager/dm_guimanagertoken.h"
#include "tools/guimanager/dm_asyncoperation.h"
#include "tools/guimanager/dm_abstractasyncoperationoptions.h"
#define GUI_MANAGER DM_GuiManager::getUniqueInstance()
#define GUI_LOG DM_GuiManager::getUniqueInstance()->getPluginManager()->log()
class CT_AbstractExporter;
/**
* Classe qui reprsente le gestionnaire de toutes les vues. La
* vue principale doit hrit de DM_GuiManager et dans son constructeur
* renseign l'attribut _uniqueInstance comme suit : _uniqueInstance = this;
*
* Ce qui veut dire qu'il ne peut y avoir qu'une intance de la vue principale !
*
* Le modle peut ainsi avoir accs aux vues grce la variable GUI_MANAGER
*/
class DM_GuiManager : public QObject, public GuiManagerInterface
{
Q_OBJECT
private:
class ActionItemDrawable
{
public:
ActionItemDrawable(DM_AsyncOperation *aop,
CT_AbstractResult *res,
QList *itemList,
QString filePath,
DM_DocumentManagerView *view,
DM_AsynchroneProgress *progress,
DM_AsynchroneProgress *secondProgress = nullptr)
{
_aop = aop;
_res = res;
_itemModel = nullptr;
_exporter = nullptr;
if(itemList != nullptr)
{
_itemList = *itemList;
}
_filePath = filePath;
_view = view;
_progress = progress;
_secondProgress = secondProgress;
}
ActionItemDrawable(const ActionItemDrawable &action)
{
_aop = action._aop;
_res = action._res;
_itemModel = action._itemModel;
_exporter = action._exporter;
_itemList = action._itemList;
_filePath = action._filePath;
_view = action._view;
m_docView = action.m_docView;
_progress = action._progress;
_secondProgress = action._secondProgress;
}
void setItemModel(CT_OutAbstractItemModel *model) { _itemModel = model; }
void setDocumentView(DM_DocumentView *view) { m_docView = view; }
void setIExporter(CT_AbstractExporter *exporter) { _exporter = exporter; }
DM_AsyncOperation *_aop;
CT_AbstractResult *_res;
CT_OutAbstractItemModel *_itemModel;
DM_DocumentView *m_docView;
CT_AbstractExporter *_exporter;
QList _itemList;
QString _filePath;
DM_DocumentManagerView *_view;
DM_AsynchroneProgress *_progress;
DM_AsynchroneProgress *_secondProgress;
};
class ActionStep
{
public:
ActionStep(DM_AsyncOperation *aop,
CT_VirtualAbstractStep *step,
CDM_StepManager *stepManager,
DM_DocumentManagerView *docManagerView,
DM_AsynchroneProgress *progress,
DM_AsynchroneProgress *secondProgress,
int totalProgressSize,
int nProgress)
{
_aop = aop;
_step = step;
_stepManager = stepManager;
_docManagerView = docManagerView;
_progress = progress;
_secondProgress = secondProgress;
_totalProgressSize = totalProgressSize;
_nProgress = nProgress;
}
ActionStep(const ActionStep &action)
{
_aop = action._aop;
_step = action._step;
_stepManager = action._stepManager;
_docManagerView = action._docManagerView;
_progress = action._progress;
_secondProgress = action._secondProgress;
_totalProgressSize = action._totalProgressSize;
_nProgress = action._nProgress;
}
DM_AsyncOperation *_aop;
CT_VirtualAbstractStep *_step;
CDM_StepManager *_stepManager;
DM_DocumentManagerView *_docManagerView;
DM_AsynchroneProgress *_progress;
DM_AsynchroneProgress *_secondProgress;
int _totalProgressSize;
int _nProgress;
};
public:
static DM_GuiManager* getUniqueInstance()
{
return _uniqueInstance;
}
virtual ~DM_GuiManager();
/**
* @brief return true if another async operation is in progress
*/
bool isAsyncOperationInProgress() const;
/**
* @brief Request a exclusive async operation. If you want to do a asynchronous treatment and do
* not want that another elements in the gui do another treatment in same time you must call this method. We create a
* token, append them in a list and blocks the workflow (without block the gui) until they are other token before them and until the
* async options don't pass (method 'passed'). When it is the turn for this token and when the async options passed the workflows continue.
*
* @param options : to specify otions (example : if you want that no step is running. example 2 : if you want that the StepManager don't clear automatically resuls, etc...).
* @param wait : true if you want to wait until the current operation is finished. If true the workflow is blocked (not the gui thread)
* @return A object that you must delete when yo have finished your operation to free the access to other elements in the gui. If the
* variable 'wait' is false and a current operation is in progress the method return nullptr.
*/
DM_AsyncOperation* requestExclusiveAsyncOperation(const DM_AbstractAsyncOperationOptions *options = nullptr, bool wait = true);
/**
* \brief Gre l'ajout des CT_AbstractItemDrawable d'un rsultat aux diffrentes
* vues qui en ont besoin. (Asynchrone)
*
* \param res : le rsultat
* \param context : le context a renvoyer lorsque l'action est termin (voir signal correspondant)
* \return false si une demande a dj t formul et n'est pas termine
*/
virtual bool asyncAddAllItemDrawableOfResultOnView(CT_AbstractResult &res, DM_Context *context);
/**
* \brief Gere l'ajout des CT_AbstractItemDrawable à la vue passé en paramètre. (Asynchrone)
*
* \param result : le résultat contenant le modèle. On ne peut pas le récupérer à partir du modèle car si c'est une copie
* il contient le résultat du modèle original !
* \param model : le modele d'CT_AbstractItemDrawable a rechercher et ajouter
* \param view : la vue à laquelle il faut ajouter les items
* \param context : le context a renvoyer lorsque l'action est termine (voir signal correspondant)
* \return false si une demande a deja ete formule et n'est pas terminee
*/
virtual bool asyncAddAllItemDrawableOfModelOnView(CT_AbstractResult &res, CT_OutAbstractItemModel &model, DM_DocumentView &view, DM_Context *context);
/**
* \brief Gre l'ajout de la liste des ItemDrawables pass en paramtres aux
* vues qui en ont besoin. (Asynchrone)
*
* \param itemList : la liste des itemsDrawable
* \param view : la vue à laquelle il faut ajouter les items. nullptr si vous voulez ajouter au document actif
* \param context : le context a renvoyer lorsque l'action est termin (voir signal correspondant)
* \return false si une demande a dj t formul et n'est pas termine
*/
virtual bool asyncAddAllItemDrawableOfListOnView(QList &itemList, DM_DocumentView *view, DM_Context *context);
/**
* \brief Gre la suppression des CT_AbstractItemDrawable d'un rsultat des diffrentes
* vues. (Asynchrone)
*
* \param res : le rsultat
* \param context : le context a renvoyer lorsque l'action est termin (voir signal correspondant)
* \return false si une demande a dj t formul et n'est pas termine
*/
virtual bool asyncRemoveAllItemDrawableOfResultFromView(CT_AbstractResult &res, DM_Context *context);
virtual bool syncRemoveAllItemDrawableOfResultFromView(CT_AbstractResult &res);
/**
* \brief Gere la suppression des CT_AbstractItemDrawable, en fonction d'un modele, des differentes
* vues. (Asynchrone)
*
* \param model : le modele d'ItemDrawablea rechercher et enlever
* \param context : le context a renvoyer lorsque l'action est termin (voir signal correspondant)
* \return false si une demande a dj t formul et n'est pas termine
*/
virtual bool asyncRemoveAllItemDrawableOfModelFromAllViews(CT_OutAbstractItemModel &model, DM_Context *context);
/**
* \brief Gere la suppression des CT_AbstractItemDrawable, en fonction d'un modele, de la vue passé en paramètre. (Asynchrone)
*
* \param model : le modele d'CT_AbstractItemDrawable a rechercher et enlever
* \param view : la vue
* \param context : le context a renvoyer lorsque l'action est termin (voir signal correspondant)
* \return false si une demande a dj t formul et n'est pas termine
*/
virtual bool asyncRemoveAllItemDrawableOfModelFromView(CT_OutAbstractItemModel &model, DM_DocumentView &view, DM_Context *context);
/**
* \brief Gère la suppression de la liste des ItemDrawables passé en paramètres du document passé en paramètre (Asynchrone)
*
* \param itemList : la liste des itemsDrawable
* \param view : le document duquel il faut supprimer les éléments. nullptr si vous voulez ajouter au document actif
* \param context : le context a renvoyer lorsque l'action est terminé (voir signal correspondant)
* \return false si une demande a déjà été formul et n'est pas terminé
*/
virtual bool asyncRemoveAllItemDrawableOfListFromView(QList &itemList, DM_DocumentView *view, DM_Context *context);
/**
* \brief Gre la suppression d'une tape (suppression des rsultats de la mmoire,
* des CT_AbstractItemDrawable des documents, etc...)
* \param step : l'tape
* \param context : le context a renvoyer lorsque l'action est termin (voir signal correspondant)
* \return : false si une demande a dj t formul et n'est pas termine
*/
virtual bool asyncRemoveStep(CT_VirtualAbstractStep &step, DM_Context *context);
/**
* \brief Gre la suppression de toutes les tapes de l'arbre
* \param context : le context a renvoyer lorsque l'action est termin (voir signal correspondant)
* \return : 0 si l'action n'est pas termine, 1 si l'action a commence, -1 si l'action n'a pas besoin d'tre effectue
*/
virtual int asyncRemoveAllStep(DM_Context *context);
/**
* \brief Gere l'exportation. Appel les methodes de l'exportateur : configure(...) puis avec un thread export(...)
*
* ATTNENTION : veuillez spécifier à l'exportateur le chemin du fichier avant d'appeler cette méthode
*
* \param exporter : l'exportateur a utiliser pour l'export
* \param context : le context a renvoyer lorsque l'action est termine (voir signal correspondant)
* \return : false si une demande a dj t formul et n'est pas termine
*/
virtual bool asyncExport(CT_AbstractExporter *exporter, DM_Context *context);
/**
* \brief Modifie la couleur de tous les CT_AbstractItemDrawable de tous les documents qui ont comme modèle celui
* passé en paramètre
*/
bool setColorOnAllItemDrawableOnAllDocumentsThatModelCorresponding(const CT_OutAbstractItemModel *model, const QColor &color);
/**
* \brief Modifie la couleur de tous les CT_AbstractItemDrawable de tous les documents qui ont comme modèle celui
* passé en paramètre parmis une liste de couleur
*/
bool setColorListOnAllItemDrawableOnAllDocumentsThatModelCorresponding(const CT_OutAbstractItemModel *model, const QList &colorList);
/**
* \brief Gere l'ajout des itemdrawable modele du resultat pass en paramtre a la vue permettant d'interagir avec eux
*/
bool editItemDrawableModelOfResult(CT_AbstractResult &res);
/**
* \brief Supprime le résultat de la vue permettant d'intéragir avec les modèles de ses CT_AbstractItemDrawable
*/
bool removeEditItemDrawableModelOfResult(CT_AbstractResult &res);
/**
* \brief Supprime tous les CT_AbstractItemDrawable de tous les documents
*/
bool cleanItemDrawableOfAllDocuments();
bool isRunning();
void redrawAllDocuments();
CDM_PluginManager* getPluginManager() const;
/**
* \brief Retourne la vue qui gre les documents (gestionnaire de document)
*/
virtual DM_DocumentManagerView* getDocumentManagerView() const = 0;
/**
* \brief Retourne le gestionnaire d'etape
*/
virtual CDM_StepManager* getStepManager() const = 0;
/**
* @brief Return the actions manager
*/
virtual DM_ActionsManager* getActionsManager() const = 0;
/**
* @brief Returns the language manager
*/
virtual CDM_Internationalization* getLanguageManager() const = 0;
/**
* @brief Returns the manager of itemdrawable's configuration
*/
virtual DM_ItemDrawableConfigurationManagerView* getItemDrawableConfigurationManagerView() const = 0;
/**
* \brief Retourne la fentre principale
*/
virtual DM_MainWindow* getMainWindow() const = 0;
/**
* \brief Retourne le gestionnaire de modele d'itemDrawable
*/
virtual DM_MultipleItemDrawableModelManager* getItemDrawableModelManager() const = 0;
/**
* \brief Initialise la fentre de progression avec le texte pass en
* paramtre et l'affiche.
*/
void initProgressDialog(IMainProgressDialog *dialog, QString text, QString secondText = "");
protected:
static DM_GuiManager* _uniqueInstance;
DM_AsyncOperation *m_currentAsyncOperation;
QMutex m_asyncOperationTokenMutex;
QList m_tokens;
QFutureWatcher _futureWatcher;
QFuture _future;
GMainProgressDialog *_progressDialog;
DM_AsynchroneProgress _asyncProgress;
DM_AsynchroneProgress _asyncSecondProgress;
QList _contextList;
QQueue m_queueProgressDialogToDestroy;
/**
* \brief Initialisation (connexion des signaux, etc...)
*/
void init();
private:
void addNewContext(DM_Context *context);
void recursiveDeleteStepConfigurationDialog(CT_VirtualAbstractStep &step);
static void staticRemoveResultFromOtherView(ActionItemDrawable info);
static void staticAddAllItemDrawableOfResultOnView(ActionItemDrawable info);
static void staticAddAllItemDrawableOfModelOnView(ActionItemDrawable info);
static void staticAddAllItemDrawableOfListOnView(ActionItemDrawable info);
static void staticRemoveAllItemDrawableOfResultFromView(ActionItemDrawable info);
static void staticRemoveAllItemDrawablOfModelFromAllViews(ActionItemDrawable info);
static void staticRemoveAllItemDrawableOfModelFromView(ActionItemDrawable info);
static void staticRemoveAllItemDrawableOfListFromView(ActionItemDrawable info);
static void staticClearResultMemoryAndRemoveStep(ActionStep info);
static int staticRecursiveCountProgress(CT_VirtualAbstractStep *step);
static int staticRecursiveClearResultMemoryAndRemoveStep(ActionStep info);
static void staticExport(ActionItemDrawable info);
private slots:
/**
* \brief Slot connect au gestionnaire d'tape qui envoie un signal
* lorsqu'on dsaloue les CT_AbstractItemDrawable d'un rsultat de la mmoire.
*/
void resultToBeClearedFromMemory(const CT_AbstractResult *res);
/**
* \brief Slot connect au gestionnaire d'tape qui envoie un signal
* lorsqu'une tape va supprimer l'un de ses rsultats.
*/
void resultToBeRemoved(const CT_AbstractResult *res);
/**
* @brief Called when the current async operation was destroyed
*/
void slotCurrentAsyncOperationDestroyed();
/**
* @brief Called when the current async operation was destroyed
*/
void slotCurrentAsyncOperationReleased();
signals:
void currentAsyncOperationDestroyed();
void currentAsyncOperationReleased();
};
#endif // DM_GUIMANAGER_H