diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
commit | e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch) | |
tree | 68cb5ef9081156392f1dd62a00c6ccc1451b93df /ui/qt/io_graph_dialog.h | |
parent | Initial commit. (diff) | |
download | wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip |
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ui/qt/io_graph_dialog.h')
-rw-r--r-- | ui/qt/io_graph_dialog.h | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/ui/qt/io_graph_dialog.h b/ui/qt/io_graph_dialog.h new file mode 100644 index 00000000..f0bd4cdf --- /dev/null +++ b/ui/qt/io_graph_dialog.h @@ -0,0 +1,262 @@ +/** @file + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef IO_GRAPH_DIALOG_H +#define IO_GRAPH_DIALOG_H + +#include <config.h> + +#include <glib.h> + +#include "epan/epan_dissect.h" +#include "epan/prefs.h" +#include "ui/preference_utils.h" + +#include "ui/io_graph_item.h" + +#include "wireshark_dialog.h" + +#include <ui/qt/models/uat_model.h> +#include <ui/qt/models/uat_delegate.h> + +#include <QIcon> +#include <QMenu> +#include <QTextStream> + +class QRubberBand; +class QTimer; + +class QCPBars; +class QCPGraph; +class QCPItemTracer; +class QCustomPlot; +class QCPAxisTicker; +class QCPAxisTickerDateTime; + +// GTK+ sets this to 100000 (NUM_IO_ITEMS) +const int max_io_items_ = 250000; + +// XXX - Move to its own file? +class IOGraph : public QObject { +Q_OBJECT +public: + // COUNT_TYPE_* in gtk/io_graph.c + enum PlotStyles { psLine, psDotLine, psStepLine, psDotStepLine, psImpulse, psBar, psStackedBar, psDot, psSquare, psDiamond, psCross, psPlus, psCircle }; + + explicit IOGraph(QCustomPlot *parent); + ~IOGraph(); + const QString configError() { return config_err_; } + const QString name() { return name_; } + void setName(const QString &name); + const QString filter() { return filter_; } + void setFilter(const QString &filter); + void applyCurrentColor(); + bool visible() { return visible_; } + void setVisible(bool visible); + QRgb color(); + void setColor(const QRgb color); + void setPlotStyle(int style); + const QString valueUnitLabel(); + void setValueUnits(int val_units); + const QString valueUnitField() { return vu_field_; } + void setValueUnitField(const QString &vu_field); + unsigned int movingAveragePeriod() { return moving_avg_period_; } + void setInterval(int interval); + bool addToLegend(); + bool removeFromLegend(); + QCPGraph *graph() { return graph_; } + QCPBars *bars() { return bars_; } + double startOffset(); + int packetFromTime(double ts); + bool hasItemToShow(int idx, double value) const; + double getItemValue(int idx, const capture_file *cap_file) const; + int maxInterval () const { return cur_idx_; } + QString scaledValueUnit() const { return scaled_value_unit_; } + + void clearAllData(); + + unsigned int moving_avg_period_; + unsigned int y_axis_factor_; + +public slots: + void recalcGraphData(capture_file *cap_file, bool enable_scaling); + void captureEvent(CaptureEvent e); + void reloadValueUnitField(); + +signals: + void requestReplot(); + void requestRecalc(); + void requestRetap(); + +private: + // Callbacks for register_tap_listener + static void tapReset(void *iog_ptr); + static tap_packet_status tapPacket(void *iog_ptr, packet_info *pinfo, epan_dissect_t *edt, const void *data, tap_flags_t flags); + static void tapDraw(void *iog_ptr); + + void calculateScaledValueUnit(); + template<class DataMap> double maxValueFromGraphData(const DataMap &map); + template<class DataMap> void scaleGraphData(DataMap &map, int scalar); + + QCustomPlot *parent_; + QString config_err_; + QString name_; + bool visible_; + QCPGraph *graph_; + QCPBars *bars_; + QString filter_; + QBrush color_; + io_graph_item_unit_t val_units_; + QString vu_field_; + int hf_index_; + int interval_; + double start_time_; + QString scaled_value_unit_; + + // Cached data. We should be able to change the Y axis without retapping as + // much as is feasible. + io_graph_item_t items_[max_io_items_]; + int cur_idx_; +}; + +namespace Ui { +class IOGraphDialog; +} + +class IOGraphDialog : public WiresharkDialog +{ + Q_OBJECT + +public: + explicit IOGraphDialog(QWidget &parent, CaptureFile &cf, QString displayFilter = QString()); + ~IOGraphDialog(); + + enum UatColumns { colEnabled = 0, colName, colDFilter, colColor, colStyle, colYAxis, colYField, colSMAPeriod, colYAxisFactor, colMaxNum}; + + void addGraph(bool checked, QString name, QString dfilter, QRgb color_idx, IOGraph::PlotStyles style, + io_graph_item_unit_t value_units, QString yfield, int moving_average, int yaxisfactor); + void addGraph(bool copy_from_current = false); + void addDefaultGraph(bool enabled, int idx = 0); + void syncGraphSettings(int row); + +public slots: + void scheduleReplot(bool now = false); + void scheduleRecalc(bool now = false); + void scheduleRetap(bool now = false); + void modelRowsReset(); + void reloadFields(); + +protected: + void keyPressEvent(QKeyEvent *event); + void reject(); + +signals: + void goToPacket(int packet_num); + void recalcGraphData(capture_file *cap_file, bool enable_scaling); + void intervalChanged(int interval); + void reloadValueUnitFields(); + +private: + Ui::IOGraphDialog *ui; + + //Model and delegate were chosen over UatFrame because add/remove/copy + //buttons would need realignment (UatFrame has its own) + UatModel *uat_model_; + UatDelegate *uat_delegate_; + + // XXX - This needs to stay synced with UAT index + QVector<IOGraph*> ioGraphs_; + + QString hint_err_; + QCPGraph *base_graph_; + QCPItemTracer *tracer_; + guint32 packet_num_; + double start_time_; + bool mouse_drags_; + QRubberBand *rubber_band_; + QPoint rb_origin_; + QMenu ctx_menu_; + QTimer *stat_timer_; + bool need_replot_; // Light weight: tell QCP to replot existing data + bool need_recalc_; // Medium weight: recalculate values, then replot + bool need_retap_; // Heavy weight: re-read packet data + bool auto_axes_; + + QSharedPointer<QCPAxisTicker> number_ticker_; + QSharedPointer<QCPAxisTickerDateTime> datetime_ticker_; + + +// void fillGraph(); + void zoomAxes(bool in); + void zoomXAxis(bool in); + void zoomYAxis(bool in); + void panAxes(int x_pixels, int y_pixels); + void toggleTracerStyle(bool force_default = false); + void getGraphInfo(); + void updateLegend(); + QRectF getZoomRanges(QRect zoom_rect); + void createIOGraph(int currentRow); + void loadProfileGraphs(); + void makeCsv(QTextStream &stream) const; + bool saveCsv(const QString &file_name) const; + IOGraph *currentActiveGraph() const; + bool graphIsEnabled(int row) const; + +private slots: + void copyFromProfile(QString filename); + void updateWidgets(); + void graphClicked(QMouseEvent *event); + void mouseMoved(QMouseEvent *event); + void mouseReleased(QMouseEvent *event); + + void resetAxes(); + void updateStatistics(void); + void copyAsCsvClicked(); + + void on_intervalComboBox_currentIndexChanged(int index); + void on_todCheckBox_toggled(bool checked); + void modelDataChanged(const QModelIndex &index); + void on_graphUat_currentItemChanged(const QModelIndex ¤t, const QModelIndex &previous); + + void on_resetButton_clicked(); + void on_logCheckBox_toggled(bool checked); + void on_automaticUpdateCheckBox_toggled(bool checked); + void on_enableLegendCheckBox_toggled(bool checked); + void on_newToolButton_clicked(); + void on_deleteToolButton_clicked(); + void on_copyToolButton_clicked(); + void on_clearToolButton_clicked(); + void on_moveUpwardsToolButton_clicked(); + void on_moveDownwardsToolButton_clicked(); + void on_dragRadioButton_toggled(bool checked); + void on_zoomRadioButton_toggled(bool checked); + void on_actionReset_triggered(); + void on_actionZoomIn_triggered(); + void on_actionZoomInX_triggered(); + void on_actionZoomInY_triggered(); + void on_actionZoomOut_triggered(); + void on_actionZoomOutX_triggered(); + void on_actionZoomOutY_triggered(); + void on_actionMoveUp10_triggered(); + void on_actionMoveLeft10_triggered(); + void on_actionMoveRight10_triggered(); + void on_actionMoveDown10_triggered(); + void on_actionMoveUp1_triggered(); + void on_actionMoveLeft1_triggered(); + void on_actionMoveRight1_triggered(); + void on_actionMoveDown1_triggered(); + void on_actionGoToPacket_triggered(); + void on_actionDragZoom_triggered(); + void on_actionToggleTimeOrigin_triggered(); + void on_actionCrosshairs_triggered(); + void on_buttonBox_helpRequested(); + void on_buttonBox_accepted(); +}; + +#endif // IO_GRAPH_DIALOG_H |