diff --git a/src/xlsx/xlsxabstractsheet.cpp b/src/xlsx/xlsxabstractsheet.cpp index 9e2b397..2cf6eee 100644 --- a/src/xlsx/xlsxabstractsheet.cpp +++ b/src/xlsx/xlsxabstractsheet.cpp @@ -31,8 +31,8 @@ QT_BEGIN_NAMESPACE_XLSX AbstractSheetPrivate::AbstractSheetPrivate(AbstractSheet *p, AbstractSheet::CreateFlag flag) : AbstractOOXmlFilePrivate(p, flag) { - hidden = false; type = AbstractSheet::ST_WorkSheet; + sheetState = AbstractSheet::SS_Visible; } AbstractSheetPrivate::~AbstractSheetPrivate() @@ -48,11 +48,19 @@ AbstractSheetPrivate::~AbstractSheetPrivate() /*! \enum AbstractSheet::SheetType - \value ST_WorkSheet, - \value ST_ChartSheet, - \omitvalue ST_DialogSheet, + \value ST_WorkSheet + \value ST_ChartSheet + \omitvalue ST_DialogSheet \omitvalue ST_MacroSheet - */ +*/ + +/*! + \enum AbstractSheet::SheetState + + \value SS_Visible + \value SS_Hidden + \value SS_VeryHidden User cann't make a veryHidden sheet visible in normal way. +*/ /*! \fn AbstractSheet::copy(const QString &distName, int distId) const @@ -110,21 +118,62 @@ void AbstractSheet::setSheetType(SheetType type) } /*! - * \internal + * Returns the state of the sheet. + * + * \sa isHidden(), isVisible(), setSheetState() + */ +AbstractSheet::SheetState AbstractSheet::sheetState() const +{ + Q_D(const AbstractSheet); + return d->sheetState; +} + +/*! + * Set the state of the sheet to \a state. + */ +void AbstractSheet::setSheetState(SheetState state) +{ + Q_D(AbstractSheet); + d->sheetState = state; +} + +/*! + * Returns true if the sheet is not visible, otherwise false will be returned. + * + * \sa sheetState(), setHidden() */ bool AbstractSheet::isHidden() const { Q_D(const AbstractSheet); - return d->hidden; + return d->sheetState != SS_Visible; } /*! - * \internal + * Returns true if the sheet is visible. + */ +bool AbstractSheet::isVisible() const +{ + return !isHidden(); +} + +/*! + * Make the sheet hiden or visible based on \a hidden. */ void AbstractSheet::setHidden(bool hidden) { Q_D(AbstractSheet); - d->hidden = hidden; + if (hidden == isHidden()) + return; + + d->sheetState = hidden ? SS_Hidden : SS_Visible; +} + +/*! + * Convenience function, equivalent to setHidden(! \a visible). + */ +void AbstractSheet::setVisible(bool visible) +{ + setHidden(!visible); } /*! diff --git a/src/xlsx/xlsxabstractsheet.h b/src/xlsx/xlsxabstractsheet.h index f915297..7aa416d 100644 --- a/src/xlsx/xlsxabstractsheet.h +++ b/src/xlsx/xlsxabstractsheet.h @@ -37,17 +37,28 @@ class Q_XLSX_EXPORT AbstractSheet : public AbstractOOXmlFile { Q_DECLARE_PRIVATE(AbstractSheet) public: - enum SheetType - { + enum SheetType { ST_WorkSheet, ST_ChartSheet, ST_DialogSheet, ST_MacroSheet }; - SheetType sheetType() const; + enum SheetState { + SS_Visible, + SS_Hidden, + SS_VeryHidden + }; + QString sheetName() const; + SheetType sheetType() const; + SheetState sheetState() const; + void setSheetState(SheetState ss); bool isHidden() const; + bool isVisible() const; + void setHidden(bool hidden); + void setVisible(bool visible); + Workbook *workbook() const; protected: @@ -55,7 +66,6 @@ protected: AbstractSheet(const QString &sheetName, int sheetId, Workbook *book, AbstractSheetPrivate *d); virtual AbstractSheet *copy(const QString &distName, int distId) const = 0; void setSheetName(const QString &sheetName); - void setHidden(bool hidden); void setSheetType(SheetType type); int sheetId() const; diff --git a/src/xlsx/xlsxabstractsheet_p.h b/src/xlsx/xlsxabstractsheet_p.h index 89c1202..7d0f344 100644 --- a/src/xlsx/xlsxabstractsheet_p.h +++ b/src/xlsx/xlsxabstractsheet_p.h @@ -56,7 +56,7 @@ public: QString name; int id; - bool hidden; + AbstractSheet::SheetState sheetState; AbstractSheet::SheetType type; }; diff --git a/src/xlsx/xlsxworkbook.cpp b/src/xlsx/xlsxworkbook.cpp index ed08ee0..1b97b56 100755 --- a/src/xlsx/xlsxworkbook.cpp +++ b/src/xlsx/xlsxworkbook.cpp @@ -486,8 +486,10 @@ void Workbook::saveToXmlFile(QIODevice *device) const writer.writeEmptyElement(QStringLiteral("sheet")); writer.writeAttribute(QStringLiteral("name"), sheet->sheetName()); writer.writeAttribute(QStringLiteral("sheetId"), QString::number(sheet->sheetId())); - if (sheet->isHidden()) + if (sheet->sheetState() == AbstractSheet::SS_Hidden) writer.writeAttribute(QStringLiteral("state"), QStringLiteral("hidden")); + else if (sheet->sheetState() == AbstractSheet::SS_VeryHidden) + writer.writeAttribute(QStringLiteral("state"), QStringLiteral("veryHidden")); d->relationships->addDocumentRelationship(QStringLiteral("/worksheet"), QStringLiteral("worksheets/sheet%1.xml").arg(i+1)); writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(d->relationships->count())); @@ -500,8 +502,10 @@ void Workbook::saveToXmlFile(QIODevice *device) const writer.writeEmptyElement(QStringLiteral("sheet")); writer.writeAttribute(QStringLiteral("name"), sheet->sheetName()); writer.writeAttribute(QStringLiteral("sheetId"), QString::number(sheet->sheetId())); - if (sheet->isHidden()) + if (sheet->sheetState() == AbstractSheet::SS_Hidden) writer.writeAttribute(QStringLiteral("state"), QStringLiteral("hidden")); + else if (sheet->sheetState() == AbstractSheet::SS_VeryHidden) + writer.writeAttribute(QStringLiteral("state"), QStringLiteral("veryHidden")); d->relationships->addDocumentRelationship(QStringLiteral("/chartsheet"), QStringLiteral("chartsheets/sheet%1.xml").arg(i+1)); writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(d->relationships->count())); @@ -566,8 +570,12 @@ bool Workbook::loadFromXmlFile(QIODevice *device) const QString name = attributes.value(QLatin1String("name")).toString(); int sheetId = attributes.value(QLatin1String("sheetId")).toString().toInt(); const QString rId = attributes.value(QLatin1String("r:id")).toString(); -// if (attributes.hasAttribute(QLatin1String("state"))) -// QString state = attributes.value(QLatin1String("state")).toString(); + QStringRef &stateString = attributes.value(QLatin1String("state")); + AbstractSheet::SheetState state = AbstractSheet::SS_Visible; + if (stateString == QLatin1String("hidden")) + state = AbstractSheet::SS_Hidden; + else if (stateString == QLatin1String("veryHidden")) + state = AbstractSheet::SS_VeryHidden; XlsxRelationship relationship = d->relationships->getRelationshipById(rId); @@ -584,6 +592,7 @@ bool Workbook::loadFromXmlFile(QIODevice *device) qWarning("unknown sheet type"); AbstractSheet *sheet = addSheet(name, sheetId, type); + sheet->setSheetState(state); const QString fullPath = QDir::cleanPath(splitPath(filePath())[0] +QLatin1String("/")+ relationship.target); sheet->setFilePath(fullPath); } else if (reader.name() == QLatin1String("workbookPr")) {