825 changes: 825 additions & 0 deletions src/core/symbology-ng/qgscptcitybrowsermodel.cpp

Large diffs are not rendered by default.

302 changes: 302 additions & 0 deletions src/core/symbology-ng/qgscptcitybrowsermodel.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,302 @@
/***************************************************************************
qgscptcitybrowsermodel.h
---------------------
begin : August 2012
copyright : (C) 2009 by Martin Dobias
copyright : (C) 2012 by Etienne Tourigny
email : etourigny.dev at gmail.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. *
* *
***************************************************************************/

#ifndef QGSCPTCITYBROWSERMODEL_H
#define QGSCPTCITYBROWSERMODEL_H

#include "qgsvectorcolorrampv2.h"

#include <QAbstractItemModel>
#include <QIcon>
#include <QMimeData>
#include <QAction>

class QgsCptCityColorRampV2;

/** base class for all items in the model */
class CORE_EXPORT QgsCptCityDataItem : public QObject
{
Q_OBJECT
public:
enum Type
{
ColorRamp,
Collection,
Directory,
Category
};

QgsCptCityDataItem( QgsCptCityDataItem::Type type, QgsCptCityDataItem* parent,
QString name, QString path, QString info );
virtual ~QgsCptCityDataItem();

bool hasChildren();

int rowCount();

//

virtual void refresh();

// Create vector of children
virtual QVector<QgsCptCityDataItem*> createChildren();

// Populate children using children vector created by createChildren()
virtual void populate();
bool isPopulated() { return mPopulated; }

// Insert new child using alphabetical order based on mName, emits necessary signal to model before and after, sets parent and connects signals
// refresh - refresh populated item, emit signals to model
virtual void addChildItem( QgsCptCityDataItem * child, bool refresh = false );

// remove and delete child item, signals to browser are emited
virtual void deleteChildItem( QgsCptCityDataItem * child );

// remove child item but don't delete it, signals to browser are emited
// returns pointer to the removed item or null if no such item was found
virtual QgsCptCityDataItem * removeChildItem( QgsCptCityDataItem * child );

virtual bool equal( const QgsCptCityDataItem *other );

virtual QWidget * paramWidget() { return 0; }

// list of actions provided by this item - usually used for popup menu on right-click
virtual QList<QAction*> actions() { return QList<QAction*>(); }

// whether accepts drag&drop'd layers - e.g. for import
virtual bool acceptDrop() { return false; }

// try to process the data dropped on this item
virtual bool handleDrop( const QMimeData * /*data*/, Qt::DropAction /*action*/ ) { return false; }

// static methods

// Find child index in vector of items using '==' operator
static int findItem( QVector<QgsCptCityDataItem*> items, QgsCptCityDataItem * item );
static QgsCptCityDataItem* dataItem( QString path );

// members

Type type() const { return mType; }
QgsCptCityDataItem* parent() const { return mParent; }
void setParent( QgsCptCityDataItem* parent ) { mParent = parent; }
QVector<QgsCptCityDataItem*> children() const { return mChildren; }
QIcon icon() const { return mIcon; }
QString name() const { return mName; }
QString path() const { return mPath; }
QString info() const { return mInfo; }

void setIcon( QIcon icon ) { mIcon = icon; }

void setToolTip( QString msg ) { mToolTip = msg; }
QString toolTip() const { return mToolTip; }

protected:

Type mType;
QgsCptCityDataItem* mParent;
QVector<QgsCptCityDataItem*> mChildren; // easier to have it always
bool mPopulated;
QString mName;
QString mPath; // it is also used to identify item in tree
QString mInfo;
QString mToolTip;
QIcon mIcon;

public slots:
void emitBeginInsertItems( QgsCptCityDataItem* parent, int first, int last );
void emitEndInsertItems();
void emitBeginRemoveItems( QgsCptCityDataItem* parent, int first, int last );
void emitEndRemoveItems();

signals:
void beginInsertItems( QgsCptCityDataItem* parent, int first, int last );
void endInsertItems();
void beginRemoveItems( QgsCptCityDataItem* parent, int first, int last );
void endRemoveItems();
};

