Skip to content

Commit 710e5c5

Browse files
💎 Chord progression creation dialog (elieserdejesus#1132) (close elieserdejesus#1124, close elieserdejesus#1042)
* Creating Chord Progression Creation dialog manual test * Finishing the Chord Progression Dialog * Integrating chords dialog in Ninjam Window * Guessing a good measures number when opening chord progression dialog * Always opening current progression in chords dialog
1 parent 6444c15 commit 710e5c5

36 files changed

+823
-30
lines changed

PROJECTS/Jamtaba-common.pri

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ HEADERS += gui/chords/ChordsPanel.h
147147
HEADERS += gui/chords/ChordProgression.h
148148
HEADERS += gui/chords/ChordProgressionMeasure.h
149149
HEADERS += gui/chords/ChordsProgressionParser.h
150+
HEADERS += gui/chords/ChordProgressionCreationDialog.h
150151
HEADERS += gui/chords/ChatChordsProgressionParser.h
151152
HEADERS += gui/chords/Chord.h
152153
HEADERS += gui/LocalTrackView.h
@@ -273,6 +274,7 @@ SOURCES += gui/BpiUtils.cpp
273274
SOURCES += gui/chords/ChordsPanel.cpp
274275
SOURCES += gui/chords/ChordProgression.cpp
275276
SOURCES += gui/chords/ChordProgressionMeasure.cpp
277+
SOURCES += gui/chords/ChordProgressionCreationDialog.cpp
276278
SOURCES += gui/chords/Chord.cpp
277279
SOURCES += gui/chords/ChordLabel.cpp
278280
SOURCES += gui/chords/ChatChordsProgressionParser.cpp
@@ -311,6 +313,7 @@ FORMS += gui/PrivateServerWindow.ui
311313
FORMS += gui/UserNameDialog.ui
312314
FORMS += gui/MainWindow.ui
313315
FORMS += gui/chords/ChordsPanel.ui
316+
FORMS += gui/chords/ChordProgressionCreationDialog.ui
314317

315318
RESOURCES += ../resources/jamtaba.qrc
316319

src/Common/gui/GuiUtils.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,20 @@ QString gui::sanitizeServerName(const QString &serverName)
3434
return serverName;
3535
}
3636

37+
void gui::clearLayout(QLayout *layout)
38+
{
39+
if (!layout)
40+
return;
41+
42+
QLayoutItem *item = nullptr;
43+
while ((item = layout->takeAt(0)) != nullptr) {
44+
45+
if (item->widget())
46+
item->widget()->deleteLater();
47+
48+
if (item->layout())
49+
clearLayout(item->layout());
50+
51+
delete item;
52+
}
53+
}

src/Common/gui/GuiUtils.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ namespace gui {
1212

1313
QString sanitizeServerName(const QString &serverName);
1414

15+
void clearLayout(QLayout *layout);
16+
1517
} // namespace
1618

1719
#endif

src/Common/gui/MainWindow.cpp

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "PrivateServerWindow.h"
1414
#include "chords/ChordsPanel.h"
1515
#include "chords/ChatChordsProgressionParser.h"
16+
#include "chords/ChordProgressionCreationDialog.h"
1617
#include "widgets/BlinkableButton.h"
1718
#include "InactivityDetector.h"
1819
#include "IconFactory.h"
@@ -1319,7 +1320,7 @@ void MainWindow::enterInRoom(const login::RoomInfo &roomInfo)
13191320

13201321
ui.leftPanel->adjustSize();
13211322

1322-
wireNinjamControllerSignals();
1323+
wireNinjamSignals();
13231324

13241325
enableLooperButtonInLocalTracks(true); // looper buttons are enabled when entering in a server
13251326

@@ -1386,7 +1387,7 @@ void MainWindow::addNinjamPanelsInBottom()
13861387

13871388
}
13881389

1389-
void MainWindow::wireNinjamControllerSignals()
1390+
void MainWindow::wireNinjamSignals()
13901391
{
13911392
auto controller = mainController->getNinjamController();
13921393
connect(controller, &NinjamController::preparedToTransmit, this, &MainWindow::startTransmission);
@@ -1416,6 +1417,11 @@ void MainWindow::wireNinjamControllerSignals()
14161417
Q_ASSERT(xmitInactivityDetector);
14171418
xmitInactivityDetector->initialize(controller);
14181419

1420+
if (ninjamWindow) {
1421+
auto chordsDialog = ninjamWindow->getChordProgressionDialog();
1422+
connect(chordsDialog, &ChordProgressionCreationDialog::chordProgressionCreated, this, &MainWindow::acceptChordProgression);
1423+
}
1424+
14191425
}
14201426

