void Workspace::AddDocument(string projectName, QString& imageFullPath, ProcessingOptions& options)
{
    QFileInfo imageFileInfo(imageFullPath);

    // Get project.
    Project* project = m_Projects[projectName].get();
    m_ProjectsPersistentState[projectName] = false;
    QString projectDirPath = QString(project->GetDocumentsPath().c_str());
    QDir projectDir(projectDirPath);

    // Copy image to project dir.
    QString dstImageFullPath = projectDir.absoluteFilePath(imageFileInfo.fileName());
    QFile::copy(imageFullPath, dstImageFullPath);

    // Get image name.
    QString docNameQ = imageFileInfo.baseName();
    std::string docName = Utils::StringQ2W(docNameQ);

    // Add image to project.
    Document* document = project->AddDocument(
                                docName,
                                Utils::StringQ2W(dstImageFullPath),
                                options);

    // Add image to view model.
    auto projRowItem = m_ProjectsModel.findItems(Utils::StringW2Q(projectName));
    ProjectItem* projectItem = (ProjectItem*) projRowItem.first();

    ProjectItem* docItem = new ProjectItem(docName, true);
    QList<QStandardItem*> docRowItem;
    docRowItem << docItem;
    projectItem->appendRow(docItem);

    SetCurrent(project, projectItem, document, docItem);
}
void Workspace::AddProject(QString& projectFullPath, bool load)
{
    QFileInfo projectFileInfo(projectFullPath);

    // Extract project name from path.
    QString projectNameQ = projectFileInfo.fileName().remove(".ndtr");
    std::string projectName = Utils::StringQ2W(projectNameQ);

    // If not exists, create dir to store images.
    QDir projectDir = projectFileInfo.absoluteDir();
    // Create dir if not exist.
    if (!projectDir.exists(projectNameQ))
    {
        projectDir.mkdir(projectNameQ);
    }
    projectDir.cd(projectNameQ);

    // There can't be more projects with same name.
    if (m_Projects.count(projectName))
    {
        // "Project with the same name is already loaded."
        throw std::exception();
    }

    // Initialize project.
    m_Projects[projectName] = unique_ptr<Project>(new Project());
    m_ProjectsPersistentState[projectName] = true; // loaded or saved
    Project* project = m_Projects[projectName].get();
    project->Init(projectName,
                  projectFullPath.toStdString(),
                  projectDir.absolutePath().toStdString());

    // Load/Save project.
    if (load)
    {
        // If exists load project from file.
        if(!ProjectParser::Load(project))
        {
            // "Failed to load project file."
            throw std::exception();
        }
    }
    else
    {
        // Save project file. Serialize as XML.
        if (!ProjectParser::Save(project))
        {
            // "Failed to save project file."
            throw std::exception();
        }
    }

    // TODO: Move to method. Add images to view.
    // Add project to project model view.
    QStandardItem* rootItem = m_ProjectsModel.invisibleRootItem();
    ProjectItem* projectItem = new ProjectItem(projectName);
    QList<QStandardItem*> projectItems;
    projectItems << projectItem;
    rootItem->appendRow(projectItems);

    for (Document* doc : project->GetDocuments())
    {
        auto projRowItem = m_ProjectsModel.findItems(Utils::StringW2Q(projectName));
        ProjectItem* projectItem = (ProjectItem*) projRowItem.first();

        ProjectItem* docItem = new ProjectItem(doc->GetName(), true);
        QList<QStandardItem*> docRowItem;
        docRowItem << docItem;
        projectItem->appendRow(docItem);
    }

    // Set new project as current project.
    SetCurrent(projectName);
}