Skip to content

Commit fc8493f

Browse files
authored
Merge pull request #3851 from nirvn/raster_ui_improvements
Raster renderer UI improvements
2 parents 8ec3eaf + ffb6ba7 commit fc8493f

5 files changed

+126
-7
lines changed

src/gui/raster/qgspalettedrendererwidget.cpp

+37-3
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,24 @@
2020
#include "qgsrasterdataprovider.h"
2121
#include "qgsrasterlayer.h"
2222
#include "qgscolordialog.h"
23+
2324
#include <QColorDialog>
25+
#include <QInputDialog>
26+
#include <QMenu>
2427

2528
QgsPalettedRendererWidget::QgsPalettedRendererWidget( QgsRasterLayer* layer, const QgsRectangle &extent ): QgsRasterRendererWidget( layer, extent )
2629
{
2730
setupUi( this );
2831

32+
contextMenu = new QMenu( tr( "Options" ), this );
33+
contextMenu->addAction( tr( "Change color" ), this, SLOT( changeColor() ) );
34+
35+
mTreeWidget->setColumnWidth( ColorColumn, 50 );
36+
mTreeWidget->setContextMenuPolicy( Qt::CustomContextMenu );
37+
mTreeWidget->setSelectionMode( QAbstractItemView::ExtendedSelection );
38+
connect( mTreeWidget, &QTreeView::customContextMenuRequested, [=]( const QPoint& ) { contextMenu->exec( QCursor::pos() ); }
39+
);
40+
2941
if ( mRasterLayer )
3042
{
3143
QgsRasterDataProvider* provider = mRasterLayer->dataProvider();
@@ -72,7 +84,7 @@ QgsRasterRenderer* QgsPalettedRendererWidget::renderer()
7284

7385
void QgsPalettedRendererWidget::on_mTreeWidget_itemDoubleClicked( QTreeWidgetItem * item, int column )
7486
{
75-
if ( column == 1 && item ) //change item color
87+
if ( column == ColorColumn && item ) //change item color
7688
{
7789
item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
7890
QColor c = QgsColorDialog::getColor( item->background( column ).color(), nullptr );
@@ -82,15 +94,15 @@ void QgsPalettedRendererWidget::on_mTreeWidget_itemDoubleClicked( QTreeWidgetIte
8294
emit widgetChanged();
8395
}
8496
}
85-
else if ( column == 2 && item )
97+
else if ( column == LabelColumn && item )
8698
{
8799
item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable );
88100
}
89101
}
90102

91103
void QgsPalettedRendererWidget::on_mTreeWidget_itemChanged( QTreeWidgetItem * item, int column )
92104
{
93-
if ( column == 2 && item ) //palette label modified
105+
if ( column == LabelColumn && item ) //palette label modified
94106
{
95107
emit widgetChanged();
96108
}
@@ -133,3 +145,25 @@ void QgsPalettedRendererWidget::setFromRenderer( const QgsRasterRenderer* r )
133145
}
134146
}
135147
}
148+
149+
void QgsPalettedRendererWidget::changeColor()
150+
{
151+
QList<QTreeWidgetItem *> itemList;
152+
itemList = mTreeWidget->selectedItems();
153+
if ( itemList.isEmpty() )
154+
{
155+
return;
156+
}
157+
QTreeWidgetItem* firstItem = itemList.first();
158+
159+
QColor newColor = QgsColorDialog::getColor( firstItem->background( ColorColumn ).color(), this, QStringLiteral( "Change color" ), true );
160+
if ( newColor.isValid() )
161+
{
162+
Q_FOREACH ( QTreeWidgetItem *item, itemList )
163+
{
164+
item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
165+
item->setBackground( ColorColumn, QBrush( newColor ) );
166+
}
167+
emit widgetChanged();
168+
}
169+
}

src/gui/raster/qgspalettedrendererwidget.h

+14
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class GUI_EXPORT QgsPalettedRendererWidget: public QgsRasterRendererWidget, priv
3131
Q_OBJECT
3232