14211427
void MainWindow::setPrivateChatInputstatus(const QString userName, bool enabled)
@@ -2657,6 +2663,8 @@ ChordsPanel *MainWindow::createChordsPanel()
26572663
}
26582664
});
26592665

2666+
connect(chordsPanel, &ChordsPanel::openingChordsDialog, ninjamWindow.data(), &NinjamRoomWindow::showChordProgressionDialog);
2667+
26602668
connect(mainController->getNinjamController(), &NinjamController::intervalBeatChanged, chordsPanel, &ChordsPanel::setCurrentBeat);
26612669

26622670
return chordsPanel;
@@ -2715,14 +2723,27 @@ void MainWindow::showChordsPanel()
27152723
if (!mainController || !mainController->isPlayingInNinjamRoom())
27162724
return;
27172725

2718-
if (ui.contentTabWidget->count() < 3) { // chords tab is not created
2726+
if (!chordsPanelIsVisible()) { // chords tab is not created
27192727
auto chordsPanel = createChordsPanel();
27202728
auto tabTitle = tr("Chords");
27212729
auto tabIndex = ui.contentTabWidget->addTab(chordsPanel, tabTitle);
27222730
ui.contentTabWidget->setCurrentIndex(tabIndex);
27232731
}
27242732
}
27252733

