/*
Copyright (C) 2012, University of Cambridge, Department of Psychiatry.
Created by Rudolf Cardinal (rnc1001@cam.ac.uk).
This file is part of CamCOPS.
CamCOPS 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.
CamCOPS 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 CamCOPS. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once
#include <QPointer>
#include <QString>
#include "tasklib/task.h"
class CamcopsApp;
class QuElement;
class Questionnaire;
class AceFamily : public Task
{
// This is an abstract class (it doesn't implement all of Task's pure
// virtual methods). It supports the ACE-III and Mini-ACE tasks.
Q_OBJECT
public:
AceFamily(CamcopsApp& app, DatabaseManager& db,
const QString& tablename, QObject* parent = nullptr);
// ------------------------------------------------------------------------
// Class overrides
// ------------------------------------------------------------------------
virtual bool hasClinician() const override { return true; }
virtual bool prohibitsCommercial() const override { return true; }
virtual Version minimumServerVersion() const override;
virtual bool isTaskProperlyCreatable(QString& why_not_creatable) const override;
virtual QString xstringTaskname() const override;
protected:
// ------------------------------------------------------------------------
// Cosmetic support functions
// ------------------------------------------------------------------------
QString scorePercent(int score, int out_of) const;
// ------------------------------------------------------------------------
// Task address version support functions
// ------------------------------------------------------------------------
// The task address version currently in use (A/B/C).
// Guaranteed to be valid (even with missing/incorrect underlying data),
// by defaulting to 'A'.
virtual QString taskAddressVersion() const = 0;
// Is it OK to change task address version? (The converse question: have we
// collected data, such that changing task address version is dubious?)
virtual bool isChangingAddressVersionOk() const = 0;
// Internal: the CSV-split xstring providing task address version info.
QStringList rawAddressVersionsAvailable() const;
// Is the information provided by the server about available address
// versions (e.g. A or A,B,C) valid?
bool isAddressVersionInfoValid() const;
// Internal function to provide the validity check on a specific list
// of strings.
bool isAddressVersionInfoValid(const QStringList& versions) const;
// Address versions that are available. Each element is a character,
// typically "A", "B", "C" (but this varies with language).
// Defaults to "A" alone if the information is invalid.
QStringList addressVersionsAvailable() const;
// One of the seven components of the main (target) address:
QString targetAddressComponent(int component) const;
// ------------------------------------------------------------------------
// Automatic tag generation
// ------------------------------------------------------------------------
QString tagAddressRegistration(int trial, int component) const;
QString tagAddressFreeRecall(int component) const;
// ------------------------------------------------------------------------
// Editor assistance functions
// ------------------------------------------------------------------------
QuElement* textRaw(const QString& string) const;
QuElement* text(const QString& stringname) const;
QuElement* explanation(const QString& stringname) const;
QuElement* stdExplan(const QString& stringname) const;
QuElement* remExplan(const QString& stringname) const;
QuElement* heading(const QString& stringname) const;
QuElement* subheading(const QString& stringname) const;
QuElement* instructionRaw(const QString& string) const;
QuElement* instruction(const QString& stringname) const;
QuElement* stdInstruct(const QString& stringname) const;
QuElement* remInstruct(const QString& stringname) const;
QuElement* boolean(const QString& stringname, const QString& fieldname,
bool mandatory = true, bool bold = false);
QuElement* boolimg(const QString& filenamestem, const QString& fieldname,
bool mandatory = true);
QuElement* warning(const QString& string) const;
protected:
QPointer<Questionnaire> m_questionnaire;
public:
static const QString ACE3_TABLENAME; // used for xstring in ACE/miniACE
protected:
static const int TOTAL_MINI_ACE = 30;
static const int MIN_AGE = 0;
static const int MAX_AGE_Y = 120;
static const int FLUENCY_TIME_SEC = 60;
static const int N_MEM_REPEAT_RECALL_ADDR = 7;
static const int ADDR_LEARN_N_TRIALS = 3;
static const QString TASK_DEFAULT_VERSION; // A
static const QString FN_TASK_EDITION;
static const QString FN_TASK_ADDRESS_VERSION;
static const QString FN_REMOTE_ADMINISTRATION;
static const QString FN_AGE_FT_EDUCATION;
static const QString FN_OCCUPATION;
static const QString FN_HANDEDNESS;
static const QString FP_ATTN_TIME;
static const QString FP_MEM_REPEAT_ADDR_GENERIC;
static const QString FP_MEM_REPEAT_ADDR_TRIAL1;
static const QString FP_MEM_REPEAT_ADDR_TRIAL2;
static const QString FP_MEM_REPEAT_ADDR_TRIAL3;
static const QString FP_MEM_RECALL_ADDRESS;
static const QString FN_FLUENCY_ANIMALS_SCORE;
static const QString FN_VSP_DRAW_CLOCK;
static const QString FN_PICTURE1_BLOBID;
static const QString FN_PICTURE2_BLOBID;
static const QString FN_COMMENTS;
static const QString TAG_PG_PREAMBLE;
static const QString TAG_EL_CHOOSE_TASK_VERSION;
static const QString TAG_EL_SHOW_TASK_VERSION;
static const QString TAG_REMOTE;
static const QString TAG_STANDARD;
static const QString TAG_PG_ADDRESS_LEARNING_FAMOUS;
static const QString TAG_PG_MEM_FREE_RECALL;
static const QString X_MINI_ACE_SCORE;
};