Skip to content

Commit

Permalink
- MIDI Controller mappings are now shown on floating tool-tips.
Browse files Browse the repository at this point in the history
  (EXPERIMENTAL)
  • Loading branch information
rncbc committed Mar 30, 2024
1 parent 2d9a26f commit 45e61eb
Show file tree
Hide file tree
Showing 24 changed files with 869 additions and 722 deletions.
3 changes: 3 additions & 0 deletions ChangeLog
Expand Up @@ -6,6 +6,9 @@ ChangeLog

GIT HEAD

- MIDI Controller mappings are now shown on floating tool-tips.
(EXPERIMENTAL)

- Custom color themes are now file based (*.conf); legacy still
preserved ntl. (EXPERIMENTAL)

Expand Down
59 changes: 56 additions & 3 deletions src/qtractorMidiControl.cpp
Expand Up @@ -537,25 +537,30 @@ void qtractorMidiControl::sendController (

// Insert/remove observer mappings.
void qtractorMidiControl::mapMidiObserver (
qtractorMidiControlObserver *pMidiObserver )
qtractorMidiControlObserver *pMidiObserver, QWidget *pWidget )
{
const MapKey key(
pMidiObserver->type(),
pMidiObserver->channel(),
pMidiObserver->param());

m_observerMap.insert(key, pMidiObserver);

mapMidiObserverWidget(pMidiObserver, pWidget);
}

void qtractorMidiControl::unmapMidiObserver (
qtractorMidiControlObserver *pMidiObserver )
qtractorMidiControlObserver *pMidiObserver, bool bResetWidgets )
{
const MapKey key(
pMidiObserver->type(),
pMidiObserver->channel(),
pMidiObserver->param());

m_observerMap.remove(key);

if (bResetWidgets)
unmapMidiObserverWidgets(pMidiObserver, true);
}

// Observer map predicate.
Expand All @@ -571,12 +576,60 @@ bool qtractorMidiControl::isMidiObserverMapped (

// Observer finder.
qtractorMidiControlObserver *qtractorMidiControl::findMidiObserver (
ControlType ctype, unsigned short iChannel, unsigned short iParam) const
ControlType ctype, unsigned short iChannel, unsigned short iParam ) const
{
return m_observerMap.value(MapKey(ctype, iChannel, iParam), nullptr);
}


// Observer (widget) mappings.
void qtractorMidiControl::mapMidiObserverWidget (
qtractorMidiControlObserver *pMidiObserver, QWidget *pWidget )
{
if (pWidget)
m_widgetMap.insert(pMidiObserver, pWidget);

QString sToolTip = pMidiObserver->subject()->name();

if (isMidiObserverMapped(pMidiObserver)) {
sToolTip += '\n';
sToolTip += '\n';
sToolTip += QObject::tr("MIDI Controller: %1, %2, %3")
.arg(qtractorMidiControl::nameFromType(pMidiObserver->type()))
.arg(QString::number(pMidiObserver->channel() + 1))
.arg(QString::number(pMidiObserver->param()));
}

QListIterator<QWidget *> iter(m_widgetMap.values(pMidiObserver));
while (iter.hasNext())
iter.next()->setToolTip(sToolTip);
}


void qtractorMidiControl::unmapMidiObserverWidget (
qtractorMidiControlObserver *pMidiObserver, QWidget *pWidget )
{
if (pWidget) {
m_widgetMap.remove(pMidiObserver, pWidget);
} else {
m_widgetMap.remove(pMidiObserver);
}
}


void qtractorMidiControl::unmapMidiObserverWidgets (
qtractorMidiControlObserver *pMidiObserver, bool bResetWidgets )
{
if (bResetWidgets) {
QListIterator<QWidget *> iter(m_widgetMap.values(pMidiObserver));
while (iter.hasNext())
iter.next()->setToolTip(pMidiObserver->subject()->name());
} else {
m_widgetMap.remove(pMidiObserver);
}
}