2734+
bool MainWindow::chordsPanelIsVisible() const
2735+
{
2736+
return ui.contentTabWidget->count() >= 3;
2737+
}
2738+
2739+
ChordsPanel *MainWindow::getChordsPanel() const
2740+
{
2741+
if (!chordsPanelIsVisible())
2742+
return nullptr;
2743+
2744+
return qobject_cast<ChordsPanel *>(ui.contentTabWidget->widget(2));
2745+
}
2746+
27262747
// ninjam controller events
27272748
void MainWindow::updateBpi(int bpi)
27282749
{

src/Common/gui/MainWindow.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ class MainWindow : public QMainWindow
120120

121121
void fillUserContextMenu(QMenu &menu, const QString &userFullName, bool addInvitationEntry);
122122

123+
ChordsPanel* getChordsPanel() const;
124+
123125
public slots:
124126
void enterInRoom(const login::RoomInfo &roomInfo);
125127
void openLooperWindow(uint trackID);
@@ -316,6 +318,8 @@ private slots:
316318

317319
void connectInMainChat();
318320

321+
bool chordsPanelIsVisible() const;
322+
319323
private:
320324

321325
static const QString JAMTABA_CHAT_BOT_NAME;
@@ -368,7 +372,7 @@ private slots:
368372

369373
void showMessageBox(const QString &title, const QString &text, QMessageBox::Icon icon);
370374

371-
void wireNinjamControllerSignals();
375+
void wireNinjamSignals();
372376

373377
int timerID; // timer used to refresh the entire GUI: animations, peak meters, etc
374378
static const quint8 DEFAULT_REFRESH_RATE;

src/Common/gui/NinjamRoomWindow.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ NinjamRoomWindow::NinjamRoomWindow(MainWindow *mainWindow, const RoomInfo &roomI
5050
tracksSize(TracksSize::WIDE),
5151
metronomeFloatingWindow(nullptr),
5252
roomInfo(roomInfo),
53-
usersColorsPool(mainWindow->getUsersColorsPool())
53+
usersColorsPool(mainWindow->getUsersColorsPool()),
54+
chordProgressionDialog(new ChordProgressionCreationDialog(this))
5455
{
5556
qCDebug(jtNinjamGUI) << "NinjamRoomWindow::NinjamRoomWindow ctor";
5657
ui->setupUi(this);
@@ -733,6 +734,23 @@ void NinjamRoomWindow::setupSignals(controller::NinjamController* ninjamControll
733734

734735
connect(mainController->getNinjamService(), &ninjam::client::Service::videoIntervalCompleted, this, &NinjamRoomWindow::setVideoInterval);
735736

737+
connect(ui->chordsButton, &QPushButton::clicked, [=](){
738+
739+
auto chordsPanel = mainWindow->getChordsPanel();
740+
auto currentProgression = ChordProgression();
741+
if (chordsPanel)
742+
currentProgression = chordsPanel->getChordProgression();
743+
744+
showChordProgressionDialog(currentProgression);
745+
});
746+
}
747+
748+
void NinjamRoomWindow::showChordProgressionDialog(const ChordProgression &currentProgression)
749+
{
750+
if (chordProgressionDialog) {
751+
auto currentBpi = ninjamPanel->getBpi();
752+
chordProgressionDialog->show(currentBpi, currentProgression);
753+
}
736754
}
737755

738756
void NinjamRoomWindow::setVideoInterval(const User &user, const QByteArray &encodedVideoData)

src/Common/gui/NinjamRoomWindow.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "NinjamPanel.h"
1212
#include "MetronomePanel.h"
1313
#include "intervalProgress/IntervalProgressWindow.h"
14+
#include "chords/ChordProgressionCreationDialog.h"
1415
#include "chat/ChatPanel.h"
1516
#include "ninjam/client/UserChannel.h"
1617

@@ -44,6 +45,7 @@ class NinjamRoomWindow : public QWidget
4445

4546
NinjamPanel *getNinjamPanel() const;
4647
MetronomePanel *getMetronomePanel() const;
48+
ChordProgressionCreationDialog *getChordProgressionDialog() const;
4749

4850
void setTracksLayout(TracksLayout newLayout);
4951

@@ -73,6 +75,7 @@ public slots:
7375
void setChannelXmitStatus(long channelID, bool transmiting);
7476
void resetBpiComboBox();
7577
void resetBpmComboBox();
78+
void showChordProgressionDialog(const ChordProgression &currentProgression);
7679

7780
protected:
7881
Ui::NinjamRoomWindow *ui;
@@ -103,6 +106,7 @@ public slots:
103106
TracksSize tracksSize;
104107

105108
IntervalProgressWindow *metronomeFloatingWindow;
109+
ChordProgressionCreationDialog *chordProgressionDialog;
106110

107111
void createLayoutButtons(TracksLayout initialLayout);
108112
QToolButton *horizontalLayoutButton;
@@ -174,6 +178,11 @@ private slots:
174178
void updateStylesheet();
175179
};
176180

181+
inline ChordProgressionCreationDialog *NinjamRoomWindow::getChordProgressionDialog() const
182+
{
183+
return chordProgressionDialog;
184+
}
185+
177186
inline QList<NinjamTrackGroupView *> NinjamRoomWindow::getTrackGroups() const
178187
{
179188
return trackGroups.values();

src/Common/gui/NinjamRoomWindow.ui

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,29 @@
9292
</property>
9393
</widget>
9494
</item>
95+
<item>
96+
<widget class="QPushButton" name="chordsButton">
97+
<property name="sizePolicy">
98+
<sizepolicy hsizetype="Maximum" vsizetype="MinimumExpanding">
99+
<horstretch>0</horstretch>
100+
<verstretch>0</verstretch>
101+
</sizepolicy>
102+
</property>
103+
<property name="minimumSize">
104+
<size>
105+
<width>16</width>
106+
<height>16</height>
107+
</size>
108+
</property>
109+
<property name="text">
110+
<string/>
111+
</property>
112+
<property name="icon">
113+
<iconset resource="../../resources/jamtaba.qrc">
114+
<normaloff>:/images/chords.png</normaloff>:/images/chords.png</iconset>
115+
</property>
116+
</widget>
117+
</item>
95118
</layout>
96119
</item>
97120
<item>
@@ -139,6 +162,8 @@
139162
</item>
140163
</layout>
141164
</widget>
142-
<resources/>
165+
<resources>
166+
<include location="../../resources/jamtaba.qrc"/>
167+
</resources>
143168
<connections/>
144169
</ui>

src/Common/gui/chords/ChordProgression.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,18 @@ const QList<ChordProgressionMeasure *> ChordProgression::getMeasures() const
1515
return measuresPointers;
1616
}
1717

18+
int ChordProgression::getMaxChordsPerMeasure() const
19+
{
20+
auto maxChords = 1;
21+
for (auto measure : measures) {
22+
auto chords = measure.getChords().size();
23+
if (chords > maxChords)
24+
maxChords = chords;
25+
}
26+
27+
return maxChords;
28+
}
29+
1830
bool ChordProgression::canBeUsed(int bpi) const
1931
{
2032
auto dividers = bpiUtils::getBpiDividers(bpi);

src/Common/gui/chords/ChordProgression.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class ChordProgression
1212
bool isEmpty() const;
1313
void addMeasure(const ChordProgressionMeasure &measure);
1414
const QList<ChordProgressionMeasure *> getMeasures() const;
15+
int getMeasuresCount() const;
16+
int getMaxChordsPerMeasure() const;
1517
QString toString() const;
1618
bool canBeUsed(int bpi) const;
1719
ChordProgression getStretchedVersion(int bpi) const;
@@ -23,6 +25,10 @@ class ChordProgression
2325
QList<ChordProgressionMeasure> measures;
2426
};
2527

28+
inline int ChordProgression::getMeasuresCount() const
29+
{
30+
return measures.count();
31+
}
2632

2733
inline bool ChordProgression::isEmpty() const
2834
{

0 commit comments

Comments
 (0)