Untangle DiveCalculatedCeiling from MainWindow

DiveCalculatedCeiling is the last class the references
MainWindow in the profile-widget stack.

In modelDataChanged() it looks for the information()
widget and sets a slot for the dateTimeChanged() signal that
information() emits.

To solve the issue we make DiveCalculatedCeiling recieve
a ProfileWidget2 reference and make ProfileWidget2 emit
the dateTimeChangedItems() signal.

ProfileWidget2 itself listens for the dateTimeChanged()
signal that information() emits and emits dateTimeChangedItems()
to notify any possible children/item listeners in the
ProfileWidget2::dateTimeChanged() slot.

The connection between ProfileWidget2 and information()
is set in MainWindow. This makes DiveCalculatedCeiling
unaware of MainWindow and which class originally emits
the dateTimeChanged() signal to ProfileWidget2.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
--
Think delegation.

Tomaz, please take a look at this one, to double check
if i messed up.

also i have zero idea how the mobile app is setting these
connections, if it does so even.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Lubomir I. Ivanov 2015-11-06 14:40:20 +02:00 committed by Dirk Hohndel
parent 61e768036e
commit 8e7be1b50a
5 changed files with 21 additions and 8 deletions

View file

@ -181,6 +181,7 @@ MainWindow::MainWindow() : QMainWindow(),
connect(ui.actionRecent3, SIGNAL(triggered(bool)), this, SLOT(recentFileTriggered(bool))); connect(ui.actionRecent3, SIGNAL(triggered(bool)), this, SLOT(recentFileTriggered(bool)));
connect(ui.actionRecent4, SIGNAL(triggered(bool)), this, SLOT(recentFileTriggered(bool))); connect(ui.actionRecent4, SIGNAL(triggered(bool)), this, SLOT(recentFileTriggered(bool)));
connect(information(), SIGNAL(addDiveFinished()), graphics(), SLOT(setProfileState())); connect(information(), SIGNAL(addDiveFinished()), graphics(), SLOT(setProfileState()));
connect(information(), SIGNAL(dateTimeChanged()), graphics(), SLOT(dateTimeChanged()));
connect(DivePlannerPointsModel::instance(), SIGNAL(planCreated()), this, SLOT(planCreated())); connect(DivePlannerPointsModel::instance(), SIGNAL(planCreated()), this, SLOT(planCreated()));
connect(DivePlannerPointsModel::instance(), SIGNAL(planCanceled()), this, SLOT(planCanceled())); connect(DivePlannerPointsModel::instance(), SIGNAL(planCanceled()), this, SLOT(planCanceled()));
connect(plannerDetails->printPlan(), SIGNAL(pressed()), divePlannerWidget(), SLOT(printDecoPlan())); connect(plannerDetails->printPlan(), SIGNAL(pressed()), divePlannerWidget(), SLOT(printDecoPlan()));

View file

@ -791,15 +791,16 @@ void DiveGasPressureItem::paint(QPainter *painter, const QStyleOptionGraphicsIte
painter->restore(); painter->restore();
} }
DiveCalculatedCeiling::DiveCalculatedCeiling() : is3mIncrement(false) DiveCalculatedCeiling::DiveCalculatedCeiling(ProfileWidget2 *widget) :
profileWidget(widget),
is3mIncrement(false)
{ {
settingsChanged(); settingsChanged();
} }
void DiveCalculatedCeiling::modelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) void DiveCalculatedCeiling::modelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
{ {
if (MainWindow::instance()->information()) connect(profileWidget, SIGNAL(dateTimeChangedItems()), this, SLOT(recalc()), Qt::UniqueConnection);
connect(MainWindow::instance()->information(), SIGNAL(dateTimeChanged()), this, SLOT(recalc()), Qt::UniqueConnection);
// We don't have enougth data to calculate things, quit. // We don't have enougth data to calculate things, quit.
if (!shouldCalculateStuff(topLeft, bottomRight)) if (!shouldCalculateStuff(topLeft, bottomRight))
@ -830,7 +831,7 @@ void DiveCalculatedCeiling::paint(QPainter *painter, const QStyleOptionGraphicsI
QGraphicsPolygonItem::paint(painter, option, widget); QGraphicsPolygonItem::paint(painter, option, widget);
} }
DiveCalculatedTissue::DiveCalculatedTissue() DiveCalculatedTissue::DiveCalculatedTissue(ProfileWidget2 *widget) : DiveCalculatedCeiling(widget)
{ {
settingsChanged(); settingsChanged();
} }

View file

@ -21,6 +21,7 @@
This is a generically item and should be used as a base for others, I think... This is a generically item and should be used as a base for others, I think...
*/ */
class ProfileWidget2;
class DivePlotDataModel; class DivePlotDataModel;
class DiveTextItem; class DiveTextItem;
class DiveCartesianAxis; class DiveCartesianAxis;
@ -175,7 +176,7 @@ class DiveCalculatedCeiling : public AbstractProfilePolygonItem {
Q_OBJECT Q_OBJECT
public: public:
DiveCalculatedCeiling(); DiveCalculatedCeiling(ProfileWidget2 *profileWidget);
virtual void modelDataChanged(const QModelIndex &topLeft = QModelIndex(), const QModelIndex &bottomRight = QModelIndex()); virtual void modelDataChanged(const QModelIndex &topLeft = QModelIndex(), const QModelIndex &bottomRight = QModelIndex());
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
virtual void settingsChanged(); virtual void settingsChanged();
@ -184,6 +185,9 @@ public
slots: slots:
void recalc(); void recalc();
protected:
ProfileWidget2 *profileWidget;
private: private:
bool is3mIncrement; bool is3mIncrement;
}; };
@ -200,7 +204,7 @@ public:
class DiveCalculatedTissue : public DiveCalculatedCeiling { class DiveCalculatedTissue : public DiveCalculatedCeiling {
Q_OBJECT Q_OBJECT
public: public:
DiveCalculatedTissue(); DiveCalculatedTissue(ProfileWidget2 *profileWidget);
virtual void settingsChanged(); virtual void settingsChanged();
}; };

