/*************************************************************************** qgstabpositionwidget.h --------------------- begin : October 2024 copyright : (C) 2024 by Nyall Dawson email : nyall dot dawson at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "qgstabpositionwidget.h" #include "qgsapplication.h" #include "qgsdoublevalidator.h" #include QgsTabPositionWidget::QgsTabPositionWidget( QWidget *parent ) : QgsPanelWidget( parent ) { setupUi( this ); mAddButton->setIcon( QgsApplication::getThemeIcon( "symbologyAdd.svg" ) ); mRemoveButton->setIcon( QgsApplication::getThemeIcon( "symbologyRemove.svg" ) ); connect( mAddButton, &QPushButton::clicked, this, &QgsTabPositionWidget::mAddButton_clicked ); connect( mRemoveButton, &QPushButton::clicked, this, &QgsTabPositionWidget::mRemoveButton_clicked ); connect( mTabPositionTreeWidget, &QTreeWidget::itemChanged, this, &QgsTabPositionWidget::emitPositionsChanged ); } void QgsTabPositionWidget::setPositions( const QList &positions ) { mTabPositionTreeWidget->clear(); for ( const QgsTextFormat::Tab &tab : positions ) { QTreeWidgetItem *entry = new QTreeWidgetItem(); entry->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled ); entry->setText( 0, QLocale().toString( tab.position() ) ); entry->setData( 0, Qt::EditRole, tab.position() ); mTabPositionTreeWidget->addTopLevelItem( entry ); } } QList QgsTabPositionWidget::positions() const { QList result; const int nTopLevelItems = mTabPositionTreeWidget->topLevelItemCount(); result.reserve( nTopLevelItems ); for ( int i = 0; i < nTopLevelItems; ++i ) { if ( QTreeWidgetItem *currentItem = mTabPositionTreeWidget->topLevelItem( i ) ) { result << QgsTextFormat::Tab( QgsDoubleValidator::toDouble( currentItem->text( 0 ) ) ); } } std::sort( result.begin(), result.end(), []( const QgsTextFormat::Tab & a, const QgsTextFormat::Tab & b ) { return a.position() < b.position(); } ); return result; } void QgsTabPositionWidget::mAddButton_clicked() { const QList< QgsTextFormat::Tab > currentPositions = positions(); double newPosition = 6; if ( !currentPositions.empty() ) { newPosition = currentPositions.last().position() + 6; } QTreeWidgetItem *entry = new QTreeWidgetItem(); entry->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled ); entry->setText( 0, QLocale().toString( newPosition ) ); entry->setData( 0, Qt::EditRole, newPosition ); mTabPositionTreeWidget->addTopLevelItem( entry ); emitPositionsChanged(); } void QgsTabPositionWidget::mRemoveButton_clicked() { if ( QTreeWidgetItem *currentItem = mTabPositionTreeWidget->currentItem() ) { mTabPositionTreeWidget->takeTopLevelItem( mTabPositionTreeWidget->indexOfTopLevelItem( currentItem ) ); } emitPositionsChanged(); } void QgsTabPositionWidget::emitPositionsChanged() { emit positionsChanged( positions() ); } QgsTabPositionDialog::QgsTabPositionDialog( QWidget *parent, Qt::WindowFlags f ) : QDialog( parent, f ) { QVBoxLayout *vLayout = new QVBoxLayout(); mWidget = new QgsTabPositionWidget(); vLayout->addWidget( mWidget ); QDialogButtonBox *bbox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal ); connect( bbox, &QDialogButtonBox::accepted, this, &QgsTabPositionDialog::accept ); connect( bbox, &QDialogButtonBox::rejected, this, &QgsTabPositionDialog::reject ); vLayout->addWidget( bbox ); setLayout( vLayout ); setWindowTitle( tr( "Tab Positions" ) ); } void QgsTabPositionDialog::setPositions( const QList &positions ) { mWidget->setPositions( positions ); } QList QgsTabPositionDialog::positions() const { return mWidget->positions(); }