Skip to content

Commit

Permalink
ddmCountyInfoFilter: Фильтр переписан на основе созданного базового ф…
Browse files Browse the repository at this point in the history
…ильтра ddmBaseCountyFilter
  • Loading branch information
alexeymarunin committed Mar 19, 2015
1 parent 9b2ddd6 commit f0aa573
Show file tree
Hide file tree
Showing 24 changed files with 1,108 additions and 485 deletions.
18 changes: 11 additions & 7 deletions ddmApplication.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@
#include "ddmApplication.h"

#include "filters/ddmEmptyFilter.h"
#include "filters/ddmCountyFilter.h"
#include "filters/ddmCountyInfoFilter.h"
#include "filters/ddmMinMaxFrictionFilter.h"
#include "filters/ddmPosNegDeltaFilter.h"
#include "filters/ddmFrictionDeltaFilter.h"
#include "filters/ddmFrictionPopulationFilter.h"
#include "filters/ddmDeltaPopulationFilter.h"
#include "filters/ddmNeighborCountyFilter.h"

/**
* @Конструктор класса
Expand Down Expand Up @@ -51,13 +52,16 @@ ddmApplication::ddmApplication( int& argc, char** argv ) : QApplication( argc, a
this->mainWindow()->setCentralWidget( centralWidget );

// Фильтры
centralWidget->appendFilter( "<выберите фильтр>", new ddmEmptyFilter( this ) );
centralWidget->appendFilter( "Информация о графстве", new ddmCountyFilter( this ) );
centralWidget->appendFilter( "Диапазон трений", new ddmMinMaxFrictionFilter( this ) );
centralWidget->appendFilter( "Центры миграции", new ddmPosNegDeltaFilter( this ) );

centralWidget->appendFilter( "<выберите фильтр>", new ddmEmptyFilter( this ) );
centralWidget->appendFilter( "Информация о графстве", new ddmCountyInfoFilter( this ) );
centralWidget->appendFilter( "Диапазон трений", new ddmMinMaxFrictionFilter( this ) );
centralWidget->appendFilter( "Центры миграции", new ddmPosNegDeltaFilter( this ) );
centralWidget->appendFilter( "Диапазон трений по центрам миграции", new ddmFrictionDeltaFilter( this ) );
centralWidget->appendFilter( "Диапазон трений и населения", new ddmFrictionPopulationFilter( this ) );
centralWidget->appendFilter( "Процент дельты от населения", new ddmDeltaPopulationFilter( this ) );
centralWidget->appendFilter( "Диапазон трений и населения", new ddmFrictionPopulationFilter( this ) );
centralWidget->appendFilter( "Процент дельты от населения", new ddmDeltaPopulationFilter( this ) );
centralWidget->appendFilter( "Соседи 1-го порядка", new ddmNeighborCountyFilter( this ) );


//centralWidget->setCurrentFilter( 0 );
ddmSettings* settings = ddmSettings::instance();
Expand Down
37 changes: 27 additions & 10 deletions ddmSystem.pro
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,8 @@ SOURCES += main.cpp \
models/ddmModel.cpp \
models/ddmStateModel.cpp \
models/ddmFilterModel.cpp \
models/ddmCountyFilterModel.cpp \
filters/ddmFilter.cpp \
filters/ddmCountyFilter.cpp \
widgets/ddmFilterWidget.cpp \
widgets/ddmCountyFilterWidget.cpp \
widgets/ddmCentralWidget.cpp \
ddmMapView.cpp \
ddmMapViewPage.cpp \
Expand All @@ -54,7 +51,17 @@ SOURCES += main.cpp \
ddmSettings.cpp \
widgets/ddmDeltaPopulationFilterWidget.cpp \
models/ddmDeltaPopulationFilterModel.cpp \
filters/ddmDeltaPopulationFilter.cpp
filters/ddmDeltaPopulationFilter.cpp \
models/ddmNeighborCountyFilterModel.cpp \
widgets/ddmNeighborCountyFilterWidget.cpp \
filters/ddmNeighborCountyFilter.cpp \
widgets/ddmBaseCountyFilterWidget.cpp \
filters/ddmBaseCountyFilter.cpp \
models/ddmBaseCountyFilterModel.cpp \
models/ddmCountyInfoFilterModel.cpp \
widgets/ddmCountyInfoFilterWidget.cpp \
widgets/panels/ddmCountyInfoFilterWidgetPanel.cpp \
filters/ddmCountyInfoFilter.cpp

HEADERS += \
ddmVersion.h \
Expand All @@ -66,11 +73,8 @@ HEADERS += \
models/ddmModel.h \
models/ddmStateModel.h \
models/ddmFilterModel.h \
models/ddmCountyFilterModel.h \
filters/ddmFilter.h \
filters/ddmCountyFilter.h \
widgets/ddmFilterWidget.h \
widgets/ddmCountyFilterWidget.h \
widgets/ddmCentralWidget.h \
ddmMapView.h \
ddmMapViewPage.h \
Expand Down Expand Up @@ -98,17 +102,30 @@ HEADERS += \
ddmSettings.h \
widgets/ddmDeltaPopulationFilterWidget.h \
models/ddmDeltaPopulationFilterModel.h \
filters/ddmDeltaPopulationFilter.h
filters/ddmDeltaPopulationFilter.h \
models/ddmNeighborCountyFilterModel.h \
widgets/ddmNeighborCountyFilterWidget.h \
filters/ddmNeighborCountyFilter.h \
widgets/ddmBaseCountyFilterWidget.h \
filters/ddmBaseCountyFilter.h \
models/ddmBaseCountyFilterModel.h \
models/ddmCountyInfoFilterModel.h \
widgets/ddmCountyInfoFilterWidget.h \
widgets/panels/ddmCountyInfoFilterWidgetPanel.h \
filters/ddmCountyInfoFilter.h

FORMS += ddmMainWindow.ui \
widgets/ddmCountyFilterWidget.ui \
widgets/ddmCentralWidget.ui \
widgets/ddmEmptyFilterWidget.ui \
widgets/ddmMinMaxFrictionFilterWidget.ui \
widgets/ddmPosNegDeltaFilterWidget.ui \
widgets/ddmFrictionDeltaFilterWidget.ui \
widgets/ddmFrictionPopulationFilterWidget.ui \
widgets/ddmDeltaPopulationFilterWidget.ui
widgets/ddmDeltaPopulationFilterWidget.ui \
widgets/ddmNeighborCountyFilterWidget.ui \
widgets/ddmBaseCountyFilterWidget.ui \
widgets/ddmCountyInfoFilterWidgetPanel.ui \
widgets/panels/ddmCountyInfoFilterWidgetPanel.ui

Debug:DESTDIR = debug
Release:DESTDIR = release
Expand Down
4 changes: 2 additions & 2 deletions ddmVersion.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#define DDM_VERSION_H

#define DDM_MAJOR_VERSION 2
#define DDM_MINOR_VERSION 7
#define DDM_BUILD_NUMBER 342
#define DDM_MINOR_VERSION 8
#define DDM_BUILD_NUMBER 375

#endif // DDM_VERSION_H
194 changes: 194 additions & 0 deletions filters/ddmBaseCountyFilter.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
#include "filters/ddmBaseCountyFilter.h"
#include "models/ddmBaseCountyFilterModel.h"
#include "ddmMapView.h"
#include "ddmSettings.h"
#include "widgets/ddmBaseCountyFilterWidget.h"

/**
* Конструктор класса
*
* @param parent Родитель (владелец)
* @author Марунин А.В.
* @since 2.8
*/
ddmBaseCountyFilter::ddmBaseCountyFilter( QObject* parent ) : ddmFilter( parent )
{
}