/** Item that represents a layer that can be opened with one of the providers */
class CORE_EXPORT QgsCptCityColorRampItem : public QgsCptCityDataItem
{
Q_OBJECT
public:

QgsCptCityColorRampItem( QgsCptCityDataItem* parent,
QString name, QString path, QString info = QString(),
QString variantName = QString() );

// --- reimplemented from QgsCptCityDataItem ---

virtual bool equal( const QgsCptCityDataItem *other );

// --- New virtual methods for layer item derived classes ---
const QgsCptCityColorRampV2& ramp() const { return mRamp; }

protected:

QgsCptCityColorRampV2 mRamp;
QIcon mIcon;
};


/** A Collection: logical collection of subcollections and color ramps */
class CORE_EXPORT QgsCptCityCollectionItem : public QgsCptCityDataItem
{
Q_OBJECT
public:
QgsCptCityCollectionItem( QgsCptCityDataItem* parent,
QString name, QString path, QString info,
QString collectionName = DEFAULT_CPTCITY_COLLECTION );
~QgsCptCityCollectionItem();

void setPopulated() { mPopulated = true; }
void addChild( QgsCptCityDataItem *item ) { mChildren.append( item ); }

protected:
QString mCollectionName;

};

/** A directory: contains subdirectories and color ramps */
class CORE_EXPORT QgsCptCityDirectoryItem : public QgsCptCityCollectionItem
{
Q_OBJECT
public:
QgsCptCityDirectoryItem( QgsCptCityDataItem* parent,
QString name, QString path, QString info = QString(),
QString collectionName = DEFAULT_CPTCITY_COLLECTION );
~QgsCptCityDirectoryItem();

QVector<QgsCptCityDataItem*> createChildren();

virtual bool equal( const QgsCptCityDataItem *other );

};

/** A category: contains subdirectories and color ramps */
class CORE_EXPORT QgsCptCityCategoryItem : public QgsCptCityCollectionItem
{
Q_OBJECT
public:
QgsCptCityCategoryItem( QgsCptCityDataItem* parent, QString name, QString path, QString info,
QString collectionName = DEFAULT_CPTCITY_COLLECTION );
~QgsCptCityCategoryItem();

QVector<QgsCptCityDataItem*> createChildren();

virtual bool equal( const QgsCptCityDataItem *other );
};



class CORE_EXPORT QgsCptCityBrowserModel : public QAbstractItemModel
{
Q_OBJECT

public:
explicit QgsCptCityBrowserModel( QObject *parent = 0,
QString collectionName = DEFAULT_CPTCITY_COLLECTION,
QString viewName = "authors" );
~QgsCptCityBrowserModel();

// implemented methods from QAbstractItemModel for read-only access

/** Used by other components to obtain information about each item provided by the model.
In many models, the combination of flags should include Qt::ItemIsEnabled and Qt::ItemIsSelectable. */
virtual Qt::ItemFlags flags( const QModelIndex &index ) const;

/** Used to supply item data to views and delegates. Generally, models only need to supply data
for Qt::DisplayRole and any application-specific user roles, but it is also good practice
to provide data for Qt::ToolTipRole, Qt::AccessibleTextRole, and Qt::AccessibleDescriptionRole.
See the Qt::ItemDataRole enum documentation for information about the types associated with each role. */
virtual QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const;

/** Provides views with information to show in their headers. The information is only retrieved
by views that can display header information. */
virtual QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;

/** Provides the number of rows of data exposed by the model. */
virtual int rowCount( const QModelIndex &parent = QModelIndex() ) const;

/** Provides the number of columns of data exposed by the model. List models do not provide this function
because it is already implemented in QAbstractListModel. */
virtual int columnCount( const QModelIndex &parent = QModelIndex() ) const;

/** Returns the index of the item in the model specified by the given row, column and parent index. */
virtual QModelIndex index( int row, int column, const QModelIndex & parent = QModelIndex() ) const;

QModelIndex findItem( QgsCptCityDataItem *item, QgsCptCityDataItem *parent = 0 ) const;

/** Returns the parent of the model item with the given index.
* If the item has no parent, an invalid QModelIndex is returned.
*/
virtual QModelIndex parent( const QModelIndex &index ) const;

/** Returns a list of mime that can describe model indexes */
/* virtual QStringList mimeTypes() const; */

/** Returns an object that contains serialized items of data corresponding to the list of indexes specified */
/* virtual QMimeData * mimeData( const QModelIndexList &indexes ) const; */

/** Handles the data supplied by a drag and drop operation that ended with the given action */
/* virtual bool dropMimeData( const QMimeData * data, Qt::DropAction action, int row, int column, const QModelIndex & parent ); */

QgsCptCityDataItem *dataItem( const QModelIndex &idx ) const;

bool hasChildren( const QModelIndex &parent = QModelIndex() ) const;

// Reload the whole model
void reload();

// Refresh item specified by path
void refresh( QString path );

// Refresh item childs
void refresh( const QModelIndex &index = QModelIndex() );

//! return index of a path
QModelIndex findPath( QString path );

void connectItem( QgsCptCityDataItem *item );

bool canFetchMore( const QModelIndex & parent ) const;
void fetchMore( const QModelIndex & parent );

signals:

public slots:
//void removeItems( QgsCptCityDataItem * parent, QVector<QgsCptCityDataItem *>items );
//void addItems( QgsCptCityDataItem * parent, QVector<QgsCptCityDataItem *>items );
//void refreshItems( QgsCptCityDataItem * parent, QVector<QgsCptCityDataItem *>items );

void beginInsertItems( QgsCptCityDataItem *parent, int first, int last );
void endInsertItems();
void beginRemoveItems( QgsCptCityDataItem *parent, int first, int last );
void endRemoveItems();

protected:

// populates the model
void addRootItems( );
void removeRootItems();

QVector<QgsCptCityDataItem*> mRootItems;
QString mCollectionName;
QString mViewName;
};

