19#include "moc_qgsrasterlayertemporalpropertieswidget.cpp" 
   43  mFixedRangeLowerExpression = QStringLiteral( 
"make_datetime(%1,1,1,0,0,0) + make_interval(days:=@band)" ).arg( QDate::currentDate().year() );
 
   44  mFixedRangeUpperExpression = QStringLiteral( 
"make_datetime(%1,1,1,23,59,59) + make_interval(days:=@band)" ).arg( QDate::currentDate().year() );
 
   46  mExtraWidgetLayout = 
new QVBoxLayout();
 
   47  mExtraWidgetLayout->setContentsMargins( 0, 0, 0, 0 );
 
   48  mExtraWidgetLayout->addStretch();
 
   49  mExtraWidgetContainer->setLayout( mExtraWidgetLayout );
 
   81  mFixedRangePerBandModel = 
new QgsRasterBandFixedTemporalRangeModel( 
this );
 
   82  mBandRangesTable->verticalHeader()->setVisible( 
false );
 
   83  mBandRangesTable->setModel( mFixedRangePerBandModel );
 
   84  QgsFixedTemporalRangeDelegate *tableDelegate = 
new QgsFixedTemporalRangeDelegate( mBandRangesTable );
 
   85  mBandRangesTable->setItemDelegateForColumn( 1, tableDelegate );
 
   86  mBandRangesTable->setItemDelegateForColumn( 2, tableDelegate );
 
   88  connect( mModeComboBox, qOverload<int>( &QComboBox::currentIndexChanged ), 
this, &QgsRasterLayerTemporalPropertiesWidget::modeChanged );
 
   90  connect( mTemporalGroupBox, &QGroupBox::toggled, 
this, &QgsRasterLayerTemporalPropertiesWidget::temporalGroupBoxChecked );
 
   92  mFixedDateTimeEdit->setDisplayFormat( QStringLiteral( 
"yyyy-MM-dd HH:mm:ss" ) );
 
   93  mStartTemporalDateTimeEdit->setDisplayFormat( QStringLiteral( 
"yyyy-MM-dd HH:mm:ss" ) );
 
   94  mEndTemporalDateTimeEdit->setDisplayFormat( QStringLiteral( 
"yyyy-MM-dd HH:mm:ss" ) );
 
   95  mOffsetDateTimeEdit->setDisplayFormat( QStringLiteral( 
"yyyy-MM-dd HH:mm:ss" ) );
 
   97  QMenu *calculateFixedRangePerBandMenu = 
new QMenu( mCalculateFixedRangePerBandButton );
 
   98  mCalculateFixedRangePerBandButton->setMenu( calculateFixedRangePerBandMenu );
 
   99  mCalculateFixedRangePerBandButton->setPopupMode( QToolButton::InstantPopup );
 
  100  QAction *calculateLowerAction = 
