Skip to content

Commit

Permalink
Merge pull request #452 from DmitryZagorodnev/feature/dataRoles
Browse files Browse the repository at this point in the history
Feature/data roles
  • Loading branch information
fralx authored Mar 30, 2024
2 parents 0007495 + 4c1c0c4 commit 5139ac0
Show file tree
Hide file tree
Showing 11 changed files with 286 additions and 27 deletions.
26 changes: 11 additions & 15 deletions limereport/items/lrtextitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,6 @@ TextItem::TextItem(QObject *owner, QGraphicsItem *parent)

TextItem::~TextItem(){}

int TextItem::fakeMarginSize() const{
return marginSize()+5;
}

void TextItem::preparePopUpMenu(QMenu &menu)
{
QAction* editAction = menu.addAction(QIcon(":/report/images/edit_pecil2.png"),tr("Edit"));
Expand Down Expand Up @@ -180,7 +176,7 @@ void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* style, Q
qreal hOffset = 0, vOffset = 0;
switch (m_angle){
case Angle0:
hOffset = fakeMarginSize();
hOffset = marginSize();
if ((tmpSize.height() > 0) && (m_alignment & Qt::AlignVCenter)){
vOffset = tmpSize.height() / 2;
}
Expand All @@ -189,8 +185,8 @@ void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* style, Q
painter->translate(hOffset,vOffset);
break;
case Angle90:
hOffset = width() - fakeMarginSize();
vOffset = fakeMarginSize();
hOffset = width() - marginSize();
vOffset = marginSize();
if (m_alignment & Qt::AlignVCenter){
hOffset = (width() - text->size().height()) / 2 + text->size().height();
}
Expand All @@ -202,8 +198,8 @@ void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* style, Q
painter->rotate(90);
break;
case Angle180:
hOffset = width() - fakeMarginSize();
vOffset = height() - fakeMarginSize();
hOffset = width() - marginSize();
vOffset = height() - marginSize();
if ((tmpSize.width()>0) && (m_alignment & Qt::AlignVCenter)){
vOffset = tmpSize.height() / 2+ text->size().height();
}
Expand All @@ -214,8 +210,8 @@ void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* style, Q
painter->rotate(180);
break;
case Angle270:
hOffset = fakeMarginSize();
vOffset = height()-fakeMarginSize();
hOffset = marginSize();
vOffset = height()-marginSize();
if (m_alignment & Qt::AlignVCenter){
hOffset = (width() - text->size().height())/2;
}
Expand Down Expand Up @@ -321,7 +317,7 @@ void TextItem::updateItemSize(DataSourceManager* dataManager, RenderPass pass, i
initTextSizes();

if (m_textSize.width()>width() && ((m_autoWidth==MaxWordLength)||(m_autoWidth==MaxStringLength))){
setWidth(m_textSize.width() + fakeMarginSize()*2);
setWidth(m_textSize.width() + marginSize()*2);
}

if (m_textSize.height()>height()) {
Expand Down Expand Up @@ -380,9 +376,9 @@ QString TextItem::replaceReturns(QString text) const
void TextItem::setTextFont(TextPtr text, const QFont& value) const {
text->setDefaultFont(value);
if ((m_angle==Angle0)||(m_angle==Angle180)){
text->setTextWidth(rect().width()-fakeMarginSize()*2);
text->setTextWidth(rect().width()-marginSize()*2);
} else {
text->setTextWidth(rect().height()-fakeMarginSize()*2);
text->setTextWidth(rect().height()-marginSize()*2);
}
}

Expand All @@ -394,7 +390,7 @@ void TextItem::adaptFontSize(TextPtr text) const{
if (_font.pixelSize()>2)
_font.setPixelSize(_font.pixelSize()-1);
else break;
} while(text->size().height()>this->height() || text->size().width()>(this->width()) - fakeMarginSize() * 2);
} while(text->size().height()>this->height() || text->size().width()>(this->width()) - marginSize() * 2);
}

int TextItem::underlineLineSize() const
Expand Down
1 change: 0 additions & 1 deletion limereport/items/lrtextitem.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,6 @@ class TextItem : public ContentItemDesignIntf, IPageInit {
bool isNeedExpandContent() const;
QString replaceBR(QString text) const;
QString replaceReturns(QString text) const;
int fakeMarginSize() const;
QString getTextPart(int height, int skipHeight);
void restoreLinksEvent();
void preparePopUpMenu(QMenu &menu);
Expand Down
43 changes: 43 additions & 0 deletions limereport/lrdatadesignintf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,24 @@ QVariant ModelToDataSource::dataByRowIndex(const QString &columnName, int rowInd
return QVariant();
}

QVariant ModelToDataSource::dataByRowIndex(const QString &columnName, int rowIndex, int roleName)
{
if(m_model->rowCount() > rowIndex)
return m_model->data(m_model->index(rowIndex, columnIndexByName(columnName)));
return QVariant();
}

QVariant ModelToDataSource::dataByRowIndex(const QString &columnName, int rowIndex, const QString &roleName)
{
if(m_model->rowCount() > rowIndex) {
int roleCode{roleName.isEmpty() ? Qt::DisplayRole
: m_model->roleNames().key(roleName.toUtf8(), Qt::DisplayRole)};
return m_model->data(m_model->index(rowIndex, columnIndexByName(columnName)), roleCode);
}

return QVariant();
}

QVariant ModelToDataSource::dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData)
{
for( int i=0; i < m_model->rowCount(); ++i ){
Expand Down Expand Up @@ -310,6 +328,13 @@ int ModelToDataSource::columnIndexByName(QString name)
return -1;
}

QVariant ModelToDataSource::headerData(const QString &columnName, const QString &roleName)
{
int roleCode{roleName.isEmpty() ? Qt::DisplayRole
: m_model->roleNames().key(roleName.toUtf8(), Qt::DisplayRole)};
return m_model->headerData(columnIndexByName(columnName), Qt::Horizontal, roleCode);
}

QString ModelToDataSource::lastError()
{
return m_lastError;
Expand Down Expand Up @@ -722,6 +747,18 @@ QVariant CallbackDatasource::dataByRowIndex(const QString &columnName, int rowIn
return result;
}

QVariant CallbackDatasource::dataByRowIndex(const QString &columnName, int rowIndex, int roleName)
{
Q_UNUSED(roleName)
return dataByRowIndex(columnName, rowIndex);
}

QVariant CallbackDatasource::dataByRowIndex(const QString &columnName, int rowIndex, const QString &roleName)
{
Q_UNUSED(roleName)
return dataByRowIndex(columnName, rowIndex);
}

QVariant CallbackDatasource::dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData)
{
int backupCurrentRow = m_currentRow;
Expand Down Expand Up @@ -816,6 +853,12 @@ int CallbackDatasource::columnIndexByName(QString name)
return -1;
}

QVariant CallbackDatasource::headerData(const QString &columnName, const QString &roleName)
{
Q_UNUSED(roleName)
return columnName; // STUB
}

bool CallbackDatasource::checkNextRecord(int recordNum){
if (bof()) checkIfEmpty();
if (m_rowCount > 0) {
Expand Down
7 changes: 7 additions & 0 deletions limereport/lrdatadesignintf.h
Original file line number Diff line number Diff line change
Expand Up @@ -388,10 +388,13 @@ class ModelToDataSource : public QObject, public IDataSource{
bool bof();
QVariant data(const QString& columnName);
QVariant dataByRowIndex(const QString &columnName, int rowIndex);
QVariant dataByRowIndex(const QString &columnName, int rowIndex, int roleName);
QVariant dataByRowIndex(const QString &columnName, int rowIndex, const QString &roleName);
QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData);
int columnCount();
QString columnNameByIndex(int columnIndex);
int columnIndexByName(QString name);
QVariant headerData(const QString &columnName, const QString &roleName);
QString lastError();
virtual QAbstractItemModel* model();
int currentRow();
Expand Down Expand Up @@ -421,13 +424,16 @@ class CallbackDatasource :public ICallbackDatasource, public IDataSource {
bool eof(){return m_eof;}
QVariant data(const QString &columnName);
QVariant dataByRowIndex(const QString& columnName, int rowIndex);
QVariant dataByRowIndex(const QString &columnName, int rowIndex, int roleName);
QVariant dataByRowIndex(const QString &columnName, int rowIndex, const QString &roleName);
QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData);
int columnCount();
QString columnNameByIndex(int columnIndex);
int columnIndexByName(QString name);
bool isInvalid() const{ return false;}
QString lastError(){ return "";}
QAbstractItemModel *model(){return 0;}
QVariant headerData(const QString &columnName, const QString &roleName);
private:
bool checkNextRecord(int recordNum);
bool checkIfEmpty();
Expand All @@ -441,6 +447,7 @@ class CallbackDatasource :public ICallbackDatasource, public IDataSource {
QHash<QString, QVariant> m_valuesCache;
bool m_getDataFromCache;
int m_lastKeyRow;

};

class CallbackDatasourceHolder :public QObject, public IDataSourceHolder{
Expand Down
3 changes: 3 additions & 0 deletions limereport/lrdatasourceintf.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,12 @@ class IDataSource {
virtual bool eof() = 0;
virtual QVariant data(const QString& columnName) = 0;
virtual QVariant dataByRowIndex(const QString& columnName, int rowIndex) = 0;
virtual QVariant dataByRowIndex(const QString &columnName, int rowIndex, int roleName) = 0;
virtual QVariant dataByRowIndex(const QString &columnName, int rowIndex, const QString &roleName) = 0;
virtual QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData) = 0;
virtual int columnCount() = 0;
virtual QString columnNameByIndex(int columnIndex) = 0;
virtual QVariant headerData(const QString &columnName, const QString &roleName) = 0;
virtual int columnIndexByName(QString name) = 0;
virtual bool isInvalid() const = 0;
virtual QString lastError() = 0;
Expand Down
52 changes: 52 additions & 0 deletions limereport/lrdatasourcemanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1689,6 +1689,28 @@ QVariant DataSourceManager::fieldDataByRowIndex(const QString &fieldName, int ro
return QVariant();
}

QVariant DataSourceManager::fieldDataByRowIndex(const QString &fieldName, int rowIndex, int role)
{
if(containsField(fieldName)) {
IDataSource *ds = dataSource(extractDataSource(fieldName));
if(ds) {
return ds->dataByRowIndex(extractFieldName(fieldName), rowIndex, role);
}
}
return QVariant();
}

QVariant DataSourceManager::fieldDataByRowIndex(const QString &fieldName, int rowIndex, const QString &roleName)
{
if(containsField(fieldName)) {
IDataSource *ds = dataSource(extractDataSource(fieldName));
if(ds) {
return ds->dataByRowIndex(extractFieldName(fieldName), rowIndex, roleName);
}
}
return QVariant();
}

QVariant DataSourceManager::fieldDataByKey(const QString& datasourceName, const QString& valueFieldName, const QString& keyFieldName, QVariant keyValue)
{
IDataSource* ds = dataSource(datasourceName);
Expand All @@ -1698,6 +1720,36 @@ QVariant DataSourceManager::fieldDataByKey(const QString& datasourceName, const
return QVariant();
}

QVariant DataSourceManager::headerData(const QString &fieldName, const QString &roleName)
{
if(containsField(fieldName)) {
IDataSource *ds = dataSource(extractDataSource(fieldName));
if(ds) {
return ds->headerData(extractFieldName(fieldName), roleName);
}
}
return QVariant();
}

QString DataSourceManager::columnName(const QString &datasourceName, int index)
{
IDataSource *ds = dataSource(datasourceName);
if(ds && !ds->isInvalid() && ds->columnCount() > index) {
return ds->columnNameByIndex(index);
}
return QString("unknown");
}

int DataSourceManager::columnCount(const QString &datasourceName)
{
IDataSource *ds = dataSource(datasourceName);
if(ds && !ds->isInvalid()) {
return ds->columnCount();
}

return -1;
}

void DataSourceManager::reopenDatasource(const QString& datasourceName)
{
QueryHolder* qh = dynamic_cast<QueryHolder*>(dataSourceHolder(datasourceName));
Expand Down
5 changes: 5 additions & 0 deletions limereport/lrdatasourcemanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -173,12 +173,17 @@ class DataSourceManager : public QObject, public ICollectionContainer, public IV
bool containsField(const QString& fieldName);
QVariant fieldData(const QString& fieldName);
QVariant fieldDataByRowIndex(const QString& fieldName, int rowIndex);
QVariant fieldDataByRowIndex(const QString &fieldName, int rowIndex, int role);
QVariant fieldDataByRowIndex(const QString &fieldName, int rowIndex, const QString &roleName);
QVariant fieldDataByKey(
const QString& datasourceName,
const QString& valueFieldName,
const QString& keyFieldName,
QVariant keyValue
);
QVariant headerData(const QString &fieldName, const QString &roleName);
QString columnName(const QString &datasourceName, int index);
int columnCount(const QString &datasourceName);
void reopenDatasource(const QString& datasourceName);

QString extractDataSource(const QString& fieldName);
Expand Down
Loading

0 comments on commit 5139ac0

Please sign in to comment.