#endif
246 changes: 177 additions & 69 deletions src/core/symbology-ng/qgsvectorcolorrampv2.cpp

Large diffs are not rendered by default.

104 changes: 73 additions & 31 deletions src/core/symbology-ng/qgsvectorcolorrampv2.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <QColor>

#include "qgssymbollayerv2.h" // for QgsStringMap
#include "qgslogger.h"

class CORE_EXPORT QgsVectorColorRampV2
{
Expand Down Expand Up @@ -158,6 +159,61 @@ class CORE_EXPORT QgsVectorColorBrewerColorRampV2 : public QgsVectorColorRampV2
QList<QColor> mPalette;
};

#define DEFAULT_CPTCITY_COLLECTION "default"

class CORE_EXPORT QgsCptCityCollection
{
public:
QgsCptCityCollection( QString collectionName = DEFAULT_CPTCITY_COLLECTION,
QString baseDir = QString() );
~QgsCptCityCollection();

QString baseDir() const;
static QString baseDir( QString collectionName );
static QString defaultBaseDir();
void setBaseDir( QString dirName ) { mBaseDir = dirName; }
bool loadSchemes( QString rootDir = "", bool reset = false );
/** Is the minimal (free to distribute) set of schemes available?
* Currently returns hasAllSchemes, because we don't have a minimal set yet. */
bool hasBasicSchemes();
/** Is the entire archive available? Currently tests that there is at least one scheme. */
bool hasAllSchemes();
QStringList listSchemeCollections( QString collectionName = "", bool recursive = false );
QStringList listSchemeNames( QString collectionName );
QgsCptCityCollection* colorRampFromSVGFile( QString svgFile );
QgsCptCityCollection* colorRampFromSVGString( QString svgString );

QString copyingFileName( const QString& dirName ) const;
QString descFileName( const QString& dirName ) const;
static QMap< QString, QString > copyingInfo( const QString& copyingFileName );

QString collectionName() const { return mCollectionName; }
QMap< QString, QStringList > schemeMap() const { return mSchemeMap; }
QMap< QString, QStringList > schemeVariants() const { return mSchemeVariants; }
QMap< QString, QString > collectionNames() const { return mCollectionNames; }
QMap< QString, QStringList > collectionSelections() const { return mCollectionSelections; }

static void initCollection( QString collectionName = DEFAULT_CPTCITY_COLLECTION,
QString collectionBaseDir = baseDir( DEFAULT_CPTCITY_COLLECTION ) );
static void initCollections( ) { initCollection(); }
static void initCollections( QMap< QString, QString > collectionsDefs );
static QgsCptCityCollection* defaultCollection();
static QMap< QString, QgsCptCityCollection* > collectionRegistry();

protected:

QString mCollectionName;
QString mBaseDir;
QStringList mCollections;
QMap< QString, QStringList > mSchemeMap; //key is collection, value is schemes
QMap< QString, QStringList > mSchemeVariants; //key is scheme, value is variants
QMap< QString, QString > mCollectionNames; //key is name, value is description
QMap< QString, QStringList > mCollectionSelections;
static QgsCptCityCollection* mDefaultCollection;
static QMap< QString, QgsCptCityCollection* > mCollectionRegistry;
static QMap< QString, QMap< QString, QString > > mCopyingInfoMap; // mapping of copyinginfo, key is fileName
};


