71 lines
1.8 KiB
C++
71 lines
1.8 KiB
C++
// 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);
|
|
}
|