diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2017-01-17 11:37:02 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2017-01-24 16:23:20 +0000 |
commit | 962130c66c9c8d449769d15710595482632b82f5 (patch) | |
tree | 9927c4487a1e195a1f963c408566e2f197a79396 /tests/manual/triangulator/triviswidget.h | |
parent | 139d2e5f1024fe940285e897aae130f3d1c18b86 (diff) |
Add manual test for the QtGui triangulator
Have a widget-based application that uses qTriangulate for fills
and QTriangulatingStroker (and optionally the dash stroke processor)
for strokes.
The resulting triangle (strip) set is visualized on a simple QPainter
canvas, offering the ability to zoom in and examine how the triangulator
behaves on a number of example shapes. It is also possible to step through
and only have the first N set of triangles drawn.
Change-Id: I3a27d86d4ea13a63dd4be0fe81dd4b5ed6e4fa75
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'tests/manual/triangulator/triviswidget.h')
-rw-r--r-- | tests/manual/triangulator/triviswidget.h | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/tests/manual/triangulator/triviswidget.h b/tests/manual/triangulator/triviswidget.h new file mode 100644 index 0000000000..aee80c6cad --- /dev/null +++ b/tests/manual/triangulator/triviswidget.h @@ -0,0 +1,139 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TRIVISWIDGET_H +#define TRIVISWIDGET_H + +#include <QWidget> +#include <QComboBox> +#include <QRadioButton> +#include <QLabel> +#include <QSpinBox> +#include <QCheckBox> +#include <QScrollArea> + +class TriVisCanvas : public QWidget +{ + Q_OBJECT + +public: + TriVisCanvas(QWidget *parent = nullptr); + + QStringList shapes() const; + + enum Type { + Stroke, + Fill + }; + + void setType(Type t) { m_type = t; } + void setIndex(int idx) { m_idx = idx; } + + void setStrokeWidth(float w) { m_strokeWidth = w; } + void setDashStroke(bool d) { m_dashStroke = d; } + + void setStepLimits(int strokeLimit, int fillLimit) { + m_strokeStepLimit = strokeLimit; + m_fillStepLimit = fillLimit; + update(); + } + + enum GeomType { + Triangles, + TriangleStrips + }; + + QImage preview() const; + GeomType geomType() const { return m_type == Stroke ? TriangleStrips : Triangles; } + int vertexCount() const { return m_type == Stroke ? m_strokeVertices.count() : m_fillVertices.count(); } + int indexCount() const { return m_type == Stroke ? 0 : m_fillIndices.count(); } + float zoomLevel() const { return m_zoom; } + + void retriangulate(); + void regeneratePreviews(); + +protected: + void paintEvent(QPaintEvent *event) override; + void wheelEvent(QWheelEvent *event) override; + +signals: + void retriangulated(); + void zoomChanged(float oldZoom, float newZoom); + +private: + void addPreview(int idx); + + Type m_type = Stroke; + int m_idx = 0; + float m_strokeWidth = 1; + bool m_dashStroke = false; + + QVector<QPainterPath> m_paths; + QVector<QImage> m_strokePreviews; + QVector<QImage> m_fillPreviews; + + struct Vertex { + float x, y; + void set(float vx, float vy) { x = vx; y = vy; } + }; + QVector<Vertex> m_fillVertices; + QVector<quint32> m_fillIndices; + QVector<Vertex> m_strokeVertices; + + float m_zoom = 1; + + int m_fillStepLimit = 0; + int m_strokeStepLimit = 0; +}; + +class TriangulationVisualizer : public QWidget +{ + Q_OBJECT + +public: + TriangulationVisualizer(QWidget *parent = nullptr); + +private: + void updateInfoLabel(); + void updatePreviewLabel(); + + QComboBox *m_cbShape; + QLabel *m_lbPreview; + QRadioButton *m_rdStroke; + QRadioButton *m_rdFill; + QScrollArea *m_scrollArea; + TriVisCanvas *m_canvas; + QLabel *m_lbInfo; + QSpinBox *m_spStrokeWidth; + QCheckBox *m_chDash; + QCheckBox *m_chStepEnable; + QSpinBox *m_spStepStroke; + QSpinBox *m_spStepFill; +}; + +#endif |