#define DEFAULT_CPTCITY_SCHEMENAME "cb/div/BrBG_" //change this
#define DEFAULT_CPTCITY_VARIANTNAME "05"
Expand All @@ -166,7 +222,8 @@ class CORE_EXPORT QgsCptCityColorRampV2 : public QgsVectorColorRampV2
{
public:
QgsCptCityColorRampV2( QString schemeName = DEFAULT_CPTCITY_SCHEMENAME,
QString variantName = DEFAULT_CPTCITY_VARIANTNAME );
QString variantName = DEFAULT_CPTCITY_VARIANTNAME,
QString collectionName = DEFAULT_CPTCITY_COLLECTION );


enum GradientType
Expand All @@ -192,55 +249,40 @@ class CORE_EXPORT QgsCptCityColorRampV2 : public QgsVectorColorRampV2

QString schemeName() const { return mSchemeName; }
QString variantName() const { return mVariantName; }
QStringList variantList() const { return mVariantList; }
/* QgsCptCityCollection* collection() const { return mCollection; } */
QString collectionName() const { return mCollectionName; }
QgsCptCityCollection* collection() const
{ return QgsCptCityCollection::collectionRegistry().value( mCollectionName ); }

/* lazy loading - have to call loadPalette() explicitly */
void setSchemeName( QString schemeName ) { mSchemeName = schemeName; }
void setVariantName( QString variantName ) { mVariantName = variantName; }
void setSchemeName( QString schemeName ) { mSchemeName = schemeName; mFileLoaded = false; }
void setVariantName( QString variantName ) { mVariantName = variantName; mFileLoaded = false; }
void setName( QString schemeName, QString variantName = "" )
{ mSchemeName = schemeName; mVariantName = variantName; loadPalette(); }
{ mSchemeName = schemeName; mVariantName = variantName; mFileLoaded = false; }

void loadPalette() { loadFile(); }
/* bool isContinuous() const { return mContinuous; } */
GradientType gradientType() const { return mGradientType; }

QString fileName() const;
bool loadFile( QString filename = "" );
bool loadFile();

QString copyingFileName() const;
QMap< QString, QString > copyingInfo();
QString descFileName() const;

static QString baseDir();
static void setBaseDir( QString dirName ) { mBaseDir = dirName; }
static bool loadSchemes( QString rootDir = "", bool reset = false );
/** Is the minimal (free to distribute) set of schemes available?
* Currently returns hasAllSchemes, because we don't have a minimal set yet. */
static bool hasBasicSchemes();
/** Is the entire archive available? Currently tests that there is at least one scheme. */
static bool hasAllSchemes();
static QStringList listSchemeCollections( QString collectionName = "", bool recursive = false );
static QStringList listSchemeNames( QString collectionName );
static QgsCptCityColorRampV2* colorRampFromSVGFile( QString svgFile );
static QgsCptCityColorRampV2* colorRampFromSVGString( QString svgString );

static const QMap< QString, QStringList > schemeMap() { return mSchemeMap; }
static const QMap< QString, QStringList > schemeVariants() { return mSchemeVariants; }
static const QMap< QString, QString > collectionNames() { return mCollectionNames; }
static const QMap< QString, QStringList > collectionSelections() { return mCollectionSelections; }
QMap< QString, QString > copyingInfo() const;

protected:

QString mSchemeName;
QString mVariantName;
QString mCollectionName;
/* QgsCptCityCollection* mCollection; */
GradientType mGradientType;
GradientList mPalette;
static QString mBaseDir;
static QStringList mCollections;
static QMap< QString, QStringList > mSchemeMap; //key is collection, value is schemes
static QMap< QString, QStringList > mSchemeVariants; //key is scheme, value is variants
static QMap< QString, QString > mCollectionNames; //key is name, value is description
static QMap< QString, QStringList > mCollectionSelections;

QStringList mVariantList;
bool mFileLoaded;
};