//----------------------------------------------------------------------
// qtractorMidiControl::Document -- MIDI control document.
//
Expand Down
19 changes: 17 additions & 2 deletions src/qtractorMidiControl.h
Expand Up @@ -39,6 +39,7 @@ class qtractorDocument;
class qtractorMidiControlObserver;

class QDomElement;
class QWidget;


//----------------------------------------------------------------------
Expand Down Expand Up @@ -313,8 +314,10 @@ class qtractorMidiControl
const ControlMap& controlMap() const { return m_controlMap; }

// Insert/remove observer mappings.
void mapMidiObserver(qtractorMidiControlObserver *pMidiObserver);
void unmapMidiObserver(qtractorMidiControlObserver *pMidiObserver);
void mapMidiObserver(
qtractorMidiControlObserver *pMidiObserver, QWidget *pWidget = nullptr);
void unmapMidiObserver(
qtractorMidiControlObserver *pMidiObserver, bool bResetWidgets = false);

// Observer map predicate.
bool isMidiObserverMapped(qtractorMidiControlObserver *pMidiObserver) const;
Expand All @@ -325,6 +328,14 @@ class qtractorMidiControl
unsigned short iChannel,
unsigned short iParam) const;

// Observer (widget) mappings.
void mapMidiObserverWidget(
qtractorMidiControlObserver *pMidiObserver, QWidget *pWidget);
void unmapMidiObserverWidget(
qtractorMidiControlObserver *pMidiObserver, QWidget *pWidget);
void unmapMidiObserverWidgets(
qtractorMidiControlObserver *pMidiObserver, bool bResetWidgets = false);

// Forward declaration.
class Document;

Expand Down Expand Up @@ -482,6 +493,10 @@ class qtractorMidiControl

ObserverMap m_observerMap;

typedef QMultiHash<qtractorMidiControlObserver *, QWidget *> WidgetMap;

WidgetMap m_widgetMap;

// MIDI control non catch-up/hook global option.
static bool g_bSync;

