diff --git a/python/core/qgscolorscheme.sip b/python/core/qgscolorscheme.sip index 70d0bee4406..b1e460e207e 100755 --- a/python/core/qgscolorscheme.sip +++ b/python/core/qgscolorscheme.sip @@ -137,6 +137,11 @@ class QgsUserColorScheme : QgsGplColorScheme virtual QgsColorScheme* clone() const; virtual bool isEditable() const; + + /**Sets the name for the scheme + * @param name new name + */ + void setName( const QString name ); protected: diff --git a/python/core/symbology-ng/qgssymbollayerv2utils.sip b/python/core/symbology-ng/qgssymbollayerv2utils.sip index a2a0c1f10e8..4a412e72eda 100644 --- a/python/core/symbology-ng/qgssymbollayerv2utils.sip +++ b/python/core/symbology-ng/qgssymbollayerv2utils.sip @@ -259,10 +259,11 @@ class QgsSymbolLayerV2Utils * Imports colors from a gpl GIMP palette file * @param file source gpl file * @param ok will be true if file was successfully read + * @param name will be set to palette name from gpl file, if present * @returns list of imported colors * @see saveColorsToGpl */ - static QgsNamedColorList importColorsFromGpl( QFile &file, bool &ok ); + static QgsNamedColorList importColorsFromGpl( QFile &file, bool &ok, QString& name ); /** * Attempts to parse a string as a color using a variety of common formats, including hex diff --git a/src/core/qgscolorscheme.cpp b/src/core/qgscolorscheme.cpp index af8223c3eeb..ec3368ba3ce 100644 --- a/src/core/qgscolorscheme.cpp +++ b/src/core/qgscolorscheme.cpp @@ -266,8 +266,9 @@ QgsNamedColorList QgsGplColorScheme::fetchColors( const QString context, const Q } bool ok; + QString name; QFile sourceFile( sourceFilePath ); - return QgsSymbolLayerV2Utils::importColorsFromGpl( sourceFile, ok ); + return QgsSymbolLayerV2Utils::importColorsFromGpl( sourceFile, ok, name ); } bool QgsGplColorScheme::setColors( const QgsNamedColorList colors, const QString context, const QColor baseColor ) diff --git a/src/core/qgscolorscheme.h b/src/core/qgscolorscheme.h index 65ffc9fc5ef..ff5dafb8099 100644 --- a/src/core/qgscolorscheme.h +++ b/src/core/qgscolorscheme.h @@ -150,6 +150,11 @@ class CORE_EXPORT QgsUserColorScheme : public QgsGplColorScheme virtual bool isEditable() const { return true; } + /**Sets the name for the scheme + * @param name new name + */ + void setName( const QString name ) { mName = name; } + protected: QString mName; diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.cpp b/src/core/symbology-ng/qgssymbollayerv2utils.cpp index 8b89cd12a84..281db7e274f 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.cpp +++ b/src/core/symbology-ng/qgssymbollayerv2utils.cpp @@ -3033,7 +3033,7 @@ bool QgsSymbolLayerV2Utils::saveColorsToGpl( QFile &file, const QString paletteN return true; } -QgsNamedColorList QgsSymbolLayerV2Utils::importColorsFromGpl( QFile &file, bool &ok ) +QgsNamedColorList QgsSymbolLayerV2Utils::importColorsFromGpl( QFile &file, bool &ok, QString &name ) { QgsNamedColorList importedColors; @@ -3052,6 +3052,20 @@ QgsNamedColorList QgsSymbolLayerV2Utils::importColorsFromGpl( QFile &file, bool return importedColors; } + //find name line + while ( !in.atEnd() && !line.startsWith( "Name:" ) && !line.startsWith( "#" ) ) + { + line = in.readLine(); + } + if ( line.startsWith( "Name:" ) ) + { + QRegExp nameRx( "Name:\\s*(\\S.*)$" ); + if ( nameRx.indexIn( line ) != -1 ) + { + name = nameRx.cap( 1 ); + } + } + //ignore lines until after "#" while ( !in.atEnd() && !line.startsWith( "#" ) ) { @@ -3064,10 +3078,10 @@ QgsNamedColorList QgsSymbolLayerV2Utils::importColorsFromGpl( QFile &file, bool } //ready to start reading colors + QRegExp rx( "^\\s*(\\d+)\\s+(\\d+)\\s+(\\d+)(\\s.*)?$" ); while ( !in.atEnd() ) { line = in.readLine(); - QRegExp rx( "^\\s*(\\d+)\\s+(\\d+)\\s+(\\d+)(\\s.*)?$" ); if ( rx.indexIn( line ) == -1 ) { continue; diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.h b/src/core/symbology-ng/qgssymbollayerv2utils.h index 993fa2b242f..e6b1857e3ab 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.h +++ b/src/core/symbology-ng/qgssymbollayerv2utils.h @@ -297,10 +297,11 @@ class CORE_EXPORT QgsSymbolLayerV2Utils * Imports colors from a gpl GIMP palette file * @param file source gpl file * @param ok will be true if file was successfully read + * @param name will be set to palette name from gpl file, if present * @returns list of imported colors * @see saveColorsToGpl */ - static QgsNamedColorList importColorsFromGpl( QFile &file, bool &ok ); + static QgsNamedColorList importColorsFromGpl( QFile &file, bool &ok, QString& name ); /** * Attempts to parse a string as a color using a variety of common formats, including hex diff --git a/src/gui/qgscolordialog.cpp b/src/gui/qgscolordialog.cpp index 840a375003c..8e635a61a64 100644 --- a/src/gui/qgscolordialog.cpp +++ b/src/gui/qgscolordialog.cpp @@ -86,7 +86,7 @@ QgsColorDialogV2::QgsColorDialogV2( QWidget *parent, Qt::WindowFlags fl, const Q { mSchemeComboBox->addItem(( *schemeIt )->schemeName() ); } - int activeScheme = settings.value( "/Windows/ColorDialog/activeScheme", 0 ).toInt(); + int activeScheme = qMin( settings.value( "/Windows/ColorDialog/activeScheme", 0 ).toInt(), schemeList.length() - 1 ); if ( activeScheme < schemeList.length() ) { mSchemeList->setScheme( schemeList.at( activeScheme ) ); @@ -100,12 +100,15 @@ QgsColorDialogV2::QgsColorDialogV2( QWidget *parent, Qt::WindowFlags fl, const Q connect( mActionPasteColors, SIGNAL( triggered() ), mSchemeList, SLOT( pasteColors() ) ); connect( mActionExportColors, SIGNAL( triggered() ), this, SLOT( exportColors() ) ); connect( mActionImportColors, SIGNAL( triggered() ), this, SLOT( importColors() ) ); + connect( mActionImportPalette, SIGNAL( triggered() ), this, SLOT( importPalette() ) ); connect( mRemoveColorsFromSchemeButton, SIGNAL( clicked() ), mSchemeList, SLOT( removeSelection() ) ); QMenu* schemeMenu = new QMenu( mSchemeToolButton ); schemeMenu->addAction( mActionPasteColors ); schemeMenu->addAction( mActionImportColors ); schemeMenu->addAction( mActionExportColors ); + schemeMenu->addSeparator(); + schemeMenu->addAction( mActionImportPalette ); mSchemeToolButton->setMenu( schemeMenu ); connect( mSchemeComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( schemeIndexChanged( int ) ) ); @@ -382,6 +385,65 @@ void QgsColorDialogV2::importColors() } } +void QgsColorDialogV2::importPalette() +{ + QSettings s; + QString lastDir = s.value( "/UI/lastGplPaletteDir", "" ).toString(); + QString filePath = QFileDialog::getOpenFileName( this, tr( "Select palette file" ), lastDir, "GPL (*.gpl);;All files (*.*)" ); + activateWindow(); + if ( filePath.isEmpty() ) + { + return; + } + + //check if file exists + QFileInfo fileInfo( filePath ); + if ( !fileInfo.exists() || !fileInfo.isReadable() ) + { + QMessageBox::critical( 0, tr( "Invalid file" ), tr( "Error, file does not exist or is not readable" ) ); + return; + } + + s.setValue( "/UI/lastGplPaletteDir", fileInfo.absolutePath() ); + QFile file( filePath ); + + QgsNamedColorList importedColors; + bool ok = false; + QString paletteName; + importedColors = QgsSymbolLayerV2Utils::importColorsFromGpl( file, ok, paletteName ); + if ( !ok ) + { + QMessageBox::critical( 0, tr( "Invalid file" ), tr( "Palette file is not readable" ) ); + return; + } + + if ( importedColors.length() == 0 ) + { + //no imported colors + QMessageBox::critical( 0, tr( "Invalid file" ), tr( "No colors found in palette file" ) ); + return; + } + + //TODO - handle conflicting file names, name for new palette + QgsUserColorScheme* importedScheme = new QgsUserColorScheme( fileInfo.fileName() ); + importedScheme->setName( paletteName ); + importedScheme->setColors( importedColors ); + + QgsColorSchemeRegistry::instance()->addColorScheme( importedScheme ); + + //refresh combobox + mSchemeComboBox->blockSignals( true ); + mSchemeComboBox->clear(); + QList schemeList = QgsColorSchemeRegistry::instance()->schemes( QgsColorScheme::ShowInColorDialog ); + QList::const_iterator schemeIt = schemeList.constBegin(); + for ( ; schemeIt != schemeList.constEnd(); ++schemeIt ) + { + mSchemeComboBox->addItem(( *schemeIt )->schemeName() ); + } + mSchemeComboBox->blockSignals( false ); + mSchemeComboBox->setCurrentIndex( mSchemeComboBox->count() - 1 ); +} + void QgsColorDialogV2::exportColors() { QSettings s; diff --git a/src/gui/qgscolordialog.h b/src/gui/qgscolordialog.h index 10da5fc05bb..5b6d7adcd66 100644 --- a/src/gui/qgscolordialog.h +++ b/src/gui/qgscolordialog.h @@ -160,6 +160,7 @@ class GUI_EXPORT QgsColorDialogV2 : public QDialog, private Ui::QgsColorDialogBa void exportColors(); void importColors(); + void importPalette(); void schemeIndexChanged( int index ); diff --git a/src/gui/qgscolorschemelist.cpp b/src/gui/qgscolorschemelist.cpp index 97fe682e38f..c8b0cde09bb 100644 --- a/src/gui/qgscolorschemelist.cpp +++ b/src/gui/qgscolorschemelist.cpp @@ -191,7 +191,8 @@ bool QgsColorSchemeList::importColorsFromGpl( QFile &file ) { QgsNamedColorList importedColors; bool ok = false; - importedColors = QgsSymbolLayerV2Utils::importColorsFromGpl( file, ok ); + QString name; + importedColors = QgsSymbolLayerV2Utils::importColorsFromGpl( file, ok, name ); if ( !ok ) { return false; diff --git a/src/ui/qgscolordialog.ui b/src/ui/qgscolordialog.ui index 0677a41c83e..fc5302b0b9f 100755 --- a/src/ui/qgscolordialog.ui +++ b/src/ui/qgscolordialog.ui @@ -789,7 +789,7 @@ - Import Colors + Import Colors... Import colors from file @@ -797,7 +797,7 @@ - Export Colors + Export Colors... Export colors to file @@ -811,6 +811,14 @@ Paste colors from clipboard + + + Import Palette... + + + Import palette from file + +