/**
* Создает фильтр
*
* Создает модель фильтра и виджет, настраивает сигнал-слоты
*
* @author Марунин А.В.
* @since 2.8
*/
void ddmBaseCountyFilter::setup()
{
// Модель и виджет должны быть созданы в дочернем setup()
Q_ASSERT( this->model() != NULL );
Q_ASSERT( this->widget() != NULL );

// Загружаем предыдущие значения
this->loadSettings();

ddmBaseCountyFilterModel* model = this->model_cast<ddmBaseCountyFilterModel>();
ddmBaseCountyFilterWidget* widget = this->widget_cast<ddmBaseCountyFilterWidget>();

widget->setStateNames( model->stateNames() );
widget->setCurrentState( model->currentState()->geographicName() );
widget->setCountyNames( model->currentState()->countyNames() );
widget->setCurrentCounty( model->currentCounty()->geographicName() );

QObject::connect( widget, SIGNAL( changedState() ), this, SLOT( slotWidgetChangedState() ) );
QObject::connect( widget, SIGNAL( changedCounty() ), this, SLOT( slotWidgetChangedCounty() ) );

ddmFilter::setup();

}

/**
* Синхронизирует данные между моделью и виджетом
*
* @param fromWidget Флаг, указывающий направление синхронизации:
* true - обновить данные модели из значений элементов управления виджета
* false - обновить элементы управления на виджете по данным модели
* @author Марунин А.В.
* @since 2.8
*/
void ddmBaseCountyFilter::updateData( bool fromWidget )
{
if ( this->valid() )
{
ddmBaseCountyFilterModel* model = this->model_cast<ddmBaseCountyFilterModel>();
ddmBaseCountyFilterWidget* widget = this->widget_cast<ddmBaseCountyFilterWidget>();
if ( fromWidget )
{
if ( model->currentState() && model->currentState()->geographicName() != widget->currentState() )
{
model->setCurrentState( widget->currentState() );
}
else if ( model->currentCounty() && model->currentCounty()->geographicName() != widget->currentCounty() )
{
model->setCurrentCounty( widget->currentCounty() );
}
}
else
{
if ( model->currentState() )
{
widget->setCurrentState( model->currentState()->geographicName() );
}
if ( model->currentCounty() )
{
widget->setCurrentCounty( model->currentCounty()->geographicName() );
}
}
}
}

