1 /***************************************************************************
2     qgspresetcolorrampdialog.cpp
3     ----------------------------
4     begin                : September 2016
5     copyright            : (C) 2016 by Nyall Dawson
6     email                : nyall dot dawson at gmail dot 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 "qgspresetcolorrampdialog.h"
17 
18 #include "qgssymbollayerutils.h"
19 #include "qgscolordialog.h"
20 #include <QFileDialog>
21 #include <QAbstractButton>
22 #include <QDialogButtonBox>
23 #include <QMessageBox>
24 
QgsPresetColorRampWidget(const QgsPresetSchemeColorRamp & ramp,QWidget * parent)25 QgsPresetColorRampWidget::QgsPresetColorRampWidget( const QgsPresetSchemeColorRamp &ramp, QWidget *parent )
26   : QgsPanelWidget( parent )
27   , mRamp( ramp )
28 {
29   setupUi( this );
30   connect( mButtonAddColor, &QToolButton::clicked, this, &QgsPresetColorRampWidget::mButtonAddColor_clicked );
31   mTreeColors->setScheme( &mRamp );
32 
33   connect( mButtonCopyColors, &QAbstractButton::clicked, mTreeColors, &QgsColorSchemeList::copyColors );
34   connect( mButtonRemoveColor, &QAbstractButton::clicked, mTreeColors, &QgsColorSchemeList::removeSelection );
35   connect( mButtonPasteColors, &QAbstractButton::clicked, mTreeColors, &QgsColorSchemeList::pasteColors );
36   connect( mButtonImportColors, &QAbstractButton::clicked, mTreeColors, &QgsColorSchemeList::showImportColorsDialog );
37   connect( mButtonExportColors, &QAbstractButton::clicked, mTreeColors, &QgsColorSchemeList::showExportColorsDialog );
38 
39   connect( mTreeColors->model(), &QAbstractItemModel::dataChanged, this, &QgsPresetColorRampWidget::schemeChanged );
40   connect( mTreeColors->model(), &QAbstractItemModel::rowsRemoved, this, &QgsPresetColorRampWidget::schemeChanged );
41 
42   updatePreview();
43 }
44 
ramp() const45 QgsPresetSchemeColorRamp QgsPresetColorRampWidget::ramp() const
46 {
47   return mRamp;
48 }
49 
setRamp(const QgsPresetSchemeColorRamp & ramp)50 void QgsPresetColorRampWidget::setRamp( const QgsPresetSchemeColorRamp &ramp )
51 {
52   mRamp = ramp;
53   mTreeColors->setScheme( &mRamp );
54   updatePreview();
55   emit changed();
56 }
57 
updatePreview()58 void QgsPresetColorRampWidget::updatePreview()
59 {
60   const QSize size( 300, 40 );
61   lblPreview->setPixmap( QgsSymbolLayerUtils::colorRampPreviewPixmap( &mRamp, size ) );
62 }
63 
setColors()64 void QgsPresetColorRampWidget::setColors()
65 {
66   updatePreview();
67   emit changed();
68 }
69 
mButtonAddColor_clicked()70 void QgsPresetColorRampWidget::mButtonAddColor_clicked()
71 {
72   if ( dockMode() )
73   {
74     mTreeColors->addColor( QgsRecentColorScheme::lastUsedColor(), QgsSymbolLayerUtils::colorToName( QgsRecentColorScheme::lastUsedColor() ), true );
75 
76     QgsCompoundColorWidget *colorWidget = new QgsCompoundColorWidget( this, QgsRecentColorScheme::lastUsedColor(), QgsCompoundColorWidget::LayoutVertical );
77     colorWidget->setPanelTitle( tr( "Select Color" ) );
78     colorWidget->setAllowOpacity( true );
79     connect( colorWidget, &QgsCompoundColorWidget::currentColorChanged, this, &QgsPresetColorRampWidget::newColorChanged );
80     openPanel( colorWidget );
81   }
82   else
83   {
84     const QColor newColor = QgsColorDialog::getColor( QColor(), this->parentWidget(), tr( "Select Color" ), true );
85     if ( !newColor.isValid() )
86     {
87       return;
88     }
89     activateWindow();
90 
91     mTreeColors->addColor( newColor, QgsSymbolLayerUtils::colorToName( newColor ) );
92   }
93 }
94 
schemeChanged()95 void QgsPresetColorRampWidget::schemeChanged()
96 {
97   mTreeColors->saveColorsToScheme();
98   updatePreview();
99   emit changed();
100 }
101 
newColorChanged(const QColor & color)102 void QgsPresetColorRampWidget::newColorChanged( const QColor &color )
103 {
104   const int row = mTreeColors->model()->rowCount() - 1;
105   const QModelIndex colorIndex = mTreeColors->model()->index( row, 0 );
106   mTreeColors->model()->setData( colorIndex, color );
107 }
108 
QgsPresetColorRampDialog(const QgsPresetSchemeColorRamp & ramp,QWidget * parent)109 QgsPresetColorRampDialog::QgsPresetColorRampDialog( const QgsPresetSchemeColorRamp &ramp, QWidget *parent )
110   : QDialog( parent )
111 {
112   QVBoxLayout *vLayout = new QVBoxLayout();
113   mWidget = new QgsPresetColorRampWidget( ramp );
114   connect( mWidget, &QgsPanelWidget::panelAccepted, this, &QDialog::reject );
115 
116   vLayout->addWidget( mWidget );
117   mButtonBox = new QDialogButtonBox( QDialogButtonBox::Cancel | QDialogButtonBox::Help | QDialogButtonBox::Ok, Qt::Horizontal );
118   connect( mButtonBox, &QDialogButtonBox::accepted, this, &QDialog::accept );
119   connect( mButtonBox, &QDialogButtonBox::rejected, this, &QDialog::reject );
120   connect( mButtonBox, &QDialogButtonBox::helpRequested, this, &QgsPresetColorRampDialog::showHelp );
121   vLayout->addWidget( mButtonBox );
122   setLayout( vLayout );
123   setWindowTitle( tr( "Color Presets Ramp" ) );
124   connect( mWidget, &QgsPresetColorRampWidget::changed, this, &QgsPresetColorRampDialog::changed );
125 }
126 
buttonBox() const127 QDialogButtonBox *QgsPresetColorRampDialog::buttonBox() const
128 {
129   return mButtonBox;
130 }
131 
showHelp()132 void QgsPresetColorRampDialog::showHelp()
133 {
134   QgsHelp::openHelp( QStringLiteral( "style_library/style_manager.html#setting-a-color-ramp" ) );
135 }
136