/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */

/*
    Rosegarden
    A MIDI and audio sequencer and musical notation editor.
    Copyright 2000-2026 the Rosegarden development team.

    Other copyrights also apply to some parts of this work.  Please
    see the AUTHORS file and individual file headers for details.

    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.  See the file
    COPYING included with this distribution for more information.
*/

#ifndef RG_EVENTPARAMETERDIALOG_H
#define RG_EVENTPARAMETERDIALOG_H

#include "commands/edit/SelectionPropertyCommand.h"  // for SelectionSituation

#include <QDialog>

#include <vector>

class QWidget;
class QSpinBox;
class QString;
class QLabel;
class QComboBox;


namespace Rosegarden
{


class ParameterPattern;

/// Set Event Velocities and Set Controller Values dialogs.
/**
 * Sets a property for a group of events.  Ultimately makes a
 * ParameterPattern::Result to be passed to SelectionPropertyCommand.
 *
 * Launched from the Matrix and Notation editors by:
 *
 *   - Adjust > Set Event Velocities...
 *   - Controllers > Set Controller Values...
 *
 * @author Chris Cannam (originally)
 * @author Tom Breton (Tehom) (adapted)
 */
class EventParameterDialog : public QDialog
{
    Q_OBJECT

public:
    // @author Tom Breton (Tehom) (some)
    // @author Chris Cannam (most)
    EventParameterDialog(
            QWidget *parent,
            const QString &name,
            SelectionSituation *situation,
            const ParameterPattern::ParameterPatternVec *patterns);

    ParameterPattern::Result getResult();

public slots:
    // React to selecting a pattern: Set up the parameter widgets in
    // accordance with what the pattern tells us it needs.
    void slotPatternSelected(int value);

private:
    const SelectionSituation *m_situation;

    // The available patterns.
    const ParameterPattern::ParameterPatternVec *m_patterns;
    // Get the current pattern index.
    const ParameterPattern *getPattern(int index) const
    { return m_patterns->at(index); }

    // The widget that chooses the current pattern.
    QComboBox *m_patternCombo;
    // Initialize m_patternCombo.
    void initPatternCombo();

    // cppcheck-suppress noCopyConstructor
    /// A QLabel and a QSpinBox.
    /**
     * ??? The name ParameterWidget is misleading.  This is not a widget.
     *     A QWidget is used in the ctor.  This should derive from QWidget
     *     and act like one.  Then the name ParameterWidget makes sense.
     *     See comments in the ctor.
     *
     * @author Tom Breton (Tehom)
     */
    class ParameterWidget
    {
    public:
        explicit ParameterWidget(QLayout *parent);

        void showByArgs(const ParameterPattern::SliderSpec *args);
        void hide();

        int getValue() const;

    private:
        // We only include the widgets that we may want to interact with
        // in other code.
        // cppcheck-suppress unsafeClassCanLeak
        QSpinBox *m_spinBox;
        // cppcheck-suppress unsafeClassCanLeak
        QLabel *m_label;
    };
    typedef std::vector<ParameterWidget> ParameterWidgetVector;
    // All the parameter widgets.  Not all are used with
    // all patterns.
    ParameterWidgetVector m_parameterWidgetVector;
    // Number of parameters currently in use.  Not always the same as
    // m_paramVec.size().
    int m_numberOfParameters;
    // Get a vector of the current parameters.  This makes part of our
    // final result object.
    ParameterPattern::BareParams getBareParams();
};


}

#endif
