1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "spreadformula.h"
#include "spreadcell.h"
#include "spreadrole.h"
#include "spreadmodel.h"
bool SpreadCell::isNull() const
{
return !has(spread::Role::Display) && !has(spread::Role::Hightlight);
}
bool SpreadCell::has(int role) const
{
switch (role) {
case spread::Role::Display:
case spread::Role::Edit:
return !text.isNull() && !text.isEmpty();
case spread::Role::Hightlight:
return highlight; // false highlight equals to no highlight set
default:
return false;
}
}
void SpreadCell::set(int role, const QVariant &data)
{
switch (role) {
case spread::Role::Edit:
text = data.toString();
break;
case spread::Role::Hightlight:
highlight = data.toBool();
break;
default:
break;
}
}
QVariant SpreadCell::get(int role) const
{
switch (role) {
case spread::Role::Edit:
return text;
case spread::Role::Display: {
const QString display_text = displayText();
return display_text.isNull() ? QVariant{} : display_text;
}
case spread::Role::Hightlight:
return highlight;
default:
return QVariant{};
}
}
QString SpreadCell::displayText() const
{
SpreadModel *model = SpreadModel::instance();
const Formula formula = model->parseFormulaString(text);
if (!formula.isValid())
return text;
if (formula.firstOperandId() <= 0) // at least one arg should be available
return "#ERROR!";
if ((formula.firstOperandId() == id) || (formula.secondOperandId() == id))
return "#ERROR!"; // found loop
if (formula.includesLoop(model, model->dataModel()))
return "#ERROR!";
return model->formulaValueText(formula);
}
|