#endif
528 changes: 182 additions & 346 deletions src/gui/symbology-ng/qgscptcitycolorrampv2dialog.cpp

Large diffs are not rendered by default.

33 changes: 21 additions & 12 deletions src/gui/symbology-ng/qgscptcitycolorrampv2dialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
#include "ui_qgscptcitycolorrampv2dialogbase.h"

class QgsCptCityColorRampV2;
class QgsCptCityCollection;
class QgsCptCityBrowserModel;

class GUI_EXPORT QgsCptCityColorRampV2Dialog : public QDialog, private Ui::QgsCptCityColorRampV2DialogBase
{
Expand All @@ -29,28 +31,35 @@ class GUI_EXPORT QgsCptCityColorRampV2Dialog : public QDialog, private Ui::QgsCp
public:
QgsCptCityColorRampV2Dialog( QgsCptCityColorRampV2* ramp, QWidget* parent = NULL );

QString selectedName() const { return lblSchemeName->text() + cboVariantName->currentText(); }

public slots:
void setSchemeName();
void setVariantName();
void populateSchemes( QString view = "author" );
void populateVariants();

void on_treeWidget_currentItemChanged( QTreeWidgetItem * current, QTreeWidgetItem * previous );
void on_treeWidget_itemExpanded( QTreeWidgetItem * item );
/* void on_buttonGroupView_buttonClicked( QAbstractButton * button ); */
void populateVariants( QString newVariant = QString() );

void on_mBrowserView_clicked( const QModelIndex & );
void on_tabBar_currentChanged( int index );
void on_pbtnLicenseDetails_pressed();
void on_cboVariantName_currentIndexChanged( int index );
/* void refresh(); */

protected:

void updatePreview();
QTreeWidgetItem* findPath( QString path );
QTreeWidgetItem * makeCollectionItem( const QString& path );
void makeSchemeItem( QTreeWidgetItem *item, const QString& path, const QString& schemeName );
void updateCopyingInfo( const QMap< QString, QString >& copyingMap );
bool eventFilter( QObject *obj, QEvent *event );

QgsCptCityColorRampV2* mRamp;
QString mCollection;
QgsCptCityCollection* mCollection;
QString mCollectionGroup;

/* void refreshModel( const QModelIndex& index ); */
/* void showEvent( QShowEvent * event ); */

QgsCptCityBrowserModel* mModel;
QgsCptCityBrowserModel* mAuthorsModel;
QgsCptCityBrowserModel* mSelectionsModel;

};


#endif
3 changes: 2 additions & 1 deletion src/gui/symbology-ng/qgsstylev2managerdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -412,7 +412,8 @@ QString QgsStyleV2ManagerDialog::addColorRampStatic( QWidget* parent, QgsStyleV2
if ( !dlg.exec() )
{
delete cptCityRamp;
return QString();
// return QString();
return dlg.selectedName();
}
ramp = cptCityRamp;
}
Expand Down
628 changes: 299 additions & 329 deletions src/ui/qgscptcitycolorrampv2dialogbase.ui

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion tests/src/core/testqgsrasterlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ void TestQgsRasterLayer::colorRamp2()
void TestQgsRasterLayer::colorRamp3()
{
// cpt-city ramp, small selection available in <testdir>/cpt-city
QgsCptCityColorRampV2::setBaseDir( mTestDataDir + "cpt-city" );
QgsCptCityCollection::initCollection( DEFAULT_CPTCITY_COLLECTION, mTestDataDir + "cpt-city" );
QVERIFY( testColorRamp( "raster_colorRamp3",
new QgsCptCityColorRampV2( "gmt/GMT_panoply", "" ),
QgsColorRampShader::DISCRETE, 10 ) );
Expand Down
3 changes: 1 addition & 2 deletions tests/src/core/testqgsstylev2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,7 @@ void TestStyleV2::initTestCase()
// mStyle->clear();

// cpt-city ramp, small selection available in <testdir>/cpt-city
QgsCptCityColorRampV2::setBaseDir( mTestDataDir + "cpt-city" );
QgsCptCityColorRampV2::loadSchemes( "" );
QgsCptCityCollection::initCollection( DEFAULT_CPTCITY_COLLECTION, mTestDataDir + "cpt-city" );
}

void TestStyleV2::cleanupTestCase()
Expand Down