Add the Spreadsheet example
The example demonstrates a Spreadsheet that provides adding, editing,
and deleting data, and also the ability to write formulas for numeric
data. Also, it's possible to select cells, rows, and columns for
deleting them or their data, copying or cutting the data, and dragging
them to other places. The user can hide columns or rows, and also show
them again. Thanks to the reordering API, columns and rows can be
reordered and also can be reset to the default order.
There is a SpreadModel class which handles the entered data. It only
stores the data of the cells that is provided by the user. It means
that it does not create any empty data structure for empty cells, in
order to reduce memory usage.
Task-number: QTBUG-125767
Pick-to: 6.8
Change-Id: I1d9cc5b4b8d902257e9ed508d4a712b0574490f3
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
2024-05-27 16:06:47 +00:00
|
|
|
// Copyright (C) 2024 The Qt Company Ltd.
|
|
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
|
|
|
2024-09-09 10:05:51 +00:00
|
|
|
#include "spreadformula.h"
|
Add the Spreadsheet example
The example demonstrates a Spreadsheet that provides adding, editing,
and deleting data, and also the ability to write formulas for numeric
data. Also, it's possible to select cells, rows, and columns for
deleting them or their data, copying or cutting the data, and dragging
them to other places. The user can hide columns or rows, and also show
them again. Thanks to the reordering API, columns and rows can be
reordered and also can be reset to the default order.
There is a SpreadModel class which handles the entered data. It only
stores the data of the cells that is provided by the user. It means
that it does not create any empty data structure for empty cells, in
order to reduce memory usage.
Task-number: QTBUG-125767
Pick-to: 6.8
Change-Id: I1d9cc5b4b8d902257e9ed508d4a712b0574490f3
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
2024-05-27 16:06:47 +00:00
|
|
|
#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);
|
|
|
|
}
|