Expand Down
12 changes: 7 additions & 5 deletions src/qtractorMidiControlCommand.cpp
@@ -1,7 +1,7 @@
// qtractorMidiControlCommand.cpp
//
/****************************************************************************
Copyright (C) 2010-2019, rncbc aka Rui Nuno Capela. All rights reserved.
Copyright (C) 2010-2024, rncbc aka Rui Nuno Capela. All rights reserved.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
Expand Down Expand Up @@ -30,8 +30,10 @@

// Constructor.
qtractorMidiControlObserverCommand::qtractorMidiControlObserverCommand (
const QString& sName, qtractorMidiControlObserver *pMidiObserver )
: qtractorCommand(sName), m_pMidiObserver(pMidiObserver)
const QString& sName, qtractorMidiControlObserver *pMidiObserver,
QWidget *pMidiObserverWidget ) : qtractorCommand(sName),
m_pMidiObserver(pMidiObserver),
m_pMidiObserverWidget(pMidiObserverWidget)
{
setRefresh(false);
}
Expand All @@ -47,7 +49,7 @@ bool qtractorMidiControlObserverCommand::mapMidiObserver (void) const
if (pMidiControl->isMidiObserverMapped(m_pMidiObserver))
return false;

pMidiControl->mapMidiObserver(m_pMidiObserver);
pMidiControl->mapMidiObserver(m_pMidiObserver, m_pMidiObserverWidget);
return true;
}

Expand All @@ -62,7 +64,7 @@ bool qtractorMidiControlObserverCommand::unmapMidiObserver (void) const
if (!pMidiControl->isMidiObserverMapped(m_pMidiObserver))
return false;

pMidiControl->unmapMidiObserver(m_pMidiObserver);
pMidiControl->unmapMidiObserver(m_pMidiObserver, true);
return true;
}

Expand Down
25 changes: 15 additions & 10 deletions src/qtractorMidiControlCommand.h
@@ -1,7 +1,7 @@
// qtractorMidiControlCommand.h
//
/****************************************************************************
Copyright (C) 2010-2019, rncbc aka Rui Nuno Capela. All rights reserved.
Copyright (C) 2010-2024, rncbc aka Rui Nuno Capela. All rights reserved.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
Expand All @@ -27,10 +27,6 @@
#include "qtractorMidiControl.h"


// Forward declarations...
class qtractorMidiControlObserver;


//----------------------------------------------------------------------
// class qtractorMidiControlObserverCommand - declaration.
//
Expand All @@ -41,7 +37,8 @@ class qtractorMidiControlObserverCommand : public qtractorCommand

// Constructor.
qtractorMidiControlObserverCommand(const QString& sName,
qtractorMidiControlObserver *pMidiObserver = nullptr);
qtractorMidiControlObserver *pMidiObserver,
QWidget *pMidiObserverWidget = nullptr);

protected:

Expand All @@ -53,6 +50,8 @@ class qtractorMidiControlObserverCommand : public qtractorCommand

// Instance variables.
qtractorMidiControlObserver *m_pMidiObserver;

QWidget *m_pMidiObserverWidget;
};


Expand All @@ -65,9 +64,12 @@ class qtractorMidiControlObserverMapCommand : public qtractorMidiControlObserver
public:

// Constructor.
qtractorMidiControlObserverMapCommand(qtractorMidiControlObserver *pMidiObserver)
qtractorMidiControlObserverMapCommand(
qtractorMidiControlObserver *pMidiObserver,
QWidget *pMidiObserverWidget = nullptr)
: qtractorMidiControlObserverCommand(
QObject::tr("set controller"), pMidiObserver) {}
QObject::tr("set controller"),
pMidiObserver, pMidiObserverWidget) {}

// MIDI control observer command methods.
bool redo() { return mapMidiObserver(); }
Expand All @@ -84,9 +86,12 @@ class qtractorMidiControlObserverUnmapCommand : public qtractorMidiControlObserv
public:

// Constructor.
qtractorMidiControlObserverUnmapCommand(qtractorMidiControlObserver *pMidiObserver)
qtractorMidiControlObserverUnmapCommand(
qtractorMidiControlObserver *pMidiObserver,
QWidget *pMidiObserverWidget = nullptr)
: qtractorMidiControlObserverCommand(
QObject::tr("reset controller"), pMidiObserver) {}
QObject::tr("reset controller"),
pMidiObserver, pMidiObserverWidget) {}

// MIDI control observer command methods.
bool redo() { return unmapMidiObserver(); }
Expand Down
8 changes: 5 additions & 3 deletions src/qtractorMidiControlObserver.cpp
Expand Up @@ -70,16 +70,18 @@ qtractorMidiControlObserver::qtractorMidiControlObserver (
qtractorMidiControlObserver::~qtractorMidiControlObserver (void)
{
qtractorMidiControl *pMidiControl = qtractorMidiControl::getInstance();
if (pMidiControl && pMidiControl->isMidiObserverMapped(this))
pMidiControl->unmapMidiObserver(this);
if (pMidiControl) {
pMidiControl->unmapMidiObserverWidgets(this);
if (pMidiControl->isMidiObserverMapped(this))
pMidiControl->unmapMidiObserver(this);
}
}


// MIDI scale type (7bit vs. 14bit).
unsigned short qtractorMidiControlObserver::midiScale (void) const
{
if (m_ctype == qtractorMidiEvent::PITCHBEND ||

m_ctype == qtractorMidiEvent::CONTROL14 ||
m_ctype == qtractorMidiEvent::REGPARAM ||
m_ctype == qtractorMidiEvent::NONREGPARAM)
Expand Down

0 comments on commit 45e61eb

Please sign in to comment.