3333
public:
34+
3435
QgsPalettedRendererWidget( QgsRasterLayer* layer, const QgsRectangle &extent = QgsRectangle() );
3536
static QgsRasterRendererWidget* create( QgsRasterLayer* layer, const QgsRectangle &theExtent ) { return new QgsPalettedRendererWidget( layer, theExtent ); }
3637
~QgsPalettedRendererWidget();
@@ -39,9 +40,22 @@ class GUI_EXPORT QgsPalettedRendererWidget: public QgsRasterRendererWidget, priv
3940

4041
void setFromRenderer( const QgsRasterRenderer* r );
4142

43+
private:
44+
45+
enum Column
46+
{
47+
ValueColumn = 0,
48+
ColorColumn = 1,
49+
LabelColumn = 2,
50+
};
51+
52+
QMenu* contextMenu;
53+
4254
private slots:
55+
4356
void on_mTreeWidget_itemDoubleClicked( QTreeWidgetItem * item, int column );
4457
void on_mTreeWidget_itemChanged( QTreeWidgetItem * item, int column );
58+
void changeColor();
4559
};
4660

4761
#endif // QGSPALETTEDRENDERERWIDGET_H

src/gui/raster/qgssinglebandpseudocolorrendererwidget.cpp

+70-3
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,15 @@
2929
#include "qgscolorrampbutton.h"
3030
#include "qgscolordialog.h"
3131

32+
#include <QCursor>
3233
#include <QPushButton>
34+
#include <QInputDialog>
3335
#include <QFileDialog>
36+
#include <QMenu>
3437
#include <QMessageBox>
3538
#include <QSettings>
3639
#include <QTextStream>
40+
#include <QTreeView>
3741