new QAction( 
"Calculate Beginning by Expression…", calculateFixedRangePerBandMenu );
 
  101  calculateFixedRangePerBandMenu->addAction( calculateLowerAction );
 
  102  connect( calculateLowerAction, &QAction::triggered, 
this, [
this] {
 
  103    calculateRangeByExpression( 
false );
 
  105  QAction *calculateUpperAction = 
new QAction( 
"Calculate End by Expression…", calculateFixedRangePerBandMenu );
 
  106  calculateFixedRangePerBandMenu->addAction( calculateUpperAction );
 
  107  connect( calculateUpperAction, &QAction::triggered, 
this, [
this] {
 
  108    calculateRangeByExpression( 
true );
 
 
  122  temporalProperties->
setBandNumber( mBandComboBox->currentBand() );
 
  124  switch ( temporalProperties->
mode() )
 
 
  161  mModeComboBox->setCurrentIndex( mModeComboBox->findData( QVariant::fromValue( temporalProperties->
mode() ) ) );
 
  162  switch ( temporalProperties->
mode() )
 
  165      mStackedWidget->setCurrentWidget( mPageAutomatic );
 
  168      mStackedWidget->setCurrentWidget( mPageFixedDateTime );
 
  171      mStackedWidget->setCurrentWidget( mPageFixedRange );
 
  174      mStackedWidget->setCurrentWidget( mPageRedrawOnly );
 
  177      mStackedWidget->setCurrentWidget( mPageFixedRangePerBand );
 
  180      mStackedWidget->setCurrentWidget( mPageRepresentsTemporalValues );
 
  186    mWidgetFixedRangePerBand->hide();
 
  187    mFixedRangePerBandLabel->setText( tr( 
"This mode cannot be used with a multi-band renderer." ) );
 
  190  mBandComboBox->setLayer( mLayer );
 
  191  mBandComboBox->setBand( temporalProperties->
bandNumber() );
 
  197  mFixedRangePerBandModel->setLayerData( mLayer, temporalProperties->
fixedRangePerBand() );
 
  198  mBandRangesTable->horizontalHeader()->setSectionResizeMode( 0, QHeaderView::Stretch );
 
  199  mBandRangesTable->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::Stretch );
 
  200  mBandRangesTable->horizontalHeader()->setSectionResizeMode( 2, QHeaderView::Stretch );
 
  207  mTemporalGroupBox->setChecked( temporalProperties->
isActive() );
 
  211    widget->syncToLayer( mLayer );
 
 
  217  mExtraWidgets << widget;
 
  218  mExtraWidgetLayout->insertWidget( mExtraWidgetLayout->count() - 1, widget );
 
 
  221void QgsRasterLayerTemporalPropertiesWidget::temporalGroupBoxChecked( 
bool checked )
 
  225    widget->emit dynamicTemporalControlToggled( checked );
 
  229void QgsRasterLayerTemporalPropertiesWidget::modeChanged()
 
  231  if ( mModeComboBox->currentData().isValid() )
 
  236        mStackedWidget->setCurrentWidget( mPageAutomatic );
 
  239        mStackedWidget->setCurrentWidget( mPageFixedDateTime );
 
  242        mStackedWidget->setCurrentWidget( mPageFixedRange );
 
  245        mStackedWidget->setCurrentWidget( mPageRedrawOnly );
 
  248        mStackedWidget->setCurrentWidget( mPageFixedRangePerBand );
 
  251        mStackedWidget->setCurrentWidget( mPageRepresentsTemporalValues );
 
  257void QgsRasterLayerTemporalPropertiesWidget::calculateRangeByExpression( 
bool isUpper )
 
  267  expressionContext.
setHighlightedVariables( { QStringLiteral( 
"band" ), QStringLiteral( 
"band_name" ), QStringLiteral( 
"band_description" ) } );
 
  270  dlg.
setExpectedOutputFormat( !isUpper ? tr( 
"Temporal range start date / time" ) : tr( 
"Temporal range end date / time" ) );
 
  272  QList<QPair<QString, QVariant>> bandChoices;
 
  273  for ( 
int band = 1; band <= mLayer->
bandCount(); ++band )
 
  278    return createExpressionContextForBand( value.toInt() );
 
  289    exp.prepare( &expressionContext );
 
  290    for ( 
int band = 1; band <= mLayer->
bandCount(); ++band )
 
  292      bandScope->
setVariable( QStringLiteral( 
"band" ), band );
 
  296      const QVariant res = exp.evaluate( &expressionContext );
 
  297      mFixedRangePerBandModel->setData( mFixedRangePerBandModel->index( band - 1, isUpper ? 2 : 1 ), res, Qt::EditRole );
 
  302QgsExpressionContext QgsRasterLayerTemporalPropertiesWidget::createExpressionContextForBand( 
int band )
 const 
  311  context.
setHighlightedVariables( { QStringLiteral( 
"band" ), QStringLiteral( 
"band_name" ), QStringLiteral( 
"band_description" ) } );
 
  321QgsRasterBandFixedTemporalRangeModel::QgsRasterBandFixedTemporalRangeModel( QObject *parent )
 
  322  : QAbstractItemModel( parent )
 
  326int QgsRasterBandFixedTemporalRangeModel::columnCount( 
const QModelIndex & )
 const 
  331int QgsRasterBandFixedTemporalRangeModel::rowCount( 
const QModelIndex &parent )
 const 
  333  if ( parent.isValid() )
 
  338QModelIndex QgsRasterBandFixedTemporalRangeModel::index( 
int row, 
int column, 
const QModelIndex &parent )
 const 
  340  if ( hasIndex( row, column, parent ) )
 
  342    return createIndex( row, column, row );
 
  345  return QModelIndex();
 
  348QModelIndex QgsRasterBandFixedTemporalRangeModel::parent( 
const QModelIndex &child )
 const 
  351  return QModelIndex();
 
  354Qt::ItemFlags QgsRasterBandFixedTemporalRangeModel::flags( 
const QModelIndex &index )
 const 
  356  if ( !index.isValid() )
 
  357    return Qt::ItemFlags();
 
  359  if ( index.row() < 0 || index.row() >= mBandCount || index.column() < 0 || index.column() >= columnCount() )
 
  360    return Qt::ItemFlags();
 
  362  switch ( index.column() )
 
  365      return Qt::ItemFlag::ItemIsEnabled;
 
  368      return Qt::ItemFlag::ItemIsEnabled | Qt::ItemFlag::ItemIsEditable | Qt::ItemFlag::ItemIsSelectable;
 
  373  return Qt::ItemFlags();
 
  376QVariant QgsRasterBandFixedTemporalRangeModel::data( 
const QModelIndex &index, 
int role )
 const 
  378  if ( !index.isValid() )
 
  381  if ( index.row() < 0 || index.row() >= mBandCount || index.column() < 0 || index.column() >= columnCount() )
 
  384  const int band = index.row() + 1;
 
  389    case Qt::DisplayRole:
 
  391    case Qt::ToolTipRole:
 
  393      switch ( index.column() )
 
  396          return mBandNames.value( band, QString::number( band ) );
 
  399          return range.
begin().isValid() ? range.
begin() : QVariant();
 
  402          return range.
end().isValid() ? range.
end() : QVariant();
 
  410    case Qt::TextAlignmentRole:
 
  412      switch ( index.column() )
 
  415          return static_cast<Qt::Alignment::Int
>( Qt::AlignLeft | Qt::AlignVCenter );
 
  419          return static_cast<Qt::Alignment::Int
>( Qt::AlignRight | Qt::AlignVCenter );
 
  432QVariant QgsRasterBandFixedTemporalRangeModel::headerData( 
int section, Qt::Orientation orientation, 
int role )
 const 
  434  if ( role == Qt::DisplayRole && orientation == Qt::Horizontal )
 
  441        return tr( 
"Begin" );
 
  448  return QAbstractItemModel::headerData( section, orientation, role );
 
  451bool QgsRasterBandFixedTemporalRangeModel::setData( 
const QModelIndex &index, 
const QVariant &value, 
int role )
 
  453  if ( !index.isValid() )
 
  456  if ( index.row() > mBandCount || index.row() < 0 )
 
  459  const int band = index.row() + 1;
 
  466      const QDateTime newValue = value.toDateTime();
 
  467      if ( !newValue.isValid() )
 
  470      switch ( index.column() )
 
  475          emit dataChanged( index, index, QVector<int>() << role );
 
  481          emit dataChanged( index, index, QVector<int>() << role );
 
  497void QgsRasterBandFixedTemporalRangeModel::setLayerData( 
QgsRasterLayer *layer, 
const QMap<int, QgsDateTimeRange> &ranges )
 
  505  for ( 
int band = 1; band <= mBandCount; ++band )
 
  517QgsFixedTemporalRangeDelegate::QgsFixedTemporalRangeDelegate( QObject *parent )
 
  518  : QStyledItemDelegate( parent )
 
  522QWidget *QgsFixedTemporalRangeDelegate::createEditor( QWidget *parent, 
const QStyleOptionViewItem &, 
const QModelIndex & )
 const 
  529void QgsFixedTemporalRangeDelegate::setModelData( QWidget *editor, QAbstractItemModel *model, 
const QModelIndex &index )
 const 
  531  if ( 
QgsDateTimeEdit *dateTimeEdit = qobject_cast<QgsDateTimeEdit *>( editor ) )
 
  533    model->setData( index, dateTimeEdit->dateTime() );
 
TemporalUnit
Temporal units.
 
@ Milliseconds
Milliseconds.
 
RasterTemporalMode
Raster layer temporal modes.
 
@ RepresentsTemporalValues
Pixel values represent an datetime.
 
@ RedrawLayerOnly
Redraw the layer when temporal range changes, but don't apply any filtering. Useful when raster symbo...
 
@ FixedRangePerBand
Layer has a fixed temporal range per band.
 
@ TemporalRangeFromDataProvider
Mode when raster layer delegates temporal range handling to the dataprovider.
 
@ FixedTemporalRange
Mode when temporal properties have fixed start and end datetimes.
 
@ FixedDateTime
Layer has a fixed date time instant.
 
@ UsesMultipleBands
The renderer utilizes multiple raster bands for color data (note that alpha bands are not considered ...
 
static QgsRasterRendererRegistry * rasterRendererRegistry()
Returns the application's raster renderer registry, used for managing raster layer renderers.
 
bool hasTemporalCapabilities() const
Returns true if the provider has temporal capabilities available.
 
A QDateTimeEdit with the capability of setting/reading null date/times.
 
void setAllowNull(bool allowNull)
Determines if the widget allows setting null date/time.
 
A generic dialog for building expression strings.
 
void setExpectedOutputFormat(const QString &expected)
Set the expected format string, which is shown in the dialog.
 
QgsExpressionBuilderWidget * expressionBuilder()
The builder widget that is used by the dialog.
 
Single scope for storing variables and functions for use within a QgsExpressionContext.
 
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
 
void setVariable(const QString &name, const QVariant &value, bool isStatic=false)
Convenience method for setting a variable in the context scope by name name and value.
 
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer's project and layer.
 
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
 
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
 
void setHighlightedVariables(const QStringList &variableNames)
Sets the list of variable names within the context intended to be highlighted to the user.
 
void appendScopes(const QList< QgsExpressionContextScope * > &scopes)
Appends a list of scopes to the end of the context.
 
Handles parsing and evaluation of expressions (formerly called "search strings").
 
A representation of the interval between two datetime values.
 
double originalDuration() const
Returns the original interval duration.
 
Qgis::TemporalUnit originalUnit() const
Returns the original interval temporal unit.
 
QgsRasterDataProviderTemporalCapabilities * temporalCapabilities() override
Returns the provider's temporal capabilities.
 
virtual QString bandDescription(int bandNumber)
Returns the description for band bandNumber, or an empty string if the band is not valid or has not d...
 
QString displayBandName(int bandNumber) const
Generates a friendly, descriptive name for the specified bandNumber.
 
Implementation of map layer temporal properties for raster layers.
 
QDateTime temporalRepresentationOffset() const
Returns the temporal offset, which is a fixed datetime which should be added to individual pixel valu...
 
void setTemporalRepresentationOffset(const QDateTime &offset)
Sets the temporal offset, which is a fixed datetime which should be added to individual pixel values ...
 
const QgsInterval & temporalRepresentationScale() const
Returns the scale, which is an interval factor which should be applied to individual pixel values fro...
 
Qgis::RasterTemporalMode mode() const
Returns the temporal properties mode.
 
void setTemporalRepresentationScale(const QgsInterval &scale)
Sets the scale, which is an interval factor which should be applied to individual pixel values from t...
 
void setMode(Qgis::RasterTemporalMode mode)
Sets the temporal properties mode.
 
void setFixedTemporalRange(const QgsDateTimeRange &range)
Sets a temporal range to apply to the whole layer.
 
void setFixedRangePerBand(const QMap< int, QgsDateTimeRange > &ranges)
Sets the fixed temporal range for each band.
 
QMap< int, QgsDateTimeRange > fixedRangePerBand() const
Returns the fixed temporal range for each band.
 
int bandNumber() const
Returns the band number from which temporal values should be taken.
 
const QgsDateTimeRange & fixedTemporalRange() const
Returns the fixed temporal range for the layer.
 
void setBandNumber(int number)
Sets the band number from which temporal values should be taken.
 
Represents a raster layer.
 
int bandCount() const
Returns the number of bands in this layer.
 
QgsMapLayerTemporalProperties * temporalProperties() override
Returns the layer's temporal properties.
 
QgsRasterRenderer * renderer() const
Returns the raster's renderer.
 
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
 
Qgis::RasterRendererCapabilities rendererCapabilities(const QString &rendererName) const
Returns the capabilities for the renderer with the specified name.
 
virtual QString type() const
Returns a unique string representation of the renderer type.
 
bool isActive() const
Returns true if the temporal property is active.
 
void setIsActive(bool active)
Sets whether the temporal property is active.
 
T begin() const
Returns the beginning of the range.
 
T end() const
Returns the upper bound of the range.
 
bool includeEnd() const
Returns true if the end is inclusive, or false if the end is exclusive.
 
bool includeBeginning() const
Returns true if the beginning is inclusive, or false if the beginning is exclusive.
 
static Q_INVOKABLE QString toString(Qgis::DistanceUnit unit)
Returns a translated string representing a distance unit.
 
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.
 
Single variable definition for use within a QgsExpressionContextScope.