Skip to content

Commit a17a646

Browse files
committed
Merge branch 'master' into release
2 parents e3faf69 + 1f7adf5 commit a17a646

File tree

6 files changed

+134
-72
lines changed

6 files changed

+134
-72
lines changed

CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,18 @@ list(APPEND obs-midi_HEADERS
7878
src/macro-helpers.h
7979
src/Midi_hook.h
8080
src/Midi_message.h)
81+
set(obs_midi_UI
82+
src/forms/settings-dialog.ui)
83+
84+
qt5_wrap_ui(obs_midi_UI_HEADERS ${obs_midi_UI})
8185

8286
add_library(obs-midi MODULE
8387
${obs-midi_SOURCES}
88+
${obs_midi_UI_HEADERS}
8489
${obs-midi_HEADERS})
8590
include_directories(
8691
"${LIBOBS_INCLUDE_DIR}/../UI/obs-frontend-api"
87-
92+
${obs_midi_UI_HEADERS}
8893
${Qt5Core_INCLUDES}
8994
${Qt5Widgets_INCLUDES}
9095
"${CMAKE_SOURCE_DIR}/deps/asio/asio/include")

src/forms/settings-dialog.cpp

Lines changed: 89 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ PluginWindow::PluginWindow(QWidget *parent) : QDialog(parent, Qt::Dialog), ui(ne
3838
configure_table();
3939
hide_all_pairs();
4040
connect_ui_signals();
41-
41+
reset_to_defaults();
4242
starting = false;
4343
}
4444
void PluginWindow::configure_table() const
@@ -68,6 +68,7 @@ void PluginWindow::connect_ui_signals() const
6868
connect(ui->table_mapping, SIGNAL(cellClicked(int, int)), this, SLOT(edit_mapping()));
6969
/**************Connections to mappper****************/
7070
connect(ui->btn_add, SIGNAL(clicked()), this, SLOT(add_new_mapping()));
71+
connect(ui->btn_reset, SIGNAL(clicked()), this, SLOT(reset_to_defaults()));
7172
connect(ui->btn_delete, SIGNAL(clicked()), this, SLOT(delete_mapping()));
7273
connect(ui->tabWidget, SIGNAL(currentChanged(int)), this, SLOT(tab_changed(int)));
7374
connect(ui->outbox, SIGNAL(currentTextChanged(QString)), this, SLOT(select_output_device(QString)));
@@ -450,16 +451,23 @@ void PluginWindow::reset_to_defaults() const
450451
ui->cb_obs_output_audio_source->setCurrentIndex(0);
451452
ui->cb_obs_output_media_source->setCurrentIndex(0);
452453
ui->sb_channel->setValue(0);
453-
ui->sb_norc->setValue(0);
454+
ui->sb_norc->clear();
454455
ui->cb_mtype->setCurrentIndex(0);
455456
ui->slider_value->setValue(0);
456457
ui->btn_add->setText("Add Mapping");
457458
ui->btn_delete->setEnabled(false);
459+
ui->btn_reset->setEnabled(false);
458460
ui->table_mapping->clearSelection();
461+
ui->sb_max->clear();
462+
ui->sb_min->clear();
463+
ui->sb_int_override->clear();
464+
clear_table();
465+
load_table();
459466
this->ui->table_mapping->resizeColumnsToContents();
460467
}
461468
void PluginWindow::obs_actions_select(const QString &action) const
462469
{
470+
ui->btn_reset->setEnabled(true);
463471
if (!switching) {
464472
hide_all_pairs();
465473
switch (ActionsClass::string_to_action(Utils::untranslate(action))) {
@@ -605,9 +613,9 @@ void PluginWindow::obs_actions_select(const QString &action) const
605613
ui->label_Int_override->setText("Duration * ");
606614
ui->sb_int_override->setSuffix(" ms");
607615
break;
608-
case ActionsClass::Actions::Trigger_Hotkey_By_Name:
609-
show_pair(Pairs::Hotkey);
610-
break;
616+
case ActionsClass::Actions::Trigger_Hotkey_By_Name:
617+
show_pair(Pairs::Hotkey);
618+
break;
611619
default:
612620
hide_all_pairs();
613621
break;
@@ -673,8 +681,6 @@ void PluginWindow::add_new_mapping()
673681
const auto row = (editmode) ? editrow : ui->table_mapping->rowCount();
674682
if (!editmode)
675683
ui->table_mapping->insertRow(row);
676-
677-
editmode = false;
678684
// don't delete it, because the table takes ownership of the items
679685
const auto channel_item = new QTableWidgetItem(QString::number(ui->sb_channel->value()));
680686
const auto message_type_item = new QTableWidgetItem(ui->cb_mtype->currentText());
@@ -690,47 +696,71 @@ void PluginWindow::add_new_mapping()
690696
const auto int_override = new QTableWidgetItem(QString::number(ui->sb_int_override->value()));
691697
const auto min = new QTableWidgetItem(QString::number(ui->sb_min->value()));
692698
const auto max = new QTableWidgetItem(QString::number(ui->sb_max->value()));
693-
const auto hotkey_item = new QTableWidgetItem(ui->cb_obs_output_hotkey->currentText());
699+
const auto hotkey_item = new QTableWidgetItem(ui->cb_obs_output_hotkey->currentText());
694700
ui->table_mapping->setItem(row, 0, channel_item);
695701
ui->table_mapping->setItem(row, 1, message_type_item);
696702
ui->table_mapping->setItem(row, 2, norc_item);
697703
ui->table_mapping->setItem(row, 3, action_item);
698-
ui->table_mapping->setItem(row, 4, scene_item);
699-
ui->table_mapping->setItem(row, 5, source_item);
700-
ui->table_mapping->setItem(row, 6, filter_item);
701-
ui->table_mapping->setItem(row, 7, transition_item);
702-
ui->table_mapping->setItem(row, 8, item_item);
703-
ui->table_mapping->setItem(row, 9, audio_item);
704-
ui->table_mapping->setItem(row, 10, media_item);
705-
ui->table_mapping->setItem(row, 11, int_override);
706-
ui->table_mapping->setItem(row, 12, min);
707-
ui->table_mapping->setItem(row, 13, max);
708-
ui->table_mapping->setItem(row, 14, hotkey_item);
709-
710-
set_all_cell_colors(row);
711-
auto *new_midi_hook = (editmode) ? find_existing_hook() : new MidiHook();
704+
705+
auto *new_midi_hook = new MidiHook();
712706
new_midi_hook->channel = ui->sb_channel->value();
713707
new_midi_hook->message_type = ui->cb_mtype->currentText();
714708
new_midi_hook->norc = ui->sb_norc->value();
715709
new_midi_hook->value_as_filter = ui->check_use_value->isChecked();
716-
new_midi_hook->value.emplace((ui->check_use_value->isChecked()) ? ui->slider_value->value() : NULL);
710+
new_midi_hook->value.emplace(ui->slider_value->value());
717711
new_midi_hook->action = ui->cb_obs_output_action->currentText();
718-
new_midi_hook->scene = ui->cb_obs_output_scene->currentText();
719-
new_midi_hook->source = ui->cb_obs_output_source->currentText();
720-
new_midi_hook->filter = ui->cb_obs_output_filter->currentText();
721-
new_midi_hook->transition = ui->cb_obs_output_transition->currentText();
722-
new_midi_hook->item = ui->cb_obs_output_item->currentText();
723-
new_midi_hook->hotkey = ui->cb_obs_output_hotkey->currentText();
724-
new_midi_hook->audio_source = ui->cb_obs_output_audio_source->currentText();
725-
new_midi_hook->media_source = ui->cb_obs_output_media_source->currentText();
726-
new_midi_hook->int_override.emplace(ui->sb_int_override->value());
727-
new_midi_hook->range_min.emplace(ui->sb_min->value());
728-
new_midi_hook->range_max.emplace(ui->sb_max->value());
712+
if (ui->cb_obs_output_scene->isVisible()) {
713+
ui->table_mapping->setItem(row, 4, scene_item);
714+
new_midi_hook->scene = ui->cb_obs_output_scene->currentText();
715+
}
716+
if (ui->cb_obs_output_source->isVisible()) {
717+
ui->table_mapping->setItem(row, 5, source_item);
718+
new_midi_hook->source = ui->cb_obs_output_source->currentText();
719+
}
720+
if (ui->cb_obs_output_filter->isVisible()) {
721+
ui->table_mapping->setItem(row, 6, filter_item);
722+
new_midi_hook->filter = ui->cb_obs_output_filter->currentText();
723+
}
724+
if (ui->cb_obs_output_transition->isVisible()) {
725+
ui->table_mapping->setItem(row, 7, transition_item);
726+
new_midi_hook->transition = ui->cb_obs_output_transition->currentText();
727+
}
728+
if (ui->cb_obs_output_item->isVisible()) {
729+
ui->table_mapping->setItem(row, 8, item_item);
730+
new_midi_hook->item = ui->cb_obs_output_item->currentText();
731+
}
732+
if (ui->cb_obs_output_hotkey->isVisible())
733+
new_midi_hook->hotkey = ui->cb_obs_output_hotkey->currentText();
734+
if (ui->cb_obs_output_audio_source->isVisible()) {
735+
ui->table_mapping->setItem(row, 9, audio_item);
736+
new_midi_hook->audio_source = ui->cb_obs_output_audio_source->currentText();
737+
}
738+
if (ui->cb_obs_output_media_source->isVisible()) {
739+
ui->table_mapping->setItem(row, 10, media_item);
740+
new_midi_hook->media_source = ui->cb_obs_output_media_source->currentText();
741+
}
742+
if (ui->sb_int_override->isVisible()) {
743+
ui->table_mapping->setItem(row, 11, int_override);
744+
new_midi_hook->int_override.emplace(ui->sb_int_override->value());
745+
}
746+
if (ui->sb_min->isVisible()) {
747+
ui->table_mapping->setItem(row, 12, min);
748+
new_midi_hook->range_min.emplace(ui->sb_min->value());
749+
}
750+
if (ui->sb_max->isVisible()) {
751+
ui->table_mapping->setItem(row, 13, max);
752+
new_midi_hook->range_max.emplace(ui->sb_max->value());
753+
}
754+
ui->table_mapping->setItem(row, 14, hotkey_item);
729755
new_midi_hook->setAction();
730-
GetDeviceManager().get()->get_midi_device(ui->mapping_lbl_device_name->text())->add_MidiHook(new_midi_hook);
731-
756+
set_all_cell_colors(row);
757+
if (editmode) {
758+
GetDeviceManager().get()->get_midi_device(ui->mapping_lbl_device_name->text())->edit_midi_hook(edithook, new_midi_hook);
759+
} else {
760+
GetDeviceManager().get()->get_midi_device(ui->mapping_lbl_device_name->text())->add_MidiHook(new_midi_hook);
761+
}
732762
GetConfig().get()->Save();
733-
ui->table_mapping->selectRow(row);
763+
reset_to_defaults();
734764
this->ui->table_mapping->resizeColumnsToContents();
735765
} else {
736766
if (ui->sb_channel->value()) {
@@ -753,6 +783,8 @@ void PluginWindow::add_new_mapping()
753783
Utils::alert_popup(mess);
754784
}
755785
}
786+
if (editmode)
787+
editmode = false;
756788
}
757789
void PluginWindow::add_row_from_hook(const MidiHook *hook) const
758790
{
@@ -796,7 +828,7 @@ void PluginWindow::set_all_cell_colors(const int row) const
796828
{
797829
const QColor midi_color(0, 170, 255);
798830
const QColor action_color(170, 0, 255);
799-
831+
800832
for (auto col = 0; col <= ui->table_mapping->columnCount(); col++) {
801833
auto *const rc = ui->table_mapping->item(row, col);
802834
(col < 3) ? set_cell_colors(midi_color, rc) : set_cell_colors(action_color, rc);
@@ -847,32 +879,36 @@ void PluginWindow::remove_hook(MidiHook *hook) const
847879
}
848880
void PluginWindow::delete_mapping() const
849881
{
850-
if (ui->table_mapping->rowCount() > 0) {
851-
auto row = ui->table_mapping->selectedItems().at(0)->row();
852-
blog(LOG_DEBUG, "selected row to delete %i", row);
853-
const auto hooks = GetDeviceManager()->get_midi_device(ui->mapping_lbl_device_name->text())->GetMidiHooks();
854-
for (auto *hook : hooks) {
855-
if ((hook->channel == ui->sb_channel->value()) && (hook->norc == ui->sb_norc->value()) &&
856-
(hook->message_type == ui->cb_mtype->currentText())) {
857-
if (hook->value_as_filter) {
858-
if (hook->value == ui->slider_value->value()) {
859-
remove_hook(hook);
860-
ui->table_mapping->removeRow(row);
861-
ui->table_mapping->clearSelection();
862-
}
863-
} else {
882+
if (ui->table_mapping->rowCount() <= 0)
883+
return;
884+
885+
auto row = ui->table_mapping->selectedItems().at(0)->row();
886+
blog(LOG_DEBUG, "selected row to delete %i", row);
887+
const auto hooks = GetDeviceManager()->get_midi_device(ui->mapping_lbl_device_name->text())->GetMidiHooks();
888+
for (auto *hook : hooks) {
889+
if ((hook->channel == ui->sb_channel->value()) && (hook->norc == ui->sb_norc->value()) && (hook->message_type == ui->cb_mtype->currentText())) {
890+
if (hook->value_as_filter) {
891+
if (hook->value == ui->slider_value->value()) {
864892
remove_hook(hook);
865893
ui->table_mapping->removeRow(row);
866894
ui->table_mapping->clearSelection();
867895
}
896+
} else {
897+
remove_hook(hook);
898+
ui->table_mapping->removeRow(row);
899+
ui->table_mapping->clearSelection();
868900
}
869901
}
870902
}
903+
reset_to_defaults();
871904
}
872905
void PluginWindow::edit_mapping()
873906
{
874907
if (ui->table_mapping->rowCount() != 0) {
875908
editmode = true;
909+
910+
ui->btn_add->setText("Save Edits");
911+
ui->btn_reset->setEnabled(true);
876912
const auto dv = GetDeviceManager().get()->get_midi_hooks(ui->mapping_lbl_device_name->text());
877913
blog(LOG_DEBUG, "hook numners: name %s = %i", ui->mapping_lbl_device_name->text().toStdString().c_str(), dv.count());
878914
const auto selected_items = ui->table_mapping->selectedItems();
@@ -899,6 +935,7 @@ void PluginWindow::edit_mapping()
899935
ui->check_int_override->setChecked(check);
900936
ui->sb_int_override->setValue(selected_items.at(11)->text().toInt());
901937
ui->btn_delete->setEnabled(true);
938+
edithook = find_existing_hook();
902939
}
903940
}
904941

src/forms/settings-dialog.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ with this program. If not, see <https://www.gnu.org/licenses/>
1515

1616
#include <vector>
1717

18-
#include "ui_settings-dialog.h"
1918

19+
#include "ui_settings-dialog.h"
2020
#include "../midi-agent.h"
2121
#include "../version.h"
2222

@@ -82,4 +82,5 @@ private slots:
8282
int editrow = -1;
8383
bool editmode = false;
8484
bool switching = false;
85+
MidiHook *edithook;
8586
};

src/forms/settings-dialog.ui

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1428,8 +1428,11 @@
14281428
</size>
14291429
</property>
14301430
<layout class="QGridLayout" name="gridLayout_28">
1431-
<item row="2" column="0">
1432-
<widget class="QPushButton" name="btn_add">
1431+
<item row="4" column="0">
1432+
<widget class="QPushButton" name="btn_delete">
1433+
<property name="enabled">
1434+
<bool>false</bool>
1435+
</property>
14331436
<property name="sizePolicy">
14341437
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
14351438
<horstretch>0</horstretch>
@@ -1443,12 +1446,19 @@
14431446
</size>
14441447
</property>
14451448
<property name="text">
1446-
<string>Add Mapping</string>
1449+
<string>Delete Mapping</string>
14471450
</property>
14481451
</widget>
14491452
</item>
1450-
<item row="3" column="0">
1451-
<widget class="QPushButton" name="btn_delete">
1453+
<item row="1" column="0">
1454+
<widget class="QLabel" name="label_optional">
1455+
<property name="text">
1456+
<string>* optional</string>
1457+
</property>
1458+
</widget>
1459+
</item>
1460+
<item row="2" column="0">
1461+
<widget class="QPushButton" name="btn_add">
14521462
<property name="sizePolicy">
14531463
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
14541464
<horstretch>0</horstretch>
@@ -1462,19 +1472,12 @@
14621472
</size>
14631473
</property>
14641474
<property name="text">
1465-
<string>Delete Mapping</string>
1466-
</property>
1467-
</widget>
1468-
</item>
1469-
<item row="1" column="0">
1470-
<widget class="QLabel" name="label_optional">
1471-
<property name="text">
1472-
<string>* optional</string>
1475+
<string>Add Mapping</string>
14731476
</property>
14741477
</widget>
14751478
</item>
1476-
<item row="4" column="0">
1477-
<spacer name="verticalSpacer_3">
1479+
<item row="0" column="0">
1480+
<spacer name="verticalSpacer_4">
14781481
<property name="orientation">
14791482
<enum>Qt::Vertical</enum>
14801483
</property>
@@ -1486,8 +1489,8 @@
14861489
</property>
14871490
</spacer>
14881491
</item>
1489-
<item row="0" column="0">
1490-
<spacer name="verticalSpacer_4">
1492+
<item row="6" column="0">
1493+
<spacer name="verticalSpacer_3">
14911494
<property name="orientation">
14921495
<enum>Qt::Vertical</enum>
14931496
</property>
@@ -1499,6 +1502,16 @@
14991502
</property>
15001503
</spacer>
15011504
</item>
1505+
<item row="3" column="0">
1506+
<widget class="QPushButton" name="btn_reset">
1507+
<property name="enabled">
1508+
<bool>false</bool>
1509+
</property>
1510+
<property name="text">
1511+
<string>Reset</string>
1512+
</property>
1513+
</widget>
1514+
</item>
15021515
</layout>
15031516
</widget>
15041517
</item>

src/midi-agent.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,12 @@ void MidiAgent::remove_MidiHook(MidiHook *hook)
395395
delete (hook);
396396
}
397397
}
398-
/// <summary>
398+
void MidiAgent::edit_midi_hook(MidiHook *old_hook, MidiHook *new_hook)
399+
{
400+
remove_MidiHook(old_hook);
401+
add_MidiHook(new_hook);
402+
}
403+
/// <summary>
399404
/// Clears all the MidiHooks for this device.
400405
/// *This does not delete hooks from config unless saved afterwards*
401406
/// </summary>

src/midi-agent.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class MidiAgent : public QObject {
6767
void exe_midi_hook_if_exists(MidiMessage *message);
6868
void add_MidiHook(MidiHook *hook);
6969
void remove_MidiHook(MidiHook *hook);
70+
void edit_midi_hook(MidiHook *old_hook, MidiHook *new_hook);
7071
void clear_MidiHooks();
7172
QString GetData();
7273
void remove_source(const RpcEvent &event);

0 commit comments

Comments
 (0)