/**
* Обработчик события изменения текущего элемента в выпадающем списке штатов
*
* @author Марунин А.В.
* @since 2.8
*/
void ddmBaseCountyFilter::slotWidgetChangedState()
{
ddmBaseCountyFilterWidget* widget = this->widget_cast<ddmBaseCountyFilterWidget>();
QString stateName = widget->currentState();
if ( !stateName.isEmpty() )
{
this->updateData();
ddmBaseCountyFilterModel* model = qobject_cast<ddmBaseCountyFilterModel*>( this->model() );
QStringList countyNames = model->currentState()->countyNames();
widget->setCountyNames( countyNames );
}
}

/**
* Обработчик события изменения текущего элемента в выпадающем списке графств
*
* @author Марунин А.В.
* @since 2.8
*/
void ddmBaseCountyFilter::slotWidgetChangedCounty()
{
ddmBaseCountyFilterWidget* widget = this->widget_cast<ddmBaseCountyFilterWidget>();
QString countyName = widget->currentCounty();
if ( !countyName.isEmpty() )
{
ddmBaseCountyFilterModel* model = this->model_cast<ddmBaseCountyFilterModel>();
model->setCurrentCounty( countyName );
this->apply();

this->fitSelection();

this->saveSettings();
}
}

/**
* Центрирует текущее выделение
*
* @author Марунин А.В.
* @since 2.8
*/
void ddmBaseCountyFilter::fitSelection()
{
this->mapView()->fitSelection();
}

/**
* Обработчик, вызываемый после обновления карты
*
* @author Марунин А.В.
* @since 2.8
*/
void ddmBaseCountyFilter::slotMapLoaded()
{
this->updateData();
this->fitSelection();
}

/**
* Загружает настройки фильтра
*
* @author Марунин А.В.
* @since 2.8
*/
void ddmBaseCountyFilter::loadSettings()
{
ddmSettings* settings = ddmSettings::instance();

int lastCounty = settings->value( QString( this->metaObject()->className() ) + "/county", 0 ).toInt();
if ( lastCounty > 0 )
{
ddmBaseCountyFilterModel* model = this->model_cast<ddmBaseCountyFilterModel>();
model->setCurrentCounty( lastCounty );
}
}

/**
* Сохраняет настройки фильтра
*
* @author Марунин А.В.
* @since 2.8
*/
void ddmBaseCountyFilter::saveSettings()
{
ddmSettings* settings = ddmSettings::instance();

ddmBaseCountyFilterModel* model = this->model_cast<ddmBaseCountyFilterModel>();
settings->setValue( QString( this->metaObject()->className() ) + "/county", model->currentCounty()->id() );
}

/**
* Деструктор класса
*
* @author Марунин А.В.
* @since 2.8
*/
ddmBaseCountyFilter::~ddmBaseCountyFilter()
{
}
45 changes: 45 additions & 0 deletions filters/ddmBaseCountyFilter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#ifndef DDM_BASE_COUNTY_FILTER_H
#define DDM_BASE_COUNTY_FILTER_H

#include <QStringList>
#include "filters/ddmFilter.h"

class ddmState;
class ddmCounty;

/**
* Класс ddmBaseCountyFilter описывает базовый фильтр
* при работе с конкретным графством
*
* @author Марунин А.В.
* @since 2.8
*/
class ddmBaseCountyFilter : public ddmFilter
{
Q_OBJECT

public:

ddmBaseCountyFilter( QObject* parent = 0 );

virtual ~ddmBaseCountyFilter();

protected Q_SLOTS:

virtual void slotWidgetChangedState();
virtual void slotWidgetChangedCounty();
virtual void slotMapLoaded();

protected:

virtual void setup();
virtual void updateData( bool fromWidget = true );

void fitSelection();

virtual void loadSettings();
virtual void saveSettings();

};

#endif // DDM_BASE_COUNTY_FILTER_H
Loading

0 comments on commit f0aa573

Please sign in to comment.