qtdeclarative/examples/quickcontrols/spreadsheets/Spreadsheets/spreadcell.cpp

71 lines
1.8 KiB
C++
Raw Normal View History

// 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);
}