Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsattributetableconfig.cpp - QgsAttributeTableConfig 3 : : 4 : : --------------------- 5 : : begin : 27.4.2016 6 : : copyright : (C) 2016 by mku 7 : : email : [your-email-here] 8 : : *************************************************************************** 9 : : * * 10 : : * This program is free software; you can redistribute it and/or modify * 11 : : * it under the terms of the GNU General Public License as published by * 12 : : * the Free Software Foundation; either version 2 of the License, or * 13 : : * (at your option) any later version. * 14 : : * * 15 : : ***************************************************************************/ 16 : : #include "qgsattributetableconfig.h" 17 : : #include "qgsfields.h" 18 : : #include <QStringList> 19 : : 20 : 0 : QVector<QgsAttributeTableConfig::ColumnConfig> QgsAttributeTableConfig::columns() const 21 : : { 22 : 0 : return mColumns; 23 : : } 24 : : 25 : 0 : bool QgsAttributeTableConfig::isEmpty() const 26 : : { 27 : 0 : return mColumns.isEmpty(); 28 : : } 29 : : 30 : 0 : int QgsAttributeTableConfig::mapVisibleColumnToIndex( int visibleColumn ) const 31 : : { 32 : 0 : for ( int i = 0; i < mColumns.size(); ++i ) 33 : : { 34 : 0 : if ( mColumns.at( i ).hidden ) 35 : : { 36 : 0 : visibleColumn++; 37 : 0 : continue; 38 : : } 39 : 0 : if ( visibleColumn == i ) 40 : 0 : return i; 41 : 0 : } 42 : 0 : return -1; 43 : 0 : } 44 : : 45 : 0 : void QgsAttributeTableConfig::setColumns( const QVector<ColumnConfig> &columns ) 46 : : { 47 : 0 : mColumns = columns; 48 : 0 : } 49 : : 50 : 0 : void QgsAttributeTableConfig::update( const QgsFields &fields ) 51 : : { 52 : 0 : QStringList columns; 53 : : 54 : 0 : bool containsActionColumn = false; 55 : : 56 : 0 : for ( int i = mColumns.count() - 1; i >= 0; --i ) 57 : : { 58 : 0 : const ColumnConfig &column = mColumns.at( i ); 59 : 0 : if ( column.type == Field ) 60 : : { 61 : 0 : if ( fields.indexOf( column.name ) == -1 ) 62 : : { 63 : 0 : mColumns.remove( i ); 64 : 0 : } 65 : : else 66 : : { 67 : 0 : columns.append( column.name ); 68 : : } 69 : 0 : } 70 : 0 : else if ( column.type == Action ) 71 : : { 72 : 0 : containsActionColumn = true; 73 : 0 : } 74 : 0 : } 75 : : 76 : 0 : for ( const auto &field : fields ) 77 : : { 78 : 0 : if ( !columns.contains( field.name() ) ) 79 : : { 80 : 0 : ColumnConfig newColumn; 81 : 0 : newColumn.hidden = false; 82 : 0 : newColumn.type = Field; 83 : 0 : newColumn.name = field.name(); 84 : : 85 : 0 : mColumns.append( newColumn ); 86 : 0 : } 87 : : } 88 : : 89 : 0 : if ( !containsActionColumn ) 90 : : { 91 : 0 : ColumnConfig actionConfig; 92 : : 93 : 0 : actionConfig.type = Action; 94 : 0 : actionConfig.hidden = true; 95 : : 96 : 0 : mColumns.append( actionConfig ); 97 : 0 : } 98 : 0 : } 99 : : 100 : 0 : bool QgsAttributeTableConfig::actionWidgetVisible() const 101 : : { 102 : 0 : const auto constMColumns = mColumns; 103 : 0 : for ( const ColumnConfig &columnConfig : constMColumns ) 104 : : { 105 : 0 : if ( columnConfig.type == Action && !columnConfig.hidden ) 106 : 0 : return true; 107 : : } 108 : 0 : return false; 109 : 0 : } 110 : : 111 : 0 : void QgsAttributeTableConfig::setActionWidgetVisible( bool visible ) 112 : : { 113 : 0 : for ( int i = 0; i < mColumns.size(); ++i ) 114 : : { 115 : 0 : if ( mColumns.at( i ).type == Action ) 116 : : { 117 : 0 : mColumns[i].hidden = !visible; 118 : 0 : } 119 : 0 : } 120 : 0 : } 121 : : 122 : 0 : QgsAttributeTableConfig::ActionWidgetStyle QgsAttributeTableConfig::actionWidgetStyle() const 123 : : { 124 : 0 : return mActionWidgetStyle; 125 : : } 126 : : 127 : 0 : void QgsAttributeTableConfig::setActionWidgetStyle( ActionWidgetStyle actionWidgetStyle ) 128 : : { 129 : 0 : mActionWidgetStyle = actionWidgetStyle; 130 : 0 : } 131 : : 132 : : 133 : 0 : void QgsAttributeTableConfig::readXml( const QDomNode &node ) 134 : : { 135 : 0 : mColumns.clear(); 136 : : 137 : 0 : QDomNode configNode = node.namedItem( QStringLiteral( "attributetableconfig" ) ); 138 : 0 : if ( !configNode.isNull() ) 139 : : { 140 : 0 : QDomNode columnsNode = configNode.toElement().namedItem( QStringLiteral( "columns" ) ); 141 : : 142 : 0 : QDomNodeList columns = columnsNode.childNodes(); 143 : : 144 : 0 : for ( int i = 0; i < columns.size(); ++i ) 145 : : { 146 : 0 : QDomElement columnElement = columns.at( i ).toElement(); 147 : : 148 : 0 : ColumnConfig column; 149 : : 150 : 0 : if ( columnElement.attribute( QStringLiteral( "type" ) ) == QLatin1String( "actions" ) ) 151 : : { 152 : 0 : column.type = Action; 153 : 0 : } 154 : : else 155 : : { 156 : 0 : column.type = Field; 157 : 0 : column.name = columnElement.attribute( QStringLiteral( "name" ) ); 158 : : } 159 : : 160 : 0 : column.hidden = columnElement.attribute( QStringLiteral( "hidden" ) ) == QLatin1String( "1" ); 161 : 0 : column.width = columnElement.attribute( QStringLiteral( "width" ), QStringLiteral( "-1" ) ).toDouble(); 162 : : 163 : 0 : mColumns.append( column ); 164 : 0 : } 165 : : 166 : 0 : if ( configNode.toElement().attribute( QStringLiteral( "actionWidgetStyle" ) ) == QLatin1String( "buttonList" ) ) 167 : 0 : mActionWidgetStyle = ButtonList; 168 : : else 169 : 0 : mActionWidgetStyle = DropDown; 170 : 0 : } 171 : : else 172 : : { 173 : : // Before QGIS 2.16 the attribute table would hide "Hidden" widgets. 174 : : // They are migrated to hidden columns here. 175 : 0 : QDomNodeList editTypeNodes = node.namedItem( QStringLiteral( "edittypes" ) ).childNodes(); 176 : : 177 : 0 : for ( int i = 0; i < editTypeNodes.size(); i++ ) 178 : : { 179 : 0 : QDomElement editTypeElement = editTypeNodes.at( i ).toElement(); 180 : : 181 : 0 : if ( editTypeElement.attribute( QStringLiteral( "widgetv2type" ) ) == QLatin1String( "Hidden" ) ) 182 : : { 183 : 0 : ColumnConfig column; 184 : : 185 : 0 : column.name = editTypeElement.attribute( QStringLiteral( "name" ) ); 186 : 0 : column.hidden = true; 187 : 0 : column.type = Field; 188 : 0 : mColumns.append( column ); 189 : 0 : } 190 : 0 : } 191 : 0 : } 192 : : 193 : 0 : mSortExpression = configNode.toElement().attribute( QStringLiteral( "sortExpression" ) ); 194 : 0 : Qt::SortOrder sortOrder = static_cast<Qt::SortOrder>( configNode.toElement().attribute( QStringLiteral( "sortOrder" ) ).toInt() ); 195 : 0 : setSortOrder( sortOrder ); 196 : 0 : } 197 : : 198 : 0 : QString QgsAttributeTableConfig::sortExpression() const 199 : : { 200 : 0 : return mSortExpression; 201 : : } 202 : : 203 : 0 : void QgsAttributeTableConfig::setSortExpression( const QString &sortExpression ) 204 : : { 205 : 0 : mSortExpression = sortExpression; 206 : 0 : } 207 : : 208 : 0 : int QgsAttributeTableConfig::columnWidth( int column ) const 209 : : { 210 : 0 : return mColumns.at( column ).width; 211 : : } 212 : : 213 : 0 : void QgsAttributeTableConfig::setColumnWidth( int column, int width ) 214 : : { 215 : 0 : mColumns[ column ].width = width; 216 : 0 : } 217 : : 218 : 0 : bool QgsAttributeTableConfig::columnHidden( int column ) const 219 : : { 220 : 0 : return mColumns.at( column ).hidden; 221 : : } 222 : : 223 : 0 : void QgsAttributeTableConfig::setColumnHidden( int column, bool hidden ) 224 : : { 225 : 0 : mColumns[ column ].hidden = hidden; 226 : 0 : } 227 : : 228 : 0 : bool QgsAttributeTableConfig::operator!=( const QgsAttributeTableConfig &other ) const 229 : : { 230 : 0 : return mSortExpression != other.mSortExpression || mColumns != other.mColumns || mActionWidgetStyle != other.mActionWidgetStyle || mSortOrder != other.mSortOrder; 231 : : } 232 : : 233 : 0 : Qt::SortOrder QgsAttributeTableConfig::sortOrder() const 234 : : { 235 : 0 : return mSortOrder; 236 : : } 237 : : 238 : 0 : void QgsAttributeTableConfig::setSortOrder( Qt::SortOrder sortOrder ) 239 : : { 240 : : // fix https://hub.qgis.org/issues/15803 241 : 0 : if ( sortOrder != Qt::AscendingOrder && sortOrder != Qt::DescendingOrder ) 242 : : { 243 : 0 : sortOrder = Qt::AscendingOrder; 244 : 0 : } 245 : : 246 : 0 : mSortOrder = sortOrder; 247 : 0 : } 248 : : 249 : 0 : void QgsAttributeTableConfig::writeXml( QDomNode &node ) const 250 : : { 251 : 0 : QDomDocument doc( node.ownerDocument() ); 252 : : 253 : 0 : QDomElement configElement = doc.createElement( QStringLiteral( "attributetableconfig" ) ); 254 : 0 : configElement.setAttribute( QStringLiteral( "actionWidgetStyle" ), mActionWidgetStyle == ButtonList ? "buttonList" : "dropDown" ); 255 : : 256 : 0 : configElement.setAttribute( QStringLiteral( "sortExpression" ), mSortExpression ); 257 : : 258 : 0 : configElement.setAttribute( QStringLiteral( "sortOrder" ), mSortOrder ); 259 : : 260 : 0 : QDomElement columnsElement = doc.createElement( QStringLiteral( "columns" ) ); 261 : : 262 : 0 : const auto constMColumns = mColumns; 263 : 0 : for ( const ColumnConfig &column : constMColumns ) 264 : : { 265 : 0 : QDomElement columnElement = doc.createElement( QStringLiteral( "column" ) ); 266 : : 267 : 0 : if ( column.type == Action ) 268 : : { 269 : 0 : columnElement.setAttribute( QStringLiteral( "type" ), QStringLiteral( "actions" ) ); 270 : 0 : } 271 : : else 272 : : { 273 : 0 : columnElement.setAttribute( QStringLiteral( "type" ), QStringLiteral( "field" ) ); 274 : 0 : columnElement.setAttribute( QStringLiteral( "name" ), column.name ); 275 : : } 276 : : 277 : 0 : columnElement.setAttribute( QStringLiteral( "hidden" ), column.hidden ); 278 : 0 : columnElement.setAttribute( QStringLiteral( "width" ), QString::number( column.width ) ); 279 : : 280 : 0 : columnsElement.appendChild( columnElement ); 281 : 0 : } 282 : : 283 : 0 : configElement.appendChild( columnsElement ); 284 : : 285 : 0 : node.appendChild( configElement ); 286 : 0 : } 287 : : 288 : 0 : bool QgsAttributeTableConfig::hasSameColumns( const QgsAttributeTableConfig &other ) const 289 : : { 290 : 0 : if ( columns().size() == other.columns().size() ) 291 : : { 292 : 0 : for ( int i = 0; i < columns().size(); i++ ) 293 : : { 294 : 0 : if ( columns().at( i ).name != other.columns().at( i ).name || 295 : 0 : columns().at( i ).type != other.columns().at( i ).type || 296 : 0 : columns().at( i ).hidden != other.columns().at( i ).hidden ) 297 : : { 298 : 0 : return false; 299 : : } 300 : 0 : } 301 : 0 : return true; 302 : : } 303 : : 304 : 0 : return false; 305 : 0 : } 306 : : 307 : 0 : bool QgsAttributeTableConfig::ColumnConfig::operator== ( const ColumnConfig &other ) const 308 : : { 309 : 0 : return type == other.type && name == other.name && hidden == other.hidden && width == other.width; 310 : : }