QGIS API Documentation  3.23.0-Master (c716e02dd3)
qgsmultiedittoolbutton.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmultiedittoolbutton.cpp
3  --------------------------
4  Date : March 2016
5  Copyright : (C) 2016 Nyall Dawson
6  Email : nyall dot dawson at gmail.com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include "qgsmultiedittoolbutton.h"
17 #include "qgsapplication.h"
18 #include "qgsguiutils.h"
19 
20 #include <QMenu>
22  : QToolButton( parent )
23 {
24  setFocusPolicy( Qt::StrongFocus );
25 
26  // set default tool button icon properties
27  setStyleSheet( QStringLiteral( "QToolButton{ background: none; border: 1px solid rgba(0, 0, 0, 0%);} QToolButton:focus { border: 1px solid palette(highlight); }" ) );
28 
29  const int iconSize = QgsGuiUtils::scaleIconSize( 24 );
30  setIconSize( QSize( iconSize, iconSize ) );
31  // button width is 1.25 * icon size, height 1.1 * icon size. But we round to ensure even pixel sizes for equal margins
32  setFixedSize( 2 * static_cast< int >( 1.25 * iconSize / 2.0 ), 2 * static_cast< int >( iconSize * 1.1 / 2.0 ) );
33 
34  setPopupMode( QToolButton::InstantPopup );
35 
36  mMenu = new QMenu( this );
37  connect( mMenu, &QMenu::aboutToShow, this, &QgsMultiEditToolButton::aboutToShowMenu );
38  setMenu( mMenu );
39 
40  // sets initial appearance
41  updateState();
42 }
43 
44 void QgsMultiEditToolButton::aboutToShowMenu()
45 {
46  mMenu->clear();
47 
48  switch ( mState )
49  {
50  case Default:
51  {
52  QAction *noAction = mMenu->addAction( tr( "No Changes to Commit" ) );
53  noAction->setEnabled( false );
54  break;
55  }
56  case MixedValues:
57  {
58  const QString title = !mField.name().isEmpty() ? tr( "Set %1 for All Selected Features" ).arg( mField.name() )
59  : tr( "Set field for all selected features" );
60  QAction *setFieldAction = mMenu->addAction( title );
61  connect( setFieldAction, &QAction::triggered, this, &QgsMultiEditToolButton::setFieldTriggered );
62  break;
63  }
64  case Changed:
65  {
66  QAction *resetFieldAction = mMenu->addAction( tr( "Reset to Original Values" ) );
67  connect( resetFieldAction, &QAction::triggered, this, &QgsMultiEditToolButton::resetFieldTriggered );
68  break;
69  }
70  }
71 }
72 
73 void QgsMultiEditToolButton::setFieldTriggered()
74 {
75  mIsChanged = true;
76  updateState();
78 }
79 
80 void QgsMultiEditToolButton::resetFieldTriggered()
81 {
82  mIsChanged = false;
83  updateState();
85 }
86 
87 void QgsMultiEditToolButton::updateState()
88 {
89  //changed state takes priority over mixed values state
90  if ( mIsChanged )
91  mState = Changed;
92  else if ( mIsMixedValues )
93  mState = MixedValues;
94  else
95  mState = Default;
96 
97  QIcon icon;
98  QString tooltip;
99  switch ( mState )
100  {
101  case Default:
102  icon = QgsApplication::getThemeIcon( QStringLiteral( "/multieditSameValues.svg" ) );
103  tooltip = tr( "All features in selection have equal value for '%1'" ).arg( mField.name() );
104  break;
105  case MixedValues:
106  icon = QgsApplication::getThemeIcon( QStringLiteral( "/multieditMixedValues.svg" ) );
107  tooltip = tr( "Some features in selection have different values for '%1'" ).arg( mField.name() );
108  break;
109  case Changed:
110  icon = QgsApplication::getThemeIcon( QStringLiteral( "/multieditChangedValues.svg" ) );
111  tooltip = tr( "Values for '%1' have unsaved changes" ).arg( mField.name() );
112  break;
113  }
114 
115  setIcon( icon );
116  setToolTip( tooltip );
117 }
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
QString name
Definition: qgsfield.h:60
@ Changed
Value for widget has changed but changes have not yet been committed.
@ MixedValues
Mixed state, some features have different values for the widget.
@ Default
Default state, all features have same value for widget.
void resetFieldValueTriggered()
Emitted when the "reset to original values" option is selected.
QgsMultiEditToolButton(QWidget *parent=nullptr)
Constructor for QgsMultiEditToolButton.
void setFieldValueTriggered()
Emitted when the "set field value for all features" option is selected.
QSize iconSize(bool dockableToolbar)
Returns the user-preferred size of a window's toolbar icons.
int scaleIconSize(int standardSize)
Scales an icon size to compensate for display pixel density, making the icon size hi-dpi friendly,...