1 #pragma once
2 
3 #include <QObject>
4 
5 #include "control/controlencoder.h"
6 #include "control/controlproxy.h"
7 #include "util/memory.h"
8 
9 class ControlObject;
10 class ControlPushButton;
11 class Library;
12 class LibraryControl;
13 class WLibrary;
14 class WLibrarySidebar;
15 class WSearchLineEdit;
16 class KeyboardEventFilter;
17 
18 class LoadToGroupController : public QObject {
19     Q_OBJECT
20   public:
21     LoadToGroupController(LibraryControl* pParent, const QString& group);
22     virtual ~LoadToGroupController();
23 
24   signals:
25     void loadToGroup(const QString& group, bool);
26 
27   public slots:
28     void slotLoadToGroup(double v);
29     void slotLoadToGroupAndPlay(double v);
30 
31   private:
32     const QString m_group;
33     std::unique_ptr<ControlObject> m_pLoadControl;
34     std::unique_ptr<ControlObject> m_pLoadAndPlayControl;
35 };
36 
37 class LibraryControl : public QObject {
38     Q_OBJECT
39   public:
40     LibraryControl(Library* pLibrary);
41     virtual ~LibraryControl();
42 
43     void bindLibraryWidget(WLibrary* pLibrary, KeyboardEventFilter* pKeyboard);
44     void bindSidebarWidget(WLibrarySidebar* pLibrarySidebar);
45     void bindSearchboxWidget(WSearchLineEdit* pSearchbox);
46 
47   signals:
48     void clearSearchIfClearButtonHasFocus();
49 
50   public slots:
51     // Deprecated navigation slots
52     void slotLoadSelectedTrackToGroup(const QString& group, bool play);
53 
54   private slots:
55     void libraryWidgetDeleted();
56     void sidebarWidgetDeleted();
57     void searchboxWidgetDeleted();
58 
59     void slotMoveUp(double);
60     void slotMoveDown(double);
61     void slotMoveVertical(double);
62     void slotScrollUp(double);
63     void slotScrollDown(double);
64     void slotScrollVertical(double);
65     void slotMoveLeft(double);
66     void slotMoveRight(double);
67     void slotMoveHorizontal(double);
68     void slotMoveFocusForward(double);
69     void slotMoveFocusBackward(double);
70     void slotMoveFocus(double);
71     void slotGoToItem(double v);
72 
73     void slotTrackColorPrev(double v);
74     void slotTrackColorNext(double v);
75 
76     // Deprecated navigation slots
77     void slotSelectNextTrack(double v);
78     void slotSelectPrevTrack(double v);
79     void slotSelectTrack(double v);
80     void slotSelectSidebarItem(double v);
81     void slotSelectNextSidebarItem(double v);
82     void slotSelectPrevSidebarItem(double v);
83     void slotToggleSelectedSidebarItem(double v);
84     void slotLoadSelectedIntoFirstStopped(double v);
85     void slotAutoDjAddTop(double v);
86     void slotAutoDjAddBottom(double v);
87     void slotAutoDjAddReplace(double v);
88 
89     void maybeCreateGroupController(const QString& group);
90     void slotNumDecksChanged(double v);
91     void slotNumSamplersChanged(double v);
92     void slotNumPreviewDecksChanged(double v);
93 
94     void slotSortColumn(double v);
95     void slotSortColumnToggle(double v);
96 
97     void slotFontSize(double v);
98     void slotIncrementFontSize(double v);
99     void slotDecrementFontSize(double v);
100 
101   private:
102     Library* m_pLibrary;
103 
104     // Simulate pressing a key on the keyboard
105     void emitKeyEvent(QKeyEvent&& event);
106     // Give the keyboard focus to the main library pane
107     void setLibraryFocus();
108 
109     // Controls to navigate vertically within currently focused widget (up/down buttons)
110     std::unique_ptr<ControlPushButton> m_pMoveUp;
111     std::unique_ptr<ControlPushButton> m_pMoveDown;
112     std::unique_ptr<ControlEncoder> m_pMoveVertical;
113 
114     // Controls to QUICKLY navigate vertically within currently focused widget (pageup/pagedown buttons)
115     std::unique_ptr<ControlPushButton> m_pScrollUp;
116     std::unique_ptr<ControlPushButton> m_pScrollDown;
117     std::unique_ptr<ControlEncoder> m_pScrollVertical;
118 
119     // Controls to navigate horizontally within currently selected item (left/right buttons)
120     std::unique_ptr<ControlPushButton> m_pMoveLeft;
121     std::unique_ptr<ControlPushButton> m_pMoveRight;
122     std::unique_ptr<ControlEncoder> m_pMoveHorizontal;
123 
124     // Controls to navigate between widgets (tab/shit+tab button)
125     std::unique_ptr<ControlPushButton> m_pMoveFocusForward;
126     std::unique_ptr<ControlPushButton> m_pMoveFocusBackward;
127     std::unique_ptr<ControlEncoder> m_pMoveFocus;
128 
129     // Control to choose the currently selected item in focused widget (double click)
130     std::unique_ptr<ControlObject> m_pGoToItem;
131 
132     // Add to Auto-Dj Queue
133     std::unique_ptr<ControlObject> m_pAutoDjAddTop;
134     std::unique_ptr<ControlObject> m_pAutoDjAddBottom;
135     std::unique_ptr<ControlObject> m_pAutoDjAddReplace;
136 
137     // Controls to sort the track view
138     std::unique_ptr<ControlEncoder> m_pSortColumn;
139     std::unique_ptr<ControlEncoder> m_pSortColumnToggle;
140     std::unique_ptr<ControlPushButton> m_pSortOrder;
141 
142     // Controls to change track color
143     std::unique_ptr<ControlPushButton> m_pTrackColorPrev;
144     std::unique_ptr<ControlPushButton> m_pTrackColorNext;
145 
146     // Font sizes
147     std::unique_ptr<ControlPushButton> m_pFontSizeIncrement;
148     std::unique_ptr<ControlPushButton> m_pFontSizeDecrement;
149     std::unique_ptr<ControlObject> m_pFontSizeKnob;
150 
151     // Direct navigation controls for specific widgets (deprecated)
152     std::unique_ptr<ControlObject> m_pSelectNextTrack;
153     std::unique_ptr<ControlObject> m_pSelectPrevTrack;
154     std::unique_ptr<ControlObject> m_pSelectTrack;
155     std::unique_ptr<ControlObject> m_pSelectSidebarItem;
156     std::unique_ptr<ControlObject> m_pSelectPrevSidebarItem;
157     std::unique_ptr<ControlObject> m_pSelectNextSidebarItem;
158     std::unique_ptr<ControlObject> m_pToggleSidebarItem;
159     std::unique_ptr<ControlObject> m_pLoadSelectedIntoFirstStopped;
160 
161     // Library widgets
162     WLibrary* m_pLibraryWidget;
163     WLibrarySidebar* m_pSidebarWidget;
164     WSearchLineEdit* m_pSearchbox;
165 
166     // Other variables
167     ControlProxy m_numDecks;
168     ControlProxy m_numSamplers;
169     ControlProxy m_numPreviewDecks;
170     std::map<QString, std::unique_ptr<LoadToGroupController>> m_loadToGroupControllers;
171 };
172