1 #pragma once
2 
3 #include <QDialog>
4 #include <QList>
5 #include <QString>
6 #include <QTimer>
7 
8 #include "controllers/ui_dlgcontrollerlearning.h"
9 #include "controllers/controlpickermenu.h"
10 #include "controllers/midi/midicontroller.h"
11 #ifdef __HID__
12 #include "controllers/hid/hidcontroller.h"
13 #endif
14 #include "controllers/bulk/bulkcontroller.h"
15 #include "controllers/midi/midimessage.h"
16 #include "controllers/controller.h"
17 #include "controllers/controllervisitor.h"
18 #include "preferences/usersettings.h"
19 
20 class ControllerPreset;
21 
22 //#define CONTROLLERLESSTESTING
23 
24 /// The controller mapping learning wizard
25 class DlgControllerLearning : public QDialog,
26                               public ControllerVisitor,
27                               public Ui::DlgControllerLearning {
28     Q_OBJECT
29 
30   public:
31     DlgControllerLearning(QWidget *parent, Controller *controller);
32     virtual ~DlgControllerLearning();
33 
34     void visit(MidiController* pController);
35     void visit(HidController* pController);
36     void visit(BulkController* pController);
37 
38   signals:
39     void learnTemporaryInputMappings(const MidiInputMappings& mappings);
40     void clearTemporaryInputMappings();
41     void commitTemporaryInputMappings();
42 
43     // Used to notify DlgPrefController that we have learned some new input
44     // mappings.
45     void inputMappingsLearned(const MidiInputMappings& mappings);
46 
47     void startLearning();
48     void stopLearning();
49     void listenForClicks();
50     void stopListeningForClicks();
51 
52   public slots:
53     // Triggered when the user picks a control from the menu.
54     void controlPicked(const ConfigKey& control);
55     // Triggered when user clicks a control from the GUI
56     void controlClicked(ControlObject* pControl);
57     void comboboxIndexChanged(int index);
58 
59     void slotMessageReceived(unsigned char status,
60                              unsigned char control,
61                              unsigned char value);
62 
63     void slotCancelLearn();
64     void slotChooseControlPressed();
65     void slotTimerExpired();
66     void slotFirstMessageTimeout();
67     void slotRetry();
68     void slotStartLearningPressed();
69     void slotMidiOptionsChanged();
70 
71   private slots:
72     void showControlMenu();
73 #ifdef CONTROLLERLESSTESTING
74     void DEBUGFakeMidiMessage();
75     void DEBUGFakeMidiMessage2();
76 #endif
77 
78   private:
79     void loadControl(const ConfigKey& key, const QString& title, QString description);
80     void startListening();
81     void commitMapping();
82     void resetWizard(bool keepCurrentControl = false);
83     void populateComboBox();
84 
85     Controller* m_pController;
86     MidiController* m_pMidiController;
87     ControlPickerMenu m_controlPickerMenu;
88     ConfigKey m_currentControl;
89     bool m_messagesLearned;
90     QTimer m_firstMessageTimer;
91     QTimer m_lastMessageTimer;
92     QList<QPair<MidiKey, unsigned char> > m_messages;
93     MidiInputMappings m_mappings;
94 };
95