summaryrefslogtreecommitdiffstats
path: root/src/waveform/renderers/allshader/waveformrendermark.h
blob: 4f77e5f821252529a2e3b4361a9901aec248e702 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#pragma once

#include <QColor>
#include <QObject>

#include "shaders/rgbashader.h"
#include "shaders/textureshader.h"
#include "util/class.h"
#include "waveform/renderers/allshader/waveformrenderer.h"
#include "waveform/renderers/waveformmarkset.h"

class QDomNode;
class SkinContext;
class QOpenGLTexture;

namespace allshader {
class WaveformRenderMark;
}

class allshader::WaveformRenderMark final : public QObject, public allshader::WaveformRenderer {
    Q_OBJECT
  public:
    explicit WaveformRenderMark(WaveformWidgetRenderer* waveformWidget);
    ~WaveformRenderMark() override;

    void setup(const QDomNode& node, const SkinContext& context) override;

    void initializeGL() override;
    void paintGL() override;
    void resizeGL(int w, int h) override;

    // Called when a new track is loaded.
    void onSetTrack() override;

  public slots:
    // Called when the loaded track's cues are added, deleted or modified and
    // when a new track is loaded.
    // It updates the marks' names and regenerates their image if needed.
    // This method is used for hotcues.
    void slotCuesUpdated();

  private:
    void checkCuesUpdated();

    void generateMarkImage(WaveformMarkPointer pMark, float breadth);
    void generatePlayPosMarkTexture(float breadth);

    void drawTriangle(QPainter* painter,
            const QBrush& fillColor,
            QPointF p1,
            QPointF p2,
            QPointF p3);

    WaveformMarkSet m_marks;
    mixxx::RGBAShader m_rgbaShader;
    mixxx::TextureShader m_textureShader;
    std::unique_ptr<QOpenGLTexture> m_pPlayPosMarkTexture;
    bool m_bCuesUpdates{};

    void drawMark(const QRectF& rect, QColor color);
    void drawTexture(float x, float y, QOpenGLTexture* texture);

    DISALLOW_COPY_AND_ASSIGN(WaveformRenderMark);
};