View file

@ -92,7 +92,7 @@ ProfileWidget2::ProfileWidget2(QWidget *parent) : QGraphicsView(parent),
cylinderPressureAxis(new DiveCartesianAxis(this)), cylinderPressureAxis(new DiveCartesianAxis(this)),
gasPressureItem(new DiveGasPressureItem()), gasPressureItem(new DiveGasPressureItem()),
diveComputerText(new DiveTextItem()), diveComputerText(new DiveTextItem()),
diveCeiling(new DiveCalculatedCeiling()), diveCeiling(new DiveCalculatedCeiling(this)),
decoModelParameters(new DiveTextItem()), decoModelParameters(new DiveTextItem()),
reportedCeiling(new DiveReportedCeiling()), reportedCeiling(new DiveReportedCeiling()),
pn2GasItem(new PartialPressureGasItem()), pn2GasItem(new PartialPressureGasItem()),
@ -302,7 +302,7 @@ void ProfileWidget2::setupItemOnScene()
setupItem(reportedCeiling, timeAxis, profileYAxis, dataModel, DivePlotDataModel::CEILING, DivePlotDataModel::TIME, 1); setupItem(reportedCeiling, timeAxis, profileYAxis, dataModel, DivePlotDataModel::CEILING, DivePlotDataModel::TIME, 1);
setupItem(diveCeiling, timeAxis, profileYAxis, dataModel, DivePlotDataModel::CEILING, DivePlotDataModel::TIME, 1); setupItem(diveCeiling, timeAxis, profileYAxis, dataModel, DivePlotDataModel::CEILING, DivePlotDataModel::TIME, 1);
for (int i = 0; i < 16; i++) { for (int i = 0; i < 16; i++) {
DiveCalculatedTissue *tissueItem = new DiveCalculatedTissue(); DiveCalculatedTissue *tissueItem = new DiveCalculatedTissue(this);
setupItem(tissueItem, timeAxis, profileYAxis, dataModel, DivePlotDataModel::TISSUE_1 + i, DivePlotDataModel::TIME, 1 + i); setupItem(tissueItem, timeAxis, profileYAxis, dataModel, DivePlotDataModel::TISSUE_1 + i, DivePlotDataModel::TIME, 1 + i);
allTissues.append(tissueItem); allTissues.append(tissueItem);
DivePercentageItem *percentageItem = new DivePercentageItem(i); DivePercentageItem *percentageItem = new DivePercentageItem(i);
@ -708,6 +708,11 @@ void ProfileWidget2::recalcCeiling()
diveCeiling->recalc(); diveCeiling->recalc();
} }
void ProfileWidget2::dateTimeChanged()
{
emit dateTimeChangedItems();
}
void ProfileWidget2::settingsChanged() void ProfileWidget2::settingsChanged()
{ {
// if we are showing calculated ceilings then we have to replot() // if we are showing calculated ceilings then we have to replot()

View file

@ -97,9 +97,11 @@ signals:
void refreshDisplay(bool recreateDivelist); void refreshDisplay(bool recreateDivelist);
void updateDiveInfo(bool clear); void updateDiveInfo(bool clear);
void editCurrentDive(); void editCurrentDive();
void dateTimeChangedItems();
public public
slots: // Necessary to call from QAction's signals. slots: // Necessary to call from QAction's signals.
void dateTimeChanged();
void settingsChanged(); void settingsChanged();
void setEmptyState(); void setEmptyState();
void setProfileState(); void setProfileState();