Files
GoldenCheetah/src/RideEditor.h
Mark Liversedge 255f69c1ad ConfigChanged Part 1 of 3
.. introduce concept of configChanged(what) to
   pass details of what config has been changed

.. fixed zones changes to re-read after write
   to correct the save twice to get changes to
   zones bug.

.. next parts need to spot changes (part 2) and
   then action appropriately (part 3)
2014-12-29 13:41:50 +00:00

325 lines
7.7 KiB
C++

/*
* Copyright (c) 2010 Mark Liversedge (liversedge@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.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _GC_RideEditor_h
#define _GC_RideEditor_h 1
#include "GoldenCheetah.h"
#include "Context.h"
#include "RideItem.h"
#include "RideFile.h"
#include "RideFileCommand.h"
#include "RideFileTableModel.h"
#include <QtGui>
#include <QGroupBox>
#include <QCheckBox>
#include <QTableView>
#include <QTableWidget>
#include <QHeaderView>
#include <QMessageBox>
#include <QDesktopWidget>
#include <QToolBar>
#include <QItemDelegate>
class EditorData;
class CellDelegate;
class RideModel;
class FindDialog;
class AnomalyDialog;
class PasteSpecialDialog;
class RideEditor : public GcChartWindow
{
Q_OBJECT
G_OBJECT
friend class ::FindDialog;
friend class ::AnomalyDialog;
friend class ::PasteSpecialDialog;
friend class ::CellDelegate;
public:
RideEditor(Context *);
// item delegate uses this
QTableView *table;
// read/write the model
void setModelValue(int row, int column, double value);
double getValue(int row, int column);
// setup context menu
void stdContextMenu (QMenu *, const QPoint &pos);
bool isAnomaly(int x, int y);
bool isEdited(int x, int y);
bool isFound(int x, int y);
bool isTooPrecise(int x, int y);
bool isRowSelected();
bool isColumnSelected();
signals:
void insertRows();
void insertColumns();
void deleteRows();
void deleteColumns();
public slots:
// toolbar functions
void saveFile();
void undo();
void redo();
void find();
void anomalies();
// anomaly list
void anomalySelected();
// context menu functions
void smooth();
void cut();
void delColumn();
void insColumn(QString);
void delRow();
void insRow();
void copy();
void paste();
void pasteSpecial();
void clear();
// need to hide find tool when we hide
void hideEvent(QHideEvent *event);
// trap QTableView signals
bool eventFilter(QObject *, QEvent *);
void cellMenu(const QPoint &);
void borderMenu(const QPoint &);
// ride command
void beginCommand(bool,RideCommand*);
void endCommand(bool,RideCommand*);
// GC signals
void configChanged(qint32);
void rideSelected();
void intervalSelected();
void rideDirty();
void rideClean();
// util
void getPaste(QVector<QVector<double> >&cells,
QStringList &seps, QStringList &head, bool);
protected:
EditorData *data;
RideItem *ride;
RideFileTableModel *model;
QStringList copyHeadings;
FindDialog *findTool;
AnomalyDialog *anomalyTool;
private:
Context *context;
bool inLUW;
QList<QModelIndex> itemselection;
QList<QString> whatColumns();
QSignalMapper *colMapper;
QToolBar *toolbar;
QAction *saveAct, *undoAct, *redoAct,
*searchAct, *checkAct;
// state data
struct { int row, column; } currentCell;
};
class EditorData
{
public:
QMap<QString, QString> anomalies;
QMap<QString, QString> found;
// when underlying data is modified
// these are called to adjust references
void deleteRows(int row, int count);
void insertRows(int row, int count);
void deleteSeries(RideFile::SeriesType);
};
class RideModel : public QStandardItemModel
{
public:
RideModel(int rows, int columns) : QStandardItemModel(rows, columns) {}
void forceRedraw(const QModelIndex&x, const QModelIndex&y) { emit dataChanged(x,y); }
};
class CellDelegate : public QItemDelegate
{
Q_OBJECT
G_OBJECT
public:
CellDelegate(RideEditor *, QObject *parent = 0);
// setup editor in the cell - QDoubleSpinBox
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
// Fetch data from model ready for editing
void setEditorData(QWidget *editor, const QModelIndex &index) const;
// Save data back to model after editing
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
// override stanard painter to underline anomalies in red
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
void updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option,
const QModelIndex &index) const;
private slots:
void commitAndCloseEditor();
private:
RideEditor *rideEditor;
};
class AnomalyDialog : public QWidget
{
Q_OBJECT
G_OBJECT
public:
AnomalyDialog(RideEditor*);
~AnomalyDialog();
void closeEvent(QCloseEvent*event);
QTableWidget *anomalyList;
public slots:
void reject();
void check();
private:
RideEditor *rideEditor;
};
//
// Dialog for finding values across the ride
//
class FindDialog : public QWidget
{
Q_OBJECT
G_OBJECT
public:
FindDialog(RideEditor *);
~FindDialog();
void closeEvent(QCloseEvent* event);
private slots:
void find();
void clear();
void selection();
void typeChanged(int);
void dataChanged();
public slots:
void reject();
void rideSelected();
private:
RideEditor *rideEditor;
QComboBox *type;
QDoubleSpinBox *from, *to;
QLabel *andLabel;
QGridLayout *chans;
QList<QCheckBox*> channels;
QPushButton *findButton, *clearButton;
QTableWidget *resultsTable;
void clearResultsTable();
};
//
// Dialog for paste special
//
class PasteSpecialDialog : public QDialog
{
Q_OBJECT
G_OBJECT
public:
PasteSpecialDialog(RideEditor *, QWidget *parent=0);
~PasteSpecialDialog();
private slots:
void okClicked();
void cancelClicked();
void setColumnSelect();
void columnChanged();
void sepsChanged();
private:
RideEditor *rideEditor;
bool active;
QStringList seps;
QVector<QVector<double> > cells;
QStandardItemModel *model;
QStringList headings; // the header values
QStringList sourceHeadings; // source header values
// Group boxes
QGroupBox *mode, *separators, *contents;
// insert/overwrite
QRadioButton *append, *overwrite;
QDoubleSpinBox *atRow;
// separator options
QCheckBox *tab, *comma, *semi, *space, *other;
QLineEdit *otherText;
QComboBox *textDelimeter;
QCheckBox *hasHeader;
// table selection
QComboBox *columnSelect;
QTableView *resultsTable;
void setResultsTable();
void clearResultsTable();
QPushButton *okButton, *cancelButton;
};
#endif // _GC_RideEditor_h