3842
QgsSingleBandPseudoColorRendererWidget::QgsSingleBandPseudoColorRendererWidget( QgsRasterLayer* layer, const QgsRectangle &extent )
3943
: QgsRasterRendererWidget( layer, extent )
@@ -44,7 +48,15 @@ QgsSingleBandPseudoColorRendererWidget::QgsSingleBandPseudoColorRendererWidget(
4448

4549
setupUi( this );
4650

51+
contextMenu = new QMenu( tr( "Options" ), this );
52+
contextMenu->addAction( tr( "Change color" ), this, SLOT( changeColor() ) );
53+
contextMenu->addAction( tr( "Change transparency" ), this, SLOT( changeTransparency() ) );
54+
4755
mColormapTreeWidget->setColumnWidth( ColorColumn, 50 );
56+
mColormapTreeWidget->setContextMenuPolicy( Qt::CustomContextMenu );
57+
mColormapTreeWidget->setSelectionMode( QAbstractItemView::ExtendedSelection );
58+
connect( mColormapTreeWidget, &QTreeView::customContextMenuRequested, [=]( const QPoint& ) { contextMenu->exec( QCursor::pos() ); }
59+
);
4860

4961
QString defaultPalette = settings.value( QStringLiteral( "/Raster/defaultPalette" ), "" ).toString();
5062
btnColorRamp->setColorRampFromName( defaultPalette );
@@ -303,10 +315,16 @@ void QgsSingleBandPseudoColorRendererWidget::on_mAddEntryButton_clicked()
303315

304316
void QgsSingleBandPseudoColorRendererWidget::on_mDeleteEntryButton_clicked()
305317
{
306-
QTreeWidgetItem* currentItem = mColormapTreeWidget->currentItem();
307-
if ( currentItem )
318+
QList<QTreeWidgetItem *> itemList;
319+
itemList = mColormapTreeWidget->selectedItems();
320+
if ( itemList.isEmpty() )
321+
{
322+
return;
323+
}
324+
325+
Q_FOREACH ( QTreeWidgetItem *item, itemList )
308326
{
309-
delete currentItem;
327+
delete item;
310328
}
311329
emit widgetChanged();
312330
}
@@ -775,6 +793,7 @@ void QgsSingleBandPseudoColorRendererWidget::mColormapTreeWidget_itemEdited( QTr
775793
{
776794
// call autoLabel to fill when empty or gray out when same as autoLabel
777795
autoLabel();
796+
emit widgetChanged();
778797
}
779798
}
780799

@@ -928,3 +947,51 @@ void QgsSingleBandPseudoColorRendererWidget::resetClassifyButton()
928947
mClassifyButton->setEnabled( false );
929948
}
930949
}
950+
951+
void QgsSingleBandPseudoColorRendererWidget::changeColor()
952+
{
953+
QList<QTreeWidgetItem *> itemList;
954+
itemList = mColormapTreeWidget->selectedItems();
955+
if ( itemList.isEmpty() )
956+
{
957+
return;
958+
}
959+
QTreeWidgetItem* firstItem = itemList.first();
960+
961+
QColor newColor = QgsColorDialog::getColor( firstItem->background( ColorColumn ).color(), this, QStringLiteral( "Change color" ), true );
962+
if ( newColor.isValid() )
963+
{
964+
Q_FOREACH ( QTreeWidgetItem *item, itemList )
965+
{
966+
item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
967+
item->setBackground( ColorColumn, QBrush( newColor ) );
968+
}
969+
emit widgetChanged();
970+
}
971+
}
972+
973+
void QgsSingleBandPseudoColorRendererWidget::changeTransparency()
974+
{
975+
QList<QTreeWidgetItem *> itemList;
976+
itemList = mColormapTreeWidget->selectedItems();
977+
if ( itemList.isEmpty() )
978+
{
979+
return;
980+
}
981+
QTreeWidgetItem* firstItem = itemList.first();
982+
983+
bool ok;
984+
double oldTransparency = firstItem->background( ColorColumn ).color().alpha() / 255 * 100;
985+
double transparency = QInputDialog::getDouble( this, tr( "Transparency" ), tr( "Change symbol transparency [%]" ), oldTransparency, 0.0, 100.0, 0, &ok );
986+
if ( ok )
987+
{
988+
int newTransparency = transparency / 100 * 255;
989+
Q_FOREACH ( QTreeWidgetItem *item, itemList )
990+
{
991+
QColor newColor = item->background( ColorColumn ).color();
992+
newColor.setAlpha( newTransparency );
993+
item->setBackground( ColorColumn, QBrush( newColor ) );
994+
}
995+
emit widgetChanged();
996+
}
997+
}

src/gui/raster/qgssinglebandpseudocolorrendererwidget.h

+4
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ class GUI_EXPORT QgsSingleBandPseudoColorRendererWidget: public QgsRasterRendere
7272
void autoLabel();
7373
void setUnitFromLabels();
7474

75+
QMenu* contextMenu;
76+
7577
private slots:
7678

7779
void applyColorRamp();
@@ -90,6 +92,8 @@ class GUI_EXPORT QgsSingleBandPseudoColorRendererWidget: public QgsRasterRendere
9092
void on_mMinLineEdit_textEdited( const QString & text ) { Q_UNUSED( text ); mMinMaxOrigin = QgsRasterRenderer::MinMaxUser; showMinMaxOrigin(); }
9193
void on_mMaxLineEdit_textEdited( const QString & text ) { Q_UNUSED( text ); mMinMaxOrigin = QgsRasterRenderer::MinMaxUser; showMinMaxOrigin(); }
9294
void on_mClassificationModeComboBox_currentIndexChanged( int index );
95+
void changeColor();
96+
void changeTransparency();
9397

9498
private:
9599

src/ui/qgssinglebandpseudocolorrendererwidgetbase.ui

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@
127127
<item>
128128
<widget class="QPushButton" name="mDeleteEntryButton">
129129
<property name="toolTip">
130-
<string>Remove selected row</string>
130+
<string>Remove selected row(s)</string>
131131
</property>
132132
<property name="icon">
133133
<iconset resource="../../images/images.qrc">

0 commit comments

Comments
 (0)